Skip to content

Add Hawaii's employee temporary disability insurance contribution - #10677

Open
MaxGhenis wants to merge 6 commits into
mainfrom
hi-tdi-employee-contribution
Open

MaxGhenis wants to merge 6 commits into
mainfrom
hi-tdi-employee-contribution

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Adds Hawaii's employee temporary disability insurance (TDI) contribution and counts it in employee payroll tax and household net income, following the New Jersey TDI pattern. Because Hawaii lets the employer choose whether to withhold, the contribution also follows main's pattern for New York's contributions and reads the employer's deduction share. An audit flagged the gap on 2026-11-05 without reading Hawaii law.

axiom: TheAxiomFoundation/rulespec-us#2052 queued (HRS 392-43, 392-3, 392-5 and 383-11, with DLIR's yearly notices; proposed corpus citations us-hi/statute/392-43, us-hi/statute/392-3, us-hi/statute/392-5 and us-hi/statute/383-11; plus the federal limits under 26 USC 402(g) and 414(v), proposed us/statute/26/402/g and us/statute/26/414/v). Missing corpus text blocks the signed encoder for Hawaii and, in the corpus copy I could read, for 402(g) and 414(v). Each billed encoder run needs separate approval.

What Hawaii's law says

Question Answer Source
Employee contribution An employer may withhold “one-half the cost but not more than .5 per cent of the weekly wages”. So 0.5% is a ceiling, and half the cost can bind below it. The law authorizes withholding and doesn't require it. HRS 392-43(a), Form TDI-15
Weekly wage cap The State's average annual wage for the preceding year ÷ 52, “multiplied by the factor 1.21”. The cap reaches $1,500.21 in 2026. HRS 392-43(b)(2), 2026 notice
Yearly change The Director publishes a new amount each year. It follows the wage, so it fell in 2011 and 2021. Yearly DLIR notices, cited for each year in maximum_weekly_wage_base.yaml
Who counts Wages from a payroll period count only if, in the prior 52 weeks, the employee earned at least $400 and worked at least 14 weeks of 20 or more paid hours. HRS 392-43(b)(1)
Employer share The employer pays the balance of the cost. The law sets no employer rate, so this PR models no employer dollars. HRS 392-43(a)

What this PR changes

  • Parameters under gov/states/hi/tax/payroll/temporary_disability_insurance/: the rate limit, 23 yearly wage bases, the three parts of the wages test, and the payments the statute leaves out of wages.
  • Variables under gov/states/hi/tax/payroll/: wages, the wages test, taxable wages, the employee contribution and hi_employee_state_payroll_tax.
  • employee_state_payroll_tax now adds hi_employee_state_payroll_tax. From there the amount reaches employee_payroll_tax, household_tax_before_refundable_credits and household_net_income, as New Jersey's does. It also reaches spm_unit_payroll_tax, spm_unit_taxes and spm_unit_net_income, and so SPM poverty.
  • The contribution is the 0.5% limit times state_payroll_premium_deduction_share, which clips the employer_state_payroll_premium_deduction_share input (default 1) to between 0 and 1. #10285 set this up on main for contributions the law lets the employer withhold without requiring it, such as New York's. The documentation of employee_state_payroll_tax, employer_additional_state_payroll_tax and that input now lists Hawaii TDI with the programs whose employer cost the model doesn't hold.
  • Federal parameters: the 401(k) elective deferral limit, the catch-up amounts and the catch-up age now start in 2004, from the IRS cost-of-living table. Hawaii's wages need them because the statute takes deferrals out in every year. The backfill also corrects 2015–2017: the first value on file, $18,500 for 2018, had filled those years, and the IRS table sets $18,000.
  • programs.yaml gains a hi_tdi entry with status: partial.

Reading to confirm: what counts as wages

HRS 392-3 counts “all remuneration for services” and leaves out what HRS 383-11 lists. This PR builds a Hawaii wage definition from those two sections instead of reusing payroll_tax_gross_wages.

Amount Federal payroll base This PR Why
Pre-tax health premiums, payroll HSA contributions Out Out HRS 383-11(1)(C), “Medical or hospitalization expenses”
401(k) deferrals In Out HRS 383-11(4)(A): payments “by an employing unit to, or on behalf of, an individual” to a “trust described in section 401(a)”
403(b) deferrals In Out HRS 383-11(1)(A), “Retirement”
Dependent care benefits Out In HRS 383-11 lists no such payment
Military basic pay In Out HRS 392-5(6) leaves service in the employ of the United States government out of employment

Only paragraph (5) stops at payments made “without deduction from” pay. Paragraphs (1) and (4) carry no such limit. The federal base differs because of IRC 3306(r)(1)(A), (b)(5)(G) and (b)(13), which Hawaii did not enact. The treatment of Roth deferrals follows from the text, which sets no income tax condition. The temporary disability rules take wages from HRS 392-3. They and the unemployment insurance rules address pay in kind given rather than deducted from money wages. Neither set of rules names a plan contribution or salary reduction, and the employer handbook doesn't either, so no agency reading breaks a tie. A paywalled XpertHR guide's search snippet says Hawaii's unemployment insurance treats cafeteria-plan contributions differently from the federal rule. I couldn't read how, so this reading doesn't rest on it.

The effect stays small: $60,000 with a $4,000 401(k) deferral gives $280 here and $300 on the federal base. source_conflicts/candidates.yaml records this as us-hi:tdi-wages-salary-reductions, with excerpts in source_conflicts/sources/us-hi/. The register entry and its marker follow after merge, as CONTRIBUTING.md sets out.

Invariants

These hold for every input, in the years each variable can run (see "Earlier years"):

  1. 0 ≤ contribution ≤ 0.5% × min(wages, base × counted weeks), where wages exclude the listed payments and military basic pay, and counted weeks default to 52.
  2. The contribution never falls when wages rise.
  3. The contribution is zero outside Hawaii.
  4. hi_employee_state_payroll_tax equals each person's contribution, and employee_state_payroll_tax equals the sum across a Hawaii tax unit.
  5. Under current law, removing the contribution lowers employee_state_payroll_tax, employee_payroll_tax and household_tax_before_refundable_credits by exactly the contribution, and raises household_net_income by exactly the contribution. The test runs this identity on three 2026 workers. It should hold beyond them because no Hawaii tax or benefit formula reads these totals: the only such formulas I found sit in Alabama, Delaware and two California counties.
  6. For one employer and a worker who passes the wages test, the annual amount is at least the sum of the weekly statute's amounts, and the two match for even wages.
  7. Each wage base parameter matches a stored transcription of its notice. Each notice's base follows HRS 392-43(b)(2) from its average annual wage, and its deduction equals 0.5% of its base, rounded to the cent.
  8. Previous-year history only adds workers. A Hawaii worker passes the wages test with history exactly when the worker passes without it or the previous year shows at least 14 weeks and at least 20 usual hours.
  9. The contribution equals the clipped deduction share times its amount at the default share, and the employer amount stays at zero at any share. test_state_payroll_premium_deduction_share_invariants.py checks both, now with Hawaii among the optional programs.

The test module labels two intended differences:

  • The 2010 notice's 901.70 equals the unrounded product rounded once. Every other notice matches rounding the weekly wage first, which gives 901.69 for 2010. The statute sets no rounding rule, and the parameter holds the published amount.
  • A full-year worker over the cap pays 52 × 0.5% × base here. DLIR rounds each week's maximum to the cent, so 52 weeks of it differ by at most $0.26 a year.

Assumptions and limits

  • Statutory limit. The model holds no plan cost, so it takes the 0.5% limit as the permitted amount and multiplies it by the employer's deduction share, which defaults to 1. Half the cost can bind first, so at the default the amount is an upper bound. DLIR's own example, with a premium of 80 cents per $100 of wages on $300 of weekly wages, gives $1.20 against a $1.50 limit, which a share of 0.8 reproduces.
  • Annual cap. The statute caps each week. The model uses base × weeks worked, or 52 when weeks went unreported. This is an upper bound for uneven wages. It can't separate two concurrent employers.
  • Wages test. The statute looks back 52 weeks from each payroll period, and the model approximates that with annual inputs. A worker passes on the simulation year's wages, weeks worked and usual weekly hours, or on the previous year's weeks worked and usual weekly hours. So a worker who retires in January after a full prior year pays on January's wages, and new hires' first weeks stay in once the simulation year passes. The previous-year route needs both values on file. A single year of inputs leaves it at zero, so a short year with no history on file pays nothing. I kept that on purpose: the statute leaves wages out unless the history is shown, and dropping the weeks part would charge new entrants and seasonal workers instead. In a microsimulation the dataset year has no previous year on file, and later years read the carried value. A two-year run gives the same answers whichever year calculates first. The previous year needs no wages check, because 14 weeks of 20 paid hours reach $400 at about $1.43 an hour. Usual weekly hours stand in for each week's hours, so a worker with 14 qualifying weeks and lower average hours pays nothing. Reviewer: please judge this choice.
  • Unreported values. Zero weeks or zero hours count as unreported, so that part of the test passes. The documentation of weekly_hours_worked_before_lsr has a missing value fail work-requirement tests. This PR departs from that for a tax: a worker with wages must have worked, and a household calculator that enters income alone would otherwise show no contribution. A reviewer may prefer the other default.
  • Excluded employees. HRS 392-5(6) leaves out service for the United States government. The model subtracts military_basic_pay, which its convention puts inside employment_income, and keeps a service member's civilian wages. A situation that enters basic pay on top of employment_income would subtract it from civilian pay. The model identifies no other federal employees, so it still charges them. HRS 392-5 also leaves out some domestic and family employment, commission-only insurance and real estate agents, majority owners, partners and sole proprietors, and state and county sick leave serves as TDI. The model can't observe those groups, so it treats their Hawaii wages as covered.
  • No uprating past 2026. No 2027 notice exists yet, and no state payroll parameter in the repo uprates.
  • Earlier years. The Hawaii variables and employee_state_payroll_tax ran in each year I tried between 2003 and 2026. The contribution stays at zero before 2004, the first year with a published base, and in 2003 the Hawaii wage doesn't read deferrals, so it needs no federal limit. Further down the chain, existing limits that this PR leaves alone decide which years run. For single adult workers at $10,000 and $100,000 in Hawaii and Texas, employee_payroll_tax raised a missing-parameter error before 2013, and household_net_income and spm_unit_net_income raised one before 2015. With a 15-year-old in the tax unit, employee_payroll_tax raised in 2014 as well, in Texas too. The 401(k) limits now start in 2004, so a deferral computed from a desired amount raises in 2003.
  • No aggregate run. I didn't run a microsimulation. The largest single-worker change in 2026 is $390.05.

Coverage

Published values run from 2004 to 2026, one DLIR notice per year. Live DLIR files cover five of those years, so the other 18 link pinned Internet Archive captures. I found no notice for years before 2004, and this check stays open:

  • The Internet Archive's index never answered for older DLIR paths: its CDX search came back empty, and its availability API returned 429 after one of my retry loops got flagged as abusive traffic. Older captures may exist.
  • The Department of Labor comparison URLs I tried returned error pages, and a Social Security Bulletin fetch returned 403.
  • A workers' compensation table doesn't cover this cap, and a rounded unemployment insurance wage base for 2002 and 2003 can't yield the exact amount.
  • A wider web search for 2000–2003 found nothing.

So years before 2004 hold a zero that marks them as unmodeled, as New Jersey's and Rhode Island's parameters do. Act 30 of 1999 set the wages test's 52-week window, and the section's one later amendment, Act 100 of 2013, renames a fund, so the test holds across 2004–2026.

I read every notice this session. The later retry that hit the Internet Archive's limit was meant to save local copies, so for the pinned years the record is the text captured in the first read. The 2004, 2012 and 2014 notices came as images, so for those three the record is the figures I transcribed.

Tests

  • YAML: 57 Hawaii cases with hand-computed values, across 2003–2026, in hi_employee_temporary_disability_insurance_contribution.yaml and hi_temporary_disability_insurance_wages.yaml. Three of them set the employer's deduction share to 0.5, 0 and 1.5. Thirteen federal cases in elective_deferral_limit.yaml and k401_catch_up_limit.yaml take their expected values from the IRS table.
  • Python: tests/core/test_hi_temporary_disability_insurance.py holds what YAML can't state: the stored notice table with the formula differential, the Hypothesis properties over mixed-state batches, the previous-year differential, the annual form against the weekly statute, and the net income identity. tests/core/test_payroll_contributions.py gains a Hawaii row, and tests/core/test_state_payroll_premium_deduction_share_invariants.py now draws Hawaii workers. All three run in CI's core group.
  • Changed existing tests: test_first_modeled_year_is_the_backdating_floor used the 401(k) limit as its parameter first dated after 2015. The backfill moves that date to 2004, so the test now reads the IRA limit, first dated 2018. The Hawaii case in marginal_tax_rate_including_health_benefits.yaml now expects −0.0256 instead of −0.0306. The model gives −0.0256 with the contribution and −0.0306 with it neutralized. The case's 0.01 margin would have passed either value; I updated it so that the file records what the model computes. test_state_payroll_premium_deduction_share_invariants.py adds Hawaii to its optional states and programs and to the states whose employer amount stays at zero, so each example also forces a $60,000 and a $250,000 Hawaii worker.
  • CI's load: this PR's run 42245429208 at 683f457d0b split core into three processes that took 21:21 to 24:48 and peaked at 6.5 to 8.6 GiB. The Hawaii module's 49 tests took 6.2 s of test time in core-1. Two unrelated jobs in that run hung on the certificate step until their time limits, so it isn't a pass.
  • Local cost, not Linux CI (macOS, load about 30): the module takes 45.3 s real and 1.88 GB maximum resident size with the new property test, against 46.2 s and 1.80 GB without it. That test's call takes 3.2 s. The two Hawaii YAML files take 67.7 s real, including import, and 2.82 GB in one process. With Hawaii, the share invariants test's call took 8.8 s, against 10.0 s for main's version, and the file's peak resident size went from 1.65 GB to 1.68 GB, at load 15 to 20.

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits November 6, 2026 06:30
HRS 392-43 lets an employer withhold half the cost of coverage, up to 0.5% of
weekly wages, and caps those wages at a maximum weekly wage base the Director
publishes each year. Model the contribution at that limit from the published
2004-2026 wage bases, and add it to employee_state_payroll_tax so it reaches
employee_payroll_tax and household net income.

HRS 392-3 takes its wage exclusions from HRS 383-11, the same list Hawaii
unemployment tax uses, so wages start from payroll_tax_gross_wages. That
variable raised a TypeError before 2010 because the FICA pre-tax list started
in 2010, so the list now applies to every year.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The contribution read the federal payroll wage base, which rests on federal
rules Hawaii did not enact. Hawaii's text leaves out what an employer pays to
medical and retirement plans, including salary reductions, and lists no
dependent care payment. Build wages from those two sections, record the
reading as a source-conflict candidate with short excerpts, and restore the
shared FICA list's start date, which only the federal base needed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 4 commits November 9, 2026 08:01
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Leave military basic pay out of Hawaii wages under HRS 392-5(6), let the
wages test pass on the previous year's weeks and hours, and take
retirement deferrals out from 2004. Extend the federal elective deferral
and catch-up limits back to 2004 from the IRS table, which also corrects
2015-2017 to $18,000. Add the program to programs.yaml, split the
source-conflict regulation captures by page, and update the Hawaii
marginal rate case for the contribution.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main's #10285 rewrote the documentation of employee_state_payroll_tax.
The resolution keeps its text and lists Hawaii TDI with New York's
contributions, which the employer is authorized but not required to
collect.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
HRS 392-43(a) permits the employer to withhold the contribution without
requiring it, like New York's PFL and DBL. Following main's #10285, the
employee amount is the 0.5% limit times state_payroll_premium_deduction_share,
which defaults to 1. Hawaii joins the programs whose employer cost the model
doesn't hold, in the documentation of employee_state_payroll_tax,
employer_additional_state_payroll_tax and the share input, and in the share
invariants test. Three YAML cases cover a share of 0.5, 0 and 1.5.

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