PolicyEngine / PolicyEngine/policyengine-us
Hawaii itemized state-tax deduction ignores the federal-AGI disallowance threshold
- 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
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