Skip to content

Backfill Hawaii's UI taxable wage base to 1970 and fix its 2015 new-employer rate - #10770

Draft
MaxGhenis wants to merge 3 commits into
employer-state-payroll-historyfrom
hi-ui-wage-base-history
Draft

MaxGhenis wants to merge 3 commits into
employer-state-payroll-historyfrom
hi-ui-wage-base-history

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Sets Hawaii's employer unemployment insurance (UI) taxable wage base for every year from 1970 to 2026. The values come from DLIR's December 2019 trust fund evaluation (Appendix B, 1970–2020), DLIR's tax rate schedule page (2020–2026) and HRS 383-61 for the special years.
  • Fixes Hawaii's 2015 new-employer rate. DLIR's evaluation puts schedule D in effect for 2015, and HRS 383-66(a)(2) and 383-68 give new employers 3.0% on it. Give state employer unemployment taxes their 2018-2026 histories #10700 backdates its first value, 2.4%, to 2015. In 2016 and 2017, schedule C sets 2.4%.
  • Holds the statute's $34,920 for 2010, where DLIR lists $34,900. The PR records this choice as source-conflict candidate us-hi:ui-taxable-wage-base-2010-rounding.

Stacked on #10700

The base branch is employer-state-payroll-history (#10700). That PR first sets Hawaii's 2018–2026 values and adds the invariants module this PR extends, so stacking avoids conflicts in both. PE-US runs PR CI only on pull requests into main. Once #10700 merges, GitHub retargets this PR to main, but a base change alone starts no run. #10700 will squash-merge, so after it lands:

git rebase --onto upstream/main 66b54f3d88900d287db28e973f8f1209b429ebca hi-ui-wage-base-history

Then force-push with lease, which starts CI. The rebase replays only this PR's commits. #10700's later commits (8cf5f12 so far, which moves Oklahoma's 2026 tests) build on 66b54f3 and touch none of this PR's files, so the command stays the same.

How the base follows the average annual wage

HRS 383-61(b) sets the base at the average annual wage for the four quarters ending June 30 of the preceding year. Subsection (b) computes that average by November 30 and rounds it to the nearest hundred dollars. Subsections (c) and (d) set six years otherwise:

Years Rule Base
1988 (d)(3): 50% of the average, since DLIR's reserve ratio for 1988 was 2.08, at least 1.2 $8,700
1991 (c): a flat $7,000 $7,000
2008–2009 (c): $13,000 while the fund held its adequate reserve (ratios 2.25 and 1.77) $13,000
2010–2011 (c): 90% of the average (Act 2 of 2010, retroactive to January 1, 2010) $34,920 and $34,200

The parameter takes every other year from DLIR's tables: the evaluation for 1970–2020 and the schedule page for 2020–2026.

HRS 392-43(b)(2) caps the weekly wages subject to TDI contributions at 1.21 times one fifty-second of the same average annual wage, and DLIR's yearly TDI notices print that average to the cent. The notices cover 2004–2026. In each of the 19 years among them where (b) applies alone (2004–2007 and 2012–2026), DLIR's base equals the notice's average rounded half up to $100. The new module checks every one of them.

2010

Subsection (b) computes the average annual wage "and rounded to the nearest hundred dollars" (HRS 383-61(b)), so the 2010 average is $38,800 (notice: $38,750.59). Subsection (c) takes 90% of it and adds no rounding, which gives $34,920. DLIR lists $34,900, the 90% figure rounded to the nearest hundred dollars. That rounding gives $34,900 whether or not DLIR rounded the average first.

CONTRIBUTING's source-conflict rules settle this: the statute controls stated agency practice, and its definition of the average controls. The parameter therefore holds $34,920, and source_conflicts/candidates.yaml records the conflict as step 1 of the register process (follows: statute, state: ruled). The figures differ by $20 of wages, or $0.20 of contributions for each percentage point of rate. 2010 precedes 2015, PE-US's FIRST_MODELED_YEAR, so the choice moves no amount in a year PE-US models. 2011 has no gap: 90% of $38,000 is $34,200 either way.

Rate, 2015–2017

Year Schedule (DLIR evaluation, Appendix B) Rate for a .0000 reserve ratio (HRS 383-68(d)) Before this PR
2015 D 3.0% 2.4%
2016 C 2.4% 2.4%
2017 C 2.4% 2.4%

The U.S. Department of Labor's Significant Provisions of State UI Laws agrees. Its January 2016 edition lists Hawaii's new-employer rate as 3.00%, the 2015 rate (its January 2017 and 2018 editions list 2.40%). The January 2015 edition lists 3.40% (schedule E, 2014) and the $40,900 base for 2015. These rate columns lag the year, so the parameter files cite DLIR and the statutes, not DOL.

What reads these parameters

  • taxable_earnings_for_state_unemployment_tax reads taxable_wage_base through select_state_unemployment_tax_parameter (_jurisdictions.py), which selects by the household's state code, the model's proxy for the work state. For Hawaii it returns payroll_tax_gross_wages up to the base. employer_state_unemployment_tax_default_rate reads default_rate through the same selector and averages the rates in force at the four quarter starts. Hawaii's rates change only on January 1, so the average equals the year's rate.
  • employer_state_unemployment_tax_rate takes employer_state_unemployment_tax_rate_override when it is zero or more (its default is −1), and the default rate otherwise. hi_employer_state_unemployment_tax, defined for Hawaii households, multiplies that rate by taxable earnings.
  • employer_state_unemployment_tax adds up the state variables, Hawaii's among them. It feeds employer_state_payroll_tax, which feeds employer_payroll_tax, which feeds employer_cost_of_employment.

Employer UI tax for a Hawaii worker paid $100,000, at the new-employer rate:

Year main (3% × $59,100) #10700 (2018 values backdated) This PR
2015 $1,773.00 $1,101.60 $1,227.00
2016 $1,773.00 $1,101.60 $1,012.80
2017 $1,773.00 $1,101.60 $1,056.00

2018 and later years don't change.

Invariants

These hold for every date and year in range, and the tests check them directly from parameters, with no simulation:

  1. Publication: on every date from 1970 through 2026, the wage base equals DLIR's published base for that year. The one exception is 2010 (see 4). A sweep checks the first and last day of each year, and Hypothesis draws other dates.
  2. Dates: every stored wage base starts on January 1.
  3. Formula: in the 19 years the TDI notices cover where (b) applies alone, the base equals the notice's average annual wage rounded half up to $100. This is a differential check between two DLIR publications.
  4. Special years:
    • 1991 is $7,000.
    • 2008 and 2009 are $13,000, with reserve ratios of at least 1.
    • For 1988, the subsection (d) share for a 2.08 ratio is 50%, and $8,700 doubles to an average between the 1987 and 1989 bases.
    • 2010 and 2011 equal 90% of the rounded average. DLIR's figures equal that amount rounded to $100, so 2010 is the labelled, intended difference.
  5. Federal floor (383-61(d) and (f)): the base never falls below the highest FUTA base enacted by the end of its year (26 U.S.C. 3306(b)(1); PE-US's FUTA parameter from 1982, the year Public Law 97-248 enacted the $7,000 base). 1991 meets the $7,000 FUTA base exactly.
  6. New employers: from 2015 to 2026, the default rate equals the HRS 383-68(d) rate for a .0000 reserve ratio on the year's schedule, which HRS 383-66(a)(2) assigns to new employers.

#10700's test_stored_histories_match_published_tables_in_every_month also covers Hawaii's 2015–2017 rate and base now, through new PRE_2018_RATE and PRE_2018_WAGE_BASE rows. Its Hypothesis simulations (2018, 2022, 2026) don't change.

Tests

  • YAML (hi_employer_state_unemployment_tax.yaml, one process): all 16 cases pass, including five new ones. The new cases cover 2015, 2016 and 2017 at $100,000; 2015 at $30,000, below the base; and 2010 taxable earnings at $40,000 ($34,920).
  • Python, in one process at this head: test_hi_unemployment_insurance_history_invariants.py (8 new tests), test_source_conflicts.py and test_parameter_yaml_keys.py pass, 145 tests in all. At 9a90cff, Give state employer unemployment taxes their 2018-2026 histories #10700's test_employer_state_payroll_tax_history_invariants.py and the code-health checks for reference URLs, known dead links and Python group routing passed too. The later commit changes comments and the 1982 threshold of a test helper, so those checks read nothing new.
  • Cost of the new module, measured locally on macOS with a load average of 60–70 (not Linux CI):
    • pytest reports 8 tests in 10.1 s, and the slowest, Hypothesis over 200 dates, takes 0.74 s.
    • The whole command took 126 s of wall time, almost all of it Python startup and the policyengine_us import on the loaded host.
    • Peak RSS was 1.01 GB. That is the system import, which the core group already pays.
    • The module builds no simulation, and test_rest_python_groups.py confirms that the core group collects it exactly once.
  • No new simulation. The new module reads parameters only, and the YAML cases cover the simulated amounts, as CLAUDE.md's test-design rules ask.

Follow-ups

axiom: TheAxiomFoundation/rulespec-us#2094 queued (extended for HRS 383-61, the 1970–2017 bases, the 2015–2017 rates and the 2010 reading)

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits November 9, 2026 14:02
…mployer rate

Hawaii's wage base follows HRS 383-61: the average annual wage, rounded to
the nearest hundred dollars, with special rules for 1988, 1991 and 2008 to
2011. DLIR's December 2019 trust fund evaluation lists every base from 1970
to 2020, and its schedule page lists the bases from 2020. The parameter
holds those values, except for 2010: there it holds the statute's $34,920
(90% of the $38,800 rounded average), where DLIR lists $34,900.

DLIR's evaluation puts schedule D in effect for 2015, so new employers paid
3.0% (HRS 383-66(a)(2) and 383-68), not the 2.4% that backdating gave. In
2016 and 2017, schedule C sets 2.4%.

The commit also:
- adds YAML cases for 2010 and for 2015 to 2017;
- extends #10700's invariant tables to Hawaii's 2015-2017 values;
- adds a parameter-only invariants module for the history.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
HRS 383-61(b) rounds the average annual wage to the nearest hundred
dollars, and subsection (c) takes 90% of it for 2010 with no further
rounding, so the base is $34,920. DLIR lists $34,900. PE-US follows the
statute. This records the conflict as step 1 of the register process in
CONTRIBUTING.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The invariants module said HRS 392-43(b)(2) caps TDI benefits. It caps
  the weekly wages subject to TDI contributions.
- The federal floor helper now returns $7,000 from 1982, the year Public
  Law 97-248 enacted it.
- The 2008 comment now says that Act 110 of 2007 first set $13,000 for
  2008 to 2010.
- The module docstring and the SCHEDULE comment now name the same sources.
- The source-conflict note ties the modelled years to FIRST_MODELED_YEAR.

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.

1 participant