Vermont child tax credit: the $20-per-$1,000 reduction is applied once to the total credit, but 32 V.S.A. 5830f(b) reduces each child's credit
Maintainers usually reply within 2 days
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 78/100
Research direction
Read policyengine_us/variables/gov/states/vt/tax/income/credits/ctc/vt_ctc.py and the Vermont credit parameters to trace how the reduction is applied to eligible children. Add the two-child, above-$125,000 case to tests/policy/baseline/gov/states/vt/tax/income/credits/vt_ctc.yaml and run that test; done when the result matches the per-child phaseout described in the issue.
Written by the indexing model from the issue text.
Description
Summary
Vermont's refundable child tax credit is $1,000 per qualifying child six or younger (five or younger before tax year 2025). Subsection (b) of 32 V.S.A. § 5830f says:
the amount of the credit per child under this section shall be reduced, but not below zero, by $20.00 for each $1,000.00, or fraction thereof, by which the individual's adjusted gross income exceeds $125,000.00
So each child's $1,000 falls by $20 per $1,000 of AGI above $125,000, and a family with two young children loses $40 per $1,000. Vermont's Joint Fiscal Office describes the credit the same way: it "phases out at a rate of 2% per $1,000 of income above $125,000, reaching zero at incomes of $175,000 and above" (JFO issue brief, January 2024).
vt_ctc (policyengine_us/variables/gov/states/vt/tax/income/credits/ctc/vt_ctc.py, unchanged on main at 19c240d0ff, 2026-10-07) subtracts one reduction from the total:
max_credit = p.amount * count_eligible
excess_agi = max_(agi - p.reduction.start, 0)
increments = np.ceil(excess_agi / p.reduction.increment)
total_reduction = p.reduction.amount * increments
return max_(max_credit - total_reduction, 0)
Families with two or more eligible children above $125,000 of AGI keep too much credit, and their credit ends at a higher income than the statute's $175,000.
Repro (policyengine-us 1.811.2)
from policyengine_us import Simulation
Y = 2025
def vt_ctc(wages, kids):
P = lambda v: {str(Y): v}
people = {"head": {"age": P(40), "employment_income": P(wages)}, "spouse": {"age": P(38)}}
members = ["head", "spouse"]
for i, a in enumerate(kids):
people[f"c{i}"] = {"age": P(a)}
members.append(f"c{i}")
sit = {"people": people, "tax_units": {"tu": {"members": members}}, "families": {"f": {"members": members}},
"spm_units": {"s": {"members": members}}, "marital_units": {"m": {"members": ["head", "spouse"]}},
"households": {"h": {"members": members, "state_code": P("VT")}}}
return Simulation(situation=sit).calculate("vt_ctc", Y)[0]
vt_ctc(130_000, (3, 2)) # 1900.0; statute: 2 x (1,000 - 5 x 20) = 1,800
vt_ctc(130_000, (5, 3, 1)) # 2900.0; statute: 3 x 900 = 2,700
vt_ctc(180_000, (3, 2)) # 900.0; statute: 2 x max(1,000 - 55 x 20, 0) = 0
Expected vs actual
Expected: count_eligible * max_(p.amount - total_reduction, 0). Actual: max_(count_eligible * p.amount - total_reduction, 0). The YAML tests in tests/policy/baseline/gov/states/vt/tax/income/credits/vt_ctc.yaml should add a two-child case above $125,000.
Impact on the PRD comparison
None of the prd-comparison dashboard's CPS tax units (2024-2026, aligned view) has two or more eligible Vermont children above $125,000 of AGI, so the bug moves no unit there; it matters for such families in household calculations. The comparison records the mechanism as cause state_credits.vt_ctc_reduction_once (a PolicyEngine bug), computed as PE's formula minus the statute on PE's AGI and roster.
🤖 Generated with Claude Code
- Dominant language
- Python
- Stars
- 166
- Forks
- 214
- Avg merge
- 2d 9h
- Merged PRs (30d)
- 243
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from PolicyEngine/policyengine-us
-
bug hhs/tanf states/nh
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
PolicyEngine/policyengine-us#9984 ·
Maintainers usually reply within 2 days
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
PolicyEngine/policyengine-us#9952 ·
Maintainers usually reply within 2 days
-
State EITC helper floors each spouse's earnings at zero instead of netting self-employment losses (IL, CO, DC, IN)Possibly taken @PavelMakarchuk claimed this 3 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
PolicyEngine/policyengine-us#9819 ·
Maintainers usually reply within 2 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
PolicyEngine/policyengine-us#9759 ·
Maintainers usually reply within 2 days
-
NYC school tax credit is not denied to filers who can be claimed as a dependent (§ 606(ggg)(1))Open
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
PolicyEngine/policyengine-us#9713 ·
Maintainers usually reply within 2 days
All issues in PolicyEngine/policyengine-us
Similar issues
-
documentation
Difficulty 1/5 Under an hour Newbie friendliness 65/100
ansys/pydpf-core#3547 ·
Maintainers usually reply within 1 day
-
core
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
vectorize-io/hindsight#5457 ·
Maintainers usually reply within 1 day
-
[Bug]: LangChain drops OpenAI Responses text blocks from session recordingPossibly taken @ktz03 claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
volcengine/OpenViking#5806 ·
Maintainers usually reply within 1 day
-
HTML: <template> content is extracted as document textPossibly taken @ryanmeowy claimed this today. Openbug html
Difficulty 1/5 Under an hour Newbie friendliness 82/100
docling-project/docling#4714 · 2 comments ·
Maintainers usually reply within 1 day
-
APIv2 event data accepts a non-string reply and a NaN upper_boundPossibly taken @awss1i claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
freedomofpress/securedrop#7946 · 1 comment ·
Maintainers usually reply within 2 days