PolicyEngine / PolicyEngine/policyengine-us
Wisconsin 2025 second-bracket (4.4%) upper thresholds are wrong in all four filing-status schedules
- Dominant language
- Python
- Stars
- 162
- Forks
- 212
- Avg merge
- 3d 3h
- Merged PRs (30d)
- 97
Description
# Wisconsin 2025 second-bracket (4.4%) upper thresholds are wrong in all four filing-status schedules
**Repo:** PolicyEngine/policyengine-us
**Version:** 1.794.2 (confirmed still wrong on `master` as of 2026-08-23; not yet fixed or filed — see "Prior art" below)
**Labels (suggested):** bug, states/wi
## Summary
The 2025 upper threshold of Wisconsin's second (4.4%) tax bracket is wrong
in all four filing-status rate schedules. The error originates in
[#7369](https://github.com/PolicyEngine/policyengine-us/pull/7369) (merged
2026-02-12, closing
[#7367](https://github.com/PolicyEngine/policyengine-us/issues/7367)); the
PR's own description states the correct official value ($28,640 → $50,480
for single) but the committed YAML instead contains $51,130. The same
$650–$1,150 overshoot appears in the joint, separate, and head-of-household
schedules.
## Law citation
Wis. Stat. § 71.06 (rates of taxation), 2025 values as annually indexed and
published by the Department of Revenue. Independently corroborated by the
2025 Form 1 instructions' Tax Computation Worksheet, whose printed constant
for the single/HoH schedule is:
> 586.44 = 0.009 × (14,680 + 50,480)
— i.e., the worksheet's own embedded constant only reconciles against
**50,480**, not the 51,130 currently in the repository. The 2025 Tax Table
gives the same answer: the $55,000–$55,100 row (single) is **$2,331**,
which the official thresholds reproduce exactly (0.053 × 55,050 − 586.44 =
2,331.21 → 2,331) while the repository's thresholds compute to $2,325.36 —
off by more than the table's rounding tolerance.
## Expected vs. actual (TY2025 second-bracket upper threshold)
| Filing status | Official (DOR / Form 1 instructions) | Current `policyengine-us` value | File |
|---|---|---|---|
| Single | $50,480 | $51,130 | `rates/single.yaml` |
| Head of Household | $50,480 | $51,130 | `rates/head_of_household.yaml` |
| Joint | $67,300 | $68,170 | `rates/joint.yaml` |
| Separate | $33,650 | $34,090 | `rates/separate.yaml` |
(TY2024 values in the same files are correct; only the 2025-01-01 entries
are wrong.)
## Minimal reproduction
```python
from policyengine_us import Simulation
sim = Simulation(situation={
"people": {"you": {"age": {"2025": 40}}},
"households": {"your household": {"members": ["you"], "state_name": {"2025": "WI"}}},
})
p = sim.tax_benefit_system.parameters("2025-01-01").gov.states.wi.tax.income.rates.single
print(p.brackets[2].threshold)
# Actual: 51130
# Expected: 50480
```
Equivalently, reading the raw parameter file directly:
```
policyengine_us/parameters/gov/states/wi/tax/income/rates/single.yaml
brackets[2].threshold.values["2025-01-01"] == 51_130 # should be 50_480
policyengine_us/parameters/gov/states/wi/tax/income/rates/joint.yaml
brackets[2].threshold.values["2025-01-01"] == 68_170 # should be 67_300
policyengine_us/parameters/gov/states/wi/tax/income/rates/separate.yaml
brackets[2].threshold.values["2025-01-01"] == 34_090 # should be 33_650
policyengine_us/parameters/gov/states/wi/tax/income/rates/head_of_household.yaml
brackets[2].threshold.values["2025-01-01"] == 51_130 # should be 50_480
```
Practical effect: any single/HoH filer with 2025 Wisconsin taxable income in
roughly $50,480–$51,130 (and the corresponding narrower bands for joint and
separate filers) is taxed at the wrong marginal rate on that slice of
income, understating their Wisconsin tax liability by up to a few dollars.
## Prior art (checked before filing)
- [#7367](https://github.com/PolicyEngine/policyengine-us/issues/7367) /
[#7369](https://github.com/PolicyEngine/policyengine-us/pull/7369) — this
is the PR that introduced the error; it is closed/merged and does not
track the discrepancy between its own stated $50,480 and the committed
$51,130.
- No other open or closed issue, and no other PR, mentions 51,130 / 51130 /
67,300 / 68,170 / 33,650 / 34,090, or a Wisconsin second-bracket
correction (searched via `gh issue list` / `gh pr list` against
`PolicyEngine/policyengine-us`, 2026-08-23).
- Confirmed directly against the live `master` branch parameter files
(2026-08-23) — the wrong values are still present.
## Suggested fix
In each of `rates/single.yaml`, `rates/joint.yaml`, `rates/separate.yaml`,
`rates/head_of_household.yaml`, correct the `2025-01-01` value of
`brackets[2].threshold` to 50_480 / 67_300 / 33_650 / 50_480 respectively.
---
Found while building BenchmarkUSA.org
Contributor guide
Research direction
Start with the four parameter files named in the issue: rates/single.yaml, rates/joint.yaml, rates/separate.yaml, and rates/head_of_household.yaml. Inspect brackets[2].threshold for 2025-01-01, then run the provided Simulation reproduction. Done means all four values match the official thresholds and the reproduction reports the corrected single-filer value.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 90/100