Skip to content

Limit Hawaii, Vermont and Kentucky TANF dependent care deductions to the care their rules allow - #10254

Open
PavelMakarchuk wants to merge 8 commits into
mainfrom
fix-10208-tanf-dependent-care-scope
Open

PavelMakarchuk wants to merge 8 commits into
mainfrom
fix-10208-tanf-dependent-care-scope

Conversation

@PavelMakarchuk

@PavelMakarchuk PavelMakarchuk commented Oct 16, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Three state TANF dependent care deductions subtracted the unit's childcare_expenses for its own children, which the state rules do not allow. Each state's change is in its own commit; review fixes are in a later commit.

  • Hawaii (hi_tanf_dependent_care_deduction): HAR 17-676-54.1(c)(4) and (d)(4) deduct "the actual cost for the care of each incapacitated adult living in the same household and receiving financial assistance", up to $175 (full time) or $165 a month. The HAR 17-676-2 definition is the same, and the State Plan 10.2.2 table lists "Cost of care for a disabled adult household member". The formula now deducts each disabled adult's care_expenses, capped separately at $175 or $165; child care and children no longer count.
  • Vermont (vt_reach_up_dependent_care_deduction): Reach Up rule 2251.1(e) says child care provided as a Reach Up support service "does not constitute dependent care expenses and is not an allowable deduction". Rule 2252.2 (file pages 74-75) (a) covers a disabled or seriously ill adult household member, and (b) covers only a child who is not a member of the Reach Up household. ESD Procedure P-2230A step 2 says the same. The model does not track children outside the unit, so the formula now deducts only care_expenses, up to $175 per participant. A comment in vt_reach_up_countable_earned_income notes that the order (disregard, then dependent care) follows rule 2251.1(c)(1).
  • Kentucky (ky_ktap_dependent_care_disregard): 921 KAR 2:016 Section 5(3)(b)1 allows the disregard for (a) a child 13 or over, (b) an incapacitated adult, (c) "a KTAP case that is otherwise ineligible for KTAP without the benefit of the disregard for child care", or (d) the month of application. DCBS Operations Manual Vol. III MS 2840 B.1 adds that CCAP must be used instead if the case stays eligible without the deduction. Section 4(2)(b) makes a case ineligible when countable income "exceeds" the standard of need. Changes:
    • New ky_ktap_ineligible_without_child_care_disregard: countable income with only the incapacitated adult care disregard, compared with the standard of need. At equality the case is not ineligible: the regulation says "exceeds", although manual MS 2810 B says "is equal to or exceeds". The model follows the regulation.
    • New ky_ktap_incapacitated_adult_care_disregard: the incapacitated adult part, which always applies, with each adult's care capped separately at $175 (Section 5(3)(b)2).
    • ky_ktap_dependent_care_disregard is the adult part, plus child care up to the children's age-based caps when the case is otherwise ineligible.
    • The per-person countable earnings steps and the primary-earner allocation (MS 2840 B.2.c) move into ky_ktap_earned_income_helpers.py, so ky_ktap_countable_earned_income and the new flag use the same steps. Results do not change for the existing variables.
    • Not modeled: the month-of-application case (d). Known gaps, now in Kentucky, Hawaii and Vermont TANF dependent care: remaining gaps after #10254 (KY child 13+ and part-time cap, HI applicant hours, VT rounding and participant cap) #10494: case (a) allows up to $175 (full time) or $150 (part time) for an able-bodied child 13 or over, but PE gives $0 because the existing schedule ends at 13; and PE always uses the $175 full-time cap, not the $150 part-time cap.

Reproduction from the issue (parent with $1,000 a month in earnings, children 5 and 2, $1,530 a month of child care): the deduction is now $0 in all three states, and the benefit equals the no-child-care benefit (HI $518.64, VT $125.56, KY $120.18; before: $788.64, $300.56, $216.43).

Source conflicts

The model follows the regulation where the agency's manual or procedure reads differently. These are recorded as backlog items in source_conflicts/candidates.yaml (not yet in the rulespec-us register, so the code has no markers):

  • us-ky:ktap-standard-of-need-equality: 921 KAR 2:016 Section 4(2)(b) "exceeds" vs. MS 2810 B "equal to or exceeds".
  • us-ky:ktap-incapacitated-adult-care-condition: Section 5(3)(b)1.b (adult care in every case) vs. MS 2840 B.1 (adult care only if the case is otherwise ineligible).
  • us-vt:reach-up-dependent-care-order: rule 2251.1(c)(1) (disregard, then dependent care) vs. P-2230A (dependent care first).

Overlap with #10332

#10332 also rewrites the Hawaii deduction and its tests, and gives the same per-adult result ($300 + $50 gives $225). It reads a new input, hi_tanf_qualifying_incapacitated_adult_care_expenses; this PR reads care_expenses for each disabled adult, as the Vermont and Kentucky formulas do. The two branches conflict in four Hawaii files, so only one PR should carry the Hawaii change.

Tests

  • HI: hi_tanf_dependent_care_deduction.yaml rewritten (child care cases now $0; cap and hours cases use a disabled adult; Cases 14-16 cap each adult separately: $300 + $50 gives $225, the part-time cap applies per adult, and a member who is not a disabled adult adds nothing); hi_tanf_countable_earned_income.yaml cases 2-4 use a disabled adult; integration.yaml Case 7 now shows child care does not reduce countable income ($35.76 benefit).
  • VT: vt_reach_up_dependent_care_deduction.yaml rewritten the same way; integration.yaml Case 10 now deducts $0 ($406.10 benefit).
  • KY:
    • ky_ktap_ineligible_without_child_care_disregard.yaml (6 cases): Case 3 (income equal to the standard of need) is false, and Case 3b ($1 above) is true.
    • New ky_ktap_incapacitated_adult_care_disregard.yaml (8 cases), including two adults at $300 and $50 (gives $225).
    • ky_ktap_dependent_care_disregard.yaml: per-individual caps (two adults: $225; an unused child cap and an unused adult cap absorb nothing: $175 each) and the equality case ($0).
    • integration.yaml: eligible case ($120.18), otherwise ineligible case (disregard $300, benefit $44.55), and income equal to the standard of need (benefit $0).
    • Existing cap and allocation cases set the new flag to true as an input so they keep testing the caps.
  • 10 of the cases added or changed in the review-fix commit fail on the previous head (87f3352256) and pass here.
  • policyengine-core test (batched per subdirectory) on states/hi/dhs, states/hi/bessd, states/vt/dcf and states/ky/dcbs, plus states/oh/dcy/ccap/integration.yaml: 933 passed. tests/code_health/test_source_conflicts.py: 103 passed.

Fixes #10208

axiom: TheAxiomFoundation/rulespec-us#1865 queued (HI HAR 17-676-54.1, per-adult caps; re-pin and encoder approval); TheAxiomFoundation/rulespec-us#1949 queued (VT Reach Up rules 2251.1, 2252.2; re-pin and encoder approval); TheAxiomFoundation/rulespec-us#1950 queued (KY 921 KAR 2:016 Sections 4(2)(b), 5(3)(b); re-pin and encoder approval)

🤖 Generated with Claude Code

PavelMakarchuk and others added 4 commits October 16, 2026 15:28
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
…e 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 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@PavelMakarchuk
PavelMakarchuk marked this pull request as ready for review October 23, 2026 17:03
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@DTrim99

DTrim99 commented Oct 26, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Limit Hawaii, Vermont and Kentucky TANF dependent care deductions to the care their rules allow

Summary

The PR narrows three state TANF dependent care deductions that deducted the unit's childcare_expenses for its own children:

  • Hawaii (hi_tanf_dependent_care_deduction).
    • Before: min(childcare_expenses + care_expenses, (children + disabled adults) × $175/$165).
    • Now: min(care_expenses, disabled adults × $175/$165). Children no longer count toward the cap, and child care is ignored.
  • Vermont (vt_reach_up_dependent_care_deduction).
    • Before: min(childcare_expenses + care_expenses, participants × $175).
    • Now: min(care_expenses, participants × $175).
  • Kentucky (ky_ktap_dependent_care_disregard).
    • Before: child care plus adult care went against the summed per-person caps for every unit.
    • Now: a new flag, ky_ktap_ineligible_without_child_care_disregard, compares countable income (work expense, adult care, 50%) with the standard of need. The child care part applies only when the flag is true. Otherwise the disregard is the new ky_ktap_incapacitated_adult_care_disregard.
    • The per-person earnings steps and the primary-earner share move into ky_ktap_earned_income_helpers.py, with no change in results.

The PR also rewrites or adds YAML cases in all three states and adds a fixed changelog fragment.

  • Law. The three scope changes are right:
    • HAR 17-676-54.1(c)(4) and (d)(4) deduct only "the actual cost for the care of each incapacitated adult".
    • Reach Up rule 2251.1(e) and rule 2252.2(a)-(b) exclude child care for Reach Up children.
    • 921 KAR 2:016 Section 5(3)(b)1.c allows child care only for a case "otherwise ineligible for KTAP without the benefit of the disregard for child care".
  • Years. The texts are the same in every edition I checked: HI since the 11/09/06 compilation, VT from the LII edition (history from 2008) through the 08/01/2024 edition, and KY in the versions effective 11-18-2015 and 2-16-2023.
  • Order of operations. Each state's order matches its rule.
  • Code. It is vectorized, uses the right entities, and creates no cycle. No state-gated variable is used as a parameter key, so the NH Add New Hampshire state supplementation for 2026 #10156 pattern doesn't apply.
  • Tests. I hand-checked 21 expectations and the body's reproduction, and all are arithmetically right.
  • CI and branch. All 27 checks pass, and the merge with main is clean.

Three things need fixing:

  1. HI and the new KY adult variable pool the caps instead of capping each incapacitated adult separately, as both rules require.
  2. KY's "otherwise ineligible" test uses the DCBS manual's "equal to or exceeds". The regulation says "exceeds", and the PR doesn't say so.
  3. The axiom: line is missing.

Sibling PR #10332 rewrites the same Hawaii files (see Branch status).

Critical (must fix)

None.

Should address

1. Cap each incapacitated adult's care separately (HI formula and the new KY adult variable).

Both rules cap the care of each adult individually:

  • Hawaii. HAR 17-676-54.1(d)(4) (DHS compilation, file page 37; (c)(4) on file page 36): "deduct an amount equal to the actual cost for the care of each incapacitated adult living in the same household and receiving financial assistance, but not to exceed: (A) $175 a month if the applicant or recipient is employed full time; or (B) $165 a month".
  • Kentucky. 921 KAR 2:016 Section 5(3)(b)2: "Not exceed: a. $175 per month per individual for full-time employment; b. $150 per month per individual for part-time employment; or c. $200 per month per individual for child under age two (2)" (KAR).

The code pools both the expenses and the caps:

  • Hawaii. hi_tanf_dependent_care_deduction.py:24,45 sums every member's care_expenses and returns min_(adult_care_expenses, num_care_recipients * rate).
  • Kentucky. ky_ktap_incapacitated_adult_care_disregard.py:25-26 does the same with n_incapacitated_adults * max_per_adult.

So one adult's unused cap absorbs another adult's excess. Any member's care_expenses also counts once one qualifying adult is present.

Case (40 hours a week) Rule PR
HI: two disabled adults, care $300 and $50 a month 175 + 50 = 225 min(350, 2 × 175) = 350
KY: two incapacitated adults, care $300 and $50 a month 225 350
KY, flag true: a child age 5 with $0 child care and an incapacitated adult with $300 (ky_ktap_dependent_care_disregard.py:37-39) 175 + 0 = 175 min(300, 175 + 175) = 300

The pooling is pre-existing, since main pooled children and adults too. But the PR rewrites exactly these return lines, and the KY adult variable is new code. care_expenses is a Person variable, so per-adult caps are now simple. The brief puts a missing cap on an otherwise-correct structure at this level. Main is no better on these cases, so this isn't a regression.

Fix:

  • HI. care = person("care_expenses", period) * is_disabled_adult, then return spm_unit.sum(min_(care, spm_unit.project(rate))).
  • KY adult variable. spm_unit.sum(min_(person("care_expenses", period) * incapacitated_adult, max_per_adult)).
  • KY disregard. Return adult_care_disregard + where(child_care_counts, min_(childcare_expenses, child_caps), 0), where child_caps sums only the dependents' age-based caps.
  • Tests. Add the three rows above as cases. Add a direct test file for ky_ktap_incapacitated_adult_care_disregard, which today is reached only through other outputs.

PR #10332's Hawaii formula already caps each adult separately (Branch status).

2. KY: the "otherwise ineligible" boundary follows the manual over the regulation. Follow the regulation, or register the conflict.

ky_ktap_ineligible_without_child_care_disregard.py:35 returns countable_earned + countable_unearned >= standard_of_need. Its comment (lines 20-22), the test file header, Case 3 ("countable income equal to the standard of need is ineligible") and the PR body cite only DCBS MS 2810 B.

The two sources say different things:

  • The manual. MS 2810 B (Operations Manual Vol. III, file page 160, R. 3/1/26): "If the KTAP family's income, after subtracting excluded income and applicable deductions, is equal to or exceeds the Standard of Need, the KTAP family group is ineligible."
  • The regulation. 921 KAR 2:016 Section 4(2)(b): "If the benefit group's income, after subtracting excluded income and applicable deductions, exceeds the standard of need for the appropriate benefit group size ... the benefit group shall be ineligible". It reads the same in the current version (eff. 2-16-2023) and the prior one (eff. 11-18-2015).

At exact equality, the two readings give different results:

  • The regulation. The case isn't ineligible, so 5(3)(b)1.c doesn't apply, the deficit is 0, and the benefit is $0.
  • The PR. The child care disregard applies. Take Case 3 (size 2, countable income 552 = 552) with $300 of care for a child age 5:
    • the disregard is min(300, 175) = 175;
    • earned income is (375 − 175 − 175) × 0.5 = 12.50;
    • countable income is 12.50 + 452 = 464.50;
    • the benefit is 0.55 × (552 − 464.50) = $48.13 a month.

Elsewhere the PR follows the regulation over the manual, which is the right call. MS 2840 B.1 (file page 162) would require "The KTAP case would be ineligible without the deduction" for "a child or an incapacitated adult". The regulation lists the incapacitated adult as its own case (1.b), and the PR applies adult care unconditionally. CONTRIBUTING.md ("Source conflicts") ranks the regulation above a manual.

Fix (either):

  • (a) Preferred. Change line 35 to > and cite Section 4(2)(b) in the comment. Rename Case 3 and flip it to false. Change the body's MS 2810 B sentence to match.
  • (b) Keep >=. Record the conflict as CONTRIBUTING.md requires: a rulespec-us register entry, and a # Source conflict us-ky:<id> marker on line 35.

3. Add the axiom: line to the PR body.

The body (head 87f3352256, last edited 2026-10-23) has no line starting with axiom in any format. Pavel is staff and this is a policy fix, so the line is required, and axiom: needed isn't available. encoded-correct isn't available for any of the three states. See "Axiom line assessment" for the line and the issue contents.

Suggestions

  1. KY: say plainly that case 1.a is a known gap, and file a follow-up.

    • Section 5(3)(b)1.a allows the disregard for "An able-bodied child age thirteen (13) or over and not under court supervision", whether or not the case is otherwise ineligible. MS 2840 B.2.a also allows care for a child 13 or older, with documentation.
    • The dependent_care.yaml schedule gives $0 from age 13, and edge Cases 36-37 pin that. Case 37 is one the PR edits.
    • The body's "Case (a) is also not changed: the existing schedule gives $0 at age 13 and over" reads as if that were the rule. Say instead that 1.a allows up to $175/$150 and PE gives $0.
    • Under the new structure, a 13+ child's care belongs on the always-applies side with the adult part.
    • The same follow-up can add the part-time cap: $150 under Section 5(3)(b)2.b, where part-time is "Less than thirty (30) hours per week" or "Less than 130 hours per month" (Section 1(16)). The new adult variable also hard-codes $175.
  2. KY: reword the forced-flag comments. Several existing cases set the flag to true with "# Otherwise ineligible without the child care disregard" although their households are eligible without it:

    • countable-earned Case 8: 212.50 + 112.50 = 325 < 631;
    • edge Case 38: 87.50 < 552;
    • edge Case 40: 162.50 + 30 = 192.50 < 552.

    Forcing the input to test the caps is fine. Say "set as an input to test the caps", or use inputs that are actually over the standard of need.

  3. Citations.

    • VT. Add Reach Up rule 2251.1(e) (file page 71): "Child care provided as a support service to Reach Up households does not constitute dependent care expenses and is not an allowable deduction." It is the most direct support for the VT change.
    • KY manual. Give the manual reference a page: #page=160, with a # PDF pages 160, 162-163 comment above it for MS 2810 B and MS 2840. It is a 227-page PDF.
    • HI. The quoted "Cost of care for a disabled adult household member" is the 10.2.2 table row on State Plan file page 20. Section 10.2.1(D) on file page 19 says only "Deduction for Dependent Care Expense, when applicable". Fix the attribution in the code comment (hi_tanf_dependent_care_deduction.py:20-23) and in the body.
  4. VT: note which source sets the order. The PR now cites P-2230A, whose step 2 subtracts dependent care before the $90/$350 disregard. Rule 2251.1(c)(1) (file page 71) sets the unsubsidized sequence as "Earned income disregard (rule 2252.3); and iii. Dependent care expenses". vt_reach_up_countable_earned_income follows the rule.

    • A one-line comment such as "Order per rule 2251.1(c)(1): disregard, then dependent care" would make that explicit. That wording stays clear of the source-conflict ratchet.
    • Consider a source_conflicts/candidates.yaml entry for the procedure's order.
  5. Pre-existing gaps for a follow-up issue (outside this diff).

    • VT rounding and minimum. Rule 2242(a) (file page 56): the payment is "rounded down to the nearest whole dollar amount". Rule 2242(b) sets a $10 minimum. vt_reach_up does neither, so the changed integration Case 10 expectation (integration.yaml:649) would be 406, not 406.10.
    • HI full-time test. HAR keys the cap to "the applicant" being full time, meaning 32 hours a week or 138 hours a month (17-676-2, file page 6). The code takes any adult's weekly hours, and Case 7 pins that.
    • The adult's receipt of aid. HI requires the adult to be "receiving financial assistance", and KY requires the adult to be "receiving KTAP". Neither is checked.
    • KY in-home provider. MS 2840 B.1.c's exception (CCAP won't pay a provider who lives with the family) isn't modeled.
    • VT participant cap. The $175 cap applies to a participant "claiming the deduction" from earned income. The code counts every head or spouse, earning or not.

Verified correct

  • Hawaii.
    • HAR 17-676-54.1 (LII, am. 1/13/10). (c)(4) and (d)(4) come "After the thirty-six percent earned income disregard deduction". They cover only "each incapacitated adult living in the same household and receiving financial assistance", up to $175 full time and $165 otherwise.
    • HAR 17-676-2 (file page 5): "'Dependent care deduction' means an amount ... for the care of an incapacitated adult who is living in the same household and receiving financial assistance" [am 9/18/06; comp 11/09/06]. The parameter starts on 2007-07-01, so every period PE models falls under the adult-only text.
    • Order. The 20%, $200 and 55%/36% steps run per person, then dependent care comes off and the result is floored. That matches (d)(1)-(4) and State Plan 10.2.1 A-D.
  • Vermont.
    • Rule 2252.2 (file page 74, 08/01/2024). (a) covers "a household member, who is a disabled or seriously ill adult". (b) covers "a child, who is not a member of the Reach Up household". (c) on file page 75 sets "a maximum of $175 per month".
    • Earlier edition. The same (a)-(b) text is in the LII edition, whose amendment history runs from 2008 and which still shows the $250 disregard. That covers the parameter's 2015 start.
    • P-2230A step 2: "Subtract allowable dependent care paid for incapacitated adult or non-Reach Up member (very rare)".
    • Order. The EID comes first, then dependent care (rule 2251.1(c)(1)).
  • Kentucky.
    • Section 5(3)(b)1. It allows the disregard "for: a. An able-bodied child age thirteen (13) or over ...; b. An incapacitated adult living in the home and receiving KTAP; c. A KTAP case that is otherwise ineligible for KTAP without the benefit of the disregard for child care, at the option of the recipient; or d. The month of application".
    • Section 6. "With the exception of those circumstances pursuant to Section 5(3)(b) ..., a child care expense incurred as a result of employment shall be paid pursuant to 922 KAR 2:160" (CCAP).
    • Prior version. 1.c reads the same in the version effective 11-18-2015 (only "K-TAP" becomes "KTAP").
    • Order. The order is (a) the work expense, (b) dependent care, (e) 50%, the same as MS 2840. The flag repeats that order with only the adult part, assigns it to the primary earner (MS 2840 B.2.c), and adds countable unearned income. ky_ktap_countable_income is exactly earned plus unearned, so the flag and the benefit use the same measure.
    • Gross test. The gross test (ky_ktap_income_eligible) doesn't depend on deductions, so "otherwise ineligible" can only come from the standard-of-need test, which is the one the flag models.
  • Code.
    • All new logic uses where, sum, project and min_. The if p.earned_income_flat_disregard_in_effect: test reads a scalar parameter.
    • The new variables are SPMUnit MONTH with defined_for = StateCode.KY. The bool flag defaults to False.
    • YEAR inputs (age, is_adult, is_incapable_of_self_care) are read with period.this_year. Annual care_expenses converts to monthly (1,200 → 100, confirmed by the cases).
    • No cycle. The flag reads ky_ktap_incapacitated_adult_care_disregard, ky_ktap_countable_unearned_income and ky_ktap_standard_of_need. HI and VT no longer read childcare_expenses at all.
    • Helper modules in variable folders have precedents (ar_income_tax_helpers.py, snap_income_standard_helpers.py).
    • NH Add New Hampshire state supplementation for 2026 #10156. Keys come from spm_unit_size, age and hours, none of them state-gated.
  • Callers. hi_tanf_dependent_care_deduction and vt_reach_up_dependent_care_deduction each have one reader, their countable earned income variable. ky_ktap_dependent_care_disregard feeds only the person share, which feeds ky_ktap_countable_earned_income.
  • Hand-checked expectations (21). Assumptions: HI SOA $485.76 (size 2); VT payment standard $856.096; KY standard of need $552/$631 (size 2/3), payment maximum $524 for size 3 before 2025-11, 50% EID in January, $175 work expense.
    • HI deduction:
      • Case 2 (child care only): 0 (main 175).
      • Case 3 (three children, $700): 0 (main 525).
      • Case 6 (20 hours, $300): min(300, 165) = 165.
      • Case 7 (40/20 hours): 175.
      • Case 11 (two adults at $300): min(600, 350) = 350.
      • Case 12 (child $300 and adult $100): 100 (main 350).
    • HI countable earned income:
      • Case 2: (1,000 × 0.8 − 200) × 0.45 = 270, less 100 = 170.
      • Case 4: max(200 × 0.8 − 200, 0) = 0, so 0.
    • HI integration Case 7: 450, and 485.76 − 450 = 35.76 (main 185.76).
    • VT deduction:
      • Case 2 (child in the unit): 0 (main 100).
      • Case 6: min(500, 2 × 175) = 350.
      • Case 8 (adult $100 and child $300): 100 (main 175).
    • VT integration Case 10: (800 − 350) × 0.75 + (500 − 350) × 0.75 = 450, and 856.096 − 450 = 406.10 (main 706.10). Suggestion 5 gives 406 under rule 2242(a).
    • KY flag:
      • Case 1: (1,000 − 175) × 0.5 = 412.50 < 631, so false.
      • Case 3: 100 + 452 = 552, so true under >=. It is false under Section 4(2)(b) (Should 2).
      • Case 4: (600 − 175 − 100) × 0.5 + 450 = 612.50 < 631, so false.
    • KY disregard:
      • Otherwise-ineligible case: 112.50 + 550 = 662.50 ≥ 631, and min(300, 175 + 200) = 300.
      • Adult case: min(100, 175) = 100. Without child care the case is at 362.50 < 631, so the child's care is excluded (main 350).
    • KY integration:
      • Case 5: 0.55 × (631 − 412.50) = 120.175. Gross 1,000 ≤ 631 × 1.85 = 1,167.35.
      • Case 6: max(400 − 175 − 300, 0) = 0, countable 550, and 0.55 × 81 = 44.55.
    • Body reproduction:
      • KY before: (1,000 − 175 − 350) × 0.5 = 237.50, and 0.55 × 393.50 = 216.43.
      • HI: the difference is 270, the countable earnings that the old $350 deduction wiped out.
      • VT: the difference is the $175 cap.
  • Source-conflict ratchet (Tie source-conflict markers to the register shared with Axiom #10287).
  • Changelog. changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md is a top-level fragment with the fixed type.
  • Partner tests. No files under tests/policy/baseline/partners/** are touched, and Household API Partners passes.
  • Issue closure. Fixes #10208 is right: the issue asks for these three scope fixes.

Axiom line assessment

The line is missing (Should 3).

  • Hawaii: queue it under rulespec-us#1865.
    • rulespec-us#1865 is OPEN, labelled pe-parity, and dispatch-ready. It has module paths, verbatim HAR text, required outputs and companion tests. It is blocked on a corpus re-pin and on encoder approval.
    • Its invariants include "unused caps are not pooled", and its companion row 9 expects $300 + $50 → 225. The PR's head gives 350, so the issue matches only after Should 1 is fixed.
    • No HAR 17-676 module exists in rulespec-us.
  • Vermont and Kentucky: file issues. rulespec-us has no Reach Up or 921 KAR 2:016 module, and no issue (searches for "Reach Up", "Vermont", "KTAP", "K-TAP", "921 KAR", "Kentucky", "10208" and "10254"). The sources are already in axiom-corpus:
    • VT. us-vt/regulation/2026-09-10-tanf-state-policy-manual holds us-vt-dcf-esd-rule-2200.pdf, and us-vt/manual/2026-10-06-w6-tanf-ccdf-manual-vt holds P-2230A. Both are byte-identical to the current DCF files.
    • KY. us-ky/regulation/2026-10-06-w6-tanf-ccdf-rules-ky holds 921 KAR 2:016, both current and version 10142. us-ky/manual/2026-09-10-tanf-state-policy-manual holds OM Vol. III, in an earlier revision than the 3/1/26 MS 2810.
  • What each new issue should contain (follow Integration Test of CARE/FERA Shows SNAP Issue #1865):
    • Modules.
      • us-vt/regulations/13-170-220/2251-1.yaml and .../2252-2.yaml: the scope, the $175 cap, and the order.
      • us-ky/regulations/921-kar/2/016/section-4.yaml and .../section-5.yaml: the standard-of-need test and 5(3)(b).
      • Keep the encoder's mapped path if it differs.
    • Law. The verbatim text quoted above.
    • Required outputs. The monthly deduction or disregard, and the remaining earned income.
    • VT companions (from the rule text):
      • Child care for a Reach Up child gives 0.
      • Disabled adult care of $100 with one participant gives 100; $300 gives 175.
      • $1,000 of earnings and $100 of adult care give 1,000 − (350 + 0.25 × 650) − 100 = 387.50.
    • KY companions:
      • $1,000 of earnings, two children and $1,530 of care give 412.50 < 631, so the child care disregard is 0 and the benefit is 120.175.
      • $400 earned plus $550 unearned, children 5 and 1, and $300 of care give 662.50 over 631, a disregard of 300, and a benefit of 44.55.
      • Incapacitated adult care of $100 gives 100 in any case.
      • Two adults at $300 and $50 give 225.
      • Note the equality boundary as resolved under Should 2.

Recommended line: axiom: TheAxiomFoundation/rulespec-us#1865 queued (HI, after per-adult caps); TheAxiomFoundation/rulespec-us#<n> queued (VT rule 2252.2); TheAxiomFoundation/rulespec-us#<m> queued (KY 921 KAR 2:016 Section 5(3)(b)). One combined VT/KY issue is also fine.

CI status

All 27 checks pass at 87f3352256 (gh pr checks 10254). The workflow run on that SHA was created 2026-10-23 18:43 UTC, after #10287 and #10334. That includes:

  • the 11 Baseline shards (incl. states shards 1-4);
  • the 9 Contrib shards;
  • Household API Partners;
  • PR validation (lock, guard tests, lint, changelog);
  • Package and compatibility;
  • Microsimulation;
  • the two Python Rest suites;
  • Quick Feedback.

None is pending or failing.

Branch status

The branch is 5 commits ahead of main (four change commits on 2026-10-16 and a merge of main on 2026-10-23) and 48 behind. git merge-tree --write-tree PolicyEngine/main 87f3352256 merges cleanly.

  • Since the merge base, main has changed no file under HI DHS TANF, VT DCF Reach Up or KY DCBS K-TAP, and none of the expense variables these formulas read.
  • Main's only change to test_source_conflicts.py edits unrelated KNOWN_UNMARKED rows.

Sibling note. Open PR #10332 (MaxGhenis, "Fix four statute-first benefit bugs ...") also rewrites hi_tanf_dependent_care_deduction.py, its YAML test, hi_tanf_countable_earned_income.yaml and the HI TANF integration.yaml.

Verdict: REQUEST_CHANGES

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The scope fixes are right for all three states (HAR 17-676-54.1 covers adults only; VT 2251.1(e)/2252.2 exclude Reach Up children; 921 KAR 2:016 5(3)(b)1.c), and all 21 expectations hand-check. Three should-address items: (1) the HI formula and the new KY adult variable pool the caps, while both rules cap each adult ($300 + $50 should give 225; the PR gives 350); (2) the KY flag uses '>=' per manual MS 2810 B, but 921 KAR 2:016 4(2)(b) says 'exceeds', so at equality the regulation gives $0 and the PR $48.13 (Case 3); (3) there's no axiom line (HI is #1865; file issues for VT and KY). Branch note: #10332 conflicts in four HI files and already caps per adult, so agree which PR carries the HI fix. Full report in the comment above.

PavelMakarchuk and others added 2 commits October 27, 2026 11:07
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 <noreply@anthropic.com>
# Conflicts:
#	source_conflicts/candidates.yaml
@PavelMakarchuk

Copy link
Copy Markdown
Collaborator Author

@DTrim99 thanks for the review. Every item is addressed in efa893e (new head). Item by item:

Should address

1. Per-adult caps (HI and KY). Fixed in efa893e.

  • HI: hi_tanf_dependent_care_deduction now returns spm_unit.sum(min_(care_expenses × disabled adult, spm_unit.project(rate))), so each disabled adult's care is capped separately and other members' care_expenses no longer count.
  • KY: ky_ktap_incapacitated_adult_care_disregard returns spm_unit.sum(min_(care_expenses × incapacitated adult, 175)). ky_ktap_dependent_care_disregard returns the adult part plus where(otherwise ineligible, min_(childcare_expenses, children's age-based caps), 0). The child caps exclude incapacitated adults. childcare_expenses is a unit total, so the children's caps are still summed with each other.
  • Tests, with your three rows:
    • HI Case 14: $300 + $50 gives 225. Case 15: the $165 part-time cap applies per adult (165 + 166 gives 330). Case 16: care of a member who is not a disabled adult adds nothing.
    • New ky_ktap_incapacitated_adult_care_disregard.yaml (8 cases: none, below, at and above the cap, two adults at $300 + $50 giving 225, a non-incapacitated member, an incapacitated child, non-KY).
    • ky_ktap_dependent_care_disregard.yaml: two adults (225); flag true with a child at $0 and an adult at $300 (175); and the reverse, a child at $300 and an adult at $0 (175).

2. KY "exceeds" boundary. Fixed in efa893e with option (a).

  • ky_ktap_ineligible_without_child_care_disregard now uses > and cites 921 KAR 2:016 Section 4(2)(b). The manual reference points to #page=160 with a # PDF pages 160, 162 comment.
  • Case 3 is renamed ("... equal to the standard of need is not ineligible") and expects false. New Case 3b: income $553 against $552 expects true.
  • The equality case is also in ky_ktap_dependent_care_disregard.yaml (disregard 0) and in K-TAP integration.yaml Case 7 (benefit 0).
  • The PR body's MS 2810 B sentence now states the regulation's rule.
  • CONTRIBUTING.md asks that every such reading be recorded, so I added backlog items to source_conflicts/candidates.yaml rather than markers (nothing is in the rulespec-us register yet): us-ky:ktap-standard-of-need-equality (this item), us-ky:ktap-incapacitated-adult-care-condition (Section 5(3)(b)1.b over MS 2840 B.1, which you noted) and us-vt:reach-up-dependent-care-order (Suggestion 4). test_source_conflicts.py passes (103).

3. axiom: line. Added to the body:

Branch note (#10332). Not settled here. The Hawaii result now matches #10332 ($300 + $50 gives 225), but the inputs differ: #10332 adds hi_tanf_qualifying_incapacitated_adult_care_expenses, and this PR reads care_expenses for each disabled adult, like the VT and KY formulas. @PavelMakarchuk will agree with @MaxGhenis which PR carries the Hawaii change; the PR body has an "Overlap with #10332" section.

Suggestions

  1. KY case 1.a and the part-time cap. The body now says plainly that 1.a allows up to $175/$150 for an able-bodied child 13 or over and PE gives $0, and that PE always uses the $175 cap. Follow-up: Kentucky, Hawaii and Vermont TANF dependent care: remaining gaps after #10254 (KY child 13+ and part-time cap, HI applicant hours, VT rounding and participant cap) #10494. Not implemented here: it needs a change to the age schedule and a work-hours input, which is outside Hawaii, Vermont and Kentucky TANF: dependent care deductions apply to child care the state rules do not deduct #10208.
  2. Forced-flag comments. Reworded all 16 to "Set as an input so the child care caps apply (921 KAR 2:016 Section 5(3)(b)1.c)." (countable-earned Cases 8 and 10; edge Cases 9, 15, 33-35, 37, 38, 40 and 45; historical Case 46; four disregard cases).
  3. Citations. Fixed in efa893e.
    • VT: rule 2251.1(e) is quoted in the formula comment, and the rule PDF reference is one entry, #page=71 with # PDF pages 71, 74-75.
    • KY: manual references now have pages (#page=160 for the flag, #page=162 with # PDF pages 162-163 for the disregard).
    • HI: the code comment, the test header and the body attribute the quoted text to the State Plan 10.2.2 table (file page 20), not 10.2.1(D).
  4. VT order. Added "Order per rule 2251.1(c)(1): earned income disregard, then dependent care." in vt_reach_up_countable_earned_income.py, and the us-vt:reach-up-dependent-care-order backlog item.
  5. Pre-existing gaps. All five are in follow-up Kentucky, Hawaii and Vermont TANF dependent care: remaining gaps after #10254 (KY child 13+ and part-time cap, HI applicant hours, VT rounding and participant cap) #10494: VT rounding and the $10 minimum (rule 2242), the HI applicant's full-time test, receipt of aid (HI and KY), the KY in-home provider, and the VT participant cap. None is changed here.

Tests

  • Local: states/hi/dhs, states/hi/bessd, states/vt/dcf, states/ky/dcbs (batched per subdirectory) and states/oh/dcy/ccap/integration.yaml: 933 passed, 0 failed.
  • 10 of the added or changed cases fail on the previous head (87f3352256) and pass here.
  • I then merged main (b603bf7) to resolve a conflict in source_conflicts/candidates.yaml (a new KY candidate on main next to mine). The changed test files (192) and test_source_conflicts.py (103) pass again after the merge.

🤖 Generated with Claude Code

@DTrim99

DTrim99 commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator

PR Review (round 2): Limit Hawaii, Vermont and Kentucky TANF dependent care deductions to the care their rules allow

Summary

Round 1 (head 87f3352256, 2026-10-26) requested changes on three points: pooled caps in HI and KY, KY's "equal to or exceeds" boundary, and the missing axiom: line. Since then Pavel has pushed one review-fix commit (efa893e56e) and a merge of main (b603bf7d95) that resolved one conflict in source_conflicts/candidates.yaml by hand.

All three Should items are fixed:

  • Per-adult caps. HI and KY now cap each incapacitated adult's care separately. The tests include the round-1 rows ($300 + $50 gives 225, and an unused cap no longer absorbs another person's care).
  • KY boundary. The otherwise-ineligible test now uses >, following 921 KAR 2:016 Section 4(2)(b), which I re-read today ("exceeds the standard of need ... the benefit group shall be ineligible"). The equality case is pinned in three test files. The regulation-over-manual reading is recorded as a backlog item in source_conflicts/candidates.yaml.
  • Axiom. The body now has an axiom: line with three queued issues. Each is OPEN, labelled pe-parity and dispatch-ready, and each matches the head.

The five suggestions were applied or deferred with reasons. The deferred items are tracked in #10494, which I accept.

Merge resolution. The hand-resolved block in candidates.yaml is correct. The head file is main's file plus the PR's three new items, with nothing dropped. Main's newer us-ky:ktap-payment-maximum-2025 note and its new us-ky:ktap-payment-scale-household-size item are both kept, and ids stay in alphabetical order.

Checks.

There are no open Critical or Should items. One new suggestion: say where KY still pools the children's caps.

The CI run at this head is the merged-tree test. See CI status for its result.

Prior findings

Finding Status Evidence
Should 1. Cap each incapacitated adult separately (HI formula, new KY adult variable, KY disregard) Fixed HI. hi_tanf_dependent_care_deduction.py:28,42: care_expenses × is_disabled_adult, then spm_unit.sum(min_(…, spm_unit.project(rate))).
KY adult. ky_ktap_incapacitated_adult_care_disregard.py:25-26: spm_unit.sum(min_(care_expenses × incapacitated_adult, 175)).
KY disregard. ky_ktap_dependent_care_disregard.py:31-34,45: the adult part plus where(flag, min_(childcare_expenses, child caps), 0). The child caps exclude incapacitated adults.
Tests. All three round-1 rows are now cases: HI Case 14 (225), KY two adults (225), and KY flag true with a child at $0 and an adult at $300 (175). Also added: the reverse case (175), HI Cases 15-16, and a new 8-case direct test file for the KY adult variable.
Law. HAR 17-676-54.1(c)(4), (d)(4) ("each incapacitated adult ... not to exceed $175 / $165") and 921 KAR 2:016 Section 5(3)(b)2 ("$175 per month per individual", re-read today).
Should 2. KY "otherwise ineligible" boundary: manual >= vs regulation > Fixed (option a) Code. ky_ktap_ineligible_without_child_care_disregard.py:36 returns … > standard_of_need. The comment at lines 21-23 cites Section 4(2)(b).
Tests. Flag Case 3 (552 = 552) is renamed and expects false. New Case 3b (553 > 552) expects true. A new disregard case gives 0 at equality, and K-TAP integration.yaml Case 7 gives a benefit of 0.
Docs. The body and the test header now cite the regulation.
Record. The reading is recorded as backlog item us-ky:ktap-standard-of-need-equality, which is more than option (a) asked for.
Should 3. Add the axiom: line Fixed The body line queues rulespec-us#1865 (HI), #1949 (VT) and #1950 (KY). All three are OPEN, labelled pe-parity and dispatch-ready, and they match the head (see Axiom).
Sugg 1. KY case 1.a (child 13+) and the $150 part-time cap Declined, with a reason I accept The body now says plainly that 1.a allows up to $175/$150 and PE gives $0, and that PE always uses $175. Both gaps are in open follow-up #10494, together with the receipt-of-KTAP and in-home-provider gaps. Fixing them needs a new age schedule and a work-hours input, which is outside #10208.
Sugg 2. Reword the forced-flag comments Fixed All 16 now read "Set as an input so the child care caps apply (921 KAR 2:016 Section 5(3)(b)1.c)". That covers countable-earned Cases 8 and 10, the edge cases, historical Case 46 and four disregard cases.
Sugg 3. Citations (VT 2251.1(e), KY manual pages, HI 10.2.2 attribution) Fixed VT. The formula comment quotes rule 2251.1(e). The rule reference is one href at #page=71 with a # PDF pages 71, 74-75 comment.
KY. The flag cites OMVOLIII.pdf#page=160 (# PDF pages 160, 162) and the disregard cites #page=162 (# PDF pages 162-163).
HI. The code comment, the test header and the body attribute the quote to the State Plan 10.2.2 table (file page 20).
All follow the CLAUDE.md reference convention.
Sugg 4. VT: note which source sets the order Fixed vt_reach_up_countable_earned_income.py:20 reads "Order per rule 2251.1(c)(1): earned income disregard, then dependent care." The backlog item us-vt:reach-up-dependent-care-order is added. Its example checks out: rule 1,000 − (350 + 0.25 × 650) − 100 = 387.50; procedure (1,000 − 100 − 350) × 0.75 = 412.50.
Sugg 5. Pre-existing gaps: VT rounding and $10 minimum, HI applicant hours, receipt of aid, KY in-home provider, VT participant cap Declined, with a reason I accept All are listed with citations in #10494 (OPEN). None is in this diff.
Branch note. Sibling #10332 rewrites the same HI files Open (coordination; branch note only) The HI results now agree with #10332 (225), but the two branches still conflict in all four HI files. The body's new "Overlap with #10332" section says only one PR should carry the HI change. Pavel and Max haven't settled it yet.

New findings

Critical: none.

Should address: none.

Suggestions

  1. KY: say that the children's caps are still pooled.
    • Code. ky_ktap_dependent_care_disregard.py:32-34 caps the unit's childcare_expenses at the sum of the children's age-based caps.
    • Law. Section 5(3)(b)2 caps each individual, children included. Take an otherwise-ineligible case with a child age 5 who has $300 of care and a child age 1 who has $0:
      • the rule gives min(300, 175) + 0 = 175;
      • the PR gives min(300, 175 + 200) = 300.
    • Why it stays. This is a data limit, not a coding error. PE has post-subsidy child care only as a unit total (childcare_expenses is SPMUnit; the Person-level pre_subsidy_childcare_expenses is pre-subsidy). Round 1 proposed exactly this structure, and the code comment at lines 29-30 says so.
    • Where it's missing. rulespec-us#1950 lists the invariant "one individual's unused cap does not raise another's" and asks for "each child's care capped separately". Its "Not covered by PE-US" list doesn't mention the pooling.
    • Fix. Add one line to Alabama dependent exemption #1950's "Not covered by PE-US" list and to Kentucky, Hawaii and Vermont TANF dependent care: remaining gaps after #10254 (KY child 13+ and part-time cap, HI applicant hours, VT rounding and participant cap) #10494 or the body's KY known gaps. No code change is needed here.

Verified

  • Head and main. The head is still b603bf7d95 (gh pr view). Upstream main is c2785f63b1, which is the merge's second parent, so the branch is 0 behind.
  • Law, re-checked today. 921 KAR 2:016 (LRC, current version eff. 2-16-2023):
    • Section 4(2)(b): "If the benefit group's income, after subtracting excluded income and applicable deductions, exceeds the standard of need for the appropriate benefit group size ... the benefit group shall be ineligible".
    • Section 5(3)(b)1.a-d, and 2: "$175 per month per individual for full-time employment; ... $150 ... part-time ...; or ... $200 per month per individual for child under age two (2)".
    • HAR 17-676-54.1(c)(4), (d)(4) and Reach Up rules 2251.1(c)-(e) and 2252.2(a)-(c): the round-1 quotes stand, and rulespec-us#1865 and Alabama Personal Exemption #1949 reproduce them verbatim.
  • Code.
    • HI: care_expenses (Person, YEAR) is read with a MONTH period, which divides by 12 (1,200 → 100 in the cases). rate is unit-level, projected to each person and capped per person, then summed.
    • KY adult variable: the cap is the age-two bracket ($175), applied per person.
    • KY disregard: the adult part plus the child part when the flag is true, with no double count, because the child caps exclude incapacitated_adult.
    • All of it is vectorized, with no new cycle.
    • No state-gated variable is used as a parameter key. The keys are age, hours and spm_unit_size, so NH Add New Hampshire state supplementation for 2026 #10156 doesn't apply.
    • Readers are unchanged: HI and VT each have one reader (their countable earned income), and the KY disregard feeds only the person share.
  • Hand-checked expectations (every new or changed one, 30). Assumptions: KY standard of need $552/$631 (size 2/3, unchanged since 2023-02-16), 50% EID in January, $175 work expense; HI full-time cap $175 at 32+ hours, otherwise $165.
    • HI deduction:
      • Case 11: min(300, 175) + min(300, 175) = 350 (comment rewritten, value the same).
      • Case 13: person2 isn't disabled, so 0.
      • Case 14: 175 + 50 = 225.
      • Case 15 (20 hours): min(165, 165) + min(166, 165) = 330.
      • Case 16: the disabled adult's care is 0 and person1 isn't disabled, so 0.
    • KY disregard:
      • Two adults: 225. The flag is false, since countable income 0 < 631.
      • Unused child cap: 175 + min(0, 175) = 175.
      • Unused adult cap: 0 + min(300, 175) = 175.
      • Equality: (375 − 175) × 0.5 + 452 = 552, which isn't > 552, so the flag is false and the disregard is 0.
      • Otherwise-ineligible case: 662.50 > 631, and min(300, 375) = 300 (comment only).
    • KY adult variable, Cases 1-8:
      • Case 1, no incapacitated adult: 0.
      • Case 2: min(100, 175) = 100.
      • Case 3: min(175, 175) = 175.
      • Case 4: min(300, 175) = 175.
      • Case 5: 175 + 50 = 225.
      • Case 6, the parent isn't incapacitated: 0.
      • Case 7, an incapacitated child age 10: 0.
      • Case 8, TX: 0 (defined_for).
    • KY flag:
      • Case 2: 662.50 > 631, so true.
      • Case 3: 552 = 552, so false.
      • Case 3b: (377 − 175) × 0.5 = 101, and 101 + 452 = 553 > 552, so true.
    • KY integration Case 7: flag false, disregard 0, ky_ktap_countable_income 100 + 452 = 552, and ky_ktap 0.55 × max(552 − 552, 0) = 0. Case 6 is unchanged (300, then 44.55).
    • Backlog examples:
      • Equality item: $0 under the regulation, and 0.55 × (552 − 464.50) = $48.13 under the manual.
      • Adult-condition item: (1,000 − 175) × 0.5 = 412.50 < 631 in January 2025.
      • VT order item: 387.50 vs 412.50.
  • Other KY test files. No edge, historical, countable-earned or integration case has an incapacitated adult. With no adult, the new sum (adult part 0 plus the child part) equals the old pooled minimum, so the 16 cases with a forced flag keep their values.
  • Source conflicts (CONTRIBUTING.md#source-conflicts; Tie source-conflict markers to the register shared with Axiom #10287 ratchet).
    • The three readings follow the regulation over the manual or procedure, as the 2026-10-19/20 rule requires. They are recorded as state: unreviewed, follows: statute backlog items in source_conflicts/candidates.yaml:
      • us-ky:ktap-standard-of-need-equality;
      • us-ky:ktap-incapacitated-adult-care-condition;
      • us-vt:reach-up-dependent-care-order.
    • That file's header makes it the place for conflicts not yet in the register. Their sources aren't in the pinned axiom-corpus release (Alabama Personal Exemption #1949 and Alabama dependent exemption #1950 say so), so they have no register entry or markers yet. That is acceptable for now.
    • The items are well-formed. Their kinds (regulation, manual, guidance) are in SOURCE_KINDS, they cite only tracked files, and no id is already registered.
    • I ran the test's CONFLICT_COMMENT_RE over every comment in the nine touched variable files: there are 0 hits. None of the files is in KNOWN_UNMARKED, and the PR doesn't touch test_source_conflicts.py, so no count grows or drops.
  • Merge resolution (one block, candidates.yaml). Correct.
    • The head's candidates.yaml differs from main's by 90 added lines and 0 removed: exactly the three new items.
    • Main's side of the conflict is kept whole: the rewritten note on us-ky:ktap-payment-maximum-2025 and the new us-ky:ktap-payment-scale-household-size item.
    • The PR's stale copy of the old note is dropped.
    • us-ky:ktap-standard-of-need-equality sits after …payment-scale-household-size and before us-ky:liheap-….
  • Main-side guards (static).
  • Changelog. changelog.d/fix-10208-tanf-dependent-care-scope.fixed.md is a top-level fixed fragment, updated to mention the per-adult caps and the Section 4(2)(b) test.
  • Partner tests. No file under policyengine_us/tests/policy/baseline/partners/** changed (git diff --stat main...head), so the partner-test gate doesn't apply.
  • PR body. Its claims match the head: 6 flag cases, 8 adult cases, the per-individual cap results, the reproduction amounts, the "Overlap with Fix four statute-first benefit bugs: MO TANF rounding, SNAP GU/VI limits, HI CCAP TANF income, SSI food ISM date #10332" section and Fixes #10208.

Axiom line assessment

Valid. The line is axiom: TheAxiomFoundation/rulespec-us#1865 queued (HI …); …#1949 queued (VT …); …#1950 queued (KY …). All three issues are blocked on a corpus re-pin and on encoder approval, as queued requires, and none claims a hand-written module.

  • rulespec-us#1865 (HI).
  • rulespec-us#1949 (VT).
    • Status. OPEN, labelled pe-parity, filed for this PR at head b603bf7d95.
    • Contents. Module paths under us-vt/regulations/dcf/reach-up/, a corpus citation, verbatim rules 2251.1(c)-(e), 2252.2(a)-(c) and 2252.3(a), P-2230A step 2 with the order conflict noted, required outputs, invariants, and six companions computed from the rule text. I re-computed 487.50, 387.50, 312.50 and 312.50, and all are right.
    • Companion 5 (non-material). With $400 of earnings, 2251.1(d) limits the allowed deduction to $37.50. PE's vt_reach_up_dependent_care_deduction would show 100, but net earned income is 0 either way, and that is the only value that feeds the benefit.
  • rulespec-us#1950 (KY).
    • Status. OPEN, labelled pe-parity, filed for this PR at head b603bf7d95.
    • Contents. Module paths, a corpus scope with both regulation versions byte-identical to LRC, verbatim Sections 4(2)(b), 5(3)(a)/(b)/(e) and 9(2)-(4), MS 2810 B and the MS 2840 B.1 conflict, required outputs, and eight companions.
    • Companions, re-computed. All are right:
    • Gap. Its "Not covered by PE-US" list should also name the pooling of children's caps (Suggestion 1).

CI status

Run 40528492432 at b603bf7d95 was created 2026-10-27 15:11 UTC, after the merge of main, so it tests the merged tree. At 15:54 UTC (gh pr checks 10254) it had 25 pass, 2 fail and 6 pending.

  • Pass.
  • Fail: main-caused, not this PR.
    • What failed. Python shard 3 exited with code 1, not 143, and has one failure: tests/core/test_mt_state_agi_invariants.py::test_drawn_batches (1 failed, 1,945 passed).
    • Why. The derandomized Hypothesis draw is an MT filer in 2021 with a $12,000 pension. Reported state AGI is 7,600, against an expected 12,000. The $4,400 gap is the 2021-2023 partial pension exemption that Add Montana's 2021–2023 partial pension, annuity, and IRA income exemption #10392 added to main today, which the test's "unadjusted" filter doesn't exclude.
    • Evidence it comes from main. Main's own push run at c2785f63b1, the exact tip this branch merged, fails the same test in the same shard (run 40525467763), and so does the earlier main push at 16bfb2d2c7 (run 40517436672). This PR touches no Montana or AGI code.
    • Knock-on. "Check Rest Python shards" fails only because shard 3 did.
    • What to do. Re-run once main fixes that test. This is a CI note, not a finding.
  • Pending. Contrib states-shard-1 to 4, other-shard-1 and other-shard-2b were still pending after about 20 minutes of watching. The PR touches no contrib code.

Branch status

All round-1 Critical and Should items are fixed, and no new Critical or Should items were found. Before merging:

Verdict: APPROVE

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving round 2: 0 critical, 0 should. Full report in the comment above. CI note: the Rest shard 3 failure (test_mt_state_agi_invariants) comes from main and is fixed by #10496; re-run after it lands. Coordinate with #10332, which conflicts in 4 HI files.

@hua7450 hua7450 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes for the Kentucky equality case. The new no-child-care ineligibility check omits zero-payment ineligibility under 921 KAR 2:016 Section 9(5), which can incorrectly deny the child-care disregard and the entire grant. See the inline finding.

)
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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Include zero-payment ineligibility in the child-care counterfactual

The strict > comparison considers Section 4(2)(b), but Section 9(5) of the same regulation makes a zero-payment benefit group ineligible. At equality, that can satisfy the otherwise-ineligible child-care exception in Section 5(3)(b)1.c.

The PR's January 2024 equality case illustrates the lost grant: for an otherwise-qualified household with $375/month earnings, $452/month unearned income and $300/month qualifying unsubsidized care paid to an eligible external caregiver, no-care countable income is $552, equal to need. This flag returns false and the grant is $0. Allowing the capped $175 care disregard yields countable income of $464.50 and a grant calculation of 0.55 * (552 - 464.50) = 48.125 before any separate issuance rounding.

Please include zero-payment ineligibility in this counterfactual and update the equality tests. The us-ky:ktap-standard-of-need-equality conflict candidate also needs Section 9(5); Section 4's wording alone does not establish the claimed regulation/manual disagreement.

Source: 921 KAR 2:016, Sections 4, 5 and 9.

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Hawaii, Vermont and Kentucky TANF: dependent care deductions apply to child care the state rules do not deduct

3 participants