Skip to content

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

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

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

Conversation

@PavelMakarchuk

@PavelMakarchuk PavelMakarchuk commented Oct 16, 2026 •

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) lists the SDI rate and the DI taxable wage base by year: Rev. 69 (1-26) for 2019-2026, Rev. 61 (12-17) for 2011-2018 and Rev. 55 (1-13) for 2006-2013 (archived EDD copies; the revisions agree on 2011-2013). Rev. 69's 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) (SB 951 (2022), as amended by SB 143 (2023)) 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
2006 0.8% $79,418
2007 0.6% $83,389
2008 0.8% $86,698
2009 1.1% $90,669
2010 1.1% $93,316
2011 1.2% $93,316
2012 1.0% $95,585
2013 1.0% $100,880
2014 1.0% $101,636
2015 0.9% $104,378
2016 0.9% $106,742
2017 0.9% $110,902
2018 1.0% $114,967
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. The earliest revision found starts at 2006, so the 2006 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 2006 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 (for example $939.40 in 2015, $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. This equals the net liability after the excess-SDI credit on Form 540, which PolicyEngine does not model separately.

The model's payroll chain (fica_pre_tax_contributions) has no values before 2010, so the 2006-2009 entries are not reachable in a simulation today. They are there so that the parameter matches EDD from 2006.

Issue reproduction, ca_employee_state_disability_insurance_contribution:

Year Wages main branch
2015 200,000 2,600.00 939.40
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), above the limit (1,378.48) and at exactly the limit, $153,164 (1,378.48);
  • 2024 at $200,000 (2,200), 2025 (720) and a 2026 control at $200,000 (2,600);
  • above the limit in 2010 (1,026.48), 2015 (939.40), 2018 (1,149.67) and 2021 (1,539.58), and 2011 below the limit (720);
  • a 2022 two-earner household, $200,000 and $50,000 (1,601.60 and 550).

The file gives 13 passed here, 11 failed, 2 passed on main, and 4 failed, 9 passed with the 2019 backfill of the previous head (the 2010, 2011, 2015 and 2018 cases).

Also run on this branch: tests/policy/baseline/gov/states/ca/ and tests/policy/baseline/gov/local/ca/ (937 and 867 passed); tests/core/test_payroll_contributions.py (100 passed); code-health tests for source conflicts, parameter keys and reference URLs (258 passed).

Fixes #9813

axiom: TheAxiomFoundation/rulespec-us#1944 queued

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

DE 3395 Rev. 55 (1-13) lists 2006-2013 and Rev. 61 (12-17) lists
2011-2018; they agree on 2011-2013. Years before 2006 now reuse the
2006 values instead of the 2019 values. Attribute the current UIC
985(b) wording to SB 143 as well as SB 951. Add tests for 2010, 2011,
2015, 2018 and 2021, a 2023 case at exactly the wage limit, and a
two-earner 2022 case.

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

Copy link
Copy Markdown
Collaborator Author

Thanks, @DTrim99. Each item and what I did:

Should address

1. Pre-2019 backfill: fixed in 7c5d7dc.

  • employee_rate.yaml and taxable_wage_base.yaml now carry every year from 2006. 2011-2018 come from DE 3395 Rev. 61 (12-17), the copy you linked. 2006-2010 come from DE 3395 Rev. 55 (1-13), an earlier archived EDD revision. The two revisions agree on 2011-2013.
  • The comments now read # DE 3395 Rev. 55 lists rates from 2006; earlier years reuse the 2006 rate. (and the same for the limit). Both revisions are in the references.
  • Your examples now give EDD's figures: 2015 at $200,000 gives 939.40, 2018 at $200,000 gives 1,149.67, and 2011 at $60,000 gives 720.
  • The model's payroll chain has no values before 2010 (gov.irs.gross_income.fica_pre_tax_contributions starts at 2010-01-01), so the 2006-2009 entries cannot be reached in a simulation today. The tests start at 2010.
  • I kept Fixes #9813, because the PR now covers the earlier rates and the pre-2024 limit that the issue asks for.

2. axiom: line: fixed. I filed TheAxiomFoundation/rulespec-us#1944 (pe-parity), modeled on TheAxiomFoundation/rulespec-us#1827. It names the modules us-ca/statutes/uic/984.yaml, us-ca/statutes/uic/985.yaml and us-ca/policies/edd/de3395/<YYYY>.yaml, quotes UIC 984(a)(1) and (a)(3), 985(a) and (b), SB 951 Sec. 1, the DE 3395 rows for 2006-2026 and footnote 1, and lists companion tests from the DE 3395 rates and bases. The blocker is corpus ingestion: no axiom-corpus scope holds the Unemployment Insurance Code or EDD guidance. The PR body now has axiom: TheAxiomFoundation/rulespec-us#1944 queued.

Suggestions

1. Other capped years and the boundary: done in 7c5d7dc. New cases:

  • 2021 at $200,000: 1.2% x 128,298 = 1,539.58;
  • 2023 at exactly $153,164: 1,378.48;
  • a 2022 two-earner household, $200,000 and $50,000: 1,601.60 and 550 (vectorization);
  • 2010, 2011, 2015 and 2018, for the new years.

The file has 13 cases. They all pass here; 4 fail with the previous head's 2019 backfill.

2. UIC 985(b) history: done in 7c5d7dc. The comment in taxable_wage_base.yaml now reads UIC 985(b) (SB 951 (2022), as amended by SB 143 (2023)), and the PR body says the same. leginfo shows the current text "Amended by Stats. 2023, Ch. 196, Sec. 25. (SB 143)", and SB 951 Sec. 1 has the "shall remain in effect only until January 1, 2024" wording.

3. Federal SALT leaves out SDI: no new issue. #9807 ("Federal SALT omits mandatory employee state payroll contributions (SDI, TDI, PFML, PA UC) already computed in employee_state_payroll_tax") already tracks this, so I did not open a duplicate.

Tests run on this branch

  • ca_employee_state_disability_insurance_contribution.yaml: 13 passed.
  • tests/policy/baseline/gov/states/ca/ and tests/policy/baseline/gov/local/ca/: 937 and 867 passed.
  • tests/core/test_payroll_contributions.py: 100 passed.
  • Code-health tests (source conflicts, parameter YAML keys, reference URLs): 258 passed.

🤖 Generated with Claude Code

@DTrim99

DTrim99 commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator

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

Summary

Since round 1 (730179e0ff), Pavel pushed one commit, 7c5d7dc321, that addresses every item:

  • Pre-2019 values (Should 1). The rate and wage-base files now carry each year from 2006, from DE 3395 Rev. 55 (1-13) and Rev. 61 (12-17).
  • Axiom line (Should 2). The body now has axiom: TheAxiomFoundation/rulespec-us#1944 queued.
  • Suggestions. Tests now cover 2010, 2011, 2015, 2018 and 2021, a 2023 case at exactly the limit, and a two-earner 2022 case. The UIC 985(b) comment now credits SB 143 as well as SB 951.

I checked all 21 rates and 18 wage bases (2006-2023) against the three EDD PDFs, and every one matches. The UIC 985(a) formula, applied to each year's published maximum weekly benefit, also reproduces every wage base. So the statute and EDD's publications agree, and there's no source conflict to record. I hand-checked all 8 new expectations, and all are correct.

The axiom issue is open, labelled pe-parity, dispatch-ready and matches the head. The source-conflict ratchet and the other main-side guards hold on the merged tree, and the branch merges cleanly with main. The only CI failures come from main (see CI status), and no check is pending.

I found nothing new.

Prior findings

Finding Status Evidence
Should 1: the pre-2019 backfill contradicted EDD's 2011-2018 rates and wage limits fixed employee_rate.yaml and taxable_wage_base.yaml have dated entries from 2006. I checked each against Rev. 55 (2006-2013), Rev. 61 (2011-2018) and Rev. 69 (2019-2026) (see "Verified"). The comments now read # DE 3395 Rev. 55 lists rates from 2006; earlier years reuse the 2006 rate. (and the same for the limit), which is accurate. Both files cite all three revisions. Round 1's examples now give EDD's figures: 2015 at $200,000 gives 939.40, 2018 gives 1,149.67, and 2011 at $60,000 gives 720. With these years covered, Fixes #9813 is fair.
Should 2: no axiom: line fixed The body has axiom: TheAxiomFoundation/rulespec-us#1944 queued. #1944 is OPEN and labelled pe-parity, and it is dispatch-ready and matches the head (see "Axiom line assessment").
Suggestion 1: test the other capped years and the boundary fixed New cases: Case 11 (2021 above the limit), Case 12 (2023 at exactly $153,164) and Case 13 (2022 two-earner, capped and uncapped). Cases 7-10 cover the new 2010-2018 values.
Suggestion 2: credit the current UIC 985(b) wording to SB 143 fixed taxable_wage_base.yaml now reads # UIC 985(b) (SB 951 (2022), as amended by SB 143 (2023)): .... leginfo shows 985 as "Amended by Stats. 2023, Ch. 196, Sec. 25. (SB 143) Effective September 13, 2023." The body matches.
Suggestion 3: open a follow-up issue because federal SALT leaves out SDI declined, reason accepted Pavel points to #9807, "Federal SALT omits mandatory employee state payroll contributions (SDI, TDI, PFML, PA UC) already computed in employee_state_payroll_tax". It is OPEN and covers exactly this gap, so a new issue would duplicate it.

New findings

None (0 critical, 0 should, 0 suggestions).

Verified

  • Rates, 2006-2026, against EDD's PDFs. 0000-01-01: 0.008, then 2007 0.006, 2008 0.008, 2009 0.011, 2011 0.012, 2012 0.01, 2015 0.009, 2018 0.01, 2021 0.012, 2022 0.011, 2023 0.009, 2024 0.011, 2025 0.012, 2026 0.013.
    • That gives 2010 = 1.1%, 2013-2014 = 1.0%, 2016-2017 = 0.9% and 2019-2020 = 1.0%.
    • DE 3395 Rev. 55 (1-13), SDI Tax %: 2006 0.80, 2007 0.60, 2008 0.80, 2009 1.10, 2010 1.10, 2011 1.20, 2012 1.00, 2013 1.00.
    • DE 3395 Rev. 61 (12-17), SDI Tax %: 2011 1.20, 2012 1.00, 2013 1.00, 2014 1.00, 2015 0.90, 2016 0.90, 2017 0.90, 2018 1.0.
    • DE 3395 Rev. 69 (1-26), SDI Tax %: 2019 1.0, 2020 1.0, 2021 1.2, 2022 1.1, 2023 0.9, 2024 1.1, 2025 1.2, 2026 1.3.
    • All 21 years match.
  • Wage bases, 2006-2023, against the same PDFs.
    • The head has 79,418 (from 0000-01-01), then 83,389, 86,698, 90,669, 93,316 (2010, carrying into 2011), 95,585, 100,880, 101,636, 104,378, 106,742, 110,902, 114,967, 118,371, 122,909, 128,298, 145,600 and 153,164, then .inf from 2024-01-01.
    • Rev. 55 lists 2006-2013 as 79,418 / 83,389 / 86,698 / 90,669 / 93,316 / 93,316 / 95,585 / 100,880.
    • Rev. 61 lists 2011-2018 as 93,316 / 95,585 / 100,880 / 101,636 / 104,378 / 106,742 / 110,902 / 114,967.
    • Rev. 69 lists 2019-2023 as 118,371 / 122,909 / 128,298 / 145,600 / 153,164, and "None" with footnote 1 for 2024-2026.
    • The revisions agree where they overlap (2011-2013), and all 18 years match.
  • Archive links. The Rev. 55 link opens a one-page PDF footed "DE 3395 Rev. 55 (1-13)".
    • The Wayback index records the cited Rev. 61 capture (20181221225340) as a revisit with the same content digest as the 2018-03-05 capture.
    • That capture is a one-page PDF footed "DE 3395 Rev. 61 (12-17)".
    • So both #page=1 hrefs show the cited columns.
  • Statute vs EDD: no conflict.
    • Wage base. UIC 985(a) caps remuneration at "four times the maximum weekly benefit for each calendar year specified in Section 2655 multiplied by 13 and divided by 55 percent". I applied that formula to the published maximum weekly benefit for each year:
      • 2006: $840 × 52 / 0.55 = 79,418.2;
      • 2010-2011: $987 → 93,316.4;
      • 2015: $1,104 → 104,378.2;
      • 2018: $1,216 → 114,967.3;
      • 2022: $1,540 → 145,600;
      • 2023: $1,620 → 153,163.6.
      • Every other year also rounds to the DE 3395 base.
    • Rate. Under UIC 984(a)(1), the worker rate is "the rate determined by the director", declared each year in a public statement. So the DE 3395 rate is the statutory rate. Every rate in the file is also within the current 984(a)(3): none is above 1.5% or below 0.1%, and no year falls by more than 0.2 points (the largest drops, 0.2 points, are 2006→2007, 2011→2012 and 2022→2023).
    • 2024 onward. UIC 985(b), "This section shall not apply with respect to wages paid on or after January 1, 2024", agrees with DE 3395 footnote 1.
    • So no # Source conflict marker or register entry is needed.
  • Years before 2010 are unreachable and documented. gov.irs.gross_income.fica_pre_tax_contributions starts at 2010-01-01. Through payroll_tax_gross_wages, ca_payroll_tax_gross_wages depends on it, so the 2006-2009 entries, and the pre-2006 reuse of the 2006 values, can't be reached in a simulation today. The body says so, and the comments describe the backfill accurately.
  • Formula. The formula is unchanged since round 1: p.employee_rate * min_(wages, p.taxable_wage_base). It reads scalar parameters and is vectorized, which Case 13 now exercises with a capped and an uncapped earner in one household. defined_for = StateCode.CA is unchanged, and no int or enum key variable is added, so the NH Add New Hampshire state supplementation for 2026 #10156 pattern doesn't apply.
  • Hand-checked expectations, all new or changed (8 values in 7 cases):
    • Case 7 (2010, $200,000): the 2009 entry gives 1.1% in 2010, and the base is 93,316. 0.011 × 93,316 = 1,026.476, within 0.01 of 1,026.48.
    • Case 8 (2011, $60,000): 1.2%, and 60,000 is under the 93,316 base. 0.012 × 60,000 = 720.
    • Case 9 (2015, $200,000): 0.009 × 104,378 = 939.402, which gives 939.40.
    • Case 10 (2018, $200,000): 0.01 × 114,967 = 1,149.67.
    • Case 11 (2021, $200,000): 0.012 × 128,298 = 1,539.576, which gives 1,539.58.
    • Case 12 (2023, exactly $153,164): 0.009 × min(153,164, 153,164) = 1,378.476, which gives 1,378.48, EDD's 2023 maximum.
    • Case 13 (2022): person1 gets 0.011 × min(200,000, 145,600) = 1,601.60, and person2 gets 0.011 × 50,000 = 550.
    • Cases 1-6 are unchanged from round 1 (65, 540, 1,378.48, 2,200, 720, 2,600) and still hold.
  • PR body claims.
    • Previous head. Its 2019 backfill (1.0%, $118,371) fails exactly Cases 7-10: 1,183.71, 600, 1,183.71 and 1,183.71.
    • Main. Main (flat 1.3%, no cap) passes only Cases 1 and 6, so "11 failed, 2 passed" is right.
    • Example figures. The 2015 figure (939.40), 2024 at $60,000 (660) and 2025 at $200,000 (2,400) are right.
  • Changelog. The fragment now says "from 2006", which matches the change. It is still a top-level fixed fragment.
  • Source-conflict ratchet (Tie source-conflict markers to the register shared with Axiom #10287) on the merged tree.
    • I ran the merged tree's CONFLICT_COMMENT_RE and ATTEMPT_RE over every comment line in the four changed files and found no hits.
    • No comment that counted toward the ratchet was removed, and KNOWN_UNMARKED has no CA payroll entry, so nothing needs lowering.
  • Other main-side guards. The PR changes only the two CA SDI parameter files, the variable, its test file and the changelog. It adds no reader of unemployment_compensation (the Integrate modeled state unemployment insurance into income flows #9558 guard), and no income-source list (Count military SBP annuities in state benefit income lists #10317's military-annuity reader guard, and Count each Social Security benefit once in Pennsylvania CCW countable income #10408's Social Security source-list guard, which is still open).
  • Partner tests. No file under tests/policy/baseline/partners/** changed, and Household API Partners passes.

Axiom line assessment

axiom: TheAxiomFoundation/rulespec-us#1944 queued is valid.

  • State. The issue is OPEN, labelled pe-parity, and was updated 2026-10-27.
  • Dispatch-ready:
    • Module paths. us-ca/statutes/uic/984.yaml, us-ca/statutes/uic/985.yaml and us-ca/policies/edd/de3395/<YYYY>.yaml for 2006-2026.
    • Corpus citations. us-ca/statute/uic/984, .../985 and us-ca/guidance/edd/de3395/<YYYY>.
    • Verbatim law. UIC 984(a)(1) and (a)(3), 985(a) and (b), SB 951 Sec. 1, and the DE 3395 footnote and rows.
    • Required outputs. ca_sdi_taxable_wages and ca_sdi_worker_contribution.
    • Companion tests. These come from DE 3395 rates and bases and the EDD rates page, not from PolicyEngine output.
    • Blocker. It is recorded: no axiom-corpus scope holds the Unemployment Insurance Code or EDD guidance.
  • Matches the head. The issue's 2006-2026 table equals the head's parameters. Its 13 companion rows equal 13 of the 14 YAML values, including the 2010/2011/2015/2018 rows and the 2022 two-earner row. Only Case 1 is left out; it tests PolicyEngine's HSA add-back to wages, not the rate or limit. Its per-person-cap note matches the formula.

CI status

At 7c5d7dc321 (gh pr checks 10255, last checked 2026-10-27 16:36 UTC), 31 checks pass, 2 fail and none is pending.

Branch status

  • Position. The branch is 3 commits ahead of main (the original change, a merge of main on 2026-10-23, and 7c5d7dc321) and 70 behind.
  • Merge. git merge-tree --write-tree PolicyEngine/main 7c5d7dc321 exits 0 with tree 1ba32c30af, so there are no conflicts.
  • Main since the merge base. Main hasn't changed any file under ca/tax/payroll, ca_payroll_tax_gross_wages, payroll_tax_gross_wages, fica_pre_tax_contributions, employee_state_payroll_tax or employee_payroll_tax. No test added or changed on main reads these payroll variables.
  • Sibling PRs (branch note). Two open PRs edit employee_state_payroll_tax.py, which this PR doesn't touch: Let employers deduct less than the permitted state payroll premium, and apply Massachusetts' 2027 PFML cap swap #10285 (employer deduction share and the MA PFML cap) and Model the Minnesota Paid Leave employer premium #10294 (MN Paid Leave employer premium). Their CA case is 2026 at $100,000 (1,300), which is unchanged here because the 2026 rate stays 1.3% with no cap.

Verdict: APPROVE

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

Approving round 2: 0 critical, 0 should. Full report in the comment above. CI note: the Rest shard 3 failure (test_mt_state_agi_invariants) comes from main and is fixed by #10496; re-run after it lands.

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