From e568d4ff08568b9bbbe6a754b5f53ff8e2cc6240 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 12 Mar 2026 13:54:47 -0400 Subject: [PATCH 1/9] 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/9] 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/9] 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/9] 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/9] 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/9] 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 From 2b953f81cc432207fc35b40c9ead61451432d48d Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 17 Mar 2026 14:00:31 -0400 Subject: [PATCH 7/9] adjustments --- lessons/agent-lessons.md | 14 -- .../hhs/ccdf/child_care_subsidy_programs.yaml | 1 + .../vt/dcf/ccfap/age_group/infant_max.yaml | 2 +- .../vt/dcf/ccfap/age_group/preschool_max.yaml | 2 +- .../vt/dcf/ccfap/age_group/toddler_max.yaml | 2 +- .../vt/dcf/ccfap/age_threshold/base.yaml | 2 +- .../ccfap/age_threshold/special_needs.yaml | 2 +- .../ccfap/care_schedule/full_time_max.yaml | 2 +- .../ccfap/care_schedule/part_time_max.yaml | 2 +- .../vt/dcf/ccfap/family_share/scale.yaml | 70 +++--- .../states/vt/dcf/ccfap/income/fpl_limit.yaml | 2 +- .../states/vt/dcf/ccfap/income/sources.yaml | 2 +- .../vt/dcf/ccfap/rates/licensed_center.yaml | 28 +-- .../vt/dcf/ccfap/rates/registered_home.yaml | 28 +-- .../gov/states/vt/dcf/ccfap/integration.yaml | 149 ++++++++----- .../gov/states/vt/dcf/ccfap/vt_ccfap.yaml | 92 ++++---- .../vt/dcf/ccfap/vt_ccfap_age_group.yaml | 14 +- .../vt/dcf/ccfap/vt_ccfap_care_schedule.yaml | 22 +- .../vt/dcf/ccfap/vt_ccfap_eligible.yaml | 27 ++- .../vt/dcf/ccfap/vt_ccfap_eligible_child.yaml | 20 +- .../vt/dcf/ccfap/vt_ccfap_family_share.yaml | 77 ++++--- .../dcf/ccfap/vt_ccfap_income_eligible.yaml | 27 ++- .../vt/dcf/ccfap/vt_ccfap_provider_type.yaml | 10 +- .../vt/dcf/ccfap/vt_ccfap_state_rate.yaml | 48 ++-- .../vt_ccfap_categorically_exempt.py | 29 +++ .../ccfap/eligibility/vt_ccfap_eligible.py | 24 +- .../eligibility/vt_ccfap_eligible_child.py | 12 +- .../eligibility/vt_ccfap_income_eligible.py | 2 +- .../gov/states/vt/dcf/ccfap/vt_ccfap.py | 6 +- .../states/vt/dcf/ccfap/vt_ccfap_age_group.py | 4 +- .../vt/dcf/ccfap/vt_ccfap_care_schedule.py | 6 +- .../vt/dcf/ccfap/vt_ccfap_countable_income.py | 2 +- .../vt/dcf/ccfap/vt_ccfap_family_share.py | 22 +- .../vt/dcf/ccfap/vt_ccfap_provider_type.py | 8 +- .../vt/dcf/ccfap/vt_ccfap_state_rate.py | 12 +- sources/working_references.md | 207 ------------------ 36 files changed, 424 insertions(+), 555 deletions(-) delete mode 100644 lessons/agent-lessons.md create mode 100644 policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_categorically_exempt.py delete mode 100644 sources/working_references.md diff --git a/lessons/agent-lessons.md b/lessons/agent-lessons.md deleted file mode 100644 index d81f750e0c8..00000000000 --- a/lessons/agent-lessons.md +++ /dev/null @@ -1,14 +0,0 @@ -# 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. diff --git a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml index 367612a52ae..2bfee7fa682 100644 --- a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml +++ b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml @@ -5,6 +5,7 @@ values: - 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 metadata: unit: list 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 39198e30294..48fda646505 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 @@ -1,6 +1,6 @@ description: Vermont defines infants as children up to this age in months under the Child Care Financial Assistance Program. values: - 2024-04-01: 24 + 2009-02-09: 24 metadata: unit: month 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 3948a35c7f2..fe9ebb935bc 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 @@ -1,6 +1,6 @@ description: Vermont defines preschoolers as children up to this age in months under the Child Care Financial Assistance Program. values: - 2024-04-01: 60 + 2009-02-09: 60 metadata: unit: month 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 4254fcc11df..ef4b397166e 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 @@ -1,6 +1,6 @@ description: Vermont defines toddlers as children up to this age in months under the Child Care Financial Assistance Program. values: - 2024-04-01: 36 + 2009-02-09: 36 metadata: unit: month 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 db3eaffb2ee..4ef3ada184a 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 @@ -1,6 +1,6 @@ description: Vermont limits the Child Care Financial Assistance Program to children younger than this age. values: - 2024-04-01: 13 + 2009-02-09: 13 metadata: unit: year 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 2d686bfa38f..5ac5c6b306a 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 @@ -1,6 +1,6 @@ description: Vermont limits the Child Care Financial Assistance Program to children with special needs younger than this age. values: - 2024-04-01: 19 + 2009-02-09: 19 metadata: unit: year 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 b646818b9f9..b6ded28ef63 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 @@ -1,6 +1,6 @@ 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 + 2009-02-09: 50 metadata: unit: hour 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 6c13f461283..41c0d483a01 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 @@ -1,6 +1,6 @@ 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 + 2009-02-09: 25 metadata: unit: hour 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 599d16a6c99..dab8753cc2e 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 @@ -8,76 +8,76 @@ metadata: 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 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/Benefits/CCFAP-Income-Guidelines.pdf - title: CCFAP Regulations Section IX href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=17 brackets: - threshold: - 2024-10-01: 0 + 2024-01-01: 0 amount: - 2024-10-01: 0 + 2024-01-01: 0 - threshold: - 2024-10-01: 1.7501 + 2024-01-01: 1.7501 amount: - 2024-10-01: 50 + 2024-01-01: 50 - threshold: - 2024-10-01: 2.0001 + 2024-01-01: 2.0001 amount: - 2024-10-01: 75 + 2024-01-01: 75 - threshold: - 2024-10-01: 2.2501 + 2024-01-01: 2.2501 amount: - 2024-10-01: 100 + 2024-01-01: 100 - threshold: - 2024-10-01: 2.5001 + 2024-01-01: 2.5001 amount: - 2024-10-01: 125 + 2024-01-01: 125 - threshold: - 2024-10-01: 2.7501 + 2024-01-01: 2.7501 amount: - 2024-10-01: 150 + 2024-01-01: 150 - threshold: - 2024-10-01: 3.0001 + 2024-01-01: 3.0001 amount: - 2024-10-01: 175 + 2024-01-01: 175 - threshold: - 2024-10-01: 3.2501 + 2024-01-01: 3.2501 amount: - 2024-10-01: 200 + 2024-01-01: 200 - threshold: - 2024-10-01: 3.5001 + 2024-01-01: 3.5001 amount: - 2024-10-01: 225 + 2024-01-01: 225 - threshold: - 2024-10-01: 3.7501 + 2024-01-01: 3.7501 amount: - 2024-10-01: 250 + 2024-01-01: 250 - threshold: - 2024-10-01: 4.0001 + 2024-01-01: 4.0001 amount: - 2024-10-01: 275 + 2024-01-01: 275 - threshold: - 2024-10-01: 4.2501 + 2024-01-01: 4.2501 amount: - 2024-10-01: 300 + 2024-01-01: 300 - threshold: - 2024-10-01: 4.5001 + 2024-01-01: 4.5001 amount: - 2024-10-01: 325 + 2024-01-01: 325 - threshold: - 2024-10-01: 4.7501 + 2024-01-01: 4.7501 amount: - 2024-10-01: 350 + 2024-01-01: 350 - threshold: - 2024-10-01: 5.0001 + 2024-01-01: 5.0001 amount: - 2024-10-01: 375 + 2024-01-01: 375 - threshold: - 2024-10-01: 5.2501 + 2024-01-01: 5.2501 amount: - 2024-10-01: 400 + 2024-01-01: 400 - threshold: - 2024-10-01: 5.5001 + 2024-01-01: 5.5001 amount: - 2024-10-01: 425 + 2024-01-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 index 459bdb7f93e..4135561ba8a 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 @@ -1,6 +1,6 @@ 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-01-01: 4 2024-10-01: 5.75 metadata: 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 92e18884c85..e3afc512e91 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 @@ -1,6 +1,6 @@ description: Vermont counts these income sources as gross income under the Child Care Financial Assistance Program. values: - 2024-04-01: + 2009-02-09: - employment_income - self_employment_income - pension_income 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 index 706d418289a..d5ee8c31e90 100644 --- 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 @@ -9,48 +9,48 @@ metadata: - 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 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/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 + href: https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/CDD-Guidance-CCFAP-Capped-Rates.pdf FULL_TIME: INFANT: - 2024-06-30: 471 + 2024-01-01: 471 2025-07-13: 495 TODDLER: - 2024-06-30: 443 + 2024-01-01: 443 2025-07-13: 465 PRESCHOOL: - 2024-06-30: 439 + 2024-01-01: 439 2025-07-13: 439 SCHOOL_AGE: - 2024-06-30: 371 + 2024-01-01: 371 2025-07-13: 371 PART_TIME: INFANT: - 2024-06-30: 258 + 2024-01-01: 258 2025-07-13: 271 TODDLER: - 2024-06-30: 243 + 2024-01-01: 243 2025-07-13: 255 PRESCHOOL: - 2024-06-30: 240 + 2024-01-01: 240 2025-07-13: 240 SCHOOL_AGE: - 2024-06-30: 204 + 2024-01-01: 204 2025-07-13: 204 EXTENDED_CARE: INFANT: - 2024-06-30: 640 + 2024-01-01: 640 2025-07-13: 672 TODDLER: - 2024-06-30: 602 + 2024-01-01: 602 2025-07-13: 632 PRESCHOOL: - 2024-06-30: 597 + 2024-01-01: 597 2025-07-13: 597 SCHOOL_AGE: - 2024-06-30: 505 + 2024-01-01: 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 index 8ab12a67a1e..42a950791cb 100644 --- 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 @@ -9,48 +9,48 @@ metadata: - 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 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/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 + href: https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/CDD-Guidance-CCFAP-Capped-Rates.pdf FULL_TIME: INFANT: - 2024-06-30: 387 + 2024-01-01: 387 2025-07-13: 407 TODDLER: - 2024-06-30: 364 + 2024-01-01: 364 2025-07-13: 382 PRESCHOOL: - 2024-06-30: 361 + 2024-01-01: 361 2025-07-13: 361 SCHOOL_AGE: - 2024-06-30: 321 + 2024-01-01: 321 2025-07-13: 321 PART_TIME: INFANT: - 2024-06-30: 212 + 2024-01-01: 212 2025-07-13: 223 TODDLER: - 2024-06-30: 200 + 2024-01-01: 200 2025-07-13: 210 PRESCHOOL: - 2024-06-30: 198 + 2024-01-01: 198 2025-07-13: 198 SCHOOL_AGE: - 2024-06-30: 176 + 2024-01-01: 176 2025-07-13: 176 EXTENDED_CARE: INFANT: - 2024-06-30: 527 + 2024-01-01: 527 2025-07-13: 553 TODDLER: - 2024-06-30: 494 + 2024-01-01: 494 2025-07-13: 519 PRESCHOOL: - 2024-06-30: 491 + 2024-01-01: 491 2025-07-13: 491 SCHOOL_AGE: - 2024-06-30: 436 + 2024-01-01: 436 2025-07-13: 436 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 index ad2830333e1..9577c752caa 100644 --- 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 @@ -1,6 +1,6 @@ - name: Case 1, low income single parent with one infant in full time licensed center. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -16,6 +16,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -45,24 +46,27 @@ # Income # FPG for family of 2 = 15,650 + 5,500 = 21,150 # FPL ratio = 30,000 / 21,150 = 1.418 + vt_ccfap_countable_income: 2_500.00 + # 30,000 / 12 = $2,500.00/mo vt_ccfap_income_eligible: true # Family share # FPL ratio 1.418 < 1.7501 => $0/wk - # Annual: $0 * 52 = $0 + # Monthly: $0 * 52 / 12 = $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 + # Weekly rate = $471/wk + # Monthly rate = $471 * 52 / 12 = $2,041.00 + # Benefit = max(2,041.00 - 0, 0) = $2,041.00 + vt_ccfap: 2_041.00 - name: Case 2, moderate income two parent family with two children in different settings. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -88,6 +92,7 @@ spm_units: spm_unit: members: [person1, person2, person3, person4] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3, person4] @@ -118,25 +123,27 @@ # 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_countable_income: 6_666.67 + # 80,000 / 12 = $6,666.67/mo 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 + # Monthly: $100 * 52 / 12 = $433.33 + vt_ccfap_family_share: 433.33 # 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 + # Total weekly rate = ($439 + $176) = $615/wk + # Monthly rate = $615 * 52 / 12 = $2,665.00 + # Benefit = max(2,665.00 - 433.33, 0) = $2,231.67 + vt_ccfap: 2_231.67 - name: Case 3, high income family just below 575 percent FPL threshold. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -155,6 +162,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3] @@ -179,24 +187,26 @@ # 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_countable_income: 12_750.00 + # 153,000 / 12 = $12,750.00/mo vt_ccfap_income_eligible: true # Family share - # Annual: $425 * 52 = $22,100 - vt_ccfap_family_share: 22_100 + # Monthly: $425 * 52 / 12 = $1,841.67 + vt_ccfap_family_share: 1_841.67 # Overall eligibility vt_ccfap_eligible: true # Benefit - # Total annual rate = $371 * 52 = $19,292 - # Benefit = max(19,292 - 22,100, 0) = $0 + # Weekly rate = $371/wk + # Monthly rate = $371 * 52 / 12 = $1,607.67 + # Benefit = max(1,607.67 - 1,841.67, 0) = $0 vt_ccfap: 0 - name: Case 4, foster child in registered home with high income parent. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -249,13 +259,14 @@ vt_ccfap_eligible: true # Benefit - # Total annual rate = $361 * 52 = $18,772 - # Benefit = max(18,772 - 0, 0) = $18,772 - vt_ccfap: 18_772 + # Weekly rate = $361/wk + # Monthly rate = $361 * 52 / 12 = $1,564.33 + # Benefit = max(1,564.33 - 0, 0) = $1,564.33 + vt_ccfap: 1_564.33 - name: Case 5, disabled teenager eligible as special needs child. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -272,6 +283,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -295,24 +307,27 @@ # Income # FPG for family of 2 = 21,150 # FPL ratio = 60,000 / 21,150 = 2.837 + vt_ccfap_countable_income: 5_000.00 + # 60,000 / 12 = $5,000.00/mo 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 + # Monthly: $150 * 52 / 12 = $650.00 + vt_ccfap_family_share: 650.00 # 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 + # Weekly rate = $371/wk + # Monthly rate = $371 * 52 / 12 = $1,607.67 + # Benefit = max(1,607.67 - 650.00, 0) = $957.67 + vt_ccfap: 957.67 - name: Case 6, extended care infant in registered home with two parents. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -331,6 +346,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3] @@ -357,25 +373,27 @@ # 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_countable_income: 3_750.00 + # 45,000 / 12 = $3,750.00/mo vt_ccfap_income_eligible: true # Family share # FPL ratio 1.688 < 1.7501 => $0/wk - # Annual: $0 * 52 = $0 + # Monthly: $0 * 52 / 12 = $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 + # Weekly rate = $527/wk + # Monthly rate = $527 * 52 / 12 = $2,283.67 + # Benefit = max(2,283.67 - 0, 0) = $2,283.67 + vt_ccfap: 2_283.67 - name: Case 7, ineligible family above 575 percent FPL gets zero benefit. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -412,7 +430,7 @@ - name: Case 8, family at exactly 575 percent FPL boundary with maximum family share. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -428,6 +446,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -457,25 +476,27 @@ # 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_countable_income: 10_134.38 + # 121,612.50 / 12 = $10,134.38/mo 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 + # Monthly: $425 * 52 / 12 = $1,841.67 + vt_ccfap_family_share: 1_841.67 # 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 + # Weekly rate = $640/wk + # Monthly rate = $640 * 52 / 12 = $2,773.33 + # Benefit = max(2,773.33 - 1,841.67, 0) = $931.67 + vt_ccfap: 931.67 - name: Case 9, large family of 8 with three eligible children in different settings. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -524,6 +545,7 @@ spm_units: spm_unit: members: [person1, person2, person3, person4, person5, person6, person7, person8] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3, person4, person5, person6, person7, person8] @@ -559,26 +581,27 @@ # 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_countable_income: 6_666.67 + # 80,000 / 12 = $6,666.67/mo vt_ccfap_income_eligible: true # Family share # FPL ratio 1.477 < 1.7501 => $0/wk - # Annual: $0 * 52 = $0 + # Monthly: $0 * 52 / 12 = $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 + # Total weekly rate = $387 + $243 + $439 + $176 + $204 = $1,449/wk + # Monthly rate = $1,449 * 52 / 12 = $6,279.00 + # Benefit = max(6,279.00 - 0, 0) = $6,279.00 + vt_ccfap: 6_279.00 - name: Case 10, enrollment based benefit with moderate family share. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -593,6 +616,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -615,25 +639,27 @@ # Income # FPG for family of 2 = 21,150 # FPL ratio = 55,000 / 21,150 = 2.600 - vt_ccfap_countable_income: 55_000 + vt_ccfap_countable_income: 4_583.33 + # 55,000 / 12 = $4,583.33/mo 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 + # Monthly: $125 * 52 / 12 = $541.67 + vt_ccfap_family_share: 541.67 # 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 + # Weekly rate = $640/wk + # Monthly rate = $640 * 52 / 12 = $2,773.33 + # Benefit = max(2,773.33 - 541.67, 0) = $2,231.67 + vt_ccfap: 2_231.67 - name: Case 11, protective services child with mixed eligible and ineligible children. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -674,6 +700,8 @@ # FPG for family of 3 = 26,650 # 575% FPL = 153,237.50 # Income 200,000 > 153,237.50 + vt_ccfap_countable_income: 16_666.67 + # 200,000 / 12 = $16,666.67/mo vt_ccfap_income_eligible: false # Protective services => categorically eligible @@ -683,6 +711,7 @@ 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 + # Weekly rate = $439/wk + # Monthly rate = $439 * 52 / 12 = $1,902.33 + # Benefit = max(1,902.33 - 0, 0) = $1,902.33 + vt_ccfap: 1_902.33 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 index 7488a870eed..72e1e96ac7a 100644 --- 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 @@ -1,6 +1,6 @@ - name: Case 1, single child full time licensed center at 250 percent FPL. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -16,6 +16,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -24,15 +25,15 @@ # 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 + # Monthly family share = $100 * 52 / 12 = $433.33 # 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 + # Monthly rate = $439 * 52 / 12 = $1,902.33 + # Benefit = max(1,902.33 - 433.33, 0) = $1,469.00 + vt_ccfap: 1_469.00 - name: Case 2, ineligible family gets zero benefit. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -48,6 +49,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -60,7 +62,7 @@ - name: Case 3, Reach Up eligible family gets full subsidy with no copay. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -85,13 +87,13 @@ 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 + # Monthly rate = $471 * 52 / 12 = $2,041.00 + # Benefit = max(2,041.00 - 0, 0) = $2,041.00 + vt_ccfap: 2_041.00 - name: Case 4, family share exceeds state rate results in zero benefit. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -109,6 +111,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3] @@ -117,15 +120,15 @@ # 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 + # Monthly family share = $425 * 52 / 12 = $1,841.67 # 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 + # Monthly rate = $176 * 52 / 12 = $762.67 + # Benefit = max(762.67 - 1,841.67, 0) = $0 vt_ccfap: 0 - name: Case 5, zero income family gets full subsidy. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -140,6 +143,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -147,13 +151,13 @@ 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 + # Monthly rate = $364 * 52 / 12 = $1,577.33 + # Benefit = max(1,577.33 - 0, 0) = $1,577.33 + vt_ccfap: 1_577.33 - name: Case 6, negative self employment income does not inflate benefit. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -169,6 +173,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -176,13 +181,13 @@ 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 + # Monthly rate = $439 * 52 / 12 = $1,902.33 + # Benefit capped at max(1,902.33 - 0, 0) = $1,902.33, NOT inflated + vt_ccfap: 1_902.33 - name: Case 7, enrollment based benefit equals state rate minus family share. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -197,6 +202,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -205,15 +211,15 @@ # 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 + # Monthly 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 + # Monthly rate = $471 * 52 / 12 = $2,041.00 + # Benefit = max(2,041.00 - 0, 0) = $2,041.00 + vt_ccfap: 2_041.00 - name: Case 8, two children different age groups and provider types. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -234,6 +240,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3] @@ -242,17 +249,17 @@ # 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 + # Monthly family share = $75 * 52 / 12 = $325.00 # 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 + # Monthly rate = $647 * 52 / 12 = $2,803.67 + # Benefit = max(2,803.67 - 325.00, 0) = $2,478.67 + vt_ccfap: 2_478.67 - name: Case 9, three children in extended care at different ages. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -279,6 +286,7 @@ spm_units: spm_unit: members: [person1, person2, person3, person4] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3, person4] @@ -287,18 +295,18 @@ # 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 + # Monthly 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 + # Monthly rate = $1,839 * 52 / 12 = $7,969.00 + # Benefit = max(7,969.00 - 0, 0) = $7,969.00 + vt_ccfap: 7_969.00 - name: Case 10, enrolled child receives enrollment based benefit. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -313,6 +321,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -321,7 +330,8 @@ # 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 + # Monthly family share = $0 # 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 + # Monthly rate = $439 * 52 / 12 = $1,902.33 + # Benefit = max(1,902.33 - 0, 0) = $1,902.33 + vt_ccfap: 1_902.33 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 index 58855271500..4e89a234d05 100644 --- 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 @@ -1,5 +1,5 @@ - name: Case 1, infant under 24 months. - period: 2025 + period: 2025-01 input: people: person1: @@ -12,7 +12,7 @@ vt_ccfap_age_group: [INFANT] - name: Case 2, toddler at 2 years old. - period: 2025 + period: 2025-01 input: people: person1: @@ -25,7 +25,7 @@ vt_ccfap_age_group: [TODDLER] - name: Case 3, preschooler at 3 years old. - period: 2025 + period: 2025-01 input: people: person1: @@ -38,7 +38,7 @@ vt_ccfap_age_group: [PRESCHOOL] - name: Case 4, preschooler at 4 years old. - period: 2025 + period: 2025-01 input: people: person1: @@ -51,7 +51,7 @@ vt_ccfap_age_group: [PRESCHOOL] - name: Case 5, school age at 5 years old. - period: 2025 + period: 2025-01 input: people: person1: @@ -64,7 +64,7 @@ vt_ccfap_age_group: [SCHOOL_AGE] - name: Case 6, school age at 10 years old. - period: 2025 + period: 2025-01 input: people: person1: @@ -77,7 +77,7 @@ vt_ccfap_age_group: [SCHOOL_AGE] - name: Case 7, newborn is infant. - period: 2025 + period: 2025-01 input: people: person1: 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 index 9ab4f6015eb..c468a5b8eef 100644 --- 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 @@ -1,5 +1,5 @@ - name: Case 1, part time at 20 hours per week. - period: 2025 + period: 2025-01 input: people: person1: @@ -13,7 +13,7 @@ vt_ccfap_care_schedule: [PART_TIME] - name: Case 2, part time at exactly 25 hours per week. - period: 2025 + period: 2025-01 input: people: person1: @@ -27,7 +27,7 @@ vt_ccfap_care_schedule: [PART_TIME] - name: Case 3, full time at 26 hours per week. - period: 2025 + period: 2025-01 input: people: person1: @@ -41,7 +41,7 @@ vt_ccfap_care_schedule: [FULL_TIME] - name: Case 4, full time at 40 hours per week. - period: 2025 + period: 2025-01 input: people: person1: @@ -55,7 +55,7 @@ vt_ccfap_care_schedule: [FULL_TIME] - name: Case 5, full time at exactly 50 hours per week. - period: 2025 + period: 2025-01 input: people: person1: @@ -69,7 +69,7 @@ vt_ccfap_care_schedule: [FULL_TIME] - name: Case 6, extended care at 51 hours per week. - period: 2025 + period: 2025-01 input: people: person1: @@ -83,7 +83,7 @@ vt_ccfap_care_schedule: [EXTENDED_CARE] - name: Case 7, extended care at 60 hours per week. - period: 2025 + period: 2025-01 input: people: person1: @@ -97,7 +97,7 @@ vt_ccfap_care_schedule: [EXTENDED_CARE] - name: Case 8, minimal part time at 1 hour per week. - period: 2025 + period: 2025-01 input: people: person1: @@ -111,7 +111,7 @@ vt_ccfap_care_schedule: [PART_TIME] - name: Case 9, zero childcare hours per week. - period: 2025 + period: 2025-01 input: people: person1: @@ -126,7 +126,7 @@ vt_ccfap_care_schedule: [PART_TIME] - name: Case 10, fractional hours just above 25 boundary. - period: 2025 + period: 2025-01 input: people: person1: @@ -141,7 +141,7 @@ vt_ccfap_care_schedule: [FULL_TIME] - name: Case 11, fractional hours just above 50 boundary. - period: 2025 + period: 2025-01 input: people: person1: 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 index fe145819323..ce1be2b9734 100644 --- 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 @@ -1,5 +1,5 @@ - name: Case 1, basic eligible family with income below threshold. - period: 2025 + period: 2025-01 input: people: person1: @@ -11,6 +11,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -24,7 +25,7 @@ vt_ccfap_eligible: true - name: Case 2, income above 575 percent FPL is ineligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -47,7 +48,7 @@ vt_ccfap_eligible: false - name: Case 3, Reach Up eligible bypasses income test. - period: 2025 + period: 2025-01 input: people: person1: @@ -70,7 +71,7 @@ vt_ccfap_eligible: true - name: Case 4, protective services child bypasses income test. - period: 2025 + period: 2025-01 input: people: person1: @@ -92,7 +93,7 @@ vt_ccfap_eligible: true - name: Case 5, foster child bypasses income test. - period: 2025 + period: 2025-01 input: people: person1: @@ -114,7 +115,7 @@ vt_ccfap_eligible: true - name: Case 6, no eligible child means ineligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -135,7 +136,7 @@ vt_ccfap_eligible: false - name: Case 7, assets over 1 million means ineligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -157,7 +158,7 @@ vt_ccfap_eligible: false - name: Case 8, single adult with no children is ineligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -175,7 +176,7 @@ vt_ccfap_eligible: false - name: Case 9, income at exactly 575 percent FPL is eligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -187,6 +188,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -198,7 +200,7 @@ vt_ccfap_eligible: true - name: Case 10, income one dollar above 575 percent FPL is ineligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -221,7 +223,7 @@ vt_ccfap_eligible: false - name: Case 11, multiple categorical exemptions combined. - period: 2025 + period: 2025-01 input: people: person1: @@ -247,7 +249,7 @@ vt_ccfap_eligible: true - name: Case 12, child only household with disabled teenager. - period: 2025 + period: 2025-01 input: people: person1: @@ -257,6 +259,7 @@ spm_units: spm_unit: members: [person1] + meets_ccdf_activity_test: true households: household: members: [person1] 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 index 6f5799707d1..c82dd778375 100644 --- 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 @@ -1,5 +1,5 @@ - name: Case 1, child under 13 who is a dependent and citizen. - period: 2025 + period: 2025-01 input: people: person1: @@ -13,7 +13,7 @@ vt_ccfap_eligible_child: [true] - name: Case 2, child at age 13 is ineligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -27,7 +27,7 @@ vt_ccfap_eligible_child: [false] - name: Case 3, child with special needs under 19 is eligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -42,7 +42,7 @@ vt_ccfap_eligible_child: [true] - name: Case 4, child with special needs at age 19 is ineligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -57,7 +57,7 @@ vt_ccfap_eligible_child: [false] - name: Case 5, child under 13 who is not a dependent is ineligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -71,7 +71,7 @@ vt_ccfap_eligible_child: [false] - name: Case 6, infant is eligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -85,7 +85,7 @@ vt_ccfap_eligible_child: [true] - name: Case 7, child at age 12 is eligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -99,7 +99,7 @@ vt_ccfap_eligible_child: [true] - name: Case 8, special needs child at age 18 is eligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -115,7 +115,7 @@ vt_ccfap_eligible_child: [true] - name: Case 9, non-disabled child at age 12 who is not a dependent. - period: 2025 + period: 2025-01 input: people: person1: @@ -130,7 +130,7 @@ vt_ccfap_eligible_child: [false] - name: Case 10, multiple children with mixed eligibility. - period: 2025 + period: 2025-01 input: people: person1: 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 b6fbe6e2ffd..da147bdf3d8 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 @@ -1,6 +1,6 @@ - name: Case 1, income at 150 percent FPL has zero family share. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -15,6 +15,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3] @@ -23,12 +24,12 @@ # 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 + # Monthly: $0 * 52 / 12 = $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 + period: 2025-01 input: people: person1: @@ -43,6 +44,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3] @@ -51,12 +53,12 @@ # 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 + # Monthly: $50 * 52 / 12 = $216.67 + vt_ccfap_family_share: 216.67 - name: Case 3, income at 300 percent FPL has 150 dollar weekly share. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -71,6 +73,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3] @@ -79,12 +82,12 @@ # 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 + # Monthly: $150 * 52 / 12 = $650.00 + vt_ccfap_family_share: 650 - name: Case 4, income at 575 percent FPL has maximum 425 dollar weekly share. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -99,6 +102,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3] @@ -107,12 +111,12 @@ # 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 + # Monthly: $425 * 52 / 12 = $1,841.67 + vt_ccfap_family_share: 1_841.67 - name: Case 5, Reach Up eligible family has zero family share. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -136,7 +140,7 @@ - name: Case 6, foster child present has zero family share. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -159,7 +163,7 @@ - name: Case 7, protective services child has zero family share. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -182,7 +186,7 @@ - name: Case 8, income at exactly 175 percent FPL has zero family share. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -197,6 +201,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3] @@ -205,12 +210,12 @@ # 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 + # Monthly: $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 + period: 2025-01 input: people: person1: @@ -225,6 +230,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3] @@ -233,12 +239,12 @@ # 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 + # Monthly: $50 * 52 / 12 = $216.67 + vt_ccfap_family_share: 216.67 - name: Case 10, zero income has zero family share. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -249,6 +255,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -256,12 +263,12 @@ output: # FPL ratio = 0 / 21,150 = 0.0 # 0.0 < 1.7501 => weekly family share = $0 - # Annual: $0 * 52 = $0 + # Monthly: $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 + period: 2025-01 input: people: person1: @@ -273,6 +280,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -281,12 +289,12 @@ # 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 + # Monthly: $100 * 52 / 12 = $433.33 + vt_ccfap_family_share: 433.33 - name: Case 12, income at 400 percent FPL has 250 dollar weekly share. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -298,6 +306,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -306,12 +315,12 @@ # 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 + # Monthly: $250 * 52 / 12 = $1,083.33 + vt_ccfap_family_share: 1_083.33 -- name: Case 13, income at 500 percent FPL has 375 dollar weekly share. +- name: Case 13, income at 500 percent FPL has 350 dollar weekly share. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -323,6 +332,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -331,12 +341,12 @@ # 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 + # Monthly: $350 * 52 / 12 = $1,516.67 + vt_ccfap_family_share: 1_516.67 - name: Case 14, large family of 8 with low FPL ratio. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -365,6 +375,7 @@ spm_units: spm_unit: members: [person1, person2, person3, person4, person5, person6, person7, person8] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3, person4, person5, person6, person7, person8] @@ -373,5 +384,5 @@ # 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 + # Monthly: $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 index 555c878cfa6..e14ae74896e 100644 --- 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 @@ -1,5 +1,5 @@ - name: Case 1, family of 3 with income below 575 percent FPL. - period: 2025 + period: 2025-01 input: people: person1: @@ -14,6 +14,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3] @@ -25,7 +26,7 @@ vt_ccfap_income_eligible: true - name: Case 2, family of 3 with income above 575 percent FPL. - period: 2025 + period: 2025-01 input: people: person1: @@ -40,6 +41,7 @@ spm_units: spm_unit: members: [person1, person2, person3] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3] @@ -51,7 +53,7 @@ vt_ccfap_income_eligible: false - name: Case 3, family of 4 with income at 575 percent FPL. - period: 2025 + period: 2025-01 input: people: person1: @@ -68,6 +70,7 @@ spm_units: spm_unit: members: [person1, person2, person3, person4] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3, person4] @@ -79,7 +82,7 @@ vt_ccfap_income_eligible: true - name: Case 4, family of 4 with income just above 575 percent FPL. - period: 2025 + period: 2025-01 input: people: person1: @@ -96,6 +99,7 @@ spm_units: spm_unit: members: [person1, person2, person3, person4] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3, person4] @@ -107,7 +111,7 @@ vt_ccfap_income_eligible: false - name: Case 5, zero income is eligible. - period: 2025 + period: 2025-01 input: people: person1: @@ -118,6 +122,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -127,7 +132,7 @@ vt_ccfap_income_eligible: true - name: Case 6, single parent family of 2 at exactly 575 percent FPL. - period: 2025 + period: 2025-01 input: people: person1: @@ -139,6 +144,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -150,7 +156,7 @@ vt_ccfap_income_eligible: true - name: Case 7, single parent family of 2 one dollar above 575 percent FPL. - period: 2025 + period: 2025-01 input: people: person1: @@ -162,6 +168,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] @@ -173,7 +180,7 @@ vt_ccfap_income_eligible: false - name: Case 8, large family of 8 at 575 percent FPL. - period: 2025 + period: 2025-01 input: people: person1: @@ -202,6 +209,7 @@ spm_units: spm_unit: members: [person1, person2, person3, person4, person5, person6, person7, person8] + meets_ccdf_activity_test: true households: household: members: [person1, person2, person3, person4, person5, person6, person7, person8] @@ -213,7 +221,7 @@ vt_ccfap_income_eligible: true - name: Case 9, multiple income sources combined. - period: 2025 + period: 2025-01 input: people: person1: @@ -228,6 +236,7 @@ spm_units: spm_unit: members: [person1, person2] + meets_ccdf_activity_test: true households: household: members: [person1, person2] 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 index ca50877d9f7..eaa7258a8a9 100644 --- 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 @@ -1,5 +1,5 @@ - name: Case 1, day care center maps to licensed center. - period: 2025 + period: 2025-01 input: people: person1: @@ -12,7 +12,7 @@ vt_ccfap_provider_type: [LICENSED_CENTER] - name: Case 2, family day care maps to registered home. - period: 2025 + period: 2025-01 input: people: person1: @@ -25,7 +25,7 @@ vt_ccfap_provider_type: [REGISTERED_HOME] - name: Case 3, legally exempt group maps to registered home. - period: 2025 + period: 2025-01 input: people: person1: @@ -38,7 +38,7 @@ vt_ccfap_provider_type: [REGISTERED_HOME] - name: Case 4, informal standard maps to registered home. - period: 2025 + period: 2025-01 input: people: person1: @@ -51,7 +51,7 @@ vt_ccfap_provider_type: [REGISTERED_HOME] - name: Case 5, informal enhanced maps to registered home. - period: 2025 + period: 2025-01 input: people: person1: 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 index 78d9267e0b1..3367aaa5356 100644 --- 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 @@ -1,6 +1,6 @@ - name: Case 1, licensed center full time infant. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -20,7 +20,7 @@ - name: Case 2, registered home part time school age. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -39,7 +39,7 @@ - name: Case 3, licensed center extended care toddler. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -58,7 +58,7 @@ - name: Case 4, registered home full time preschool. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -77,7 +77,7 @@ - name: Case 5, licensed center part time preschool. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -96,7 +96,7 @@ - name: Case 6, registered home extended care infant. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -115,7 +115,7 @@ - name: Case 7, licensed center full time school age. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -134,7 +134,7 @@ - name: Case 8, registered home full time toddler. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -153,7 +153,7 @@ - name: Case 9, registered home part time infant. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -172,7 +172,7 @@ - name: Case 10, registered home part time toddler. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -191,7 +191,7 @@ - name: Case 11, registered home part time preschool. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -210,7 +210,7 @@ - name: Case 12, registered home extended care toddler. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -229,7 +229,7 @@ - name: Case 13, registered home extended care preschool. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -248,7 +248,7 @@ - name: Case 14, registered home extended care school age. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -267,7 +267,7 @@ - name: Case 15, registered home full time school age. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -286,7 +286,7 @@ - name: Case 16, registered home full time infant. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -305,7 +305,7 @@ - name: Case 17, licensed center part time infant. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -324,7 +324,7 @@ - name: Case 18, licensed center part time toddler. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -343,7 +343,7 @@ - name: Case 19, licensed center part time school age. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -362,7 +362,7 @@ - name: Case 20, licensed center extended care preschool. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -381,7 +381,7 @@ - name: Case 21, licensed center extended care school age. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -400,7 +400,7 @@ - name: Case 22, licensed center extended care infant. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -419,7 +419,7 @@ - name: Case 23, licensed center full time toddler. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: @@ -438,7 +438,7 @@ - name: Case 24, licensed center full time preschool. absolute_error_margin: 0.01 - period: 2025 + period: 2025-01 input: people: person1: diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_categorically_exempt.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_categorically_exempt.py new file mode 100644 index 00000000000..a5f6be39d9c --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_categorically_exempt.py @@ -0,0 +1,29 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_categorically_exempt(Variable): + value_type = bool + entity = SPMUnit + definition_period = MONTH + defined_for = StateCode.VT + label = "Categorically exempt from Vermont CCFAP income test" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=9", + "https://legislature.vermont.gov/statutes/section/33/035/03512", + ) + + def formula(spm_unit, period, parameters): + # Reach Up (VT TANF) recipients — MONTH variable + reach_up = spm_unit("is_tanf_enrolled", period) + # Protective services — YEAR variable + protective = ( + add( + spm_unit, + period.this_year, + ["receives_or_needs_protective_services"], + ) + > 0 + ) + # Foster care — MONTH variable + foster = add(spm_unit, period, ["is_in_foster_care"]) > 0 + return reach_up | protective | foster 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 index e19c00bde2a..11cf18f0efc 100644 --- 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 @@ -4,7 +4,7 @@ class vt_ccfap_eligible(Variable): value_type = bool entity = SPMUnit - definition_period = YEAR + definition_period = MONTH defined_for = StateCode.VT label = "Eligible for Vermont CCFAP" reference = ( @@ -13,24 +13,26 @@ class vt_ccfap_eligible(Variable): ) 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) + has_eligible_child = ( + add(spm_unit, period, ["vt_ccfap_eligible_child"]) > 0 + ) + asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) income_eligible = spm_unit("vt_ccfap_income_eligible", period) - - reach_up = spm_unit("is_tanf_enrolled", period.first_month) - protective = ( + activity_eligible = ( add( spm_unit, - period, - ["receives_or_needs_protective_services"], + period.this_year, + ["is_ccdf_reason_for_care_eligible"], ) > 0 ) - foster = add(spm_unit, period.first_month, ["is_in_foster_care"]) > 0 - categorically_eligible = reach_up | protective | foster + categorically_exempt = spm_unit( + "vt_ccfap_categorically_exempt", period + ) return ( has_eligible_child & asset_eligible - & (income_eligible | categorically_eligible) + & (activity_eligible | categorically_exempt) + & (income_eligible | categorically_exempt) ) 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 index 1c3d6fdef18..fe7dba042cf 100644 --- 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 @@ -4,7 +4,7 @@ class vt_ccfap_eligible_child(Variable): value_type = bool entity = Person - definition_period = YEAR + definition_period = MONTH defined_for = StateCode.VT label = "Eligible child for Vermont CCFAP" reference = ( @@ -14,10 +14,12 @@ class vt_ccfap_eligible_child(Variable): 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 = person("age", period.this_year) + has_special_needs = person("is_disabled", period.this_year) 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) + is_dependent = person("is_tax_unit_dependent", period.this_year) + immigration_eligible = person( + "is_ccdf_immigration_eligible_child", period.this_year + ) 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 index 2c750b470c5..5999df01c6c 100644 --- 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 @@ -4,7 +4,7 @@ class vt_ccfap_income_eligible(Variable): value_type = bool entity = SPMUnit - definition_period = YEAR + definition_period = MONTH defined_for = StateCode.VT label = "Income eligible for Vermont CCFAP" reference = ( 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 index 1d0da6403ea..15cbddeff9d 100644 --- a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap.py +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap.py @@ -5,7 +5,7 @@ class vt_ccfap(Variable): value_type = float entity = SPMUnit unit = USD - definition_period = YEAR + definition_period = MONTH defined_for = "vt_ccfap_eligible" label = "Vermont Child Care Financial Assistance Program benefit" reference = ( @@ -18,6 +18,6 @@ def formula(spm_unit, period, parameters): 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 + monthly_rate = total_weekly_rate * WEEKS_IN_YEAR / MONTHS_IN_YEAR family_share = spm_unit("vt_ccfap_family_share", period) - return max_(total_annual_rate - family_share, 0) + return max_(monthly_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 index 3aea4bf6f3b..080f57ce94a 100644 --- 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 @@ -13,14 +13,14 @@ class vt_ccfap_age_group(Variable): entity = Person possible_values = VTCCFAPAgeGroup default_value = VTCCFAPAgeGroup.INFANT - definition_period = YEAR + definition_period = MONTH 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 = person("age", period.this_year) age_months = age * MONTHS_IN_YEAR return select( [ 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 index 0c6dd741c36..80ad9e79291 100644 --- 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 @@ -12,14 +12,14 @@ class vt_ccfap_care_schedule(Variable): entity = Person possible_values = VTCCFAPCareSchedule default_value = VTCCFAPCareSchedule.FULL_TIME - definition_period = YEAR + definition_period = MONTH defined_for = StateCode.VT label = "Vermont CCFAP care schedule" - reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/State-Rates.pdf" + reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/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) + hours = person("childcare_hours_per_week", period.this_year) return select( [ hours <= p.part_time_max, 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 index 29a10071f6f..6a1b97f044c 100644 --- 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 @@ -5,7 +5,7 @@ class vt_ccfap_countable_income(Variable): value_type = float entity = SPMUnit unit = USD - definition_period = YEAR + definition_period = MONTH defined_for = StateCode.VT label = "Vermont CCFAP countable income" reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf" 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 index 831f962582f..e081e504a0b 100644 --- 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 @@ -5,11 +5,11 @@ class vt_ccfap_family_share(Variable): value_type = float entity = SPMUnit unit = USD - definition_period = YEAR + definition_period = MONTH defined_for = StateCode.VT - label = "Vermont CCFAP annual family share (copayment)" + label = "Vermont CCFAP monthly 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/Benefits/CCFAP-Income-Guidelines.pdf", "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf", ) @@ -19,18 +19,8 @@ def formula(spm_unit, period, parameters): 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 + exempt = spm_unit("vt_ccfap_categorically_exempt", period) weekly_share = p.family_share.scale.calc(fpl_ratio) - annual_share = weekly_share * WEEKS_IN_YEAR - return where(exempt, 0, annual_share) + monthly_share = weekly_share * WEEKS_IN_YEAR / MONTHS_IN_YEAR + return where(exempt, 0, monthly_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 index 0b7a5441de9..a3b8538b139 100644 --- 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 @@ -11,13 +11,15 @@ class vt_ccfap_provider_type(Variable): entity = Person possible_values = VTCCFAPProviderType default_value = VTCCFAPProviderType.LICENSED_CENTER - definition_period = YEAR + definition_period = MONTH defined_for = StateCode.VT label = "Vermont CCFAP provider type" - reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/State-Rates.pdf" + reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-State-Rates.pdf" def formula(person, period, parameters): - provider_group = person("childcare_provider_type_group", period) + provider_group = person( + "childcare_provider_type_group", period.this_year + ) is_center = provider_group == provider_group.possible_values.DCC_SACC return where( is_center, 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 index 841ee42e310..9518bb431e6 100644 --- 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 @@ -5,12 +5,12 @@ class vt_ccfap_state_rate(Variable): value_type = float entity = Person unit = USD - definition_period = YEAR + definition_period = MONTH defined_for = "vt_ccfap_eligible_child" - label = "Vermont CCFAP weekly state rate per child" + label = "Vermont CCFAP state reimbursement 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", + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-State-Rates.pdf", + "https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/CDD-Guidance-CCFAP-Capped-Rates.pdf", ) def formula(person, period, parameters): @@ -18,7 +18,9 @@ def formula(person, period, parameters): 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 + 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/sources/working_references.md b/sources/working_references.md deleted file mode 100644 index 0a2f9635146..00000000000 --- a/sources/working_references.md +++ /dev/null @@ -1,207 +0,0 @@ -# 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 From 80ab6963fcc4ffcad6797feea54c18ebbd7ef452 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 17 Mar 2026 15:19:26 -0400 Subject: [PATCH 8/9] Fix VT CCFAP parameter dates, references, and preschool boundary - Backdate rates to 2023-07-02 (Act 76 simplified rate structure) - Add Jan 1, 2024 registered home rates before Jun 30 differential reduction - Fix FPL limit: 350% from 2009, 400% from Apr 7 2024, 575% from Oct 6 2024 - Backdate family share scale to 2009 with pre-April bracket at 150% FPL - Add preschool age boundary change to 72 months at 2025-07-13 - Fix #page= references on 8 variable files - Add pre-Oct-2024 income eligibility tests for 350% FPL limit - Run make format Co-Authored-By: Claude Opus 4.6 (1M context) --- .../vt/dcf/ccfap/age_group/preschool_max.yaml | 3 + .../vt/dcf/ccfap/family_share/scale.yaml | 84 +++++++++++-------- .../states/vt/dcf/ccfap/income/fpl_limit.yaml | 15 ++-- .../vt/dcf/ccfap/rates/licensed_center.yaml | 20 +++-- .../vt/dcf/ccfap/rates/registered_home.yaml | 56 +++++++++---- .../dcf/ccfap/vt_ccfap_income_eligible.yaml | 58 ++++++++++++- .../vt_ccfap_categorically_exempt.py | 2 +- .../ccfap/eligibility/vt_ccfap_eligible.py | 10 +-- .../eligibility/vt_ccfap_eligible_child.py | 2 +- .../eligibility/vt_ccfap_income_eligible.py | 2 +- .../gov/states/vt/dcf/ccfap/vt_ccfap.py | 2 +- .../states/vt/dcf/ccfap/vt_ccfap_age_group.py | 2 +- .../vt/dcf/ccfap/vt_ccfap_countable_income.py | 2 +- .../vt/dcf/ccfap/vt_ccfap_family_share.py | 2 +- .../vt/dcf/ccfap/vt_ccfap_provider_type.py | 4 +- .../vt/dcf/ccfap/vt_ccfap_state_rate.py | 4 +- uv.lock | 2 +- 17 files changed, 184 insertions(+), 86 deletions(-) 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 fe9ebb935bc..873bfc6e935 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 @@ -1,6 +1,7 @@ description: Vermont defines preschoolers as children up to this age in months under the Child Care Financial Assistance Program. values: 2009-02-09: 60 + 2025-07-13: 72 metadata: unit: month @@ -9,3 +10,5 @@ metadata: reference: - title: CCFAP Regulations Section I B 1 href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=3 + - title: CCFAP Capped State Rates Important Definitions (July 13, 2025) + href: https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/CDD-Guidance-CCFAP-Capped-Rates.pdf#page=1 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 dab8753cc2e..40de5718dc9 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 @@ -7,6 +7,10 @@ metadata: period: week label: Vermont CCFAP weekly family share scale reference: + - title: Report on Adjustment of CCFAP Rates (Jan 15, 2024) Family Contributions + href: https://legislature.vermont.gov/assets/Legislative-Reports/Act-76-CCFAP-Rates-Jan-2024.pdf#page=15 + - title: Act 76 Section 5 + href: https://legislature.vermont.gov/Documents/2024/Docs/ACTS/ACT076/ACT076%20As%20Enacted.pdf - title: CCFAP Income Guidelines (effective October 6, 2024) href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/Benefits/CCFAP-Income-Guidelines.pdf - title: CCFAP Regulations Section IX @@ -14,70 +18,82 @@ metadata: brackets: - threshold: - 2024-01-01: 0 + 2009-02-09: 0 amount: - 2024-01-01: 0 + 2009-02-09: 0 - threshold: - 2024-01-01: 1.7501 + 2009-02-09: 1.5001 amount: - 2024-01-01: 50 + 2009-02-09: 25 + 2024-04-07: 0 - threshold: - 2024-01-01: 2.0001 + 2009-02-09: 1.7501 amount: - 2024-01-01: 75 + 2009-02-09: 50 - threshold: - 2024-01-01: 2.2501 + 2009-02-09: 2.0001 amount: - 2024-01-01: 100 + 2009-02-09: 75 - threshold: - 2024-01-01: 2.5001 + 2009-02-09: 2.2501 amount: - 2024-01-01: 125 + 2009-02-09: 100 - threshold: - 2024-01-01: 2.7501 + 2009-02-09: 2.5001 amount: - 2024-01-01: 150 + 2009-02-09: 125 - threshold: - 2024-01-01: 3.0001 + 2009-02-09: 2.7501 amount: - 2024-01-01: 175 + 2009-02-09: 150 - threshold: - 2024-01-01: 3.2501 + 2009-02-09: 3.0001 amount: - 2024-01-01: 200 + 2009-02-09: 175 - threshold: - 2024-01-01: 3.5001 + 2009-02-09: 3.2501 amount: - 2024-01-01: 225 + 2009-02-09: 200 - threshold: - 2024-01-01: 3.7501 + 2009-02-09: 3.5001 amount: - 2024-01-01: 250 + 2009-02-09: 225 - threshold: - 2024-01-01: 4.0001 + 2009-02-09: 3.7501 amount: - 2024-01-01: 275 + 2009-02-09: 250 - threshold: - 2024-01-01: 4.2501 + 2009-02-09: .inf + 2024-10-06: 4.0001 amount: - 2024-01-01: 300 + 2009-02-09: 275 - threshold: - 2024-01-01: 4.5001 + 2009-02-09: .inf + 2024-10-06: 4.2501 amount: - 2024-01-01: 325 + 2009-02-09: 300 - threshold: - 2024-01-01: 4.7501 + 2009-02-09: .inf + 2024-10-06: 4.5001 amount: - 2024-01-01: 350 + 2009-02-09: 325 - threshold: - 2024-01-01: 5.0001 + 2009-02-09: .inf + 2024-10-06: 4.7501 amount: - 2024-01-01: 375 + 2009-02-09: 350 - threshold: - 2024-01-01: 5.2501 + 2009-02-09: .inf + 2024-10-06: 5.0001 amount: - 2024-01-01: 400 + 2009-02-09: 375 - threshold: - 2024-01-01: 5.5001 + 2009-02-09: .inf + 2024-10-06: 5.2501 amount: - 2024-01-01: 425 + 2009-02-09: 400 + - threshold: + 2009-02-09: .inf + 2024-10-06: 5.5001 + amount: + 2009-02-09: 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 index 4135561ba8a..9ed11207f3b 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 @@ -1,14 +1,17 @@ description: Vermont limits gross income to this share of the federal poverty guideline under the Child Care Financial Assistance Program. values: - 2024-01-01: 4 - 2024-10-01: 5.75 + 2009-02-09: 3.5 + 2024-04-07: 4 + 2024-10-06: 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#page=9 - - title: Act 76 FAQs - href: https://dcf.vermont.gov/benefits/ccfap/act76-faqs + - title: 33 V.S.A. Section 3512 (pre-Act 76) + href: https://legislature.vermont.gov/statutes/section/33/035/03512 + - title: Act 76 FAQs Section 2B + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/Act76/ACT-76-FAQs.pdf#page=7 + - title: CCFAP Income Guidelines (effective October 6, 2024) + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/Benefits/CCFAP-Income-Guidelines.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 index d5ee8c31e90..edb2b34b69f 100644 --- 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 @@ -8,6 +8,8 @@ metadata: - vt_ccfap_care_schedule - vt_ccfap_age_group reference: + - title: CCFAP Rate Increase Per Act 76 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/Act76/CCFAP-Rate-Increase-Per-Act-76.pdf - title: CCFAP State Rates (June 30, 2024) href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-State-Rates.pdf - title: CCFAP Capped State Rates (July 13, 2025) @@ -15,42 +17,48 @@ metadata: FULL_TIME: INFANT: + 2023-07-02: 349 2024-01-01: 471 2025-07-13: 495 TODDLER: + 2023-07-02: 328 2024-01-01: 443 2025-07-13: 465 PRESCHOOL: + 2023-07-02: 325 2024-01-01: 439 - 2025-07-13: 439 SCHOOL_AGE: + 2023-07-02: 275 2024-01-01: 371 - 2025-07-13: 371 PART_TIME: INFANT: + 2023-07-02: 191 2024-01-01: 258 2025-07-13: 271 TODDLER: + 2023-07-02: 180 2024-01-01: 243 2025-07-13: 255 PRESCHOOL: + 2023-07-02: 178 2024-01-01: 240 - 2025-07-13: 240 SCHOOL_AGE: + 2023-07-02: 151 2024-01-01: 204 - 2025-07-13: 204 EXTENDED_CARE: INFANT: + 2023-07-02: 474 2024-01-01: 640 2025-07-13: 672 TODDLER: + 2023-07-02: 446 2024-01-01: 602 2025-07-13: 632 PRESCHOOL: + 2023-07-02: 442 2024-01-01: 597 - 2025-07-13: 597 SCHOOL_AGE: + 2023-07-02: 374 2024-01-01: 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 index 42a950791cb..6586f1b98c9 100644 --- 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 @@ -8,6 +8,8 @@ metadata: - vt_ccfap_care_schedule - vt_ccfap_age_group reference: + - title: CCFAP Rate Increase Per Act 76 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/Act76/CCFAP-Rate-Increase-Per-Act-76.pdf - title: CCFAP State Rates (June 30, 2024) href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-State-Rates.pdf - title: CCFAP Capped State Rates (July 13, 2025) @@ -15,42 +17,60 @@ metadata: FULL_TIME: INFANT: - 2024-01-01: 387 + 2023-07-02: 225 + 2024-01-01: 304 + 2024-06-30: 387 2025-07-13: 407 TODDLER: - 2024-01-01: 364 + 2023-07-02: 211 + 2024-01-01: 285 + 2024-06-30: 364 2025-07-13: 382 PRESCHOOL: - 2024-01-01: 361 - 2025-07-13: 361 + 2023-07-02: 210 + 2024-01-01: 284 + 2024-06-30: 361 SCHOOL_AGE: - 2024-01-01: 321 - 2025-07-13: 321 + 2023-07-02: 200 + 2024-01-01: 270 + 2024-06-30: 321 PART_TIME: INFANT: - 2024-01-01: 212 + 2023-07-02: 123 + 2024-01-01: 166 + 2024-06-30: 212 2025-07-13: 223 TODDLER: - 2024-01-01: 200 + 2023-07-02: 116 + 2024-01-01: 157 + 2024-06-30: 200 2025-07-13: 210 PRESCHOOL: - 2024-01-01: 198 - 2025-07-13: 198 + 2023-07-02: 115 + 2024-01-01: 155 + 2024-06-30: 198 SCHOOL_AGE: - 2024-01-01: 176 - 2025-07-13: 176 + 2023-07-02: 110 + 2024-01-01: 149 + 2024-06-30: 176 EXTENDED_CARE: INFANT: - 2024-01-01: 527 + 2023-07-02: 306 + 2024-01-01: 413 + 2024-06-30: 527 2025-07-13: 553 TODDLER: - 2024-01-01: 494 + 2023-07-02: 286 + 2024-01-01: 386 + 2024-06-30: 494 2025-07-13: 519 PRESCHOOL: - 2024-01-01: 491 - 2025-07-13: 491 + 2023-07-02: 285 + 2024-01-01: 385 + 2024-06-30: 491 SCHOOL_AGE: - 2024-01-01: 436 - 2025-07-13: 436 + 2023-07-02: 272 + 2024-01-01: 367 + 2024-06-30: 436 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 index e14ae74896e..30e432fd7bf 100644 --- 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 @@ -220,7 +220,63 @@ # Income 311,362.50 <= 311,362.50 => eligible vt_ccfap_income_eligible: true -- name: Case 9, multiple income sources combined. +- name: Case 9, pre-Oct-2024 at 350 percent FPL limit, income above threshold. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 95_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] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # 2024 FPG for family of 3 = 15,060 + 2 * 5,380 = 25,820 + # Pre-April 2024 FPL limit = 350% + # 350% FPL = 25,820 * 3.5 = 90,370 + # Income 95,000 > 90,370 => ineligible + vt_ccfap_income_eligible: false + +- name: Case 10, pre-Oct-2024 at 350 percent FPL limit, income below threshold. + period: 2024-01 + input: + people: + person1: + age: 30 + employment_income: 80_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] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # 2024 FPG for family of 3 = 25,820 + # Pre-April 2024 FPL limit = 350% + # 350% FPL = 90,370 + # Income 80,000 <= 90,370 => eligible + vt_ccfap_income_eligible: true + +- name: Case 11, multiple income sources combined. period: 2025-01 input: people: diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_categorically_exempt.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_categorically_exempt.py index a5f6be39d9c..f8922f79101 100644 --- a/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_categorically_exempt.py +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_categorically_exempt.py @@ -8,7 +8,7 @@ class vt_ccfap_categorically_exempt(Variable): defined_for = StateCode.VT label = "Categorically exempt from Vermont CCFAP income test" reference = ( - "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=9", + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=11", "https://legislature.vermont.gov/statutes/section/33/035/03512", ) 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 index 11cf18f0efc..f3f2ad23c29 100644 --- 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 @@ -8,14 +8,12 @@ class vt_ccfap_eligible(Variable): defined_for = StateCode.VT label = "Eligible for Vermont CCFAP" reference = ( - "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf", + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=4", "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 - ) + has_eligible_child = add(spm_unit, period, ["vt_ccfap_eligible_child"]) > 0 asset_eligible = spm_unit("is_ccdf_asset_eligible", period.this_year) income_eligible = spm_unit("vt_ccfap_income_eligible", period) activity_eligible = ( @@ -26,9 +24,7 @@ def formula(spm_unit, period, parameters): ) > 0 ) - categorically_exempt = spm_unit( - "vt_ccfap_categorically_exempt", period - ) + categorically_exempt = spm_unit("vt_ccfap_categorically_exempt", period) return ( has_eligible_child 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 index fe7dba042cf..410f9fa6e17 100644 --- 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 @@ -8,7 +8,7 @@ class vt_ccfap_eligible_child(Variable): 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://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=4", "https://legislature.vermont.gov/statutes/section/33/035/03512", ) 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 index 5999df01c6c..7b41875d07f 100644 --- 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 @@ -8,7 +8,7 @@ class vt_ccfap_income_eligible(Variable): 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://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=9", "https://dcf.vermont.gov/benefits/ccfap/act76-faqs", ) 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 index 15cbddeff9d..d4b3f20fa30 100644 --- a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap.py +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap.py @@ -9,7 +9,7 @@ class vt_ccfap(Variable): 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://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=17", "https://legislature.vermont.gov/statutes/section/33/035/03512", ) 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 index 080f57ce94a..0ef22e8b4e9 100644 --- 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 @@ -16,7 +16,7 @@ class vt_ccfap_age_group(Variable): definition_period = MONTH defined_for = StateCode.VT label = "Vermont CCFAP age group" - reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf" + reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=3" def formula(person, period, parameters): p = parameters(period).gov.states.vt.dcf.ccfap.age_group 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 index 6a1b97f044c..db27a5ca910 100644 --- 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 @@ -8,6 +8,6 @@ class vt_ccfap_countable_income(Variable): definition_period = MONTH defined_for = StateCode.VT label = "Vermont CCFAP countable income" - reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf" + reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=9" 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 index e081e504a0b..70fee0721be 100644 --- 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 @@ -10,7 +10,7 @@ class vt_ccfap_family_share(Variable): label = "Vermont CCFAP monthly family share (copayment)" reference = ( "https://outside.vermont.gov/dept/DCF/Shared%20Documents/Benefits/CCFAP-Income-Guidelines.pdf", - "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf", + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=17", ) def formula(spm_unit, period, parameters): 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 index a3b8538b139..7d6e5bc3a05 100644 --- 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 @@ -17,9 +17,7 @@ class vt_ccfap_provider_type(Variable): reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-State-Rates.pdf" def formula(person, period, parameters): - provider_group = person( - "childcare_provider_type_group", period.this_year - ) + provider_group = person("childcare_provider_type_group", period.this_year) is_center = provider_group == provider_group.possible_values.DCC_SACC return where( is_center, 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 index 9518bb431e6..6857fdeadc5 100644 --- 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 @@ -18,9 +18,7 @@ def formula(person, period, parameters): 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 - ) + 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/uv.lock b/uv.lock index efec4d8555d..7adaf13620b 100644 --- a/uv.lock +++ b/uv.lock @@ -1492,7 +1492,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.592.1" +version = "1.598.0" source = { editable = "." } dependencies = [ { name = "microdf-python" }, From f0fc005ab642dc7b56d52b514c9d698129e55cc6 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 17 Mar 2026 17:31:05 -0400 Subject: [PATCH 9/9] Consolidate age group and care schedule into bracket parameters - Replace 3 separate age_group files (infant_max, toddler_max, preschool_max) with single age_group/months.yaml bracket parameter using .calc() - Replace 2 separate care_schedule files (part_time_max, full_time_max) with single care_schedule/hours.yaml bracket parameter using .calc() - Simplify both variables to return p.xxx.calc() directly (Enum index mapping) - Add Jane Smith and Honey Child Care test cases from Understanding Payments PDF - Both PDF examples match exactly: $337/wk and $193/wk respectively Co-Authored-By: Claude Opus 4.6 (1M context) --- .../vt/dcf/ccfap/age_group/infant_max.yaml | 11 -- .../states/vt/dcf/ccfap/age_group/months.yaml | 32 +++++ .../vt/dcf/ccfap/age_group/preschool_max.yaml | 14 --- .../vt/dcf/ccfap/age_group/toddler_max.yaml | 11 -- .../ccfap/care_schedule/full_time_max.yaml | 11 -- .../vt/dcf/ccfap/care_schedule/hours.yaml | 27 +++++ .../ccfap/care_schedule/part_time_max.yaml | 11 -- .../gov/states/vt/dcf/ccfap/integration.yaml | 112 +++++++++++++++++- .../states/vt/dcf/ccfap/vt_ccfap_age_group.py | 14 +-- .../vt/dcf/ccfap/vt_ccfap_care_schedule.py | 12 +- 10 files changed, 172 insertions(+), 83 deletions(-) delete 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/months.yaml delete mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/preschool_max.yaml delete mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/toddler_max.yaml delete 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/hours.yaml delete mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/part_time_max.yaml 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 deleted file mode 100644 index 48fda646505..00000000000 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/infant_max.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Vermont defines infants as children up to this age in months under the Child Care Financial Assistance Program. -values: - 2009-02-09: 24 - -metadata: - unit: month - period: year - label: Vermont CCFAP infant age limit - reference: - - 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/months.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/months.yaml new file mode 100644 index 00000000000..c2977ba5b98 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/months.yaml @@ -0,0 +1,32 @@ +description: Vermont sets these age thresholds in months for child care age group classification under the Child Care Financial Assistance Program. + +brackets: + - threshold: + 2009-02-09: 0 + amount: + 2009-02-09: 0 # INFANT + - threshold: + 2009-02-09: 24 + amount: + 2009-02-09: 1 # TODDLER + - threshold: + 2009-02-09: 36 + amount: + 2009-02-09: 2 # PRESCHOOL + - threshold: + 2009-02-09: 60 + 2025-07-13: 72 + amount: + 2009-02-09: 3 # SCHOOL_AGE + +metadata: + type: single_amount + threshold_unit: month + amount_unit: /1 + period: year + label: Vermont CCFAP age group month thresholds + reference: + - title: CCFAP Regulations Section I B 1 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=3 + - title: CCFAP Capped State Rates Important Definitions (July 13, 2025) + href: https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/CDD-Guidance-CCFAP-Capped-Rates.pdf#page=1 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 deleted file mode 100644 index 873bfc6e935..00000000000 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/preschool_max.yaml +++ /dev/null @@ -1,14 +0,0 @@ -description: Vermont defines preschoolers as children up to this age in months under the Child Care Financial Assistance Program. -values: - 2009-02-09: 60 - 2025-07-13: 72 - -metadata: - unit: month - period: year - label: Vermont CCFAP preschool age limit - reference: - - title: CCFAP Regulations Section I B 1 - href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=3 - - title: CCFAP Capped State Rates Important Definitions (July 13, 2025) - href: https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/CDD-Guidance-CCFAP-Capped-Rates.pdf#page=1 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 deleted file mode 100644 index ef4b397166e..00000000000 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/toddler_max.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Vermont defines toddlers as children up to this age in months under the Child Care Financial Assistance Program. -values: - 2009-02-09: 36 - -metadata: - unit: month - period: year - label: Vermont CCFAP toddler age limit - reference: - - 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/care_schedule/full_time_max.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/full_time_max.yaml deleted file mode 100644 index b6ded28ef63..00000000000 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/full_time_max.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Vermont sets this amount as the maximum weekly hours for full-time care under the Child Care Financial Assistance Program. -values: - 2009-02-09: 50 - -metadata: - unit: hour - period: week - label: Vermont CCFAP full-time maximum hours - reference: - - 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/hours.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/hours.yaml new file mode 100644 index 00000000000..3d50c3979e0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/hours.yaml @@ -0,0 +1,27 @@ +description: Vermont sets these weekly hour thresholds for child care schedule classification under the Child Care Financial Assistance Program. + +brackets: + - threshold: + 2009-02-09: 0 + amount: + 2009-02-09: 0 # PART_TIME + - threshold: + 2009-02-09: 25.0001 # Above 25 hours + amount: + 2009-02-09: 1 # FULL_TIME + - threshold: + 2009-02-09: 50.0001 # Above 50 hours + amount: + 2009-02-09: 2 # EXTENDED_CARE + +metadata: + type: single_amount + threshold_unit: hour + amount_unit: /1 + period: year + label: Vermont CCFAP care schedule hour thresholds + reference: + - title: CCFAP Regulations Section I B 3 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=4 + - title: CCFAP Capped State Rates Important Definitions (July 13, 2025) + href: https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/CDD-Guidance-CCFAP-Capped-Rates.pdf#page=1 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 deleted file mode 100644 index 41c0d483a01..00000000000 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/part_time_max.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Vermont sets this amount as the maximum weekly hours for part-time care under the Child Care Financial Assistance Program. -values: - 2009-02-09: 25 - -metadata: - unit: hour - period: week - label: Vermont CCFAP part-time maximum hours - reference: - - 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/tests/policy/baseline/gov/states/vt/dcf/ccfap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/integration.yaml index 9577c752caa..df40271c036 100644 --- 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 @@ -657,7 +657,117 @@ # Benefit = max(2,773.33 - 541.67, 0) = $2,231.67 vt_ccfap: 2_231.67 -- name: Case 11, protective services child with mixed eligible and ineligible children. +- name: Case 11, Jane Smith example from Understanding Payments guide. + # Source: CCFAP Understanding Payments (Rev Feb 7, 2025), page 2. + # Registered Family Child Home, infant, full-time, family share $50/wk. + # State rate = $387. State pays $387 - $50 = $337/wk. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 38_000 + person2: + age: 1 + 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: 13_000 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, INFANT] + + # Care schedule: 5 * 8 = 40 hrs/wk => full time + vt_ccfap_care_schedule: [PART_TIME, FULL_TIME] + + # Provider type: FDC_GFDC => registered home + vt_ccfap_provider_type: [LICENSED_CENTER, REGISTERED_HOME] + + # State rate: registered home, full time, infant = $387/wk + vt_ccfap_state_rate: [0, 387] + + # Income + # FPG for family of 2 = 21,150 + # FPL ratio = 38,000 / 21,150 = 1.797 + vt_ccfap_countable_income: 3_166.67 + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 1.797 >= 1.7501 => $50/wk (matches PDF example) + # Monthly: $50 * 52 / 12 = $216.67 + vt_ccfap_family_share: 216.67 + + # Benefit + # Weekly: $387 - $50 = $337/wk (matches PDF: "State will pay the provider $337") + # Monthly: $337 * 52 / 12 = $1,460.33 + vt_ccfap: 1_460.33 + +- name: Case 12, Honey Child Care example from Understanding Payments guide. + # Source: CCFAP Understanding Payments (Rev Feb 7, 2025), page 2. + # Center Based, toddler, part-time, family share $50/wk. + # State rate = $243. State pays $243 - $50 = $193/wk. + absolute_error_margin: 0.01 + period: 2025-01 + input: + people: + person1: + age: 30 + employment_income: 38_000 + person2: + age: 2 + 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: 13_520 + spm_units: + spm_unit: + members: [person1, person2] + meets_ccdf_activity_test: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Age group: age 2 = 24 months => toddler (24-35 months) + vt_ccfap_age_group: [SCHOOL_AGE, TODDLER] + + # Care schedule: 5 * 4 = 20 hrs/wk => part time (<=25) + vt_ccfap_care_schedule: [PART_TIME, PART_TIME] + + # Provider type: DCC_SACC => licensed center + vt_ccfap_provider_type: [LICENSED_CENTER, LICENSED_CENTER] + + # State rate: licensed center, part time, toddler = $243/wk + vt_ccfap_state_rate: [0, 243] + + # Income + # FPG for family of 2 = 21,150 + # FPL ratio = 38,000 / 21,150 = 1.797 + vt_ccfap_countable_income: 3_166.67 + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 1.797 >= 1.7501 => $50/wk (matches PDF example) + # Monthly: $50 * 52 / 12 = $216.67 + vt_ccfap_family_share: 216.67 + + # Benefit + # Weekly: $243 - $50 = $193/wk (matches PDF: "State will pay the provider $193") + # Monthly: $193 * 52 / 12 = $836.33 + vt_ccfap: 836.33 + +- name: Case 13, protective services child with mixed eligible and ineligible children. absolute_error_margin: 0.01 period: 2025-01 input: 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 index 0ef22e8b4e9..e5fd35be90b 100644 --- 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 @@ -22,16 +22,4 @@ def formula(person, period, parameters): p = parameters(period).gov.states.vt.dcf.ccfap.age_group age = person("age", period.this_year) 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, - ) + return p.months.calc(age_months) 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 index 80ad9e79291..cd327510166 100644 --- 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 @@ -20,14 +20,4 @@ class vt_ccfap_care_schedule(Variable): def formula(person, period, parameters): p = parameters(period).gov.states.vt.dcf.ccfap.care_schedule hours = person("childcare_hours_per_week", period.this_year) - return select( - [ - hours <= p.part_time_max, - hours <= p.full_time_max, - ], - [ - VTCCFAPCareSchedule.PART_TIME, - VTCCFAPCareSchedule.FULL_TIME, - ], - default=VTCCFAPCareSchedule.EXTENDED_CARE, - ) + return p.hours.calc(hours)