PolicyEngine / PolicyEngine/policyengine-us

Hawaii itemized state-tax deduction ignores the federal-AGI disallowance threshold

Open
#9,327 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
162
Forks
212
Avg merge
3d 3h
Merged PRs (30d)
97

Description

# Hawaii itemized state-tax deduction ignores the federal-AGI disallowance threshold

**Repo:** PolicyEngine/policyengine-us
**Version:** 1.794.2 (bug confirmed still present on `master` as of 2026-08-23)
**Labels (suggested):** bug, states/hi

## Summary

Hawaii disallows the itemized deduction for state income taxes paid once the
filer's federal adjusted gross income (AGI) exceeds a filing-status-based
threshold. `hi_salt_deduction` has no AGI test at all — it adds the state
income tax paid to the itemized deduction unconditionally, for every income
level. This overstates Hawaii itemized deductions (and understates Hawaii
tax liability) for any itemizing household above the threshold.

## Law citation

Haw. Rev. Stat. § 235-2.4 (itemized deductions), as applied on the state
return: a filer may not deduct state income taxes paid as an itemized
deduction once federal AGI exceeds:

- **$100,000** — Single / Married Filing Separately
- **$150,000** — Head of Household
- **$200,000** — Married Filing Jointly / Surviving Spouse

These thresholds are printed in the state-tax-deduction worksheet of the
Hawaii N-11 Resident Income Tax Instructions and are identical in the 2024
and 2025 booklets (no annual indexing observed in either year).

## Expected vs. actual

`gov.states.hi.tax.income.deductions.itemized.sources` correctly lists
`hi_salt_deduction` as a component of Hawaii itemized deductions, but the
variable's formula is:

```python
# policyengine_us/variables/gov/states/hi/tax/income/deductions/itemized/hi_salt_deduction.py
def formula(person, period, parameters):
# Hawaii's state income tax allows an itemized deduction for state income taxes paid.
# Hawaii does not cap the SALT deduction as the US does.
adds = ["state_and_local_sales_or_income_tax", "real_estate_taxes"]
```

There is no reference to federal AGI, filing status, or any threshold
parameter anywhere in this formula or in
`gov.states.hi.tax.income.deductions.itemized.*` — the only AGI-gated
mechanism in that parameter tree is the *general* itemized-deduction
reduction (`threshold/reduction.yaml`, thresholds $166,800 / $83,400), which
is a different, broader provision and does not substitute for the
SALT-specific disallowance.

| Federal AGI | Filing status | Expected `hi_salt_deduction` behavior | Actual |
|---|---|---|---|
| ≤ $100,000 | Single | Full state-tax paid, deductible | Full state-tax paid, deductible (correct) |
| > $100,000 | Single | State-tax component of the deduction is **$0** | Full state-tax paid, still deductible (**bug**) |
| > $200,000 | Joint | State-tax component of the deduction is **$0** | Full state-tax paid, still deductible (**bug**) |

(`real_estate_taxes` is unaffected by this provision and should continue to
be added regardless of AGI.)

## Minimal reproduction

```python
from policyengine_us import Simulation

situation = {
"people": {
"you": {
"age": {"2025": 40},
"employment_income": {"2025": 300_000},
}
},
"tax_units": {
"your tax unit": {
"members": ["you"],
"state_and_local_sales_or_income_tax": {"2025": 15_000},
}
},
"households": {
"your household": {
"members": ["you"],
"state_name": {"2025": "HI"},
}
},
}

sim = Simulation(situation=situation)
print(sim.calculate("hi_salt_deduction", 2025))
# Actual: 15000.0 (full amount allowed)
# Expected: 0.0 (federal AGI of $300,000 exceeds the $100,000
# single/MFS threshold in HRS § 235-2.4 — the
# state-tax component of itemized deductions is
# fully disallowed)
```

This was cross-checked against NBER TAXSIM, which does apply this
disallowance; TAXSIM and PolicyEngine diverge above the threshold in exactly
the pattern this formula predicts.

## Suggested fix

Add a threshold parameter (by filing status, matching the $100k/$150k/$200k
values above) and gate the `state_and_local_sales_or_income_tax` add in
`hi_salt_deduction` on federal AGI relative to that threshold, leaving
`real_estate_taxes` unconditional.

---

Found while building BenchmarkUSA.org

Contributor guide

Open the contributing guide

Research direction

Start with policyengine_us/variables/gov/states/hi/tax/income/deductions/itemized/hi_salt_deduction.py, then inspect gov.states.hi.tax.income.deductions.itemized.sources and threshold/reduction.yaml. Run the minimal Simulation reproduction and verify that the state-tax component is disallowed above the filing-status threshold while real_estate_taxes remains deductible.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
72/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.