Skip to content

Fix North Dakota 2026 income tax thresholds - #9165

Open
PavelMakarchuk wants to merge 1 commit into
mainfrom
fix/nd-2026-income-tax-thresholds
Open

Fix North Dakota 2026 income tax thresholds#9165
PavelMakarchuk wants to merge 1 commit into
mainfrom
fix/nd-2026-income-tax-thresholds

Conversation

@PavelMakarchuk

Copy link
Copy Markdown
Collaborator

Summary

  • add official TY2026 North Dakota individual income-tax thresholds for every filing status
  • pin the complete official schedule in raw parameter assertions
  • test the marginal schedule at and immediately above both boundaries for all five statuses

Source

North Dakota Office of State Tax Commissioner, 2026 Form ND-1ES, page 2.

Checks

  • make format (includes Ruff formatting and lint)
  • uv run pytest -c pyproject.toml policyengine_us/tests/core/test_state_indexed_frozen_parameters.py -k nd -q (32 passed)
  • focused ND boundary YAML (37 passed)
  • full ND income-tax YAML suite (73 passed)
  • uv run pytest -c pyproject.toml policyengine_us/tests/test_parameter_files.py -q (6 passed)
  • independent pre-PR review: CLEAN; no actionable findings

@PavelMakarchuk
PavelMakarchuk requested a review from MaxGhenis July 28, 2026 04:30
@PavelMakarchuk

Copy link
Copy Markdown
Collaborator Author

@MaxGhenis This is ready for maintainer review: exact head ec61a0344d is now 31/31 green. The sole first-attempt failure was an unrelated Hugging Face CAS download error after five retries in Baseline (rest-b); rerunning that failed job passed. Independent review and all focused ND checks are clean.

@DTrim99

DTrim99 commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Program Review — PR #9165 (Fix North Dakota 2026 income tax thresholds)

Author: PavelMakarchuk

Source Documents

  • ND Office of State Tax Commissioner, 2026 Form ND-1ES (SFN 28709, 12-2025), page 2 — "2026 Forms ND-1 and ND-EZ Tax Rate Schedules" · PDF #page=2

Branch Status

⚠ 6 commits behind main (1 ahead). Minor; review scoped to the merge-base diff.

Summary

Clean, correct TY2026 value update across all five filing statuses. 0 critical. Every 2026 bracket threshold matches ND-1ES 2026 p.2 exactly, correctly routed to the right status, correctly dated at 2026-01-01 with prior years untouched, the 3-tier scale structure (0% / 1.95% / 2.50%) preserved, and the frozen-parameter test + per-status boundary tests are aligned. CI green (31/31).

PDF / value audit — all 10 thresholds match ND-1ES 2026 p.2

Status 1.95% start 2.50% start
Single 49,575 250,400
MFJ + Qualifying Surviving Spouse 82,800 304,850
Married filing separately 41,400 152,425
Head of household 66,400 277,600

Base-amount cross-checks reproduce the form's printed "your tax is" column exactly ((250,400−49,575)×0.0195 = $3,916.09; MFJ $4,329.98; separate $2,164.99; HoH $4,118.40). MFJ and QSS correctly share one schedule per the form; no status file received another's thresholds; nd_income_tax_before_credits.py routes each status to its own scale. No mismatches.

Critical

None.

Should Address (minor / cosmetic)

  1. Reference title wording. The 2026 reference title on each of the five files reads "2026 North Dakota estimated income tax worksheet," but the schedule lives on the Form ND-1ES tax rate schedules page (the frozen-param test docstring correctly calls it that). The #page=2 href is correct and file-page-accurate — only the title wording is slightly off. Consider "2026 North Dakota Form ND-1ES tax rate schedules" for consistency.
  2. Pre-existing (not from this PR): joint.yaml carries 0.0250 trailing-zero rate values on the 2023-01-01 top bracket (should be 0.025; the other four files are correct). Since joint.yaml is a touched file, worth a cleanup pass — but not introduced here, and the new 2026 threshold values are all correctly formatted.

Suggestions (optional)

  • The 20 new test cases use free-form names rather than the file's existing Test N, … numbered convention (arguably more readable; correctly appended at the bottom).
  • The "at/just-above threshold" currency cases assert fractional-cent outputs (e.g. 3_916.0875) with no absolute_error_margin; adding 0.01 would match house style (they pass exactly as-is, so this makes them stricter, not vacuous). A one-line #($1 over × 1.95%) comment would clarify the 0.0195 outputs.

Validation Summary

Check Result
Regulatory / Value Audit All 10 thresholds exact-match ND-1ES 2026 p.2; base-amount cross-checks reproduce; MFJ+QSS shared correctly; 0 mismatches
Reference Quality ND-1ES cited on each of 5 files with correct #page=2; statute subsection preserved; minor title-wording nit
Code Patterns 0 critical; clean 2026-01-01 keys across all 5 statuses, scale structure intact, frozen-param test + changelog aligned; 1 pre-existing trailing-zero
Test Coverage Tight — all 5 statuses tested at AND just-above both bracket boundaries (20 cases); would catch a transposed threshold or wrong-schedule routing
CI Status Passing (31/31)

Review Severity: APPROVE

An exemplary, fully-verified 2026 multi-status threshold update: every value matched against ND-1ES 2026 p.2 with base-amount cross-checks, correct MFJ/QSS sharing, and comprehensive per-status boundary tests. No functional issues — only a cosmetic reference-title wording fix and a pre-existing trailing-zero cleanup. Rebase off the 6-commit lag before merge.

Review generated with Claude Code via /review-program

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Small Claude nits

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.

2 participants