Conversation
… 3 (2026) reform Under Cal. Const. art. XIII, section 36(f)(2), the 10.3%, 11.3% and 12.3% rates added by Proposition 30 and extended by Proposition 55 apply to taxable years before January 1, 2031. The baseline carried them indefinitely. From 2031 the three brackets now revert to 9.3%, matching the Legislative Analyst's Figure 1 in the 2026 voter guide. Proposition 3 on the November 3, 2026 ballot would make those rates permanent. gov.contrib.states.ca.prop3.in_effect switches on a parameter-only reform that keeps them from 2031 onward. The 1% Mental Health Services Tax is unaffected. Tests: 3 baseline boundary cases (2030 vs 2031) and 6 reform cases, expected values computed by hand from the 2031 thresholds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Program ReviewPR #9601: Encode the 2030 expiry of California's top income tax rates; add Prop 3 (2026) reform The law is encoded correctly. All five filing-status schedules keep 10.3% / 11.3% / 12.3% through tax year 2030 and fall back to 9.3% from 2031-01-01. The Prop 3 reform restores exactly those three rates, on the right brackets, for all five statuses from 2031. Neither PDF audit found a value or date mismatch. The issues below are two citation and hard-coding problems that must be fixed, a reform activation window that cannot reach Prop 3's operative year, and test coverage for the three filing statuses that aren't tested yet. Source Documents
Year(s): TY2025 thresholds (FTB); the TY2030 / TY2031 sunset boundary; Prop 3 reform 2031-01-01 to 2100-12-31. Critical (Must Fix)1. The head-of-household rate file cites the wrong constitutional paragraph: § 36(f)(2) instead of § 36(f)(3)
2. The reform hard-codes the restored rates and bracket indexes
Should Address1. The activation scan cannot see Prop 3's operative year, so a toggle that starts in 2029 or later silently does nothing
2.
3. The joint and surviving-spouse files don't cite RTC § 17045, so the chain from § 36(f)(2) to their 2031 values is broken
4. HEAD_OF_HOUSEHOLD, SEPARATE and SURVIVING_SPOUSE are never tested in 2031, under the baseline or the reform
5. The changelog type covers the baseline fix but not the new contrib reform
6. No test covers the new AMT interaction
Suggestions
Pre-existing (out of PR scope)
Verified correct
PDF Audit SummaryNeither audit reported a value mismatch; only citation and reference items came up. No cross-reference or external-PDF requests were raised, and the PR adds no
Validation Summary
Out-year impact (informational): from 2031, baseline CA income tax revenue falls for every filer above the 10.3% threshold. The LAO puts the rates at $5 billion to $15 billion a year. Saved app policies that edit brackets 6-8 will show larger 2031+ impacts against the new baseline. Review Severity: REQUEST_CHANGESThe two critical items are both citation and encoding-hygiene problems with small, mechanical fixes: the HOH citation points to the wrong constitutional paragraph, and the reform hard-codes its rates and bracket indexes. The law and every value are correct. Should Address item 1 is the most substantive functional issue: enabling Prop 3 from its own operative year does nothing, with no warning. Next StepsTo auto-fix issues: |
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes per the program review above (#9601 (comment)). The law is encoded correctly: 2030 is the last year with the 10.3/11.3/12.3% rates ("before January 1, 2031"), all five filing statuses switch on 2031-01-01, there are no value mismatches, and no partner test runs past 2026.
Items to address:
- Head-of-household is governed by Cal. Const. art. XIII §36(f)(3), not (f)(2). The same (f)(2)-only citation appears in in_effect.yaml, the reform comment and the changelog.
ca_prop3_reform.pyhard-codes the rates and bracket indexes {6: 0.103, 7: 0.113, 8: 0.123}. The values match the measure, but copying each bracket's 2030 rate forward would be safer.- The
range(5)activation scan only looks at 2024–2028, so a user who switchesin_effecton for 2029 or later silently gets the baseline. A Reform.from_dict pytest would catch this. - Prop 3 measure-text anchors are missing, and RTC §17045 is missing on joint/surviving-spouse.
- HOH, MFS and QSS have no 2031 cases, and nothing tests the 2031 AMT interaction.
- The changelog needs an
.added.mdfragment for the reform.
What this changes
Baseline fix. California's 10.3%, 11.3% and 12.3% income tax rates (Prop 30 of 2012, extended by Prop 55 of 2016) apply only to "taxable years beginning on or after January 1, 2012, and before January 1, 2031" (Cal. Const. art. XIII, § 36(f)(2)). The rate files carried them with no end date. From 2031 the three brackets now revert to 9.3% in all five filing-status schedules, matching Figure 1 of the Legislative Analyst's Prop 3 analysis in the 2026 voter guide. Thresholds and uprating are unchanged.
New contributed reform. Proposition 3 on the November 3, 2026 ballot would make those rates permanent (LAO: keeps $5 billion to $15 billion a year).
gov.contrib.states.ca.prop3.in_effectswitches on a parameter-only reform (policyengine_us/reforms/states/ca/prop3) that keeps the three rates from 2031 onward. The 1% Mental Health Services Tax is untouched.Effect
2031 tax on $1,000,000 of taxable income, single: $88,942.90 under current law, $101,169.10 under Prop 3. Checked through the app-style path (
Reform.from_dicton the in_effect parameter): a single $2M earner's 2031 CA tax goes from $181,412 to $223,467.Any existing analysis that projects California revenue past 2030 will now show the scheduled rate drop.
Tests
ca_income_tax_before_credits.yaml: the 2030 vs 2031 boundary, single and joint.tests/policy/contrib/states/ca/prop3.yaml: 2031 at $300k, $1M and $2M; 2030 unchanged; MHST unchanged. Expected values are computed by hand from the 2031 bracket thresholds (the arithmetic is in the comments).Review
@DTrim99, this is the first piece of the November ballot-measure push. Please check the reversion schedule against the statute and the voter guide, and whether the in_effect switch should default to start in 2026 for app users.
🤖 Generated with Claude Code