PolicyEngine / PolicyEngine/policyengine-us

Wisconsin 2025 second-bracket (4.4%) upper thresholds are wrong in all four filing-status schedules

Open Beginner friendly
#9,328 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

# 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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.