Skip to content

Apply each year's California SDI rate and the pre-2024 SDI wage limit - #10255

Open
PavelMakarchuk wants to merge 2 commits into
mainfrom
fix-9813-ca-sdi-rate-by-year
Open

PavelMakarchuk wants to merge 2 commits into
mainfrom
fix-9813-ca-sdi-rate-by-year

Conversation

@PavelMakarchuk

Copy link
Copy Markdown
Collaborator

Summary

gov.states.ca.tax.payroll.disability.employee_rate had one value, 0.013 (the 2026 rate), from 0000-01-01, and California SDI had no taxable wage limit in any year. EDD's Tax Rates, Wage Limits, and Value of Meals and Lodging (DE 3395 Rev. 69 (1-26)) lists the rate and the DI taxable wage base by year, and its footnote says: "Effective January 1, 2024, there is no longer a taxable wage limit and maximum withholdings for each employee subject to SDI contributions." UIC 985(b), added by SB 951, says the limit does not apply to wages paid on or after January 1, 2024. EDD's rates page gives the same 2023-2026 figures.

Year DE 3395 SDI rate DI taxable wage base
2019 1.0% $118,371
2020 1.0% $122,909
2021 1.2% $128,298
2022 1.1% $145,600
2023 0.9% $153,164
2024 1.1% none
2025 1.2% none
2026 1.3% none

Changes:

  • employee_rate.yaml: the dated rates above. DE 3395 starts at 2019, so the 2019 rate is the 0000-01-01 value for earlier years.
  • New disability/taxable_wage_base.yaml: the wage bases above, .inf from 2024-01-01. The 2019 base is the 0000-01-01 value.
  • ca_employee_state_disability_insurance_contribution: rate x min(wages, taxable wage base).

The patched results equal EDD's maximum withholdings in the capped years ($1,229.09 in 2020, $1,539.58 in 2021, $1,601.60 in 2022, $1,378.48 in 2023). The limit applies per employee and employer under UIC 985; the model applies it to each person's total wages, as for the other state wage bases.

Issue reproduction, ca_employee_state_disability_insurance_contribution:

Year Wages main branch
2023 60,000 780.00 540.00
2023 200,000 2,600.00 1,378.48
2024 60,000 780.00 660.00
2024 200,000 2,600.00 2,200.00
2025 60,000 780.00 720.00
2025 200,000 2,600.00 2,400.00
2026 60,000 / 200,000 780.00 / 2,600.00 780.00 / 2,600.00

Tests

Added to ca_employee_state_disability_insurance_contribution.yaml: 2023 below the limit (540), 2023 above the limit (1,378.48), 2024 at $200,000 (2,200), 2025 (720), and a 2026 control at $200,000 (2,600). The file gives 4 failed, 2 passed on main and 6 passed here.

Also run on this branch: tests/policy/baseline/gov/states/ca/, tests/policy/baseline/gov/local/ca/ and three other tests that compute California payroll tax (1,766 passed); tests/core/test_payroll_contributions.py (100 passed); parameter code-health tests (124 passed).

Fixes #9813

🤖 Generated with Claude Code

The employee SDI rate was 1.3% (the 2026 rate) for every year, with no
taxable wage limit. Add EDD's DE 3395 rates for 2019-2026 (1.1% in
2024, 1.2% in 2025) and a taxable wage base parameter that limits
contributions through 2023 and has no limit from 2024 (UIC 985(b),
SB 951), and apply it in ca_employee_state_disability_insurance_contribution.

Fixes #9813.

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

DTrim99 commented Oct 26, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Apply each year's California SDI rate and the pre-2024 SDI wage limit

Summary

The PR fixes #9813, where California SDI used the 2026 rate (1.3%) with no wage limit in every year. It makes three changes:

  • Rate. disability/employee_rate.yaml gets dated rates for 2019-2026.
  • Wage limit. A new disability/taxable_wage_base.yaml holds the 2019-2023 DI taxable wage bases and .inf from 2024-01-01.
  • Formula. ca_employee_state_disability_insurance_contribution becomes rate × min(CA payroll wages, wage base).

Every 2019-2026 value matches EDD's DE 3395 (Rev. 69 (1-26)), and the 2023-2026 values also match EDD's rates page. Removing the limit from 2024 follows UIC 985(b) and DE 3395 footnote 1. Applying the limit per person, rather than per employer, gives the net liability after California's excess-SDI credit, which PolicyEngine doesn't model separately. I hand-checked 12 expectations and all are correct. The formula is vectorized, and no state-gated key variable is added. CI is 27/27 green, and the branch merges cleanly with main.

Two things need fixing:

  • Pre-2019 values. The 0000-01-01 backfill uses the 2019 rate and wage base for every earlier year, and the comments say the 2019 values "also apply". EDD published different rates and limits for 2011-2018 (for example 0.9% and $104,378 in 2015).
  • Axiom line. The PR body has no axiom: line.

The suggestions are optional:

  • add test cases for 2019-2022 and a case exactly at the limit;
  • attribute the current UIC 985(b) wording to SB 143 as well as SB 951;
  • open a follow-up issue because federal SALT leaves out SDI (pre-existing).

Critical (must fix)

None.

Should address

1. The pre-2019 backfill contradicts EDD's published 2011-2018 rates and wage limits.

Both parameter files start with a comment saying the 2019 value carries back:

  • employee_rate.yaml:3: # DE 3395 lists rates from 2019; the 2019 rate also applies to earlier years. (then 0000-01-01: 0.01)
  • taxable_wage_base.yaml:3: # DE 3395 lists limits from 2019; the 2019 limit also applies to earlier years. (then 0000-01-01: 118_371)

The current DE 3395 only goes back to 2019, but EDD published the earlier years in its previous revision. DE 3395 Rev. 61 (12-17) (archived EDD copy, single page) lists:

Year SDI Tax % DI maximum taxable wage base Head (rate / base)
2018 1.0 114,967 1.0% / 118,371
2017 0.90 110,902 1.0% / 118,371
2016 0.90 106,742 1.0% / 118,371
2015 0.90 104,378 1.0% / 118,371
2014 1.00 101,636 1.0% / 118,371
2013 1.00 100,880 1.0% / 118,371
2012 1.00 95,585 1.0% / 118,371
2011 1.20 93,316 1.0% / 118,371

So the comments are wrong, and so are the results in those years:

Year Wages Head EDD rate × min(wages, base) Difference
2015 60,000 600.00 0.9% × 60,000 = 540.00 +60.00
2015 200,000 0.01 × 118,371 = 1,183.71 0.9% × 104,378 = 939.40 +244.31
2018 200,000 1,183.71 1.0% × 114,967 = 1,149.67 +34.04
2011 60,000 600.00 1.2% × 60,000 = 720.00 −120.00

Several things make this worth fixing here:

  • Claimed coverage. employee_payroll_tax, which adds this contribution, is listed in programs.yaml as verified from 2018.
  • The linked issue. California SDI employee rate: the 2026 rate (1.3%) applies to every year, including 2024 (1.1%) and 2025 (1.2%) #9813 asks for the earlier rates and a wage limit before 2024, or for those years to be documented as out of scope. This PR does neither for years before 2019, yet it closes the issue.
  • Scope. This doesn't make the PR's own 2019-2026 values wrong, and the head is still closer to EDD than main's flat 1.3% in most of those years. That is why this is a Should, not a Critical.

Fix:

  • Add dated entries from DE 3395 Rev. 61 and cite it in both files, for example:
    • employee_rate.yaml: 0000-01-01: 0.012 (or start at 2011-01-01), 2012-01-01: 0.01, 2015-01-01: 0.009, 2018-01-01: 0.01, keeping the existing 2021+ entries. 2019-2020 stay at 0.01.
    • taxable_wage_base.yaml: 2011-01-01: 93_316, 2012-01-01: 95_585, 2013-01-01: 100_880, 2014-01-01: 101_636, 2015-01-01: 104_378, 2016-01-01: 106_742, 2017-01-01: 110_902, 2018-01-01: 114_967, 2019-01-01: 118_371, …
  • Reword the comments to something true, for example # DE 3395 Rev. 61 lists values from 2011; earlier years reuse the 2011 value.
  • If you'd rather not add them, change the comments to say that years before 2019 aren't modeled. Then use Part of #9813 instead of Fixes #9813, or narrow the issue to 2011-2018.

2. Add the axiom: line to the PR body.

The body has no line starting with axiom in any format. Pavel is staff, so the line is required, and axiom: needed isn't available. See "Axiom line assessment" for the recommended queued line.

Suggestions

  1. Test the other capped years and the boundary. The new cases cover 2023 (below and above the limit), 2024, 2025 and 2026. The 2019-2022 rates and wage bases have no case. Consider:

    • one above-limit case for 2021 or 2022, for example 2022 at $200,000 giving 1.1% × 145,600 = 1,601.60, or 2021 giving 1.2% × 128,298 = 1,539.576 (margin 0.01);
    • a 2023 case exactly at $153,164, which gives the same 1,378.48 and pins the min_ boundary;
    • optionally, one multi-person case mixing a capped and an uncapped earner, to exercise vectorization.
  2. UIC 985(b) history. taxable_wage_base.yaml:9 says UIC 985(b), added by SB 951 (2022), and the body says the same. SB 951 (Stats. 2022, Ch. 878, Sec. 1) added a sunset, "(b) This section shall remain in effect only until January 1, 2024, and as of that date is repealed" (SB 951 text). The current wording, "(b) This section shall not apply with respect to wages paid on or after January 1, 2024", comes from SB 143 ("Amended by Stats. 2023, Ch. 196, Sec. 25. (SB 143) Effective September 13, 2023", UIC 985). The effect is the same, so this is wording only. Suggested comment: # UIC 985(b) (SB 951 (2022), as amended by SB 143 (2023)): ....

  3. Federal SALT leaves out SDI (pre-existing, follow-up issue). The 2025 Instructions for Schedule A (file page 3, line 5a) include "Mandatory contributions you made to the California, New Jersey, or New York Nonoccupational Disability Benefit Fund" and "Mandatory contributions to state family leave programs, such as … the California Paid Family Leave program".

    • Current code. state_and_local_sales_or_income_tax adds only state_withheld_income_tax and local_income_tax (or sales tax), so an itemizer's SDI never reaches salt.
    • Why it's out of scope here. This is outside the diff and is the same for NJ/NY/RI TDI and the paid-leave programs.
    • Effect of this PR. The PR lowers 2019-2025 SDI, so it doesn't make the gap worse.

    A follow-up issue could add employee_state_payroll_tax components that the instructions name to the income-tax side of state_and_local_sales_or_income_tax.

Verified correct

  • Rates (2019-2026). DE 3395 Rev. 69 (1-26) lists these SDI Tax % values: 2026 1.3, 2025 1.2, 2024 1.1, 2023 0.9, 2022 1.1, 2021 1.2, 2020 1.0, 2019 1.0. The head matches, and leaving out a 2020 entry correctly keeps 1.0%. EDD's rates page says "The SDI withholding rate for 2023 is 0.9 percent", and gives 1.1, 1.2 and 1.3 percent for 2024-2026.
  • Wage bases (2019-2023). DE 3395 lists 118,371, 122,909, 128,298, 145,600 and 153,164, and the head matches. The rates page gives the 2023 limit as $153,164, with a maximum withholding of $1,378.48.
  • No limit from 2024. UIC 985(b): "This section shall not apply with respect to wages paid on or after January 1, 2024." DE 3395 footnote 1: "Effective January 1, 2024, there is no longer a taxable wage limit and maximum withholdings for each employee subject to SDI contributions." .inf from 2024-01-01 with min_ gives uncapped wages.
  • Per-person limit. UIC 985(a) limits remuneration "paid to an individual by an employer", but FTB refunds the excess.
    • The 2023 Form 540 booklet, line 74, gives a credit for excess SDI to workers with "two or more California employers" and more than $153,164 in wages, against a "2023 SDI (or VPDI) limit is $1,378.48 (for each spouse/RDP if filing jointly)".
    • So capping each person's total wages gives the net liability. PolicyEngine has no separate excess-SDI credit, so nothing is counted twice.
  • Statute. UIC 984(a)(1) has each worker pay "worker contributions at the rate determined by the director … with respect to wages, as defined by Sections 926, 927, and 985". The rate is set yearly under (a)(2)-(3), so dated rates are the right structure.
  • Formula and code.
    • min_(wages, p.taxable_wage_base) with a scalar parameter is vectorized. defined_for = StateCode.CA is unchanged.
    • No new int or enum key variable is added, so the NH Add New Hampshire state supplementation for 2026 #10156 pattern doesn't apply.
    • The new parameter's description follows the house template. The reference tuple has no titles, and the single-page DE 3395 href uses #page=1 with no page in the title.
  • Consumers. Only the variable reads gov.states.ca.tax.payroll.disability.
    • Payroll tax chain. The contribution flows through ca_employee_state_payroll_tax → employee_state_payroll_tax → employee_payroll_tax. From there it reaches household_tax_before_refundable_credits, spm_unit_payroll_tax, spm_unit_paycheck_withholdings, fica_marginal_tax_rate and taxsim_tfica.
    • Santa Clara County GA. It is also listed in the SCC General Assistance earned-income deductions.
    • Other readers. No California income-tax variable reads it, and federal SALT doesn't either (Suggestion 3). al itemized sources include employee_payroll_tax, but only Alabama residents reach them.
  • Interactions with main's payroll changes.
  • Hand-checked expectations (12):
    • New and existing YAML cases:
      • Case 1 (2026): payroll_tax_gross_wages = 6,000 − 1,000 premiums − 1,000 HSA = 4,000. CA adds back the HSA amount: min(6,000, 5,000) = 5,000, and 1.3% × 5,000 = 65.
      • Case 2 (2023): 0.9% × min(60,000, 153,164) = 540.
      • Case 3 (2023): 0.9% × 153,164 = 1,378.476, within 0.01 of 1,378.48, EDD's 2023 maximum.
      • Case 4 (2024): 1.1% × min(200,000, ∞) = 2,200.
      • Case 5 (2025): 1.2% × 60,000 = 720.
      • Case 6 (2026): 1.3% × 200,000 = 2,600.
    • PR body figures:
      • 2020 maximum: 1.0% × 122,909 = 1,229.09.
      • 2021 maximum: 1.2% × 128,298 = 1,539.576, so 1,539.58.
      • 2022 maximum: 1.1% × 145,600 = 1,601.60.
      • 2024 at $60,000: 660.
      • 2025 at $200,000: 2,400.
      • "4 failed, 2 passed on main": main's flat 1.3% fails Cases 2-5 (780, 2,600, 2,600, 780) and passes Cases 1 and 6.
  • Source-conflict ratchet (Tie source-conflict markers to the register shared with Axiom #10287). The four added comment lines match neither CONFLICT_COMMENT_RE nor ATTEMPT_RE. No comment is removed, and no CA payroll file is in KNOWN_UNMARKED. Main's only change to test_source_conflicts.py since the merge base edits unrelated rows (CA premium subsidy, QBI, local sales tax).
  • Changelog. changelog.d/fix-9813-ca-sdi-rate-by-year.fixed.md is a top-level fragment with the fixed type, and its text matches the change.
  • Partner tests. No files under tests/policy/baseline/partners/** are touched, and Household API Partners passes.

Axiom line assessment

The body has no axiom: line (Should 2). encoded-correct isn't available:

  • No module. rulespec-us main has us-ca/statutes/rtc and us-ca/statutes/wic but nothing under the Unemployment Insurance Code, and no EDD policy module. No module encodes UIC 984 or 985, or the SDI worker contribution.
  • No issue. rulespec-us issue searches for "SDI", "State Disability Insurance", "Unemployment Insurance Code", "UIC 984", "10255" and "9813" find no CA SDI parity issue.
  • Closest model. rulespec-us#1827 (New Jersey TDI and FLI worker contributions, PE-US Encode the published 2027 state paid leave premiums (CO, WA, NY, NJ) and cite the unchanged 2027 rates #10295, pe-parity) is a near-identical payroll request.

Recommended line. File a dispatch-ready pe-parity issue modeled on #1827 and use axiom: TheAxiomFoundation/rulespec-us#<n> queued. The issue should have:

  • Modules:
    • us-ca/statutes/uic/984.yaml: (a)(1) the worker contribution on wages.
    • us-ca/statutes/uic/985.yaml: (a) the wage limit, and (b) no limit for wages paid on or after January 1, 2024.
    • An EDD policy module for the annual SDI rate and DI wage base, for example us-ca/policies/edd/de3395/<YYYY>.yaml.
  • Corpus citation and blocker. Ingest UIC 984/985 and EDD DE 3395 (Rev. 69 and Rev. 61), then get approval for the billed encoder run.
  • Law, verbatim. UIC 984(a)(1), 985(a) and 985(b), plus the DE 3395 rows and footnote 1.
  • Required outputs:
    • ca_sdi_taxable_wages = wages capped at the year's DI wage base through 2023, uncapped from 2024.
    • ca_sdi_worker_contribution = the year's rate × taxable wages.
  • Companion tests (from EDD and FTB, not PolicyEngine output):
    • 2023: $200,000 → $1,378.48 (EDD rates page and FTB 540 line 74 limit).
    • 2023: $60,000 → $540.
    • 2024 and 2025 at $200,000 → $2,200 and $2,400.
    • 2026 at $200,000 → $2,600.
    • 2022: $200,000 → $1,601.60.
    • 2015: $200,000 → $939.40, if Should 1 is fixed.

CI status

All 27 checks pass at 730179e0ff (gh pr checks 10255). The workflow run on that SHA was created 2026-10-23 18:43 UTC, after #10287 and #10334. That includes:

  • the Baseline states shards;
  • the Contrib shards;
  • Household API Partners;
  • PR validation;
  • Microsimulation;
  • Quick Feedback.

None is pending or failing.

Branch status

The branch is 2 commits ahead of main (the change on 2026-10-16 and a merge of main on 2026-10-23) and 48 behind. git merge-tree --write-tree PolicyEngine/main 730179e0ff merges cleanly. Since the merge base, main hasn't changed any CA payroll file, employee_state_payroll_tax, employee_payroll_tax or ca_payroll_tax_gross_wages. No other open PR touches ca/tax/payroll/disability.

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.

The 2019-2026 rates and wage bases match EDD's DE 3395 and rates page, the 2024+ no-limit rule matches UIC 985(b), and all 12 expectations hand-check. Two should-address items: (1) the 0000-01-01 backfill applies the 2019 rate and limit to earlier years, which contradicts EDD for 2011-2018 (e.g. 2015 was 0.9% and $104,378, so a $200k earner pays 1,183.71 instead of 939.40); add those years, or say they aren't modeled and use 'Part of #9813'; (2) there's no axiom line, so please file a pe-parity issue for UIC 984/985 and mark it queued. Three suggestions. Full report in the comment above.

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.

California SDI employee rate: the 2026 rate (1.3%) applies to every year, including 2024 (1.1%) and 2025 (1.2%)

2 participants