Skip to content

Give state employee payroll taxes their 2018-2027 histories - #10695

Open
MaxGhenis wants to merge 3 commits into
mainfrom
state-payroll-tax-history
Open

MaxGhenis wants to merge 3 commits into
mainfrom
state-payroll-tax-history

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

What and why

PolicyEngine-US modeled most state employee payroll taxes only under current law. A 2018-2024 run therefore charged contributions before some programs began and left out others that were already collecting. This PR gives each affected parameter its published history from 2018 on:

  • Ran back before the start. Connecticut Paid Leave (2021-01-01: 0.005) and the Oregon statewide transit tax (2018-07-01: 0.001) had no zero entry, so backdate_parameters carried their first value back to 2015 (FIRST_MODELED_YEAR). Both now read zero before contributions began.
  • Zero until 2024. Massachusetts PFML, New Jersey TDI and FLI, New York Paid Family Leave and Rhode Island TDI read zero before 2024, although contributions began in October 2019 (MA), January 2018 (NY PFL) or long before 2018 (NJ, RI). Each now takes the year's published rate and wage base.
  • Mid-year starts. YEAR variables read parameters at January 1, so Vermont's July 1, 2024 start read zero for all of 2024, and Massachusetts's October 1, 2019 start would read zero for all of 2019. New rate variables for Massachusetts PFML, the Oregon transit tax and the Vermont Child Care Contribution average the rates in force at the four quarter starts, the pattern Fix DC paid family leave employer rate history #10675 uses for DC, so a partial first year counts only its months in force. The Massachusetts and Vermont contributions apply Let employers deduct less than the permitted state payroll premium, and apply Massachusetts' PFML cap swap from 2027 #10285's deduction share to these averaged rates: the worker pays the share the employer deducts, and the employer pays the rest.
Program Parameter 2018 on, as published
CT Paid Leave ct/.../paid_leave/employee_rate 0 before 2021; 0.5% from January 1, 2021 (CGS 31-49g(b)(1))
MA PFML family_rate, medical_rate, family_employee_share, medical_employee_share, employer_headcount_threshold 0 before October 1, 2019; family/medical 0.13%/0.62% from 2019-10-01, 0.12%/0.56% 2022, 0.11%/0.52% 2023, 0.18%/0.70% 2024-2026; from 2019-10-01 the employer may withhold all of the family and 40% of the medical contribution, and the 25-employee threshold applies (DFML rate pages, archived); #10285's 2027 swap of rates and shares stays
NJ TDI and FLI worker TDI rate, worker FLI rate, worker wage base TDI 0.19%, 0.17%, 0.26%, 0.47%, 0.14%, 0, 0 for 2018-2024; FLI 0.09%, 0.08%, 0.16%, 0.28%, 0.14%, 0.06%, 0.09%; base $33,700 and $34,400 (the UI base) for 2018-2019, then $134,900, $138,200, $151,900, $156,800 for 2020-2023; 2027 adds 0.24% for each program, beside the $177,100 base already on main (NJDOL rate information)
NY PFL employee rate, annual maximum 0.126%/$85.56 (2018), 0.153%/$107.97, 0.270%/$196.72, 0.511%/$385.34, 0.511%/$423.71, 0.455%/$399.43 (2023) (DFS rate decisions; OSC Payroll Bulletin 1619 for the 2018 maximum)
OR statewide transit statewide_transit/employee_rate 0 before July 1, 2018; 0.1% after (ORS 320.550, Oregon DOR)
RI TDI employee rate, taxable wage base 1.1%/$69,300 (2018), 1.1%/$71,000, 1.3%/$72,300, 1.3%/$74,000, 1.1%/$81,500, 1.1%/$84,000 (2023) (Division of Taxation advisories ADV 2017-47, 2019-37, 2020-63; DLT quick references)
VT Child Care Contribution employee and employer rates unchanged values (July 1, 2024 start); the new rate variables average quarter starts so 2024 counts half a year

Every parameter cites its sources in its metadata. For 2019-2023 the MA files cite Wayback captures of the DFML rate pages and of its notice of the delayed start.

Before and after

An audit script, state_payroll_at_15k.py, computes employee state payroll tax for one household in every state and year: a single parent aged 30 with a child aged 5, earning $15,000 in 2019 dollars, which PE's CPI-U carries to each year. The table shows only the states whose values change; CA, CO, DE, ME, MN, PA and WA keep theirs.

State 2018 2019 2020 2021 2022 2023 2024 2025 2026
CT 73.85 → 0 75 → 0 76.86 → 0 77.94 83.77 89.14 92.31 95.07 97.31
MA 0 0 → 14.17 0 → 58.11 0 → 58.92 0 → 57.63 0 → 56.69 84.92 87.47 89.53
NJ 62.78 → 104.13 63.75 → 101.25 65.34 → 129.90 66.25 → 183.16 71.21 → 118.12 75.77 → 86.47 95.08 187.30 164.45
NY 31.20 → 49.81 31.20 → 54.15 31.20 → 72.71 31.20 → 110.86 31.20 → 116.81 31.20 → 112.32 100.06 104.98 115.28
OR 14.77 → 7.39 15.00 15.37 15.59 16.75 124.80 129.23 133.10 136.23
RI 0 → 162.48 0 → 165.00 0 → 199.85 0 → 202.65 0 → 184.30 0 → 196.11 221.53 247.19 214.08
VT 0 0 0 0 0 0 0 → 10.15 20.92 21.41

Each changed cell equals the published rate times the year's earnings ($14,770.87 in 2018 ... $17,828.11 in 2023). For example, MA 2019 is 0.378% for one quarter of $15,000 ($14.17); NY 2018 is New York's $31.20 Disability Benefits maximum plus 0.126% PFL ($49.81); OR 2018 is 0.1% for half the year ($7.39).

Already right on main, so unchanged here: CO FAMLI starts in 2023, Oregon Paid Leave in 2023, WA Cares counts half of 2023 (the 2023 WA figure is 0.5821% PFML plus half of 0.58%), CA SDI carries the full DE 3395 history (#10255), and Pennsylvania's UC employee rate is 0.06% through 2022 and 0.07% from 2023.

Years before 2018

New Jersey TDI and FLI and Rhode Island TDI collected contributions before 2018. This PR does not encode earlier years: a standing ruling (d2493) holds pre-2018 backfills of this kind, and a queued decision (d2612) asks whether these wait too. Their parameters start at 2018-01-01, so backdate_parameters carries the 2018 value back to 2015-2017. Comments in the files and the invariant test label that as an intended approximation. Programs that began after 2015 keep a 0000-01-01: 0 entry and read zero before their start.

Invariants

policyengine_us/tests/core/test_state_payroll_tax_history_invariants.py copies the published tables (not the model's parameters) and checks:

  1. Schedule. In every month from 2015 through each table's last year, every parameter in this PR equals the published value for that month: zero before each program's start, the 2018 value carried back for NJ and RI (labeled intended).
  2. Quarter-start dates. Every stored value of a parameter that an annual rate averages begins a calendar quarter, so averaging the four quarter starts equals averaging all twelve months.
  3. Differential. Each contribution equals the published rate (averaged over the twelve months where a rate starts mid-year) times published taxable wages, with New York's annual maximum, for Hypothesis-drawn batches and a seeded population of 100 workers in 2018, 2019 and 2024 (each program's partial first year). Each worker also draws Let employers deduct less than the permitted state payroll premium, and apply Massachusetts' PFML cap swap from 2027 #10285's deduction share, some left at the default of 1 and some outside 0 to 1. In Massachusetts PFML, New York PFL and the Vermont Child Care Contribution the worker pays that share, held between 0 and 1, of the permitted amount, and the Massachusetts and Vermont employer pays the rest on top of its own share. Let employers deduct less than the permitted state payroll premium, and apply Massachusetts' PFML cap swap from 2027 #10285's invariants run in 2026 and 2027 only, so this is the check where the deduction share meets a partial first year.
  4. Bounds. Each contribution lies between zero and its top monthly rate (for an employer contribution, plus the top employee rate it may cover) times positive wages; wages at or below zero owe nothing.
  5. Monotonicity. No contribution falls when wages rise (each worker has a raised twin).
  6. Agreement. employer_total_additional_state_payroll_tax equals the worker-level employer contribution for Massachusetts and Vermont when the employer-total wages equal the worker's.
  7. Geography. Outside its state, each contribution is zero.

Two mutation checks each failed both the schedule and the differential tests: New York's 2019 rate set to 0.00154, and, after the merge with #10285, Massachusetts' family employee share set to 0.4 from October 2019.

Test plan

  • For policy changes: YAML tests whose expected values come from an external source. Every expected value is a published rate times wages, capped at the published wage base or maximum.
  • Source conflicts: not applicable. No reading here sets a statute against a form, manual or agency practice.
  • make format (ruff 0.15.5, the locked version)
  • Changelog fragment changelog.d/state-payroll-tax-history.fixed.md

YAML, 62 new cases (114 → 176 in the payroll folders): a pre-start year and historical years for each state, partial first years for MA, OR and VT, #10285's deduction share in the MA and VT partial years, the 2027 MA rate variables, wage-base and annual-maximum caps, the MA employer headcount threshold, and the employer-total paths for MA and VT. CI group: test-yaml-no-structural-states. Run side by side on this machine, one process each, the payroll folders take 56.9 s of test time (143 s CPU) with a 5.83 GB peak footprint on this branch (23 files), against 48.4 s (134 s CPU) and 5.73 GB on main at 61d9e85 (16 files).

Python, one new file in the Rest Python core group; rest_python_shards.py places it at its group's median time until a CI report measures it. It needs Python because YAML cannot state for-all properties, read a parameter at each month, or compare two code paths. Alone it takes 12.5 s in pytest (75 s wall including the model import), with a 1.43 GB peak footprint against 1.12 GB for the import by itself. The rate variables read only the four quarter starts; a household calculation with monthly programs such as SNAP already builds all twelve monthly parameter snapshots, so there they add none.

Run locally on Python 3.13 at the head commit: the payroll YAML folders for every state with payroll tests plus gov/states/tax/payroll (176 passed); this PR's invariant file, #10285's deduction-share invariant file and the CBO payroll contrib test (10 passed); and tests/code_health (533 passed, 1 skipped). No partner contract test under tests/policy/baseline/partners/ sets an affected state in 2015-2023.

Overlap with other PRs

Follow-ups, not in this PR

#10700 takes on all four:

  • Employer UI default rates keep one value for every year in each state, and taxable wage bases do too outside Minnesota and Oklahoma.
  • Rhode Island's 2019 Job Development Fund adjustment (0.08%, offset by a UI rate cut) is missing.
  • PE-US doesn't model Alaska's employee UI contribution.
  • New Jersey employer rates run on a July-June fiscal year, which a January 1 reading misses.

#10700 and this PR both edit employer_total_additional_state_payroll_tax.py; git merges the two cleanly at #10700's head 8cf5f12.

axiom: TheAxiomFoundation/rulespec-us#2069 (RI TDI, new), TheAxiomFoundation/rulespec-us#2070 (OR statewide transit, new), and TheAxiomFoundation/rulespec-us#1817 (MA), TheAxiomFoundation/rulespec-us#1820 (NY), TheAxiomFoundation/rulespec-us#1823 (VT), TheAxiomFoundation/rulespec-us#1826 (CT) and TheAxiomFoundation/rulespec-us#1827 (NJ), each extended with its 2018-2023 history, queued

All seven wait on corpus ingestion of the historical sources, requested in axiom-corpus#893. Each issue carries the verbatim sources and companion tests from the same published values as the YAML tests here.

🤖 Generated with Claude Code

- Connecticut Paid Leave and the Oregon statewide transit tax read zero
  before contributions began (January 2021, July 2018) instead of carrying
  their first value back to 2015.
- Massachusetts PFML (from October 2019), New Jersey TDI and FLI, New York
  Paid Family Leave (from 2018) and Rhode Island TDI take each year's
  published rate and wage base for 2018-2023, where they read zero.
- New rate variables for Massachusetts PFML, the Oregon transit tax and the
  Vermont Child Care Contribution average the rates in force at the four
  quarter starts, so a partial first year counts only its months in force.
- YAML tests pin a pre-start year and historical years for each state. A
  property-based test compares every month's stored values with the
  published tables, and each contribution with the published rate times
  taxable wages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 2 commits November 9, 2026 14:35
…er-averaged rates

#10285 (merged 2026-11-09) added employer_state_payroll_premium_deduction_share
and Massachusetts' 2027 swap of the family and medical deduction caps. This
merge resolves its conflicts with the 2018-2027 histories:

- The MA employee and employer rate variables read family_employee_share
  beside medical_employee_share at each quarter start.
- The MA and VT employee contributions multiply the averaged permitted amount
  by state_payroll_premium_deduction_share. The employer contributions and
  employer_total_additional_state_payroll_tax add the undeducted part, as
  #10285 does at January 1.
- family_employee_share starts at 1 on 2019-10-01, when contributions began:
  DFML's 2019-2023 rate pages let the employer withhold the whole family
  contribution. medical_employee_share keeps 0.4 from 2019-10-01 and takes
  #10285's 2027 value of 1.
- The history invariants check the family share in the schedule, draw a
  deduction share for each worker in the differential, and widen the employer
  bound by the employee part the employer may cover.

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

Six YAML cases whose expected values apply the published rates by hand:

- Massachusetts 2019 at a 0.5 deduction share: the worker pays half of the
  October-December permitted amount (47.25 on $100,000) and the employer
  pays its own share plus the other half (140.25); the employer total adds
  the same half of the employee rate on $1,000,000 (1,402.50).
- Vermont 2024 at a 0.5 deduction share: 27.50 and 192.50 on $100,000, and
  1,925 for the employer total on $1,000,000.
- The 2027 rate variables after the swap of caps and rates: 0.46% for the
  employee and 0.42% for an employer with 25 covered individuals.

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