From 8a2af3886d114d5bc47f40bdff22a07072d27d23 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Fri, 16 Oct 2026 15:28:31 -0400 Subject: [PATCH 1/6] Limit Hawaii TANF dependent care deduction to incapacitated adults HAR 17-676-54.1(c)(4) and (d)(4) and the HAR 17-676-2 definition deduct only the cost of care for each incapacitated adult in the household. The formula also deducted the unit's child care expenses and counted children in the per-person cap. Drop the child care side and convert the tests. Co-Authored-By: Claude Opus 5.5 --- .../tanf/hi_tanf_countable_earned_income.yaml | 27 +- .../hi_tanf_dependent_care_deduction.yaml | 256 ++++++++---------- .../gov/states/hi/dhs/tanf/integration.yaml | 17 +- .../hi_tanf_dependent_care_deduction.py | 17 +- 4 files changed, 143 insertions(+), 174 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/hi_tanf_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/hi_tanf_countable_earned_income.yaml index 8a28757eca2..76679284278 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/hi_tanf_countable_earned_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/hi_tanf_countable_earned_income.yaml @@ -34,7 +34,7 @@ # Step 2: $200 flat = 400 - 200 = 200 # Step 3: 55% = 200 × 0.45 = 90 # Total: 450 + 90 = 540 - # No childcare expenses, so no dependent care deduction + # No care expenses, so no dependent care deduction hi_tanf_countable_earned_income: 540 - name: Case 2, earned income with dependent care deduction. @@ -46,12 +46,13 @@ tanf_gross_earned_income: 1_000 weekly_hours_worked_before_lsr: 40 person2: - age: 5 + age: 40 + is_disabled: true + # $1,200/year = $100/month disabled adult care + care_expenses: 1_200 spm_units: spm_unit: members: [person1, person2] - # $1,200/year = $100/month childcare - childcare_expenses: 1_200 tax_units: tax_unit: members: [person1, person2] @@ -61,11 +62,11 @@ state_code: HI output: # Person1 earned after deductions: 270 - # Dependent care: min(100, 1 child × $175) = 100 + # Dependent care: min(100, 1 disabled adult × $175) = 100 # Final: max(270 - 100, 0) = 170 hi_tanf_countable_earned_income: 170 -- name: Case 3, dependent care deduction capped at per-child max. +- name: Case 3, dependent care deduction capped at per-adult max. period: 2024-01 input: people: @@ -74,12 +75,13 @@ tanf_gross_earned_income: 1_500 weekly_hours_worked_before_lsr: 40 person2: - age: 5 + age: 40 + is_disabled: true + # $6,000/year = $500/month disabled adult care, exceeds $175 cap + care_expenses: 6_000 spm_units: spm_unit: members: [person1, person2] - # $6,000/year = $500/month childcare, exceeds $175 cap - childcare_expenses: 6_000 tax_units: tax_unit: members: [person1, person2] @@ -89,7 +91,7 @@ state_code: HI output: # Person1 earned after deductions: 450 - # Dependent care: min(500, 1 child × $175) = 175 + # Dependent care: min(500, 1 disabled adult × $175) = 175 # Final: max(450 - 175, 0) = 275 hi_tanf_countable_earned_income: 275 @@ -103,11 +105,12 @@ tanf_gross_earned_income: 200 weekly_hours_worked_before_lsr: 40 person2: - age: 5 + age: 40 + is_disabled: true + care_expenses: 2_400 spm_units: spm_unit: members: [person1, person2] - childcare_expenses: 2_400 tax_units: tax_unit: members: [person1, person2] diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.yaml index 6df22fdedb2..f53c110fb9e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.yaml @@ -1,10 +1,13 @@ # Hawaii TANF dependent care deduction tests -# Deduction is actual childcare expenses, capped at rate per child per month +# Deduction is the actual cost of care for each incapacitated (disabled) +# adult in the household, capped per adult per month. +# Child care is not deducted. # Rate: $175 (full-time, 32+ hrs) or $165 (part-time, <32 hrs) # Uses MAX of adult hours - if either parent is full-time, use full-time rate -# Per Hawaii TANF State Plan +# Per HAR 17-676-54.1(c)(4) and (d)(4), HAR 17-676-2 and the Hawaii TANF +# State Plan section 10.2.1(D) -- name: Case 1, no childcare expenses. +- name: Case 1, no care expenses. period: 2024-01 input: people: @@ -26,7 +29,7 @@ output: hi_tanf_dependent_care_deduction: 0 -- name: Case 2, single parent full-time, expenses below cap. +- name: Case 2, child care for a child in the unit is not deducted. period: 2024-01 input: people: @@ -38,8 +41,8 @@ spm_units: spm_unit: members: [person1, person2] - # $1,200/year = $100/month, below $175 cap - childcare_expenses: 1_200 + # $3,600/year = $300/month + childcare_expenses: 3_600 tax_units: tax_unit: members: [person1, person2] @@ -48,11 +51,11 @@ members: [person1, person2] state_code: HI output: - # 40 hrs = full-time, $175 cap - # $100/month < $175 cap, so full amount deducted - hi_tanf_dependent_care_deduction: 100 + # HAR 17-676-54.1(c)(4) and (d)(4) deduct only the care of an + # incapacitated adult; no incapacitated adult here, so $0. + hi_tanf_dependent_care_deduction: 0 -- name: Case 3, single parent full-time, expenses above cap. +- name: Case 3, child care for three children is not deducted. period: 2024-01 input: people: @@ -60,177 +63,165 @@ age: 30 weekly_hours_worked_before_lsr: 40 person2: - age: 5 + age: 10 + person3: + age: 7 + person4: + age: 4 spm_units: spm_unit: - members: [person1, person2] - # $3,600/year = $300/month, above $175 cap - childcare_expenses: 3_600 + members: [person1, person2, person3, person4] + # $8,400/year = $700/month + childcare_expenses: 8_400 tax_units: tax_unit: - members: [person1, person2] + members: [person1, person2, person3, person4] households: household: - members: [person1, person2] + members: [person1, person2, person3, person4] state_code: HI output: - # 40 hrs = full-time, $175 cap - # $300/month > $175 cap, capped at 1 child × $175 = $175 - hi_tanf_dependent_care_deduction: 175 + # No incapacitated adult, so $0. + hi_tanf_dependent_care_deduction: 0 -- name: Case 4, single parent part-time, expenses above cap. +- name: Case 4, disabled adult care below the full-time cap. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 - weekly_hours_worked_before_lsr: 20 + weekly_hours_worked_before_lsr: 40 person2: - age: 5 + age: 25 + is_disabled: true + care_expenses: 1_200 spm_units: spm_unit: members: [person1, person2] - # $3,600/year = $300/month, above $165 cap - childcare_expenses: 3_600 - tax_units: - tax_unit: - members: [person1, person2] households: household: members: [person1, person2] state_code: HI output: - # 20 hrs = part-time, $165 cap - # $300/month > $165 cap, capped at 1 child × $165 = $165 - hi_tanf_dependent_care_deduction: 165 + # 40 hrs = full-time, $175 cap per disabled adult. + # Expenses = 1,200 / 12 = 100/month, below the cap. + hi_tanf_dependent_care_deduction: 100 -- name: Case 5, two parents both full-time, uses full-time rate. +- name: Case 5, disabled adult care above the full-time cap. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 weekly_hours_worked_before_lsr: 40 person2: - age: 28 - weekly_hours_worked_before_lsr: 35 - person3: - age: 5 + age: 25 + is_disabled: true + care_expenses: 3_600 spm_units: spm_unit: - members: [person1, person2, person3] - # $3,600/year = $300/month - childcare_expenses: 3_600 - tax_units: - tax_unit: - members: [person1, person2, person3] + members: [person1, person2] households: household: - members: [person1, person2, person3] + members: [person1, person2] state_code: HI output: - # MAX(40, 35) = 40 hrs = full-time, $175 cap - # $300/month > $175 cap, capped at $175 + # $300/month > $175 cap: min(300, 1 x 175) = 175 hi_tanf_dependent_care_deduction: 175 -- name: Case 6, two parents one part-time, uses full-time rate (MAX). +- name: Case 6, disabled adult care above the part-time cap. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 - weekly_hours_worked_before_lsr: 40 - person2: - age: 28 weekly_hours_worked_before_lsr: 20 - person3: - age: 5 + person2: + age: 25 + is_disabled: true + care_expenses: 3_600 spm_units: spm_unit: - members: [person1, person2, person3] - # $3,600/year = $300/month - childcare_expenses: 3_600 - tax_units: - tax_unit: - members: [person1, person2, person3] + members: [person1, person2] households: household: - members: [person1, person2, person3] + members: [person1, person2] state_code: HI output: - # MAX(40, 20) = 40 hrs = full-time, $175 cap - # $300/month > $175 cap, capped at $175 - hi_tanf_dependent_care_deduction: 175 + # 20 hrs = part-time, $165 cap: min(300, 165) = 165 + hi_tanf_dependent_care_deduction: 165 -- name: Case 7, two children, full-time parent. +- name: Case 7, two parents one part-time, uses full-time rate (MAX). period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 weekly_hours_worked_before_lsr: 40 person2: - age: 5 + age: 28 + weekly_hours_worked_before_lsr: 20 person3: - age: 8 + age: 60 + is_disabled: true + care_expenses: 3_600 spm_units: spm_unit: members: [person1, person2, person3] - # $6,000/year = $500/month, above 2 × $175 = $350 cap - childcare_expenses: 6_000 - tax_units: - tax_unit: - members: [person1, person2, person3] households: household: members: [person1, person2, person3] state_code: HI output: - # 40 hrs = full-time, $175 per child - # $500/month > $350 cap, capped at 2 children × $175 = $350 - hi_tanf_dependent_care_deduction: 350 + # MAX(40, 20, 0) = 40 hrs = full-time, $175 cap + # $300/month > $175 cap, capped at $175 + hi_tanf_dependent_care_deduction: 175 -- name: Case 8, no children in household. +- name: Case 8, two parents both part-time, uses part-time rate. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 - weekly_hours_worked_before_lsr: 40 + weekly_hours_worked_before_lsr: 25 person2: - age: 25 - weekly_hours_worked_before_lsr: 40 + age: 28 + weekly_hours_worked_before_lsr: 20 + person3: + age: 60 + is_disabled: true + care_expenses: 3_600 spm_units: spm_unit: - members: [person1, person2] - childcare_expenses: 2_400 - tax_units: - tax_unit: - members: [person1, person2] + members: [person1, person2, person3] households: household: - members: [person1, person2] + members: [person1, person2, person3] state_code: HI output: - # No children means cap = 0 children × $175 = $0 - hi_tanf_dependent_care_deduction: 0 + # MAX(25, 20, 0) = 25 hrs = part-time, $165 cap + hi_tanf_dependent_care_deduction: 165 - name: Case 9, exactly 32 hours (boundary between part-time and full-time). period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 weekly_hours_worked_before_lsr: 32 person2: - age: 5 + age: 25 + is_disabled: true + care_expenses: 3_600 spm_units: spm_unit: members: [person1, person2] - childcare_expenses: 3_600 - tax_units: - tax_unit: - members: [person1, person2] households: household: members: [person1, person2] @@ -239,49 +230,21 @@ # 32 hrs = full-time (32+ threshold), $175 cap hi_tanf_dependent_care_deduction: 175 -- name: Case 10, two parents both part-time, uses part-time rate. - period: 2024-01 - input: - people: - person1: - age: 30 - weekly_hours_worked_before_lsr: 25 - person2: - age: 28 - weekly_hours_worked_before_lsr: 20 - person3: - age: 5 - spm_units: - spm_unit: - members: [person1, person2, person3] - childcare_expenses: 3_600 - tax_units: - tax_unit: - members: [person1, person2, person3] - households: - household: - members: [person1, person2, person3] - state_code: HI - output: - # MAX(25, 20) = 25 hrs = part-time, $165 cap - hi_tanf_dependent_care_deduction: 165 - -- name: Case 11, exactly 31 hours (just under full-time threshold). +- name: Case 10, exactly 31 hours (just under full-time threshold). period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 weekly_hours_worked_before_lsr: 31 person2: - age: 5 + age: 25 + is_disabled: true + care_expenses: 3_600 spm_units: spm_unit: members: [person1, person2] - childcare_expenses: 3_600 - tax_units: - tax_unit: - members: [person1, person2] households: household: members: [person1, person2] @@ -290,37 +253,35 @@ # 31 hrs < 32 threshold = part-time, $165 cap hi_tanf_dependent_care_deduction: 165 -- name: Case 12, three children, full-time parent. +- name: Case 11, two disabled adults, cap per disabled adult. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 weekly_hours_worked_before_lsr: 40 person2: - age: 10 + age: 60 + is_disabled: true + care_expenses: 3_600 person3: - age: 7 - person4: - age: 4 + age: 62 + is_disabled: true + care_expenses: 3_600 spm_units: spm_unit: - members: [person1, person2, person3, person4] - # $8,400/year = $700/month, above 3 × $175 = $525 cap - childcare_expenses: 8_400 - tax_units: - tax_unit: - members: [person1, person2, person3, person4] + members: [person1, person2, person3] households: household: - members: [person1, person2, person3, person4] + members: [person1, person2, person3] state_code: HI output: - # 40 hrs = full-time, $175 per child - # $700/month > $525 cap, capped at 3 children × $175 = $525 - hi_tanf_dependent_care_deduction: 525 + # Expenses = 300 + 300 = 600/month + # Cap = 2 disabled adults x $175 = $350 + hi_tanf_dependent_care_deduction: 350 -- name: Case 13, disabled adult household member care expenses. +- name: Case 12, child care and disabled adult care, only the adult care counts. period: 2024-01 absolute_error_margin: 0.01 input: @@ -329,23 +290,26 @@ age: 30 weekly_hours_worked_before_lsr: 40 person2: - age: 25 + age: 5 + person3: + age: 60 is_disabled: true care_expenses: 1_200 spm_units: spm_unit: - members: [person1, person2] + members: [person1, person2, person3] + # $3,600/year = $300/month child care, not deductible + childcare_expenses: 3_600 households: household: - members: [person1, person2] + members: [person1, person2, person3] state_code: HI output: - # Per State Plan 10.2.1(D): care of a disabled adult household member - # up to $175/month (full-time employment, 40 hours >= 32). - # Expenses = 1,200 / 12 = 100/month, below the cap. + # Adult care = 1,200 / 12 = 100/month; cap = 1 disabled adult x $175 + # min(100, 175) = 100 hi_tanf_dependent_care_deduction: 100 -- name: Case 14, adult care expenses without disability are not deducted. +- name: Case 13, adult care expenses without disability are not deducted. period: 2024-01 absolute_error_margin: 0.01 input: @@ -364,6 +328,6 @@ members: [person1, person2] state_code: HI output: - # Person2 is neither a child nor a disabled adult, so no care - # recipients: min(100, 0) = 0. + # Person2 is not a disabled adult, so no care recipients: + # min(100, 0) = 0. hi_tanf_dependent_care_deduction: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/integration.yaml index ddb1fcd3a82..b140c42588d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/integration.yaml @@ -251,7 +251,7 @@ # Benefit = 610.56 - 570 = 40.56 hi_tanf: 40.56 -- name: Case 7, family with dependent care deduction in full pipeline. +- name: Case 7, child care expenses do not reduce countable income in full pipeline. period: 2024-01 input: people: @@ -280,20 +280,21 @@ output: hi_tanf_gross_income: 1_500 hi_tanf_gross_income_eligible: true - # Dependent care: min(150, 1 child × $175) = 150 - hi_tanf_dependent_care_deduction: 150 + # HAR 17-676-54.1(c)(4) and (d)(4) deduct only the care of an + # incapacitated adult, so the child's care is not deducted. + hi_tanf_dependent_care_deduction: 0 # Earned deductions for $1,500: # Step 1: 20% = 300, After: 1,200 # Step 2: $200 flat, After: 1,000 # Step 3: 55% = 550, After: 450 - # After dependent care: max(450 - 150, 0) = 300 - hi_tanf_countable_earned_income: 300 - hi_tanf_countable_income: 300 + # No dependent care deduction: 450 + hi_tanf_countable_earned_income: 450 + hi_tanf_countable_income: 450 # SOA = 1265 × 0.48 × 0.80 = 485.76 (mandatory-work steady-state) hi_tanf_maximum_benefit: 485.76 hi_tanf_eligible: true - # Benefit = 485.76 - 300 = 185.76 - hi_tanf: 185.76 + # Benefit = 485.76 - 450 = 35.76 + hi_tanf: 35.76 - name: Case 8, single person with no income. period: 2024-01 diff --git a/policyengine_us/variables/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.py b/policyengine_us/variables/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.py index a07aa2f7839..25cdf7aef2a 100644 --- a/policyengine_us/variables/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.py +++ b/policyengine_us/variables/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.py @@ -8,6 +8,8 @@ class hi_tanf_dependent_care_deduction(Variable): unit = USD definition_period = MONTH reference = ( + "https://www.law.cornell.edu/regulations/hawaii/Haw-Code-R-SS-17-676-54-1", + "https://www.law.cornell.edu/regulations/hawaii/Haw-Code-R-SS-17-676-2", "https://humanservices.hawaii.gov/wp-content/uploads/2024/12/Hawaii_TANF_State_Plan_Signed_Certified-Eff_20231001.pdf#page=20", ) defined_for = StateCode.HI @@ -15,18 +17,17 @@ class hi_tanf_dependent_care_deduction(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.states.hi.dhs.tanf.deductions.dependent_care - # Per State Plan section 10.2.1(D), the deduction covers the cost - # of care for a disabled adult household member; care of children - # also flows through the same per-person caps. - childcare_expenses = spm_unit("childcare_expenses", period) + # Per HAR 17-676-54.1(c)(4) and (d)(4) and the HAR 17-676-2 + # definition, the deduction covers only the cost of care for each + # incapacitated adult in the household (State Plan section 10.2.1(D): + # a disabled adult household member). Child care is not deducted. adult_care_expenses = add(spm_unit, period, ["care_expenses"]) - # Count children and disabled adults in the unit for the per-person cap + # Count disabled adults in the unit for the per-person cap person = spm_unit.members - is_child = person("is_child", period.this_year) is_adult = ~person("is_child", period.this_year) is_disabled_adult = is_adult & person("is_disabled", period.this_year) - num_care_recipients = spm_unit.sum(is_child | is_disabled_adult) + num_care_recipients = spm_unit.sum(is_disabled_adult) # Determine rate based on MAX of adult hours # If either parent works full-time, use full-time rate @@ -41,4 +42,4 @@ def formula(spm_unit, period, parameters): max_deduction = num_care_recipients * rate # Deduct actual cost up to max per care recipient - return min_(childcare_expenses + adult_care_expenses, max_deduction) + return min_(adult_care_expenses, max_deduction) From 6d0125a285bbd551365842bcd6a0670bccd81a71 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Fri, 16 Oct 2026 15:33:48 -0400 Subject: [PATCH 2/6] Stop deducting Reach Up children's child care in Vermont Reach Up Code Vt. R. 13-170-220-X rule 2252.2 allows the dependent care deduction for the care of a disabled or seriously ill adult household member, and for a child who is not a member of the Reach Up household. ESD Procedure P-2230A step 2 says the same. The formula also deducted the unit's own child care expenses. Drop them and convert the tests. Co-Authored-By: Claude Opus 5.5 --- .../states/vt/dcf/reach_up/integration.yaml | 22 +-- .../vt_reach_up_dependent_care_deduction.yaml | 136 ++++++++++++++---- .../vt_reach_up_dependent_care_deduction.py | 13 +- 3 files changed, 130 insertions(+), 41 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/integration.yaml index 77fcddab4ad..1d414ce48f8 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/integration.yaml @@ -576,7 +576,7 @@ # Benefit: $1,721.12 - $0 = $1,721.12 (full benefit) vt_reach_up: 1_721.12 -- name: Case 10, two-parent family with childcare expenses. +- name: Case 10, two-parent family with child care expenses that are not deducted. period: 2024-01 absolute_error_margin: 0.01 input: @@ -628,22 +628,22 @@ vt_reach_up_countable_earned_income_person: [337.5, 112.5, 0] # Dependent care deduction: - # 2 participants (head/spouse) x $175 = $350 max - # Actual expenses: $300 - # Deduction: min($300, $350) = $300 - vt_reach_up_dependent_care_deduction: 300 + # Rule 2252.2 covers care of a disabled or seriously ill adult and + # of a child outside the Reach Up household; the $300/month of child + # care for person3, a Reach Up child, is not deducted. + vt_reach_up_dependent_care_deduction: 0 - # Countable earned: max_($450 - $300, 0) = $150 - vt_reach_up_countable_earned_income: 150 + # Countable earned: max_($450 - $0, 0) = $450 + vt_reach_up_countable_earned_income: 450 # No unearned income vt_reach_up_countable_unearned_income: 0 - # Total countable: $150 - vt_reach_up_countable_income: 150 + # Total countable: $450 + vt_reach_up_countable_income: 450 # Eligible: true vt_reach_up_eligible: true - # Benefit: $856.096 - $150 = $706.10 - vt_reach_up: 706.10 + # Benefit: $856.096 - $450 = $406.10 + vt_reach_up: 406.10 diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/vt_reach_up_dependent_care_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/vt_reach_up_dependent_care_deduction.yaml index a10c1d143a0..7418f2b9e7f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/vt_reach_up_dependent_care_deduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/reach_up/vt_reach_up_dependent_care_deduction.yaml @@ -1,8 +1,10 @@ # Vermont Reach Up Dependent Care Deduction # Max $175/month per participant (head or spouse) -# Source: Code Vt. R. 13-170-220-X Section 2252.2 +# Covers care of a disabled or seriously ill adult household member; +# child care for children in the Reach Up household is not deducted. +# Source: Code Vt. R. 13-170-220-X Section 2252.2; ESD Procedure P-2230A -- name: Case 1, zero childcare expenses. +- name: Case 1, zero care expenses. period: 2024-01 input: people: @@ -22,97 +24,151 @@ output: vt_reach_up_dependent_care_deduction: 0 -- name: Case 2, one participant childcare below max. +- name: Case 2, child care for a Reach Up child is not deducted. period: 2024-01 input: people: person1: + age: 30 is_tax_unit_head_or_spouse: true + person2: + age: 4 + is_tax_unit_head_or_spouse: false spm_units: spm_unit: - members: [person1] + members: [person1, person2] childcare_expenses: 1_200 # $100/month tax_units: tax_unit: - members: [person1] + members: [person1, person2] households: household: - members: [person1] + members: [person1, person2] state_code: VT output: - # min($100, $175) = $100 + # Rule 2252.2(b) covers only a child who is not a member of the + # Reach Up household; P-2230A step 2: "incapacitated adult or + # non-Reach Up member". The child here is in the unit, so $0. + vt_reach_up_dependent_care_deduction: 0 + +- name: Case 3, one participant, disabled adult care below max. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + is_tax_unit_head_or_spouse: true + person2: + age: 60 + is_tax_unit_head_or_spouse: false + is_disabled: true + care_expenses: 1_200 # $100/month + spm_units: + spm_unit: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Rule 2252.2(a): care of a disabled or seriously ill adult. + # min($100, 1 participant x $175) = $100 vt_reach_up_dependent_care_deduction: 100 -- name: Case 3, one participant childcare above max. +- name: Case 4, one participant, disabled adult care above max. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: + age: 30 is_tax_unit_head_or_spouse: true + person2: + age: 60 + is_tax_unit_head_or_spouse: false + is_disabled: true + care_expenses: 3_600 # $300/month spm_units: spm_unit: - members: [person1] - childcare_expenses: 3_600 # $300/month + members: [person1, person2] tax_units: tax_unit: - members: [person1] + members: [person1, person2] households: household: - members: [person1] + members: [person1, person2] state_code: VT output: # min($300, $175) = $175 (capped) vt_reach_up_dependent_care_deduction: 175 -- name: Case 4, two participants childcare below double max. +- name: Case 5, two participants, disabled adult care below double max. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: + age: 30 is_tax_unit_head_or_spouse: true person2: + age: 30 is_tax_unit_head_or_spouse: true + person3: + age: 60 + is_tax_unit_head_or_spouse: false + is_disabled: true + care_expenses: 3_000 # $250/month spm_units: spm_unit: - members: [person1, person2] - childcare_expenses: 3_000 # $250/month + members: [person1, person2, person3] tax_units: tax_unit: - members: [person1, person2] + members: [person1, person2, person3] households: household: - members: [person1, person2] + members: [person1, person2, person3] state_code: VT output: # 2 participants = $350 max # min($250, $350) = $250 vt_reach_up_dependent_care_deduction: 250 -- name: Case 5, two participants childcare above double max. +- name: Case 6, two participants, disabled adult care above double max. period: 2024-01 + absolute_error_margin: 0.01 input: people: person1: + age: 30 is_tax_unit_head_or_spouse: true person2: + age: 30 is_tax_unit_head_or_spouse: true + person3: + age: 60 + is_tax_unit_head_or_spouse: false + is_disabled: true + care_expenses: 6_000 # $500/month spm_units: spm_unit: - members: [person1, person2] - childcare_expenses: 6_000 # $500/month + members: [person1, person2, person3] tax_units: tax_unit: - members: [person1, person2] + members: [person1, person2, person3] households: household: - members: [person1, person2] + members: [person1, person2, person3] state_code: VT output: # 2 participants = $350 max # min($500, $350) = $350 (capped) vt_reach_up_dependent_care_deduction: 350 -- name: Case 6, disabled adult care expenses count toward the deduction. +- name: Case 7, disabled adult care expenses count toward the deduction. period: 2024-01 absolute_error_margin: 0.01 input: @@ -123,8 +179,7 @@ age: 35 # Describe the legal scenario (Rule 2252.2(a) covers a disabled or # seriously ill adult); the formula pools care_expenses without a - # disability filter and caps per participant, symmetric with the - # childcare side. + # disability filter and caps per participant. is_disabled: true is_incapable_of_self_care: true care_expenses: 1_200 @@ -140,3 +195,34 @@ # adult household member, capped at $175/month per participant. # Expenses = 1,200 / 12 = 100/month, below the cap. vt_reach_up_dependent_care_deduction: 100 + +- name: Case 8, child care and disabled adult care, only the adult care counts. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + is_tax_unit_head_or_spouse: true + person2: + age: 4 + is_tax_unit_head_or_spouse: false + person3: + age: 60 + is_tax_unit_head_or_spouse: false + is_disabled: true + care_expenses: 1_200 # $100/month + spm_units: + spm_unit: + members: [person1, person2, person3] + childcare_expenses: 3_600 # $300/month, not deductible + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # Adult care only: min($100, 1 participant x $175) = $100 + vt_reach_up_dependent_care_deduction: 100 diff --git a/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/deductions/vt_reach_up_dependent_care_deduction.py b/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/deductions/vt_reach_up_dependent_care_deduction.py index edce5846b27..9c12ce98f3e 100644 --- a/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/deductions/vt_reach_up_dependent_care_deduction.py +++ b/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/deductions/vt_reach_up_dependent_care_deduction.py @@ -8,7 +8,9 @@ class vt_reach_up_dependent_care_deduction(Variable): unit = USD definition_period = MONTH reference = ( - "https://www.law.cornell.edu/regulations/vermont/13-220-Code-Vt-R-13-170-220-X" + "https://www.law.cornell.edu/regulations/vermont/13-220-Code-Vt-R-13-170-220-X", + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/ESD/Rules/2200-Reach-Up.pdf#page=74", + "https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/ESD-Procedure-P2230A.pdf", ) defined_for = StateCode.VT @@ -16,13 +18,14 @@ def formula(spm_unit, period, parameters): # Per Section 2252.2(c): $175/month max per participant claiming the deduction. # We approximate "participant" as head or spouse since they are the earners. # Per Section 2252.2(a), the deduction covers care of a household - # member who is a disabled or seriously ill adult, so adult care - # expenses count alongside childcare. + # member who is a disabled or seriously ill adult. Section 2252.2(b) + # covers child care only for a child who is not a member of the + # Reach Up household, which the model does not track; child care for + # children in the unit is not deducted (ESD Procedure P-2230A). p = parameters(period).gov.states.vt.dcf.reach_up.income.deductions person = spm_unit.members head_or_spouse = person("is_tax_unit_head_or_spouse", period) num_participants = spm_unit.sum(head_or_spouse) max_deduction = p.dependent_care * num_participants - childcare_expenses = spm_unit("childcare_expenses", period) adult_care_expenses = add(spm_unit, period, ["care_expenses"]) - return min_(childcare_expenses + adult_care_expenses, max_deduction) + return min_(adult_care_expenses, max_deduction) From 2c860f2d288f94c53785064b5cd013713a4c9dc0 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Fri, 16 Oct 2026 16:03:38 -0400 Subject: [PATCH 3/6] Apply Kentucky K-TAP child care disregard only to otherwise ineligible cases 921 KAR 2:016 Section 5(3)(b)1.c allows the dependent care disregard for child care only for a KTAP case that is otherwise ineligible without it; DCBS Operations Manual Vol. III MS 2840 B.1 says CCAP must pay instead if the case remains eligible. The formula disregarded child care for every case. Add ky_ktap_ineligible_without_child_care_disregard, which compares countable income with only the incapacitated adult care disregard against the standard of need (MS 2810 B), and keep child care in the disregard only when it is true. Move the per-person countable earnings and primary-earner allocation into a shared helper so both calculations use the same steps. Co-Authored-By: Claude Opus 5.5 --- .../ky_ktap_dependent_care_disregard.yaml | 100 +++++++++++++ ...eligible_without_child_care_disregard.yaml | 134 ++++++++++++++++++ .../gov/states/ky/dcbs/ktap/integration.yaml | 67 +++++++++ .../ktap/ky_ktap_countable_earned_income.yaml | 6 + .../ky/dcbs/ktap/ky_ktap_edge_cases.yaml | 27 ++++ .../ky/dcbs/ktap/ky_ktap_historical.yaml | 3 + .../income/ky_ktap_countable_earned_income.py | 21 +-- .../ky_ktap_dependent_care_disregard.py | 20 ++- ...ky_ktap_dependent_care_disregard_person.py | 14 +- .../income/ky_ktap_earned_income_helpers.py | 34 +++++ ...ktap_incapacitated_adult_care_disregard.py | 26 ++++ ...ineligible_without_child_care_disregard.py | 35 +++++ 12 files changed, 459 insertions(+), 28 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml create mode 100644 policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_earned_income_helpers.py create mode 100644 policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.py create mode 100644 policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml index 347b36d2610..e03c2af26c5 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml @@ -3,6 +3,8 @@ # Max per child: # - $200/month for child under age 2 # - $175/month for child age 2-12 +# Child care counts only if the case is otherwise ineligible without it +# (Section 5(3)(b)1.c; DCBS Operations Manual Vol. III MS 2840 B.1). - name: No childcare expenses results in zero disregard. period: 2024-01 @@ -36,6 +38,9 @@ members: [parent, child] # $100/month * 12 = $1,200/year childcare_expenses: 1_200 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, child] @@ -58,6 +63,9 @@ members: [parent, child] # $300/month * 12 = $3,600/year childcare_expenses: 3_600 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, child] @@ -80,6 +88,9 @@ members: [parent, infant] # $400/month * 12 = $4,800/year childcare_expenses: 4_800 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, infant] @@ -104,6 +115,9 @@ members: [parent, infant, child] # $500/month * 12 = $6,000/year childcare_expenses: 6_000 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, infant, child] @@ -224,3 +238,89 @@ # Person2 is neither a dependent nor incapacitated, so the cap is $0: # min(100, 0) = 0. ky_ktap_dependent_care_disregard: 0 + +- name: Child care is not disregarded when the case is eligible without it. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 1_000 + child1: + age: 5 + child2: + age: 2 + spm_units: + spm_unit: + members: [parent, child1, child2] + # $1,530/month + childcare_expenses: 18_360 + households: + household: + members: [parent, child1, child2] + state_code: KY + output: + # Without the child care disregard, countable income is + # (1,000 - 175) x 0.5 = 412.50 < 631 standard of need (size 3), so the + # case stays eligible and CCAP, not the disregard, pays the child care + # (MS 2840 B.1.c). No incapacitated adult, so the disregard is $0. + ky_ktap_ineligible_without_child_care_disregard: false + ky_ktap_dependent_care_disregard: 0 + +- name: Child care is disregarded when the case is otherwise ineligible. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 400 + tanf_gross_unearned_income: 550 + child1: + age: 5 + child2: + age: 1 + spm_units: + spm_unit: + members: [parent, child1, child2] + # $300/month + childcare_expenses: 3_600 + households: + household: + members: [parent, child1, child2] + state_code: KY + output: + # Without child care: (400 - 175) x 0.5 + 550 = 662.50 >= 631, ineligible. + # Cap: $175 (age 5) + $200 (age 1) = $375; min(300, 375) = 300 + ky_ktap_ineligible_without_child_care_disregard: true + ky_ktap_dependent_care_disregard: 300 + +- name: Incapacitated adult care counts but child care does not for an eligible case. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 1_000 + child: + age: 5 + adult: + age: 50 + is_incapable_of_self_care: true + care_expenses: 1_200 + spm_units: + spm_unit: + members: [parent, child, adult] + # $300/month + childcare_expenses: 3_600 + households: + household: + members: [parent, child, adult] + state_code: KY + output: + # Adult care: min(1,200 / 12 = 100, 175) = 100 (Section 5(3)(b)1.b) + # Without child care: (1,000 - 175 - 100) x 0.5 = 362.50 < 631, eligible, + # so the child's care is not disregarded. + ky_ktap_dependent_care_disregard: 100 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml new file mode 100644 index 00000000000..067028d067d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml @@ -0,0 +1,134 @@ +# Kentucky K-TAP: is the case ineligible without the child care disregard? +# Per 921 KAR 2:016 Section 5(3)(b)1.c and DCBS Operations Manual Vol. III +# MS 2840 B.1, the dependent care disregard covers child care only for a case +# that is otherwise ineligible without it. Per MS 2810 B, a case is ineligible +# when countable income equals or exceeds the standard of need. +# Countable earned income here applies the $175 work expense, any +# incapacitated adult care disregard, and the 50% disregard (January). + +- name: Case 1, low earnings, eligible without the child care disregard. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 1_000 + child1: + age: 5 + child2: + age: 2 + spm_units: + spm_unit: + members: [parent, child1, child2] + childcare_expenses: 18_360 + households: + household: + members: [parent, child1, child2] + state_code: KY + output: + # Countable earned: (1,000 - 175) x 0.5 = 412.50 + # Standard of need (size 3): 631; 412.50 < 631, so eligible. + ky_ktap_ineligible_without_child_care_disregard: false + +- name: Case 2, countable income above the standard of need. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 400 + tanf_gross_unearned_income: 550 + child1: + age: 5 + child2: + age: 1 + spm_units: + spm_unit: + members: [parent, child1, child2] + childcare_expenses: 3_600 + households: + household: + members: [parent, child1, child2] + state_code: KY + output: + # Countable earned: (400 - 175) x 0.5 = 112.50; unearned: 550 + # Countable income: 662.50 >= 631 standard of need (size 3), ineligible. + ky_ktap_ineligible_without_child_care_disregard: true + +- name: Case 3, countable income equal to the standard of need is ineligible. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 375 + tanf_gross_unearned_income: 452 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + childcare_expenses: 3_600 + households: + household: + members: [parent, child] + state_code: KY + output: + # Countable earned: (375 - 175) x 0.5 = 100; unearned: 452 + # Countable income: 552 = standard of need (size 2): 552. + # MS 2810 B: "equal to or exceeds" the standard of need is ineligible. + ky_ktap_ineligible_without_child_care_disregard: true + +- name: Case 4, incapacitated adult care disregard applies in the test. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 600 + tanf_gross_unearned_income: 450 + child: + age: 5 + adult: + age: 50 + is_incapable_of_self_care: true + care_expenses: 1_200 + spm_units: + spm_unit: + members: [parent, child, adult] + childcare_expenses: 3_600 + households: + household: + members: [parent, child, adult] + state_code: KY + output: + # Incapacitated adult care: min(1,200 / 12 = 100, 175) = 100 + # Countable earned: (600 - 175 - 100) x 0.5 = 162.50; unearned: 450 + # Countable income: 612.50 < 631 standard of need (size 3), eligible. + # Without the adult care disregard it would be 662.50 (ineligible). + ky_ktap_ineligible_without_child_care_disregard: false + +- name: Case 5, unearned income above the standard of need. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_unearned_income: 700 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: KY + output: + # Countable unearned: 700; standard of need (size 2): 552. + ky_ktap_ineligible_without_child_care_disregard: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml index 76f0a7ffa87..c8a24961bb6 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml @@ -161,3 +161,70 @@ # Benefit: min(0.55 * $481, $524) = min($264.55, $524) = $264.55/month # Annual: $264.55 * 12 = $3,174.60 ky_ktap: 264.55 * 12 + +- name: Case 5, child care does not raise the benefit of a case eligible without it. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 1_000 + child1: + age: 5 + child2: + age: 2 + spm_units: + spm_unit: + members: [parent, child1, child2] + # $1,530/month + childcare_expenses: 18_360 + spm_unit_cash_assets: 0 + households: + household: + members: [parent, child1, child2] + state_code: KY + output: + # Monthly period. Without the child care disregard, countable income is + # (1,000 - 175) x 0.5 = 412.50 < 631 standard of need (size 3), so the + # case is eligible without it and the child care is not disregarded + # (921 KAR 2:016 Section 5(3)(b)1.c; MS 2840 B.1). + ky_ktap_dependent_care_disregard: 0 + ky_ktap_countable_income: 412.5 + # Benefit: min(0.55 x (631 - 412.50), 524) = 120.175 + ky_ktap: 120.175 + +- name: Case 6, child care disregard for a case otherwise ineligible. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 400 + tanf_gross_unearned_income: 550 + child1: + age: 5 + child2: + age: 1 + spm_units: + spm_unit: + members: [parent, child1, child2] + # $300/month + childcare_expenses: 3_600 + spm_unit_cash_assets: 0 + households: + household: + members: [parent, child1, child2] + state_code: KY + output: + # Monthly period. Without child care: (400 - 175) x 0.5 + 550 = 662.50 + # >= 631 standard of need (size 3), ineligible; so the child care + # disregard applies: min(300, 175 + 200) = 300. + ky_ktap_dependent_care_disregard: 300 + # Earned: max(400 - 175 - 300, 0) = 0; countable: 0 + 550 = 550 + ky_ktap_countable_income: 550 + # Gross income 950 <= 631 x 1.85 = 1,167.35 + ky_ktap_eligible: true + # Benefit: min(0.55 x (631 - 550), 524) = 44.55 + ky_ktap: 44.55 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_countable_earned_income.yaml index 5861ac40167..d07d3254c8c 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_countable_earned_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_countable_earned_income.yaml @@ -116,6 +116,9 @@ members: [person1, person2, person3] # $300/month * 12 = $3,600/year childcare_expenses: 3_600 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [person1, person2, person3] @@ -173,6 +176,9 @@ members: [person1, person2, person3] # $300/month * 12 = $3,600/year childcare_expenses: 3_600 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [person1, person2, person3] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_edge_cases.yaml index da0d73bcf8e..a564cd8a586 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_edge_cases.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_edge_cases.yaml @@ -261,6 +261,9 @@ members: [person1, person2] # $100/month * 12 = $1,200/year childcare_expenses: 1_200 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [person1, person2] @@ -432,6 +435,9 @@ spm_unit: members: [person1, person2] childcare_expenses: 4_800 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [person1, person2] @@ -888,6 +894,9 @@ spm_unit: members: [parent, infant] childcare_expenses: 6_000 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, infant] @@ -910,6 +919,9 @@ spm_unit: members: [parent, toddler] childcare_expenses: 6_000 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, toddler] @@ -936,6 +948,9 @@ spm_unit: members: [parent, child] childcare_expenses: 6_000 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, child] @@ -984,6 +999,9 @@ spm_unit: members: [parent, infant, teen] childcare_expenses: 6_000 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, infant, teen] @@ -1013,6 +1031,9 @@ members: [parent, child] # Work expense $175 + dependent care cap $175 = $350 childcare_expenses: 6_000 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, child] @@ -1077,6 +1098,9 @@ spm_unit: members: [parent, infant] childcare_expenses: 6_000 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true spm_unit_cash_assets: 0 households: household: @@ -1245,6 +1269,9 @@ members: [parent, child] # $50/month * 12 = $600/year (below $175 cap) childcare_expenses: 600 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [parent, child] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_historical.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_historical.yaml index 8e51a2e41e8..fedc8b50d9e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_historical.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_historical.yaml @@ -1043,6 +1043,9 @@ spm_unit: members: [person1, person2] childcare_expenses: 3_600 + # Otherwise ineligible without the child care disregard + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true households: household: members: [person1, person2] diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_countable_earned_income.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_countable_earned_income.py index 21ac63258a1..41a1cf539fd 100644 --- a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_countable_earned_income.py +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_countable_earned_income.py @@ -1,4 +1,7 @@ from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.ky.dcbs.ktap.income.ky_ktap_earned_income_helpers import ( + ky_ktap_countable_earnings, +) class ky_ktap_countable_earned_income(Variable): @@ -17,20 +20,6 @@ def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ky.dcbs.ktap.income.deductions person = spm_unit.members gross_earned = person("tanf_gross_earned_income", period) - # (a) Work expense per person per MS 2840.A - after_work_expense = max_(gross_earned - p.work_expense, 0) - # (b) Dependent care per MS 2840.B dep_care = person("ky_ktap_dependent_care_disregard_person", period) - after_dep_care = max_(after_work_expense - dep_care, 0) - # (e) Time-limited EID per person per MS 2857 - # Uses calendar month as proxy for participation months. - month = period.start.month - eid_rate = p.earned_income_disregard_rate.calc(month) - if p.earned_income_flat_disregard_in_effect: - flat = p.earned_income_flat_disregard - remainder = max_(after_dep_care - flat, 0) - disregard = flat + eid_rate * remainder - else: - disregard = eid_rate * after_dep_care - countable_per_person = max_(after_dep_care - disregard, 0) - return spm_unit.sum(countable_per_person) + countable = ky_ktap_countable_earnings(gross_earned, dep_care, p, period) + return spm_unit.sum(countable) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py index b2dbdbcec6c..034388dd6be 100644 --- a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py @@ -7,7 +7,10 @@ class ky_ktap_dependent_care_disregard(Variable): label = "Kentucky K-TAP dependent care disregard" unit = USD definition_period = MONTH - reference = "https://apps.legislature.ky.gov/law/kar/titles/921/002/016/" + reference = ( + "https://apps.legislature.ky.gov/law/kar/titles/921/002/016/", + "https://www.chfs.ky.gov/agencies/dcbs/dfs/Documents/OMVOLIII.pdf", + ) defined_for = StateCode.KY def formula(spm_unit, period, parameters): @@ -31,4 +34,17 @@ def formula(spm_unit, period, parameters): total_max_disregard = spm_unit.sum(max_per_person) childcare_expenses = spm_unit("childcare_expenses", period) adult_care_expenses = add(spm_unit, period, ["care_expenses"]) - return min_(childcare_expenses + adult_care_expenses, total_max_disregard) + disregard_with_child_care = min_( + childcare_expenses + adult_care_expenses, total_max_disregard + ) + # Per Section 5(3)(b)1.c and MS 2840 B.1, child care counts only for a + # case that is otherwise ineligible without it; CCAP pays child care + # for a case that remains eligible. The month-of-application case + # (Section 5(3)(b)1.d) is not modeled. + child_care_counts = spm_unit( + "ky_ktap_ineligible_without_child_care_disregard", period + ) + adult_care_disregard = spm_unit( + "ky_ktap_incapacitated_adult_care_disregard", period + ) + return where(child_care_counts, disregard_with_child_care, adult_care_disregard) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard_person.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard_person.py index 6bfd0b03fd1..58898b3e356 100644 --- a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard_person.py +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard_person.py @@ -1,4 +1,7 @@ from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.ky.dcbs.ktap.income.ky_ktap_earned_income_helpers import ( + ky_ktap_dependent_care_share, +) class ky_ktap_dependent_care_disregard_person(Variable): @@ -14,13 +17,4 @@ def formula(person, period, parameters): # Per MS 2840 B.2.c: "only one parent's income" # Allocate unit-level dependent care to the primary earner. unit_dep_care = person.spm_unit("ky_ktap_dependent_care_disregard", period) - gross_earned = person("tanf_gross_earned_income", period) - max_earned = person.spm_unit.max(gross_earned) - has_most_earnings = gross_earned == max_earned - is_recipient = has_most_earnings & (gross_earned > 0) - n_recipients = person.spm_unit.sum(is_recipient * 1.0) - return where( - n_recipients > 0, - unit_dep_care * is_recipient / max_(n_recipients, 1), - 0, - ) + return unit_dep_care * ky_ktap_dependent_care_share(person, period) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_earned_income_helpers.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_earned_income_helpers.py new file mode 100644 index 00000000000..3f39deb122e --- /dev/null +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_earned_income_helpers.py @@ -0,0 +1,34 @@ +from policyengine_us.model_api import * + + +def ky_ktap_dependent_care_share(person, period): + """Each member's share of the unit's dependent care disregard. + + Per MS 2840 B.2.c, the disregard applies to only one parent's income, so + it goes to the member with the most gross earnings (split evenly on ties). + """ + gross_earned = person("tanf_gross_earned_income", period) + max_earned = person.spm_unit.max(gross_earned) + is_recipient = (gross_earned == max_earned) & (gross_earned > 0) + n_recipients = person.spm_unit.sum(is_recipient * 1.0) + return where(n_recipients > 0, is_recipient / max_(n_recipients, 1), 0) + + +def ky_ktap_countable_earnings(gross_earned, dependent_care, p, period): + """Each member's countable earnings under 921 KAR 2:016 Section 5(3). + + Applies the work expense (MS 2840 A), the dependent care disregard + (MS 2840 B) and the time-limited earned income disregard (MS 2857). + `p` is `parameters(period).gov.states.ky.dcbs.ktap.income.deductions`. + """ + after_work_expense = max_(gross_earned - p.work_expense, 0) + after_dep_care = max_(after_work_expense - dependent_care, 0) + # Uses calendar month as proxy for participation months. + eid_rate = p.earned_income_disregard_rate.calc(period.start.month) + if p.earned_income_flat_disregard_in_effect: + flat = p.earned_income_flat_disregard + remainder = max_(after_dep_care - flat, 0) + disregard = flat + eid_rate * remainder + else: + disregard = eid_rate * after_dep_care + return max_(after_dep_care - disregard, 0) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.py new file mode 100644 index 00000000000..6a7eea1ba6e --- /dev/null +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class ky_ktap_incapacitated_adult_care_disregard(Variable): + value_type = float + entity = SPMUnit + label = "Kentucky K-TAP dependent care disregard for incapacitated adults" + unit = USD + definition_period = MONTH + reference = "https://apps.legislature.ky.gov/law/kar/titles/921/002/016/" + defined_for = StateCode.KY + + def formula(spm_unit, period, parameters): + # Per 921 KAR 2:016 Section 5(3)(b)1.b, the disregard covers an + # incapacitated adult living in the home and receiving KTAP. + p = parameters(period).gov.states.ky.dcbs.ktap.income.deductions + person = spm_unit.members + incapacitated_adult = person("is_adult", period.this_year) & person( + "is_incapable_of_self_care", period.this_year + ) + n_incapacitated_adults = spm_unit.sum(incapacitated_adult) + # An incapacitated adult receives the standard age-two-or-older rate + # per Section 5(3)(b)2, so evaluate the schedule at the age-two boundary. + max_per_adult = p.dependent_care.calc(p.dependent_care.thresholds[1]) + adult_care_expenses = add(spm_unit, period, ["care_expenses"]) + return min_(adult_care_expenses, n_incapacitated_adults * max_per_adult) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py new file mode 100644 index 00000000000..0b0233e987a --- /dev/null +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py @@ -0,0 +1,35 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.ky.dcbs.ktap.income.ky_ktap_earned_income_helpers import ( + ky_ktap_countable_earnings, + ky_ktap_dependent_care_share, +) + + +class ky_ktap_ineligible_without_child_care_disregard(Variable): + value_type = bool + entity = SPMUnit + label = "Kentucky K-TAP case is ineligible without the child care disregard" + definition_period = MONTH + reference = ( + "https://apps.legislature.ky.gov/law/kar/titles/921/002/016/", + "https://www.chfs.ky.gov/agencies/dcbs/dfs/Documents/OMVOLIII.pdf", + ) + defined_for = StateCode.KY + + def formula(spm_unit, period, parameters): + # Per MS 2810 B, a case whose countable income equals or exceeds the + # standard of need is ineligible. Compute countable income with the + # dependent care disregard for incapacitated adults only. + p = parameters(period).gov.states.ky.dcbs.ktap.income.deductions + person = spm_unit.members + gross_earned = person("tanf_gross_earned_income", period) + adult_care = spm_unit("ky_ktap_incapacitated_adult_care_disregard", period) + adult_care_person = spm_unit.project(adult_care) * ky_ktap_dependent_care_share( + person, period + ) + countable_earned = spm_unit.sum( + ky_ktap_countable_earnings(gross_earned, adult_care_person, p, period) + ) + countable_unearned = spm_unit("ky_ktap_countable_unearned_income", period) + standard_of_need = spm_unit("ky_ktap_standard_of_need", period) + return countable_earned + countable_unearned >= standard_of_need From fbb893429c76974fb463752b7672d6f8f6a6f0cb Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Fri, 16 Oct 2026 16:03:43 -0400 Subject: [PATCH 4/6] Add changelog fragment for the TANF dependent care fixes Co-Authored-By: Claude Opus 5.5 --- changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md diff --git a/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md b/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md new file mode 100644 index 00000000000..58c1a43e68d --- /dev/null +++ b/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md @@ -0,0 +1 @@ +Limit the Hawaii TANF and Vermont Reach Up dependent care deductions to the care the state rules allow (an incapacitated or disabled adult; not the unit's own children), and apply the Kentucky K-TAP child care disregard only to a case that is otherwise ineligible without it (921 KAR 2:016 Section 5(3)(b)1.c). From efa893e56e9dd6e003cb68a570d2a8772d076b12 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Tue, 27 Oct 2026 11:07:51 -0400 Subject: [PATCH 5/6] Cap each adult's care separately and use the regulation's "exceeds" test Address DTrim99's review of #10254: - Hawaii and Kentucky cap each incapacitated adult's care separately (HAR 17-676-54.1(c)(4), (d)(4); 921 KAR 2:016 Section 5(3)(b)2). The Kentucky disregard is the adult part plus, for an otherwise ineligible case, child care up to the children's age-based caps. - The Kentucky otherwise-ineligible test uses "exceeds" (Section 4(2)(b)), so income equal to the standard of need does not trigger the child care disregard. - Record three regulation-over-manual readings as source-conflict backlog items (KY standard-of-need equality, KY adult care condition, VT order). - Fix citations (VT rule 2251.1(e), manual page numbers, HI State Plan 10.2.2), reword forced-flag test comments, and add boundary tests and a direct test file for the Kentucky adult disregard. Co-Authored-By: Claude Opus 5.5 --- ...x-10208-tanf-dependent-care-scope.fixed.md | 2 +- .../hi_tanf_dependent_care_deduction.yaml | 98 ++++++++- .../ky_ktap_dependent_care_disregard.yaml | 126 +++++++++++- ...ap_incapacitated_adult_care_disregard.yaml | 190 ++++++++++++++++++ ...eligible_without_child_care_disregard.yaml | 35 +++- .../gov/states/ky/dcbs/ktap/integration.yaml | 34 +++- .../ktap/ky_ktap_countable_earned_income.yaml | 4 +- .../ky/dcbs/ktap/ky_ktap_edge_cases.yaml | 18 +- .../ky/dcbs/ktap/ky_ktap_historical.yaml | 2 +- .../hi_tanf_dependent_care_deduction.py | 15 +- .../ky_ktap_dependent_care_disregard.py | 27 +-- ...ktap_incapacitated_adult_care_disregard.py | 10 +- ...ineligible_without_child_care_disregard.py | 11 +- .../vt_reach_up_dependent_care_deduction.py | 7 +- .../vt_reach_up_countable_earned_income.py | 1 + source_conflicts/candidates.yaml | 90 +++++++++ 16 files changed, 604 insertions(+), 66 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.yaml diff --git a/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md b/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md index 58c1a43e68d..7aa70156317 100644 --- a/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md +++ b/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md @@ -1 +1 @@ -Limit the Hawaii TANF and Vermont Reach Up dependent care deductions to the care the state rules allow (an incapacitated or disabled adult; not the unit's own children), and apply the Kentucky K-TAP child care disregard only to a case that is otherwise ineligible without it (921 KAR 2:016 Section 5(3)(b)1.c). +Limit the Hawaii TANF and Vermont Reach Up dependent care deductions to the care the state rules allow (an incapacitated or disabled adult; not the unit's own children), cap each incapacitated adult's care separately in Hawaii and Kentucky, and apply the Kentucky K-TAP child care disregard only to a case whose countable income otherwise exceeds the standard of need (921 KAR 2:016 Sections 4(2)(b) and 5(3)(b)1.c). diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.yaml index f53c110fb9e..b18e5574a38 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.yaml @@ -5,7 +5,7 @@ # Rate: $175 (full-time, 32+ hrs) or $165 (part-time, <32 hrs) # Uses MAX of adult hours - if either parent is full-time, use full-time rate # Per HAR 17-676-54.1(c)(4) and (d)(4), HAR 17-676-2 and the Hawaii TANF -# State Plan section 10.2.1(D) +# State Plan section 10.2.2 - name: Case 1, no care expenses. period: 2024-01 @@ -277,8 +277,8 @@ members: [person1, person2, person3] state_code: HI output: - # Expenses = 300 + 300 = 600/month - # Cap = 2 disabled adults x $175 = $350 + # Expenses = 300 and 300/month, each capped at $175 + # min(300, 175) + min(300, 175) = 350 hi_tanf_dependent_care_deduction: 350 - name: Case 12, child care and disabled adult care, only the adult care counts. @@ -328,6 +328,94 @@ members: [person1, person2] state_code: HI output: - # Person2 is not a disabled adult, so no care recipients: - # min(100, 0) = 0. + # Person2 is not a disabled adult, so person2's care cost of + # 100/month does not count. + hi_tanf_dependent_care_deduction: 0 + +- name: Case 14, two disabled adults, each adult's care capped separately. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 40 + person2: + age: 60 + is_disabled: true + # $300/month + care_expenses: 3_600 + person3: + age: 62 + is_disabled: true + # $50/month + care_expenses: 600 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: HI + output: + # HAR 17-676-54.1(d)(4): the cost "for the care of each incapacitated + # adult", not to exceed $175 (full time). + # min(300, 175) + min(50, 175) = 175 + 50 = 225 + # A pooled cap would give min(350, 2 x 175) = 350. + hi_tanf_dependent_care_deduction: 225 + +- name: Case 15, two disabled adults, part-time cap applied to each adult. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 20 + person2: + age: 60 + is_disabled: true + # $165/month + care_expenses: 1_980 + person3: + age: 62 + is_disabled: true + # $166/month + care_expenses: 1_992 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: HI + output: + # Part time (20 hours a week): $165 cap per disabled adult. + # min(165, 165) + min(166, 165) = 165 + 165 = 330 + hi_tanf_dependent_care_deduction: 330 + +- name: Case 16, care of a member who is not a disabled adult does not count. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + weekly_hours_worked_before_lsr: 40 + # $100/month + care_expenses: 1_200 + person2: + age: 60 + is_disabled: true + care_expenses: 0 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: HI + output: + # The disabled adult has no care cost: min(0, 175) = 0. + # Person1 is not disabled, so person1's care cost does not count. hi_tanf_dependent_care_deduction: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml index e03c2af26c5..be122f39bde 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml @@ -38,7 +38,7 @@ members: [parent, child] # $100/month * 12 = $1,200/year childcare_expenses: 1_200 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: @@ -63,7 +63,7 @@ members: [parent, child] # $300/month * 12 = $3,600/year childcare_expenses: 3_600 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: @@ -88,7 +88,7 @@ members: [parent, infant] # $400/month * 12 = $4,800/year childcare_expenses: 4_800 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: @@ -115,7 +115,7 @@ members: [parent, infant, child] # $500/month * 12 = $6,000/year childcare_expenses: 6_000 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: @@ -291,7 +291,7 @@ members: [parent, child1, child2] state_code: KY output: - # Without child care: (400 - 175) x 0.5 + 550 = 662.50 >= 631, ineligible. + # Without child care: (400 - 175) x 0.5 + 550 = 662.50 > 631, ineligible. # Cap: $175 (age 5) + $200 (age 1) = $375; min(300, 375) = 300 ky_ktap_ineligible_without_child_care_disregard: true ky_ktap_dependent_care_disregard: 300 @@ -324,3 +324,119 @@ # Without child care: (1,000 - 175 - 100) x 0.5 = 362.50 < 631, eligible, # so the child's care is not disregarded. ky_ktap_dependent_care_disregard: 100 + +- name: Each incapacitated adult's care is capped separately. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + adult1: + age: 50 + is_incapable_of_self_care: true + # $300/month + care_expenses: 3_600 + adult2: + age: 55 + is_incapable_of_self_care: true + # $50/month + care_expenses: 600 + spm_units: + spm_unit: + members: [parent, adult1, adult2] + households: + household: + members: [parent, adult1, adult2] + state_code: KY + output: + # Section 5(3)(b)2: $175 per month per individual. + # min(300, 175) + min(50, 175) = 175 + 50 = 225 (not min(350, 2 x 175)). + ky_ktap_dependent_care_disregard: 225 + +- name: An unused child cap does not absorb incapacitated adult care. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + child: + age: 5 + adult: + age: 50 + is_incapable_of_self_care: true + # $300/month + care_expenses: 3_600 + spm_units: + spm_unit: + members: [parent, child, adult] + childcare_expenses: 0 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true + households: + household: + members: [parent, child, adult] + state_code: KY + output: + # Adult: min(300, 175) = 175. Child: min(0, 175) = 0. + # 175 + 0 = 175 (not min(300, 175 + 175) = 300). + ky_ktap_dependent_care_disregard: 175 + +- name: An unused adult cap does not absorb child care. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + child: + age: 5 + adult: + age: 50 + is_incapable_of_self_care: true + care_expenses: 0 + spm_units: + spm_unit: + members: [parent, child, adult] + # $300/month + childcare_expenses: 3_600 + # Set as an input so the child care caps apply + # (921 KAR 2:016 Section 5(3)(b)1.c). + ky_ktap_ineligible_without_child_care_disregard: true + households: + household: + members: [parent, child, adult] + state_code: KY + output: + # Adult: min(0, 175) = 0. Child: min(300, 175) = 175. + # 0 + 175 = 175 (not min(300, 175 + 175) = 300). + ky_ktap_dependent_care_disregard: 175 + +- name: Child care is not disregarded when countable income equals the standard of need. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 375 + tanf_gross_unearned_income: 452 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + # $300/month + childcare_expenses: 3_600 + households: + household: + members: [parent, child] + state_code: KY + output: + # Without child care: (375 - 175) x 0.5 + 452 = 552 = 552 standard of + # need (size 2). Section 4(2)(b) makes a case ineligible only when income + # exceeds the standard, so the case is not otherwise ineligible. + ky_ktap_ineligible_without_child_care_disregard: false + ky_ktap_dependent_care_disregard: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.yaml new file mode 100644 index 00000000000..d9053077d25 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.yaml @@ -0,0 +1,190 @@ +# Kentucky K-TAP dependent care disregard for incapacitated adults +# Per 921 KAR 2:016 Section 5(3)(b)1.b, the disregard covers an incapacitated +# adult living in the home. Section 5(3)(b)2 caps it at $175 per month per +# individual (full-time rate; the part-time rate is not modeled). + +- name: Case 1, no incapacitated adult. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + childcare_expenses: 3_600 + households: + household: + members: [parent, child] + state_code: KY + output: + ky_ktap_incapacitated_adult_care_disregard: 0 + +- name: Case 2, one incapacitated adult with care below the cap. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + adult: + age: 50 + is_incapable_of_self_care: true + # $100/month + care_expenses: 1_200 + spm_units: + spm_unit: + members: [parent, adult] + households: + household: + members: [parent, adult] + state_code: KY + output: + # min(100, 175) = 100 + ky_ktap_incapacitated_adult_care_disregard: 100 + +- name: Case 3, one incapacitated adult with care at the cap. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + adult: + age: 50 + is_incapable_of_self_care: true + # $175/month + care_expenses: 2_100 + spm_units: + spm_unit: + members: [parent, adult] + households: + household: + members: [parent, adult] + state_code: KY + output: + # min(175, 175) = 175 + ky_ktap_incapacitated_adult_care_disregard: 175 + +- name: Case 4, one incapacitated adult with care above the cap. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + adult: + age: 50 + is_incapable_of_self_care: true + # $300/month + care_expenses: 3_600 + spm_units: + spm_unit: + members: [parent, adult] + households: + household: + members: [parent, adult] + state_code: KY + output: + # min(300, 175) = 175 + ky_ktap_incapacitated_adult_care_disregard: 175 + +- name: Case 5, two incapacitated adults are capped one by one. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + adult1: + age: 50 + is_incapable_of_self_care: true + # $300/month + care_expenses: 3_600 + adult2: + age: 55 + is_incapable_of_self_care: true + # $50/month + care_expenses: 600 + spm_units: + spm_unit: + members: [parent, adult1, adult2] + households: + household: + members: [parent, adult1, adult2] + state_code: KY + output: + # min(300, 175) + min(50, 175) = 175 + 50 = 225 + # A pooled cap would give min(350, 2 x 175) = 350. + ky_ktap_incapacitated_adult_care_disregard: 225 + +- name: Case 6, care for an adult who is not incapacitated does not count. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + # $100/month + care_expenses: 1_200 + adult: + age: 50 + is_incapable_of_self_care: true + care_expenses: 0 + spm_units: + spm_unit: + members: [parent, adult] + households: + household: + members: [parent, adult] + state_code: KY + output: + # The incapacitated adult has no care cost: min(0, 175) = 0. + # The parent's care cost does not count, as the parent is not + # incapacitated. + ky_ktap_incapacitated_adult_care_disregard: 0 + +- name: Case 7, an incapacitated child is not an incapacitated adult. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + child: + age: 10 + is_incapable_of_self_care: true + care_expenses: 1_200 + spm_units: + spm_unit: + members: [parent, child] + households: + household: + members: [parent, child] + state_code: KY + output: + ky_ktap_incapacitated_adult_care_disregard: 0 + +- name: Case 8, non-KY state returns zero. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + adult: + age: 50 + is_incapable_of_self_care: true + care_expenses: 1_200 + spm_units: + spm_unit: + members: [parent, adult] + households: + household: + members: [parent, adult] + state_code: TX + output: + ky_ktap_incapacitated_adult_care_disregard: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml index 067028d067d..d6949e8b526 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml @@ -1,8 +1,8 @@ # Kentucky K-TAP: is the case ineligible without the child care disregard? # Per 921 KAR 2:016 Section 5(3)(b)1.c and DCBS Operations Manual Vol. III # MS 2840 B.1, the dependent care disregard covers child care only for a case -# that is otherwise ineligible without it. Per MS 2810 B, a case is ineligible -# when countable income equals or exceeds the standard of need. +# that is otherwise ineligible without it. Per 921 KAR 2:016 Section 4(2)(b), +# a case is ineligible when countable income exceeds the standard of need. # Countable earned income here applies the $175 work expense, any # incapacitated adult care disregard, and the 50% disregard (January). @@ -54,10 +54,10 @@ state_code: KY output: # Countable earned: (400 - 175) x 0.5 = 112.50; unearned: 550 - # Countable income: 662.50 >= 631 standard of need (size 3), ineligible. + # Countable income: 662.50 > 631 standard of need (size 3), ineligible. ky_ktap_ineligible_without_child_care_disregard: true -- name: Case 3, countable income equal to the standard of need is ineligible. +- name: Case 3, countable income equal to the standard of need is not ineligible. period: 2024-01 absolute_error_margin: 0.01 input: @@ -79,7 +79,32 @@ output: # Countable earned: (375 - 175) x 0.5 = 100; unearned: 452 # Countable income: 552 = standard of need (size 2): 552. - # MS 2810 B: "equal to or exceeds" the standard of need is ineligible. + # Section 4(2)(b): only income that "exceeds" the standard of need makes + # the case ineligible, so the child care disregard does not apply. + ky_ktap_ineligible_without_child_care_disregard: false + +- name: Case 3b, countable income one dollar above the standard of need is ineligible. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 377 + tanf_gross_unearned_income: 452 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + childcare_expenses: 3_600 + households: + household: + members: [parent, child] + state_code: KY + output: + # Countable earned: (377 - 175) x 0.5 = 101; unearned: 452 + # Countable income: 553 > 552 standard of need (size 2), ineligible. ky_ktap_ineligible_without_child_care_disregard: true - name: Case 4, incapacitated adult care disregard applies in the test. diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml index c8a24961bb6..aa6ec3d04a6 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml @@ -219,7 +219,7 @@ state_code: KY output: # Monthly period. Without child care: (400 - 175) x 0.5 + 550 = 662.50 - # >= 631 standard of need (size 3), ineligible; so the child care + # > 631 standard of need (size 3), ineligible; so the child care # disregard applies: min(300, 175 + 200) = 300. ky_ktap_dependent_care_disregard: 300 # Earned: max(400 - 175 - 300, 0) = 0; countable: 0 + 550 = 550 @@ -228,3 +228,35 @@ ky_ktap_eligible: true # Benefit: min(0.55 x (631 - 550), 524) = 44.55 ky_ktap: 44.55 + +- name: Case 7, countable income equal to the standard of need pays no benefit. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 375 + tanf_gross_unearned_income: 452 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + # $300/month + childcare_expenses: 3_600 + spm_unit_cash_assets: 0 + households: + household: + members: [parent, child] + state_code: KY + output: + # Without child care: (375 - 175) x 0.5 + 452 = 552 = 552 standard of + # need (size 2). 921 KAR 2:016 Section 4(2)(b) makes a case ineligible + # only when income exceeds the standard, so the case is not otherwise + # ineligible and the child care disregard does not apply. + ky_ktap_ineligible_without_child_care_disregard: false + ky_ktap_dependent_care_disregard: 0 + ky_ktap_countable_income: 552 + # Benefit: 0.55 x max(552 - 552, 0) = 0 + ky_ktap: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_countable_earned_income.yaml index d07d3254c8c..97f0555675a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_countable_earned_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_countable_earned_income.yaml @@ -116,7 +116,7 @@ members: [person1, person2, person3] # $300/month * 12 = $3,600/year childcare_expenses: 3_600 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: @@ -176,7 +176,7 @@ members: [person1, person2, person3] # $300/month * 12 = $3,600/year childcare_expenses: 3_600 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_edge_cases.yaml index a564cd8a586..3f4e1ea1269 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_edge_cases.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_edge_cases.yaml @@ -261,7 +261,7 @@ members: [person1, person2] # $100/month * 12 = $1,200/year childcare_expenses: 1_200 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: @@ -435,7 +435,7 @@ spm_unit: members: [person1, person2] childcare_expenses: 4_800 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: @@ -894,7 +894,7 @@ spm_unit: members: [parent, infant] childcare_expenses: 6_000 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: @@ -919,7 +919,7 @@ spm_unit: members: [parent, toddler] childcare_expenses: 6_000 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: @@ -948,7 +948,7 @@ spm_unit: members: [parent, child] childcare_expenses: 6_000 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: @@ -999,7 +999,7 @@ spm_unit: members: [parent, infant, teen] childcare_expenses: 6_000 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: @@ -1031,7 +1031,7 @@ members: [parent, child] # Work expense $175 + dependent care cap $175 = $350 childcare_expenses: 6_000 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: @@ -1098,7 +1098,7 @@ spm_unit: members: [parent, infant] childcare_expenses: 6_000 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true spm_unit_cash_assets: 0 @@ -1269,7 +1269,7 @@ members: [parent, child] # $50/month * 12 = $600/year (below $175 cap) childcare_expenses: 600 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_historical.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_historical.yaml index fedc8b50d9e..d2a34319ce3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_historical.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/ky_ktap_historical.yaml @@ -1043,7 +1043,7 @@ spm_unit: members: [person1, person2] childcare_expenses: 3_600 - # Otherwise ineligible without the child care disregard + # Set as an input so the child care caps apply # (921 KAR 2:016 Section 5(3)(b)1.c). ky_ktap_ineligible_without_child_care_disregard: true households: diff --git a/policyengine_us/variables/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.py b/policyengine_us/variables/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.py index 25cdf7aef2a..4c236bef255 100644 --- a/policyengine_us/variables/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.py +++ b/policyengine_us/variables/gov/states/hi/dhs/tanf/income/hi_tanf_dependent_care_deduction.py @@ -19,15 +19,13 @@ def formula(spm_unit, period, parameters): # Per HAR 17-676-54.1(c)(4) and (d)(4) and the HAR 17-676-2 # definition, the deduction covers only the cost of care for each - # incapacitated adult in the household (State Plan section 10.2.1(D): - # a disabled adult household member). Child care is not deducted. - adult_care_expenses = add(spm_unit, period, ["care_expenses"]) - - # Count disabled adults in the unit for the per-person cap + # incapacitated adult in the household (State Plan 10.2.2: "cost of + # care for a disabled adult household member"). Child care is not + # deducted. person = spm_unit.members is_adult = ~person("is_child", period.this_year) is_disabled_adult = is_adult & person("is_disabled", period.this_year) - num_care_recipients = spm_unit.sum(is_disabled_adult) + adult_care_expenses = person("care_expenses", period) * is_disabled_adult # Determine rate based on MAX of adult hours # If either parent works full-time, use full-time rate @@ -39,7 +37,6 @@ def formula(spm_unit, period, parameters): # Full-time = 32+ hours/week # Rate is $175 (full-time) or $165 (part-time) per person rate = p.amount.calc(max_adult_hours) - max_deduction = num_care_recipients * rate - # Deduct actual cost up to max per care recipient - return min_(adult_care_expenses, max_deduction) + # Deduct each disabled adult's actual cost up to the rate + return spm_unit.sum(min_(adult_care_expenses, spm_unit.project(rate))) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py index 034388dd6be..cef3b9771fd 100644 --- a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py @@ -9,7 +9,8 @@ class ky_ktap_dependent_care_disregard(Variable): definition_period = MONTH reference = ( "https://apps.legislature.ky.gov/law/kar/titles/921/002/016/", - "https://www.chfs.ky.gov/agencies/dcbs/dfs/Documents/OMVOLIII.pdf", + # PDF pages 162-163 + "https://www.chfs.ky.gov/agencies/dcbs/dfs/Documents/OMVOLIII.pdf#page=162", ) defined_for = StateCode.KY @@ -18,25 +19,19 @@ def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ky.dcbs.ktap.income.deductions person = spm_unit.members is_dependent = person("is_tax_unit_dependent", period) - # Per 921 KAR 2:016 Section 5(3)(b)1.b, the disregard covers an - # incapacitated adult living in the home and receiving KTAP. incapacitated_adult = person("is_adult", period.this_year) & person( "is_incapable_of_self_care", period.this_year ) age = person("age", period.this_year) - # Children use their age-based rate; the older-age zero-out reflects - # children aging out of care. An incapacitated adult instead receives - # the standard age-two-or-older rate per 921 KAR 2:016 Section - # 5(3)(b)2, so evaluate the schedule at the age-two boundary for them. - cap_age = where(incapacitated_adult, p.dependent_care.thresholds[1], age) - care_recipient = is_dependent | incapacitated_adult - max_per_person = p.dependent_care.calc(cap_age) * care_recipient - total_max_disregard = spm_unit.sum(max_per_person) + # Children use their age-based rate per 921 KAR 2:016 Section + # 5(3)(b)2; the older-age zero-out reflects children aging out of + # care. Incapacitated adults are capped one by one in + # ky_ktap_incapacitated_adult_care_disregard. Child care expenses are + # a unit total, so the children's caps are summed. + is_child_care_recipient = is_dependent & ~incapacitated_adult + child_caps = spm_unit.sum(p.dependent_care.calc(age) * is_child_care_recipient) childcare_expenses = spm_unit("childcare_expenses", period) - adult_care_expenses = add(spm_unit, period, ["care_expenses"]) - disregard_with_child_care = min_( - childcare_expenses + adult_care_expenses, total_max_disregard - ) + child_care_disregard = min_(childcare_expenses, child_caps) # Per Section 5(3)(b)1.c and MS 2840 B.1, child care counts only for a # case that is otherwise ineligible without it; CCAP pays child care # for a case that remains eligible. The month-of-application case @@ -47,4 +42,4 @@ def formula(spm_unit, period, parameters): adult_care_disregard = spm_unit( "ky_ktap_incapacitated_adult_care_disregard", period ) - return where(child_care_counts, disregard_with_child_care, adult_care_disregard) + return adult_care_disregard + where(child_care_counts, child_care_disregard, 0) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.py index 6a7eea1ba6e..756fb08cea9 100644 --- a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.py +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.py @@ -18,9 +18,9 @@ def formula(spm_unit, period, parameters): incapacitated_adult = person("is_adult", period.this_year) & person( "is_incapable_of_self_care", period.this_year ) - n_incapacitated_adults = spm_unit.sum(incapacitated_adult) - # An incapacitated adult receives the standard age-two-or-older rate - # per Section 5(3)(b)2, so evaluate the schedule at the age-two boundary. + # Section 5(3)(b)2 caps the care of each individual. An incapacitated + # adult receives the standard age-two-or-older rate, so evaluate the + # schedule at the age-two boundary. max_per_adult = p.dependent_care.calc(p.dependent_care.thresholds[1]) - adult_care_expenses = add(spm_unit, period, ["care_expenses"]) - return min_(adult_care_expenses, n_incapacitated_adults * max_per_adult) + adult_care_expenses = person("care_expenses", period) * incapacitated_adult + return spm_unit.sum(min_(adult_care_expenses, max_per_adult)) diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py index 0b0233e987a..eecfba505aa 100644 --- a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py @@ -12,14 +12,15 @@ class ky_ktap_ineligible_without_child_care_disregard(Variable): definition_period = MONTH reference = ( "https://apps.legislature.ky.gov/law/kar/titles/921/002/016/", - "https://www.chfs.ky.gov/agencies/dcbs/dfs/Documents/OMVOLIII.pdf", + # PDF pages 160, 162 + "https://www.chfs.ky.gov/agencies/dcbs/dfs/Documents/OMVOLIII.pdf#page=160", ) defined_for = StateCode.KY def formula(spm_unit, period, parameters): - # Per MS 2810 B, a case whose countable income equals or exceeds the - # standard of need is ineligible. Compute countable income with the - # dependent care disregard for incapacitated adults only. + # Per 921 KAR 2:016 Section 4(2)(b), a case whose countable income + # exceeds the standard of need is ineligible. Compute countable income + # with the dependent care disregard for incapacitated adults only. p = parameters(period).gov.states.ky.dcbs.ktap.income.deductions person = spm_unit.members gross_earned = person("tanf_gross_earned_income", period) @@ -32,4 +33,4 @@ def formula(spm_unit, period, parameters): ) countable_unearned = spm_unit("ky_ktap_countable_unearned_income", period) standard_of_need = spm_unit("ky_ktap_standard_of_need", period) - return countable_earned + countable_unearned >= standard_of_need + return countable_earned + countable_unearned > standard_of_need diff --git a/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/deductions/vt_reach_up_dependent_care_deduction.py b/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/deductions/vt_reach_up_dependent_care_deduction.py index 9c12ce98f3e..4be2d026662 100644 --- a/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/deductions/vt_reach_up_dependent_care_deduction.py +++ b/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/deductions/vt_reach_up_dependent_care_deduction.py @@ -9,7 +9,8 @@ class vt_reach_up_dependent_care_deduction(Variable): definition_period = MONTH reference = ( "https://www.law.cornell.edu/regulations/vermont/13-220-Code-Vt-R-13-170-220-X", - "https://outside.vermont.gov/dept/DCF/Shared%20Documents/ESD/Rules/2200-Reach-Up.pdf#page=74", + # PDF pages 71, 74-75 + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/ESD/Rules/2200-Reach-Up.pdf#page=71", "https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/ESD-Procedure-P2230A.pdf", ) defined_for = StateCode.VT @@ -21,7 +22,9 @@ def formula(spm_unit, period, parameters): # member who is a disabled or seriously ill adult. Section 2252.2(b) # covers child care only for a child who is not a member of the # Reach Up household, which the model does not track; child care for - # children in the unit is not deducted (ESD Procedure P-2230A). + # children in the unit is not deducted (rule 2251.1(e): child care + # provided as a Reach Up support service is not a dependent care + # expense; ESD Procedure P-2230A). p = parameters(period).gov.states.vt.dcf.reach_up.income.deductions person = spm_unit.members head_or_spouse = person("is_tax_unit_head_or_spouse", period) diff --git a/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/vt_reach_up_countable_earned_income.py b/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/vt_reach_up_countable_earned_income.py index 85b2bbcfff0..521fd891da7 100644 --- a/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/vt_reach_up_countable_earned_income.py +++ b/policyengine_us/variables/gov/states/vt/dcf/reach_up/income/vt_reach_up_countable_earned_income.py @@ -17,5 +17,6 @@ def formula(spm_unit, period, parameters): earned_after_disregard = add( spm_unit, period, ["vt_reach_up_countable_earned_income_person"] ) + # Order per rule 2251.1(c)(1): earned income disregard, then dependent care. dependent_care = spm_unit("vt_reach_up_dependent_care_deduction", period) return max_(earned_after_disregard - dependent_care, 0) diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 843ddcbe21c..2b4d381d58e 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -2418,6 +2418,38 @@ candidates: state: open note: A source-choice decision was requested; resolve the incorporated restriction and verify applicability beyond 2025. +- id: us-ky:ktap-incapacitated-adult-care-condition + program: tanf + years: + from: 2015 + type: calendar + question: Does the K-TAP dependent care disregard for an incapacitated adult apply only when the case would be + ineligible without it? + sources: + - kind: regulation + citation: 921 KAR 2:016 Section 5(3)(b)1 + url: https://apps.legislature.ky.gov/law/kar/titles/921/002/016/ + - kind: manual + citation: DCBS Operations Manual Volume III, MS 2840 B.1, OMTL-616, revised 3/1/23 + url: https://www.chfs.ky.gov/agencies/dcbs/dfs/Documents/OMVOLIII.pdf#page=162 + readings: + statute: Care of "an incapacitated adult living in the home and receiving KTAP" (1.b) is a case of its own; + the otherwise-ineligible case (1.c) covers only child care. + other: The deduction needs care paid for "a child or an incapacitated adult" and a case that "would be + ineligible without the deduction", for the adult as for the child. + example: In January 2025 a unit of three has a parent who earns $1,000, a child age 5 and an incapacitated adult + with $100 a month of care. Without any dependent care disregard countable income is 412.50, under the 631 + standard of need. The regulation allows the $100 disregard; the manual allows none. + pe_us: + follows: statute + code: + - policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_incapacitated_adult_care_disregard.py + - policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10254 + state: unreviewed + note: Section 5(3)(b)1.b reads the same in the versions effective 11-18-2015 and 2-16-2023. Code not yet on + main. - id: us-ky:ktap-payment-maximum-2025 program: tanf years: @@ -2445,6 +2477,36 @@ candidates: state: unreviewed note: PE-US follows the manual from November 1, 2025; determine the governing source in this regulation/manual conflict. +- id: us-ky:ktap-standard-of-need-equality + program: tanf + years: + from: 2015 + type: calendar + question: Is a K-TAP case whose countable income equals the standard of need ineligible? + sources: + - kind: regulation + citation: 921 KAR 2:016 Section 4(2)(b) + url: https://apps.legislature.ky.gov/law/kar/titles/921/002/016/ + - kind: manual + citation: DCBS Operations Manual Volume III, MS 2810 B, OMTL-688, revised 3/1/26 + url: https://www.chfs.ky.gov/agencies/dcbs/dfs/Documents/OMVOLIII.pdf#page=160 + readings: + statute: The case is ineligible only when countable income "exceeds" the standard of need. + other: The case is ineligible when countable income "is equal to or exceeds" the standard of need. + example: In January 2024 a parent with one child age 5 has $375 of earnings, $452 of unearned income and $300 + of child care. Without the child care disregard countable income is 552, equal to the standard of need (size + 2). Under the regulation the case is not otherwise ineligible, the Section 5(3)(b)1.c child care disregard + does not apply, and the benefit is $0. Under the manual the $175 disregard applies and the benefit is $48.13. + pe_us: + follows: statute + code: + - policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10254 + state: unreviewed + note: The boundary matters only for the Section 5(3)(b)1.c child care disregard, since the ratable-reduction + deficit is 0 at equality. Section 4(2)(b) reads the same in the versions effective 11-18-2015 and 2-16-2023. + Code not yet on main. - id: us-ky:liheap-subsidized-income-points program: liheap years: @@ -5467,6 +5529,34 @@ candidates: state: unreviewed note: PE-US treats the worksheet as filling silence about actual itemization; verify that interpretation against the statutory phrase. +- id: us-vt:reach-up-dependent-care-order + program: tanf + years: + from: 2024 + type: calendar + question: Does Reach Up subtract the dependent care deduction from earned income before or after the earned + income disregard? + sources: + - kind: regulation + citation: Reach Up rule 2251.1(c)(1), 08/01/2024 + url: https://outside.vermont.gov/dept/DCF/Shared%20Documents/ESD/Rules/2200-Reach-Up.pdf#page=71 + - kind: guidance + citation: ESD Procedure P-2230A, net earned income steps 2 and 4-6 + url: https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/ESD-Procedure-P2230A.pdf + readings: + statute: The unsubsidized sequence is business expenses, then the earned income disregard (rule 2252.3), then + dependent care (rule 2252.2). + other: Dependent care comes off first, then the $90 deduction or $350 disregard, then 25% of the subtotal. + example: One participant earns $1,000 and pays $100 a month of disabled adult care. The rule gives 1,000 - (350 + + 0.25 x 650) - 100 = 387.50 of net earned income; the procedure gives (1,000 - 100 - 350) x 0.75 = 412.50. + pe_us: + follows: statute + code: + - policyengine_us/variables/gov/states/vt/dcf/reach_up/income/vt_reach_up_countable_earned_income.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10254 + state: unreviewed + note: The earlier rule editions were not compared. - id: us-vt:renter-credit-booklet-income-limit-errors program: renter-credit years: From 251543ea1b987a893964f4b15c9f8db8538c8ed7 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Tue, 27 Oct 2026 18:17:48 -0400 Subject: [PATCH 6/6] Count a zero K-TAP payment as ineligible in the child care counterfactual 921 KAR 2:016 Section 9(5) makes a benefit group whose assistance payment equals zero ineligible. Under Section 9(4)(a) the payment is the lesser of 55% of the deficit and the payment maximum, so a case whose countable income without the child care disregard equals the standard of need is otherwise ineligible, and the Section 5(3)(b)1.c child care disregard applies. ky_ktap_ineligible_without_child_care_disregard now checks the zero payment as well as the Section 4(2)(b) excess. Update the equality tests: the January 2024 case (earnings $375, unearned $452, $300 of child care, size 2) now gets the $175 disregard, countable income $464.50 and a benefit of 0.55 x (552 - 464.50) = 48.125. Add a case one dollar below the standard of need (eligible). Remove the us-ky:ktap-standard-of-need-equality candidate: read with Section 9(5), the regulation also makes the equality case ineligible, as MS 2810 B does, so the sources agree. Co-Authored-By: Claude Opus 5.5 --- ...x-10208-tanf-dependent-care-scope.fixed.md | 2 +- .../ky_ktap_dependent_care_disregard.yaml | 11 +++--- ...eligible_without_child_care_disregard.yaml | 37 +++++++++++++++++-- .../gov/states/ky/dcbs/ktap/integration.yaml | 22 ++++++----- ...ineligible_without_child_care_disregard.py | 26 ++++++++++--- source_conflicts/candidates.yaml | 30 --------------- 6 files changed, 73 insertions(+), 55 deletions(-) diff --git a/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md b/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md index 7aa70156317..d2f49c72adc 100644 --- a/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md +++ b/changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md @@ -1 +1 @@ -Limit the Hawaii TANF and Vermont Reach Up dependent care deductions to the care the state rules allow (an incapacitated or disabled adult; not the unit's own children), cap each incapacitated adult's care separately in Hawaii and Kentucky, and apply the Kentucky K-TAP child care disregard only to a case whose countable income otherwise exceeds the standard of need (921 KAR 2:016 Sections 4(2)(b) and 5(3)(b)1.c). +Limit the Hawaii TANF and Vermont Reach Up dependent care deductions to the care the state rules allow (an incapacitated or disabled adult; not the unit's own children), cap each incapacitated adult's care separately in Hawaii and Kentucky, and apply the Kentucky K-TAP child care disregard only to a case that is otherwise ineligible, because its countable income exceeds the standard of need or its payment is zero (921 KAR 2:016 Sections 4(2)(b), 5(3)(b)1.c and 9(5)). diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml index be122f39bde..bd41c82b1e4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_dependent_care_disregard.yaml @@ -414,7 +414,7 @@ # 0 + 175 = 175 (not min(300, 175 + 175) = 300). ky_ktap_dependent_care_disregard: 175 -- name: Child care is not disregarded when countable income equals the standard of need. +- name: Child care is disregarded when countable income equals the standard of need. period: 2024-01 absolute_error_margin: 0.01 input: @@ -436,7 +436,8 @@ state_code: KY output: # Without child care: (375 - 175) x 0.5 + 452 = 552 = 552 standard of - # need (size 2). Section 4(2)(b) makes a case ineligible only when income - # exceeds the standard, so the case is not otherwise ineligible. - ky_ktap_ineligible_without_child_care_disregard: false - ky_ktap_dependent_care_disregard: 0 + # need (size 2). The payment is min(0.55 x (552 - 552), 450) = 0, so + # Section 9(5) makes the case otherwise ineligible. + ky_ktap_ineligible_without_child_care_disregard: true + # Child care: min(300, 175 cap for age 5) = 175 + ky_ktap_dependent_care_disregard: 175 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml index d6949e8b526..fad585a3e32 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.yaml @@ -2,7 +2,9 @@ # Per 921 KAR 2:016 Section 5(3)(b)1.c and DCBS Operations Manual Vol. III # MS 2840 B.1, the dependent care disregard covers child care only for a case # that is otherwise ineligible without it. Per 921 KAR 2:016 Section 4(2)(b), -# a case is ineligible when countable income exceeds the standard of need. +# a case is ineligible when countable income exceeds the standard of need, +# and per Section 9(5) when its payment, the lesser of 55% of the deficit and +# the payment maximum (Section 9(4)(a)), is zero. # Countable earned income here applies the $175 work expense, any # incapacitated adult care disregard, and the 50% disregard (January). @@ -57,7 +59,7 @@ # Countable income: 662.50 > 631 standard of need (size 3), ineligible. ky_ktap_ineligible_without_child_care_disregard: true -- name: Case 3, countable income equal to the standard of need is not ineligible. +- name: Case 3, countable income equal to the standard of need is ineligible. period: 2024-01 absolute_error_margin: 0.01 input: @@ -79,8 +81,35 @@ output: # Countable earned: (375 - 175) x 0.5 = 100; unearned: 452 # Countable income: 552 = standard of need (size 2): 552. - # Section 4(2)(b): only income that "exceeds" the standard of need makes - # the case ineligible, so the child care disregard does not apply. + # Section 4(2)(b) does not apply (552 does not exceed 552), but the + # payment is min(0.55 x (552 - 552), 450) = 0, so Section 9(5) makes the + # case ineligible. + ky_ktap_ineligible_without_child_care_disregard: true + +- name: Case 3a, countable income one dollar below the standard of need is eligible. + period: 2024-01 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 30 + tanf_gross_earned_income: 373 + tanf_gross_unearned_income: 452 + child: + age: 5 + spm_units: + spm_unit: + members: [parent, child] + childcare_expenses: 3_600 + households: + household: + members: [parent, child] + state_code: KY + output: + # Countable earned: (373 - 175) x 0.5 = 99; unearned: 452 + # Countable income: 551 < 552 standard of need (size 2). + # Payment: min(0.55 x (552 - 551), 450) = 0.55 > 0, so the case is + # eligible without the child care disregard. ky_ktap_ineligible_without_child_care_disregard: false - name: Case 3b, countable income one dollar above the standard of need is ineligible. diff --git a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml index aa6ec3d04a6..eac611d2a9b 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ky/dcbs/ktap/integration.yaml @@ -229,7 +229,7 @@ # Benefit: min(0.55 x (631 - 550), 524) = 44.55 ky_ktap: 44.55 -- name: Case 7, countable income equal to the standard of need pays no benefit. +- name: Case 7, child care disregard for a case whose countable income equals the standard of need. period: 2024-01 absolute_error_margin: 0.01 input: @@ -252,11 +252,15 @@ state_code: KY output: # Without child care: (375 - 175) x 0.5 + 452 = 552 = 552 standard of - # need (size 2). 921 KAR 2:016 Section 4(2)(b) makes a case ineligible - # only when income exceeds the standard, so the case is not otherwise - # ineligible and the child care disregard does not apply. - ky_ktap_ineligible_without_child_care_disregard: false - ky_ktap_dependent_care_disregard: 0 - ky_ktap_countable_income: 552 - # Benefit: 0.55 x max(552 - 552, 0) = 0 - ky_ktap: 0 + # need (size 2). The payment would be min(0.55 x (552 - 552), 450) = 0, + # and 921 KAR 2:016 Section 9(5) makes a case with a zero payment + # ineligible, so the case is otherwise ineligible and the child care + # disregard applies (Section 5(3)(b)1.c): min(300, 175) = 175. + ky_ktap_ineligible_without_child_care_disregard: true + ky_ktap_dependent_care_disregard: 175 + # Earned: (375 - 175 - 175) x 0.5 = 12.50; countable: 12.50 + 452 = 464.50 + ky_ktap_countable_income: 464.5 + # Gross income 827 <= 552 x 1.85 = 1,021.20 + ky_ktap_eligible: true + # Benefit: min(0.55 x (552 - 464.50), 450) = 48.125 + ky_ktap: 48.125 diff --git a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py index eecfba505aa..071e11a767c 100644 --- a/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py +++ b/policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py @@ -11,6 +11,7 @@ class ky_ktap_ineligible_without_child_care_disregard(Variable): label = "Kentucky K-TAP case is ineligible without the child care disregard" definition_period = MONTH reference = ( + # Sections 4(2)(b), 5(3)(b)1.c, 9(4)(a) and 9(5) "https://apps.legislature.ky.gov/law/kar/titles/921/002/016/", # PDF pages 160, 162 "https://www.chfs.ky.gov/agencies/dcbs/dfs/Documents/OMVOLIII.pdf#page=160", @@ -18,10 +19,9 @@ class ky_ktap_ineligible_without_child_care_disregard(Variable): defined_for = StateCode.KY def formula(spm_unit, period, parameters): - # Per 921 KAR 2:016 Section 4(2)(b), a case whose countable income - # exceeds the standard of need is ineligible. Compute countable income - # with the dependent care disregard for incapacitated adults only. - p = parameters(period).gov.states.ky.dcbs.ktap.income.deductions + # Compute countable income with the dependent care disregard for + # incapacitated adults only. + p = parameters(period).gov.states.ky.dcbs.ktap person = spm_unit.members gross_earned = person("tanf_gross_earned_income", period) adult_care = spm_unit("ky_ktap_incapacitated_adult_care_disregard", period) @@ -29,8 +29,22 @@ def formula(spm_unit, period, parameters): person, period ) countable_earned = spm_unit.sum( - ky_ktap_countable_earnings(gross_earned, adult_care_person, p, period) + ky_ktap_countable_earnings( + gross_earned, adult_care_person, p.income.deductions, period + ) ) countable_unearned = spm_unit("ky_ktap_countable_unearned_income", period) + countable_income = countable_earned + countable_unearned standard_of_need = spm_unit("ky_ktap_standard_of_need", period) - return countable_earned + countable_unearned > standard_of_need + # Per 921 KAR 2:016 Section 4(2)(b), a case whose countable income + # exceeds the standard of need is ineligible. + exceeds_need = countable_income > standard_of_need + # Per Section 9(5), a case whose payment is zero is also ineligible. + # Section 9(4)(a) pays the lesser of 55% of the deficit below the + # standard of need and the payment maximum, so the payment is zero + # when countable income equals the standard of need. + deficit = max_(standard_of_need - countable_income, 0) + payment_maximum = spm_unit("ky_ktap_payment_maximum", period) + payment = min_(deficit * p.benefit.rate, payment_maximum) + zero_payment = payment == 0 + return exceeds_need | zero_payment diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 983330354e0..f19cf35ef3c 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -2662,36 +2662,6 @@ candidates: size and capped at seven, and the parameter''s comment records the web app''s Number of Children label (benefit/payment_maximum.yaml, ky_ktap_payment_maximum.py). The KY FACES page is written for kinship caregivers, whose child-only cases count only the children, so the label may describe that audience; confirm which count the agency applies.' -- id: us-ky:ktap-standard-of-need-equality - program: tanf - years: - from: 2015 - type: calendar - question: Is a K-TAP case whose countable income equals the standard of need ineligible? - sources: - - kind: regulation - citation: 921 KAR 2:016 Section 4(2)(b) - url: https://apps.legislature.ky.gov/law/kar/titles/921/002/016/ - - kind: manual - citation: DCBS Operations Manual Volume III, MS 2810 B, OMTL-688, revised 3/1/26 - url: https://www.chfs.ky.gov/agencies/dcbs/dfs/Documents/OMVOLIII.pdf#page=160 - readings: - statute: The case is ineligible only when countable income "exceeds" the standard of need. - other: The case is ineligible when countable income "is equal to or exceeds" the standard of need. - example: In January 2024 a parent with one child age 5 has $375 of earnings, $452 of unearned income and $300 - of child care. Without the child care disregard countable income is 552, equal to the standard of need (size - 2). Under the regulation the case is not otherwise ineligible, the Section 5(3)(b)1.c child care disregard - does not apply, and the benefit is $0. Under the manual the $175 disregard applies and the benefit is $48.13. - pe_us: - follows: statute - code: - - policyengine_us/variables/gov/states/ky/dcbs/ktap/income/ky_ktap_ineligible_without_child_care_disregard.py - prs: - - https://github.com/PolicyEngine/policyengine-us/pull/10254 - state: unreviewed - note: The boundary matters only for the Section 5(3)(b)1.c child care disregard, since the ratable-reduction - deficit is 0 at equality. Section 4(2)(b) reads the same in the versions effective 11-18-2015 and 2-16-2023. - Code not yet on main. - id: us-ky:liheap-subsidized-income-points program: liheap years: