Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/vt-ctc-per-child-phase-out.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Reduce each child's Vermont child tax credit by $20 for each $1,000 of AGI over $125,000, as 32 V.S.A. 5830f(b) requires, instead of taking one reduction off the total, so the credit ends above $174,000 of AGI for any number of children.
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,11 @@ metadata:
href: https://legislature.vermont.gov/statutes/section/32/151/05830f
- title: Vt. 2022 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income%20Booklet-2022.pdf#page=17
- title: Vt. 2021 Tax Form # Child Tax Credit was introduced in 2022
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2021.pdf#page=24
- title: Vt. 2023 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2023.pdf#page=33
- title: Vt. 2024 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income%20Booklet-2024.pdf#page=33
- title: Vt. 2025 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2025.pdf#page=35
- title: S.51 (2025) - Vermont tax credit package extends CTC to 6-year-olds
href: https://legislature.vermont.gov/Documents/2026/Docs/BILLS/S-0051/S-0051%20As%20Passed%20by%20Both%20House%20and%20Senate%20Official.pdf#page=6
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2025.pdf#page=34
- title: "2025 Vt. Act 71, Secs. 1 and 6 #page 1,10"
href: https://legislature.vermont.gov/Documents/2026/Docs/ACTS/ACT071/ACT071%20As%20Enacted.pdf#page=1
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,9 @@ metadata:
href: https://legislature.vermont.gov/statutes/section/32/151/05830f
- title: Vt. 2022 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income%20Booklet-2022.pdf#page=17
- title: Vt. 2021 Tax Form # Child Tax Credit was introduced in 2022
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2021.pdf#page=24
- title: Vt. 2023 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2023.pdf#page=33
- title: Vt. 2024 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income%20Booklet-2024.pdf#page=33
- title: Vt. 2025 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2025.pdf#page=35
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2025.pdf#page=34
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
description: Vermont reduces the Child Tax Credit by this amount for each increment of adjusted gross income exceeding the threshold.
description: Vermont reduces the Child Tax Credit for each qualifying child by this amount for each increment of adjusted gross income exceeding the threshold.
values:
2022-01-01: 20
metadata:
unit: currency-USD
label: Vermont CTC reduction amount
label: Vermont CTC reduction amount per child
reference:
- title: Vt. Stat. tit. 32 § 5830f Section (b)
href: https://legislature.vermont.gov/statutes/section/32/151/05830f
- title: Vt. 2022 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income%20Booklet-2022.pdf#page=17
- title: Vt. 2021 Tax Form # Child Tax Credit was introduced in 2022
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2021.pdf#page=24
- title: Vt. 2023 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2023.pdf#page=33
- title: Vt. 2024 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income%20Booklet-2024.pdf#page=33
- title: Vt. 2025 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2025.pdf#page=35
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2025.pdf#page=34
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,9 @@ metadata:
href: https://legislature.vermont.gov/statutes/section/32/151/05830f
- title: Vt. 2022 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income%20Booklet-2022.pdf#page=17
- title: Vt. 2021 Tax Form # Child Tax Credit was introduced in 2022
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2021.pdf#page=24
- title: Vt. 2023 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2023.pdf#page=33
- title: Vt. 2024 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income%20Booklet-2024.pdf#page=33
- title: Vt. 2025 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2025.pdf#page=35
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2025.pdf#page=34
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,9 @@ metadata:
href: https://legislature.vermont.gov/statutes/section/32/151/05830f
- title: Vt. 2022 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income%20Booklet-2022.pdf#page=17
- title: Vt. 2021 Tax Form # Child Tax Credit was introduced in 2022
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2021.pdf#page=24
- title: Vt. 2023 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2023.pdf#page=33
- title: Vt. 2024 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income%20Booklet-2024.pdf#page=33
- title: Vt. 2025 Income Tax Return Booklet
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2025.pdf#page=35
href: https://tax.vermont.gov/sites/tax/files/documents/Income-Booklet-2025.pdf#page=34
89 changes: 89 additions & 0 deletions policyengine_us/tests/core/test_vt_ctc_phase_out_properties.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
"""Properties of Vermont's child tax credit phase-out.

32 V.S.A. 5830f(a) gives $1,000 per qualifying child, and 5830f(b) reduces
"the amount of the credit per child", but not below zero, by $20 for each
$1,000, or fraction thereof, of adjusted gross income over $125,000.

Hypothesis draws a year, a number of children and a list of AGIs, with the
phase-out's edges mixed in. Each AGI appears twice in one vectorized
simulation, once with one child and once with the drawn number. For every
AGI:

1. The credit is never below zero and never above $1,000 per child, because
(b) reduces it "but not below zero" and (a) pays $1,000 per child.
2. The credit never rises with AGI for the same children, because the
reduction in (b) grows with each $1,000 of AGI over $125,000.
3. n children get n times one child's credit, because (b) reduces each
child's credit. A single reduction off the total fails this at any AGI
over $125,000.

The YAML cases for vt_ctc pin the amounts at the edges by hand.
"""

import numpy as np
from hypothesis import HealthCheck, example, given, settings
from hypothesis import strategies as st

from policyengine_us import Simulation

AMOUNT = 1_000 # 5830f(a): "$1,000.00 per qualifying child"
TOLERANCE = 0.01
# The start of the phase-out, the first fraction of $1,000 above it, the last
# $20 of credit per child (AGI $173,001 to $174,000) and the first AGI with
# none, per the 2025 Schedule IN-112 Child Tax Credit Table.
EDGES = [0, 125_000, 125_001, 126_000, 126_001, 150_000, 174_000, 174_001, 175_000]
# 2022 is the credit's first year; the age limit rose from 5 to 6 in 2025.
YEARS = [2022, 2024, 2025, 2026]

agi_values = st.one_of(st.sampled_from(EDGES), st.integers(0, 300_000))


def build_situation(agis, n_children, year):
"""One tax unit with one child and one with n children for each AGI."""
people, tax_units, households = {}, {}, {}
for i, agi in enumerate(agis):
for kids in (1, n_children):
name = f"unit_{i}_{kids}"
members = [f"{name}_parent"]
people[members[0]] = {"age": {year: 35}}
for k in range(kids):
members.append(f"{name}_child_{k}")
# Ages 0 to 5 are within the age limit in every year.
people[members[-1]] = {"age": {year: k % 6}}
tax_units[name] = {
"members": members,
"adjusted_gross_income": {year: float(agi)},
}
households[name] = {"members": members, "state_code": {year: "VT"}}
return {"people": people, "tax_units": tax_units, "households": households}


@settings(
max_examples=10,
deadline=None,
derandomize=True,
suppress_health_check=[HealthCheck.too_slow],
)
@given(
year=st.sampled_from(YEARS),
agis=st.lists(agi_values, min_size=5, max_size=20),
n_children=st.integers(2, 4),
)
@example(year=2025, agis=EDGES, n_children=2)
@example(year=2022, agis=EDGES, n_children=4)
# No vt_ctc.yaml case covers 2026, so this example checks the per-child
# reduction in a year that file leaves out.
@example(year=2026, agis=EDGES, n_children=3)
def test_vt_ctc_phase_out_properties(year, agis, n_children):
agis = sorted(agis)
sim = Simulation(situation=build_situation(agis, n_children, year))
ctc = np.asarray(sim.calculate("vt_ctc", year), dtype=float).reshape(-1, 2)
one, many = ctc[:, 0], ctc[:, 1]
for credit, kids in ((one, 1), (many, n_children)):
# 1. Never below zero, never above $1,000 per child.
assert np.all(credit >= 0)
assert np.all(credit <= AMOUNT * kids + TOLERANCE)
# 2. Never rises with AGI (the AGIs are sorted).
assert np.all(np.diff(credit) <= TOLERANCE)
# 3. The reduction applies to each child's credit.
np.testing.assert_allclose(many, n_children * one, atol=TOLERANCE)
Loading
Loading