Skip to content

Correct Minnesota UI taxable wage bases for 2014-2026 - #10319

Open
MaxGhenis wants to merge 3 commits into
mainfrom
mn-ui-taxable-wage-base
Open

MaxGhenis wants to merge 3 commits into
mainfrom
mn-ui-taxable-wage-base

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

WIP: Correct Minnesota's unemployment insurance taxable wage base from a flat $42,000 to DEED's published annual figures for 2014–2026, including $43,000 in 2025 and $44,000 in 2026.

The annual entries cite Minnesota DEED's History of tax rate factors. Minn. Stat. 268.035, subd. 24 sets the taxable wage base at 60% of the state average annual wage, rounded to the nearest $1,000. Sources read October 20, 2026.

Adds annual capped-earnings regressions and 2025/2026 cases with zero wages and wages below, at, and above each cap. At the model's existing 0.9% default rate, maximum employer UI liability is $387 in 2025 and $396 in 2026.

Plan:

  • Add annual wage bases, anchored references, and a changelog fragment.
  • Add annual and boundary regression coverage.
  • Complete Minnesota payroll validation, one file per foreground process with thread caps.
  • Hub: run the impact analysis.
  • Hub: file parity follow-up.

Validation:

  • Minnesota UI taxable earnings: 13 passed, 1 warning; exit 0.
  • Existing Minnesota paid leave: 3 passed, 1 warning; exit 0.

Both YAML files ran one at a time in separate foreground processes with the requested thread caps: 16 passed across 2 files.

ruff format . (7,395 files unchanged) and ruff check . passed.

The hub will run the impact.

Limitation: the existing $42,000 pre-2014 fallback remains to preserve compatibility with the common UI selector, which reads every jurisdiction's parameter. This change verifies annual figures from 2014 onward; it does not verify earlier values.

axiom: pending: hub files parity

@MaxGhenis
MaxGhenis marked this pull request as ready for review October 21, 2026 00:31
@MaxGhenis MaxGhenis closed this Oct 21, 2026
@MaxGhenis MaxGhenis reopened this Oct 21, 2026
@DTrim99

DTrim99 commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Correct Minnesota UI taxable wage bases for 2014-2026

PR #10319 (author: MaxGhenis), head 1fb60e8a5f. This is a first review. The PR replaces Minnesota's flat $42,000 employer UI taxable wage base with DEED's published figure for each year from 2014 to 2026. It also adds a 13-case test file and a changelog fragment, and it rewrites the references. The PR has no comments or reviews yet. It touches no partner test file.

Path prefixes:

  • P/ = policyengine_us/parameters/gov/states/mn/tax/payroll/unemployment/
  • T/ = policyengine_us/tests/policy/baseline/gov/states/mn/tax/payroll/unemployment/

Sources read for this review (all fetched 2026-10-21):

Summary

What is right. All 13 annual values match DEED's table exactly.

  • 2014–2024: $29,000; $30,000; $31,000; $32,000 (2017 and 2018); $34,000; $35,000 (2020 and 2021); $38,000; $40,000; and $42,000.
  • 2025 and 2026: $43,000 and $44,000. The $42,000 figure is 2024's. DEED's 2025 row reads 43,000, so the PR's 2025 value is right.
  • Statute. DEED's figures follow the statute's formula: 60% of the state's average annual wage, rounded to the nearest $1,000. The average annual wage is calculated by June 30 and applies to the following calendar year (subd. 23(b)).
  • What the fix changes. main caps 2025 wages at $42,000 instead of $43,000 and 2026 wages at $42,000 instead of $44,000. It also over-caps 2014–2023. Example: in 2026, a worker earning $45,000 at the 0.9% default rate owes $378 on main and $396 at the head.
  • Tests. I hand-checked all 13 cases and all 6 employer-tax outputs. CI passed the 13 cases on the merge with current main.
  • Batch checks. The PR's comments pass the source-conflict ratchet. No state-gated key or income-source list is involved.

There are no critical findings and one should-address item:

  • S1. Invalid Axiom line. axiom: pending: hub files parity is not one of the allowed forms. n/a doesn't fit either: the provision is statutory and the PR changes MN employer UI tax results. rulespec-us has no chapter-268 module and no matching issue. The PR needs a dispatch-ready pe-parity issue, with the line axiom: TheAxiomFoundation/rulespec-us#<n> queued, or an encoder PR.

There are also three suggestions: the pre-2014 $42,000 fallback, indexing after 2026, and the "WIP" body.

Status.

  • CI: 27 checks pass and 3 are skipped (the superseded 2026-10-20 run). None is pending or failed.
  • Branch: 2 commits ahead of main and 18 behind, and it merges cleanly.

Critical (must fix)

None.

Should address

S1. The Axiom line axiom: pending: hub files parity is not a valid form

  • Where: the last line of the PR body. The body's plan also leaves "Hub: file parity follow-up" unchecked.
  • The rule (CLAUDE.md, "Axiom Parity"): a PR that updates or fixes policy needs encoded-correct, <rulespec PR> encoded, <rulespec issue> queued or n/a: <reason>. pending is not one of them.
  • Why n/a doesn't fit:
    • Minn. Stat. 268.035 subd. 24(a) fixes the base by law: "'Taxable wages' means those wages paid to an employee in covered employment each calendar year up to an amount equal to 60 percent of the state's average annual wage, rounded to the nearest $1,000." DEED publishes the result of that calculation each year.
    • The PR changes household-level results. mn_employer_state_unemployment_tax feeds employer_state_unemployment_tax, then employer_state_payroll_tax, then employer_payroll_tax.
    • Precedent: New Jersey's commissioner-promulgated wage bases, the same statute-plus-agency-figure structure, were queued as pe-parity issues (rulespec-us#1623, Improve simultaneous-tax-equations calculation #1827).
  • Why encoded-correct isn't available:
    • rulespec-us main (5796861e5) has Minnesota statute modules only for chapter 290. It has none for chapter 268, and no DEED UI policy files.
    • gh search issues in rulespec-us for "268.035" and "Minnesota unemployment" returns nothing.
  • Severity: should. An invalid Axiom line is a merge blocker, not a model error.
  • Fix: file an open, pe-parity-labelled, dispatch-ready issue in TheAxiomFoundation/rulespec-us, modelled on Improve simultaneous-tax-equations calculation #1827 or Add AMT parameters for 2020-2023 #1467. Then change the line to axiom: TheAxiomFoundation/rulespec-us#<n> queued. Alternatively, run the signed encoder and cite the PR as encoded. The issue needs:
    • Target modules: a new-module request, for example us-mn/statutes/268/035.yaml, which follows the existing us-mn/statutes/290/0671.yaml layout. Add annual DEED guidance files if the encoder keeps published figures separately.
    • Corpus citations: Minn. Stat. 268.035 subds. 23–24 and the DEED "History of tax rate factors" table.
    • Verbatim law: subd. 24(a), quoted above, and subd. 23(a)–(b). Subd. 23(b) says the average annual wage "applies to the calendar year following the calculation".
    • Required outputs: the annual taxable wage base for 2014–2026 and per-employee taxable wages, min(wages, base).
    • Companion tests from DEED, not from PolicyEngine output: the 2025 ($43,000) and 2026 ($44,000) rows, plus DEED's own worked example on the same page. In that example, three employees each earn $50,000, "the first $44,000 of the $50,000 in wages they earned is taxable", and taxable wages are "$44,000 x 3 employees = $132,000".
    • Why queued: the blocker, such as the corpus scope, the signed release or billed-run approval.

Suggestions

G1. The pre-2014 $42,000 fallback

  • Where: P/taxable_wage_base.yaml:3-4 (# Legacy fallback before the cited DEED history begins in 2014. / 0000-01-01: 42_000).
  • What it does:
    • $42,000 is DEED's 2024 figure, and no reference supports it for any year before 2014.
    • It is unreachable in modeled years. FIRST_MODELED_YEAR is 2015 (policyengine_us/tools/parameters.py:9), and the 2014 entry covers every later year.
    • The PR body's compatibility reason holds. select_state_unemployment_tax_parameter reads every jurisdiction's parameter, and core's _get_at_instant returns None before a parameter's first value. Backdating would not fill the gap, because the 2014 entry already precedes 2015. Without a 0000 entry, a 2013 run would hand None to select.
  • Fix (optional): set the fallback to the earliest verified figure ($29,000). Or reword the comment to say the value is an unverified placeholder that no modeled year (2015 onward) reads.

G2. The base stays at $44,000 after 2026

  • The statute indexes the base to the state's average annual wage every year (subds. 23–24). The DEED figures rose by $1,000–$3,000 a year from 2021 to 2026.
  • The head holds $44,000 flat for 2027 onward. DEED normally mails the next year's rate determinations by mid-December ("on or before December 15, 2025" for 2026).
  • Fix (optional): add the 2027 figure when DEED publishes it. Or add uprating: gov.ssa.nawi with rounding to the nearest $1,000 as a placeholder until then. That index is already used in the tree.

G3. PR body housekeeping

  • The body opens with "WIP:" while the PR is not a draft. Two plan items are still unchecked: "Hub: run the impact analysis" and "Hub: file parity follow-up".
  • Fix: once the hub work is done, drop "WIP:" and tick the items. Or mark the PR as a draft until then. The parity item is S1.

Verified correct

  • Every annual value (P/taxable_wage_base.yaml:5-17) matches DEED's "History of tax rate factors" table, row by row:

    Year DEED Head Year DEED Head
    2014 29,000 29,000 2021 35,000 35,000
    2015 30,000 30,000 2022 38,000 38,000
    2016 31,000 31,000 2023 40,000 40,000
    2017 32,000 32,000 2024 42,000 42,000
    2018 32,000 32,000 2025 43,000 43,000
    2019 34,000 34,000 2026 44,000 44,000
    2020 35,000 35,000

    The page header separately confirms "The Taxable wage base for 2026 is $44,000." In 2021, the base and the experience-rating period (7/1/2015–6/30/2019) were both unchanged from 2020.

  • Effective dates. January 1 of each year is correct. The base applies to each calendar year (subd. 24(a)), using the average wage calculated the year before (subd. 23(b)).

  • References (P/taxable_wage_base.yaml:23-27):

    • Both anchors resolve: #stat.268.035.24 is the subd. 24 element on the Revisor page, and #toggle-4 is the "History of tax rate factors" accordion on the DEED page.
    • The DEED reference shows every value. The statute reference gives the rule.
    • Each reference is a single source with no page text in the title.
    • Dropping the DOL CY2024 "Significant Measures" reference loses nothing, since it only showed 2024.
  • Consumers:

    • The parameter is read only through select_state_unemployment_tax_parameter(..., "taxable_wage_base") in taxable_earnings_for_state_unemployment_tax. That variable takes min_(payroll_tax_gross_wages, wage_base) for Minnesota, the default branch.
    • The result feeds mn_employer_state_unemployment_tax (rate × taxable earnings), then employer_state_unemployment_tax, employer_state_payroll_tax and employer_payroll_tax.
    • MN Paid Leave doesn't read this parameter. mn_paid_leave_taxable_wages caps wages at the Social Security base rounded to the nearest $1,000 (Minn. Stat. 268B.01), so the paid-leave tests and the test_payroll_contributions.py MN cases are unaffected.
    • No other test pins Minnesota UI earnings above $42,000.
  • Hand-checks (all 13 cases, 19 expectations). The rate is employer_state_unemployment_tax_rate_override (default −1), so the 0.009 default applies.

    • 2014–2024 (T/taxable_earnings_for_state_unemployment_tax.yaml, cases at lines 3–83). Each case is min(100,000, base) and equals that year's DEED figure: 29,000; 30,000; 31,000; 32,000; 32,000; 34,000; 35,000; 35,000; 38,000; 40,000; 42,000.
    • 2025 (line 91). Wages [0, 42,000, 43,000, 44,000] give taxable earnings [0, 42,000, 43,000, 43,000]. The tax is 0.009 × those amounts: [0, 378, 387, 387].
    • 2026 (line 100). Wages [0, 43,000, 44,000, 45,000] give taxable earnings [0, 43,000, 44,000, 44,000] and tax [0, 387, 396, 396].
    • Boundaries. 2025 and 2026 each test zero wages and wages below, at and above the cap. The cap is inclusive (min_).
  • Changelog. changelog.d/mn-ui-taxable-wage-base.fixed.md is a top-level fragment, and fixed is the right type.

  • Batch lessons:

Axiom line assessment

Invalid: axiom: pending: hub files parity (S1).

  • Recommended form: axiom: TheAxiomFoundation/rulespec-us#<n> queued, with a new open, pe-parity-labelled, dispatch-ready issue for Minn. Stat. 268.035 subds. 23–24 and DEED's annual figures. The required contents are listed under S1. Alternatively, cite an encoder PR as encoded.
  • Not n/a. This is a statutory provision, and the PR changes Minnesota employer UI tax for every worker above the cap in 2014–2023, 2025 and 2026.
  • Not encoded-correct. rulespec-us main (5796861e5) has no Minnesota chapter-268 module, and no matching issue exists.

CI status

27 pass, 3 skipping, 0 pending, 0 failed. I re-checked gh pr checks 10319 at the end of this review.

  • The green run. Run 39608187729 (pull_request, created 2026-10-21 13:27 UTC) tested merge commit 99b32069, which merges head 1fb60e8a5f into fec98b87c8, current main after Count the FL and SD LIHEAP comments in the source-conflict ratchet baseline #10334.
  • The skipped run. The three skipped checks are the umbrella jobs of the earlier run 39517389189 (2026-10-20 23:48 UTC) at the same head.
  • Where the Minnesota tests ran. Baseline states-shard-1, batch 7/14 (states/mn), passed all 13 cases of T/taxable_earnings_for_state_unemployment_tax.yaml and the three paid-leave cases. Quick Feedback selected and passed the same file.
  • Guards. Rest (Python, shard-1 + variables) passed test_source_conflicts.py, including test_conflict_sounding_comments_do_not_grow.
  • Known main-caused failure. Not applicable: the run started after 13:24 UTC on 2026-10-21, and the ratchet passed.
  • Locally: I ran no tests or model probes. The CI run is green at the current head, and every expectation was hand-checked.

Branch status

  • Position: 2 commits ahead of main (328d1721e2) and 18 behind. The merge base is 461f78e1ee.
  • Merge: clean. git merge-tree --write-tree PolicyEngine/main 1fb60e8a5f exits 0 (tree ead0f6b5f5). The PR's three files are untouched on main since the merge base.

0 critical, 1 should and 3 suggestions are open at this head.

Verdict: REQUEST_CHANGES

@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.

All 13 annual values match DEED's history table (29k in 2014 through 43k in 2025 and 44k in 2026), the statute anchors resolve, and all 19 expectations hand-check. One should-address item: 'axiom: pending: hub files parity' isn't a valid axiom line. This is statutory (Minn. Stat. 268.035 subds. 23-24) and changes employer UI tax, so please file a dispatch-ready pe-parity issue and mark it queued. Three suggestions, including indexing past 2026. Full report in the comment above.

…eholder

DTrim99's review G1: $42,000 is DEED's 2024 figure, and no modeled year (2015 onward) reads it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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