Repository navigation
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.
- Copy each bracket's 2030 rate forward instead of hard-coding the rates and bracket indexes, so user 2030 edits and schedule changes carry over. - Read activation from the dated in_effect values instead of a five-year scan, and restore the rates only in the years from 2031 to 2100 in which the toggle is true; the bypass instance stays unconditional. - Cite Cal. Const. art. XIII, § 36(f)(3) for head of household and § 36(f)(2)-(3) where both apply; add Prop 3 SEC. 4 and LAO page anchors, dated Prop 55 references, RTC § 17045 on joint and surviving spouse, and RTC § 17041 subsections; drop the stale indexing comment. - Add 2031 cases for every filing status, a 2030 head-of-household case, AMT and MHST stacking cases, and cases inside the first two surcharge brackets; move the contrib YAML to ca/prop3/ and drop redundant toggles. - Add pytest coverage of the app activation path, delayed and bounded toggles, 2030 user rates, and rate, threshold and RTC § 17045 properties. - Group the CA registration, export create_ca_prop3, and add an .added changelog fragment for the reform. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The reform now reads each schedule's enacted rates from the file they were loaded from and, inside each active window, gives the 2030 rate only to the brackets the enacted sunset changes and only on intervals where the enacted 9.3% rate still applies. This fixes three cases the January 2031 snapshot got wrong: a 2031-only override equal to the 2030 rate no longer stops the restoration in later years; a bounded 2030 edit to a lower bracket is no longer extended; and explicit future rates survive on both construction paths, so applying the reform twice (as Simulation does) changes nothing. Tests: enacted schedules match the baseline in every year 2021-2101; user edits are kept the same way through CountryTaxBenefitSystem and Simulation; a Hypothesis property checks the restoration against random edits and toggle schedules, including idempotence; the window property now probes both sides of every toggle change and the horizon. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Review (round 2): Encode the 2030 expiry of California's top income tax rates; add Prop 3 (2026) reformPR #9601 (author: MaxGhenis). Round 1 reviewed head
SummaryEvery round-1 item is addressed: both critical items, all six should-address items and all seven suggestions.
The law and the year boundary hold. Cal. Const. art. XIII, § 36(f)(2) and (f)(3) apply the 10.3% / 11.3% / 12.3% rates "for any taxable year beginning on or after January 1, 2012, and before January 1, 2031". So tax year 2030 is the last year with the higher rates, and they stop on 2031-01-01. The title's "2030 expiry" (they expire after TY2030) and the commit's "2031 rate expiry" (the reversion takes effect in 2031) describe the same boundary. The parameters ( The new reform logic is correct. It restores the rates only inside the dated windows where the toggle is true, only on the three brackets the enacted sunset changes, and only where the enacted 9.3% still applies. So it keeps a user's explicit future rates and edits to other brackets, and applying it again changes nothing. No other reform touches the CA rate schedules. The one limit is that a future edit that equals 9.3% can't be told apart from the sunset, and the PR body discloses that. Tests, CI and branch.
There is one new should-address item, and it is small. The round-2 fix for the Hypothesis health-check flake was applied to only one of the two properties that draw from the same toggle generator. There are also three suggestions. Round-1 items
Max answered every item in a table in the PR body. There are no inline review threads. Critical (must fix)None. Should address1. The Hypothesis
New suggestions
VerificationThe law and the year boundary.
Prop 3 (November 3, 2026).
The reform logic,
The property tests.
The YAML Hand checks. These use f2030 = 193 / 172.797 and f2031 = 196.85 / 172.797 on the FTB 2025 thresholds (Schedule X 72,724 / 371,479 / 445,771 / 742,953; Schedule Z 98,990 / 505,208 / 606,251 / 1,010,417). Tax at the 9.3% threshold is 3,201.97f (Schedule X) and 3,616.45f (Schedule Z).
All 17 expectations agree to within half a cent. Local runs (extracted head tree, local policyengine-core 3.26, one process at a time).
Partner contract tests. None are affected. All 144 partner YAML files, at this head and on current Axiom line assessment
Valid. Both issues are OPEN, labelled
CI status
Branch status
Verdict: REQUEST_CHANGES |
DTrim99
left a comment
There was a problem hiding this comment.
Round 2: all 15 round-1 items are addressed. TY2030 is the last surcharge year under § 36(f)(2)-(3), the parameters and tests agree, the reform restores only the enacted sunset and leaves user edits intact, and the rulespec issues are dispatch-ready. One should item (see the comment above): the Hypothesis too_slow fix covers only the window property. The restore-only property at :420, and the test at :149, draw the same strategies with no derandomize or health-check suppression, so they can hit the same stall on a busy host. Please use shared settings with derandomize=True and suppress too_slow and data_too_large.
What changes
California's rates above 9.3% expire after tax year 2030. All five filing-status schedules revert to 9.3% on January 1, 2031; Proposition 3's contributed reform extends the pre-sunset rates. The legal boundary is established by Prop 55 §4, page 16; Prop 3 removes that boundary in §4, page 6 and page 7. RTC §17045 supplies the joint and surviving-spouse treatment.
This round replaces hard-coded rates and bracket positions with the enacted schedules, snapshots rates before applying updates, respects dated app activation, and preserves future rate overrides that differ from the enacted baseline. It also adds coverage for every filing status, AMT, total tax including MHST, and both construction paths. The baseline retains the sunset; thresholds and their existing CA CPI forecasting assumptions remain in place.
DTrim99's review
The changes-requested review and program review remain open for re-review. Each requested item is addressed as follows:
in_effect.values_list; apply only true intervals intersecting 2031–2100.Reform.from_dicttests cover a 2031 start, 2026-only activation, delayed activation and true/false/true intervals..fixed.mdfor the sunset and add.added.mdfor the public reform and toggle.max(.07 × reduced AMTI − regular tax, 0), and total tax with a $1.4M AMTI / $1M taxable-income case.contrib/states/ca/prop3/ca_prop3.yaml; explain bypass and baseline controls; remove redundant toggle inputs.create_ca_prop3; remove the unused import.The additional independent review identified later-expiry intervals, bounded lower-rate edits, future overrides and endpoint coverage. The recovered implementation addresses those with interval splitting, enacted-schedule comparison, idempotence checks on both construction paths, and transition/adjacent-day probes. Implementing statutory nearest-dollar threshold rounding remains outside this PR.
Methodology choice for Max
The app toggle honors every dated true interval within 2031-01-01 through 2100-12-31. A 2026-only override has no out-year effect; delayed activation begins on its effective date; false gaps retain the sunset. The explicit
ca_prop3bypass used by YAMLreforms:applies unconditionally within the model horizon.Only brackets changed by the enacted sunset are extended. Their user-adjusted 2030 rates are copied where the future rate still equals the enacted baseline. Future overrides with a different rate survive, including on repeated application and both system-construction paths. A future user edit numerically equal to the enacted baseline cannot be distinguished from that baseline and is restored by Prop 3.
Validation
Current head: a72bca9, after a clean merge of main dd9cb3f. Both new commits were pushed immediately.
make formatpasses; independent static review approves the recovered model changes and the timing-check adjustment.Current single-file checks, run sequentially at nice 0:
30 YAML cases and the remaining Python property passed. Reused the 14 completed Python passes from the recovered checkpoint rather than rerunning them. The window property's macOS timing wrapper subsequently hit a sandbox-denied
sysctl; pytest passed. Subsequent measurements used a timer that preserves the test exit code. Final-head partner CI passes; full CI is still running with no failures observed.Recovered evidence is retained without claiming that older runs validate the final head:
ea80e9d0ad: evidence-only compatible copy of the new activation/rate tests recorded 6 failed, 6 passed, 1 skipped in 403.56s. The failures expose the dated activation, bounded timing and rate-copy bugs; the helper property skipped because that head had no helper.279f541dd1: 14 passed, 1 failed in 1028.44s. The only failure was Hypothesis's input-generation health check on the loaded host, after 158.40s; model assertions passed.ef290736bf: all 36 CI checks passed, including partner checks. The original human review separately recorded 11 targeted YAML cases passing atea80e9d0ad.The affected CI group is Contrib (other-shard-1) (
make test-policy-contrib-python). Local macOS cost at279f541dd1, including startup: 1205.73s wall, 4,060,102,656 bytes maximum RSS, 3,924,561,136 bytes peak footprint. The old-head evidence run took 565.10s wall, 3,921,494,016 bytes maximum RSS; different test contents and host contention prevent treating this as a controlled before/after delta. The Contrib CI log is now recovered: the Linux Python stage passed 72 tests in 1008.88s; the CA file occupied about 224s, inferred from log timestamps within that shared process. The entire job took 45m24s. Python-stage/file peak memory is not reported. These are existing CI measurements, not a controlled before/after comparison. The model-building tests protect activation, override replay and both construction paths; lightweight properties cover dates and interval restoration without constructing a model per example.The PR diff against merged main changes zero partner test files or expected outputs. The current tree contains 144 YAML files, with periods 2024, 2025, 2026 and 2026-01, all before 2031.
git ls-treecounts 143 at the reviewed head and 144 on merged main; the supplied spec's 145 count is not reproduced.Impact and remaining follow-up
Population microsimulation (hub runner): merge base
dd9cb3f683against this heada72bca942f, onpopulace_us_2024.h5@populace-us-2024-spm-20260909. It ran under the shared heavy lock, one run per side, compared record by record.2026 is unchanged because the enacted top rates still apply. 2031 is the first year after they expire, and the drop is the scheduled sunset that the baseline now encodes: the higher rates stop applying, so the affected high-income units pay less. The Prop 3 (2026) reform is opt-in (
gov.contrib.states.ca.prop3.in_effect), so it is not in the baseline.The hub should compare main, corrected baseline and Prop 3 enabled for 2025, 2026, 2030, 2031 and 2035, using identical cached data, entity order and weights. Calculate
ca_income_tax_before_credits,ca_amt,ca_mental_health_services_tax,ca_income_tax_before_refundable_credits,ca_income_tax,ca_withheld_income_tax,income_taxandhousehold_net_income; exclude enum arrays from numerical comparison. Expect zero direct effects before 2031, a regular-tax reduction after the sunset, possible AMT offsets, unchanged MHST, and reversal of the regular-tax reduction when Prop 3 is enabled.The existing forecast gives these hand-computed 2031 examples; they are household test expectations, not population estimates:
Differences are rounded from unrounded hand calculations; displayed taxes are rounded independently.
The $1.4M AMTI example has $98,000 tentative minimum tax: baseline AMT is $9,057.10, while Prop 3 AMT is zero. Dollar expectations still use
gov.states.ca.cpi; #9621 remains OPEN and its IRS-uprating change requires reconciliation when it lands. Rate/date properties do not depend on forecasts. Check the certified election result after November 3, 2026.axiom: CA Constitution XIII §36(f)(2)-(3) TheAxiomFoundation/rulespec-us#1565 queued | CA Prop 3 (2026) §4 TheAxiomFoundation/rulespec-us#1566 queued