Skip to content

Correct Utah taxpayer credit income-tax subtraction by year - #10843

Draft
MaxGhenis wants to merge 4 commits into
mainfrom
fix-ut-taxpayer-credit-income-tax
Draft

MaxGhenis wants to merge 4 commits into
mainfrom
fix-ut-taxpayer-credit-income-tax

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

Correct Utah's taxpayer credit income-tax subtraction by tax year and retain the federal section 68 reduction. This completes the income-tax follow-up described in #10597.

Before 2018, claimants subtract only income tax allowed in their federal itemized deductions under Utah Code 59-10-1018(2)(a)(ii)(A).

For 2018 through 2025, claimants subtract paid and reported income tax, capped at $10,000 for every filing status, under subsections (1)(e) and (1)(f). The subtraction can exceed federally deductible SALT.

From 2026, claimants subtract the lesser of paid and reported income tax and the income-tax share allowed federally under the 2026 edition. The Utah Legislature applied that amendment from January 1, 2026 in H.B. 77 section 29.

For example, a 2024 joint return with $10,000 of property tax, $8,000 of income tax and $1,000 of sales tax deducts $10,000 of SALT. Utah's deduction base falls from $10,000 to $2,000.

The calculation uses the post-section-68 federal total. It allocates property tax within actual allowed SALT, which already reflects the federal cap and phase-down.

Invariants

ut_federal_deductions_for_taxpayer_credit.yaml and test_ut_taxpayer_credit_sales_tax_properties.py check these properties:

  • Sales-tax electors retain the federal itemized total, or the existing reconstruction when that total equals zero. Their results and standard-deduction filers' results match main.
  • Income-tax electors subtract no more than $10,000 from the effective total in 2018 through 2025. The difference can remain negative until personal exemptions enter the credit calculation.
  • Before 2018 and from 2026, the income-tax base stays between zero and the effective federal total.
  • Raising sales tax above income tax never lowers the base, including pairs with section 68 reductions.

Changes for income-tax electors under binding federal limits, income tax above $10,000, and section 68 reductions are intended.

Methodology choices

  • Follow the statute over the 2025 TC-40 line 14 instructions for 2018 through 2025. Record the ruled candidate and source captures under source_conflicts/; add the marker after maintainers register the merged implementation.
  • From 2026, attribute capped SALT to property tax first, then income tax. Follow the allocation filers use under the 2025 instructions, which Utah's statute leaves unspecified.
  • Prorate income tax after section 68 under the 2017 line 14 worksheet, leaving protected deductions out of that allocation.
  • From 2026, apply analogous proration across all itemized deductions because Congress replaced section 68 without category exclusions in P.L. 119-21 section 70111. Utah's server returned 404 when we requested the 2026 TC-40 instructions; revisit this allocation when Utah publishes them.
  • Keep the signed 2018–2025 deduction difference before adding personal exemptions. For a supplied $6,000 exemption and a separate filer's $5,000 federal total and $10,000 income tax, the initial credit equals $60.
  • Retain the existing election inference, tie handling, supplied combined-tax amounts, and reconstruction when the federal total equals zero. Zero remains indistinguishable from a missing total under that existing convention.

Validation

  • Utah federal-deduction YAML: 35 passed, including 20 new cases and all 15 existing cases.
  • Property test: 1 passed, including six generated examples and five explicit examples.
  • Source-conflict guard file: 103 passed.
  • Mutation control: 26 hand probes passed. All ten mutants failed at least one probe: paid/reported treatment, the $10,000 limit, both dated transitions, deductible income from 2026, the total after section 68, proration, 2026 categories, the signed difference, and the property-tax floor.
  • make format passed.

The YAML process's capped group peak reached 3,162 MB. The pre-fix property test passed in 375.18 seconds of pytest time and 394.26 seconds including process startup. The sandbox blocked its peak-memory measurement. The expanded test passed in 58.30 seconds of pytest time and 165.00 seconds including startup, with a capped group peak of 1,018 MB. Local lane timings reflect scheduling and cache conditions.

The mutation probes execute the actual formula in a scratch worktree with vector-shaped inputs and hand-computed federal amounts. Each process blocks network access and restores its edited files afterward; these probes supplement the full-model YAML and property tests.

The final documentation commit adds two historical source captures; the tested formula, parameters, YAML cases, property test and candidate remain unchanged.

The expanded property test keeps six generated examples and adds five explicit examples in paired, vectorized simulations. It checks all five filing statuses and varies the federal SALT phase-down and supplied section 68 reductions.

The test remains in the existing Core group. No CI jobs or runners change. GitHub skipped this draft head's jobs, so Linux CI measurements remain unavailable. The earlier CI measurements appear in #10597.

Microsimulation impact

To be measured before merge.

Axiom parity

axiom: needed: extend rulespec-us#1809 with dated income-tax subtraction rules in us-ut/statutes/59-10-1018.yaml and companion tests.

🤖 Generated with Claude Code

MaxGhenis and others added 4 commits November 12, 2026 01:09
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

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.

1 participant