Skip to content

Add contributed owners draw SECA reform - #10483

Open
MaxGhenis wants to merge 5 commits into
mainfrom
reform-pass-through-owners-draw-seca
Open

MaxGhenis wants to merge 5 commits into
mainfrom
reform-pass-through-owners-draw-seca

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

Add an opt-in contributed reform that taxes eligible pass-through owners' draws under SECA OASDI, with configurable phase-in, HI inclusion, deduction, benefit credit, and cap treatment. The reform is disabled by default. Based directly on upstream main d453360635e358531059e510c227e84a3986348b, which contains required SECA-room fix b32fa449e93f72f385f92d3c3cd3c2e986482b67 (#10380).

Design

  • Define signed total T = s_corp_income + partnership_income, passive subset Q, and already-SE partnership subset K. The active residual is G = T - Q - K_active. When Q and K are both nonzero, require a validated disjoint-subset assertion or a supplied signed intersection. Net the owner's entity profits/losses before flooring; residual losses do not offset wages or existing SE earnings. Nonpassive income proxies for material participation. Source income remains in gross income once.
  • Preserve planned draw, actual gross draw D, adjusted earnings N_D, cap room, and taxed draw as separate outputs. Default q = 1 - employer_share * (SE_OASDI_rate + SE_HI_rate) follows rate changes; an explicit override is available. The adjusted planned draw independently meets the existing $400 SE reporting floor before reclassification.
  • Default example phase-in is 0.1 in 2027 through 1.0 in 2036, controlled by start year, duration, and optional annual overrides. room_cap_basis = 0 uses a current-law cap copied before user reforms; 1 imposes no draw ceiling. Under the default basis, wages have priority, then the existing adjusted/capped SE base, then min(N_D, max(cap - wages - existing_SE_base, 0)).
  • Add liability through the existing SECA OASDI/HI tax leaves so payroll and OASDI accounting count it once. HI defaults off; enabling it taxes all N_D without the OASDI ceiling. The optional section 164(f)-style deduction uses the existing deductible-share parameter and nondependent aggregation.
  • Expose the gross exclusion for a later active-NIIT reform: OASDI-only excludes draw_oasdi_base / q; HI-on excludes all actual D. Beyond-room profits remain in the active residual when HI is off. Undrawn and floor-rejected profits remain in either mode. Already-SE gross active income requires its separate exclusion. Active NIIT is absent from main and is not implemented here.
  • Benefit credit adds annual adjusted draw earnings to the existing ss_aime history helper before its annual wage-base cap, with no tax effect and preserved positive ss_aime_input precedence. Reported benefits are unchanged. The bridge inherits main's lookback/age rules and separate gov.ssa.social_security.wage_base path (last authored for 2026), without synchronizing it to the tax cap. A complete annual ledger and mini-PIA integration remain separate work; population scoring uses the tax side only.

The default capped configuration preserves nonnegative draw bases bounded by room, adjusted earnings, and gross draw; total otherwise-capped OASDI earnings stay within the cap. Tax is monotone in the phase-in share, already-SE income is removed before the draw, and a reform disabled for all earning years preserves baseline outputs. Turning it off later preserves previously credited earnings in benefit history. The explicit no-ceiling option permits earnings above the current-law cap. Details: docs/contributed_reforms/owners_draw.md.

Data and sources

The intended data contract has separate entity totals and a combined passive subset subtracted once. Current exports force S-corporation income to zero, combine nonpassive donor income in partnership income, and lack the passive column; calibration can overstate the active residual. Current-data scoring may proceed with this provisional caveat. Nonprovisional results require a pinned artifact containing Microcosm #1251 and #1261, plus a column-contract check.

  • OACT current F12: “make all distributions to all pass-through business owners up to the earnings cap subject to the SECA tax”. Current F12 starts in 2029 and requires material participation; this custom phase-in and OASDI-only default differ.
  • OACT legacy E5: “Raise the taxable maximum amount (the contribution and benefit base) to include 90 percent of total OASDI covered earnings.” That table uses 2008 Trustees assumptions and credits the additional earnings. The current payroll table uses E1–E3 categories, with no current E5 label.
  • 26 U.S.C. 1402(a) provides the comparable net-income/loss approach; this contributed expansion is not enacted law.

Validation and CI cost

  • New Python coverage: 13 passed. These tests exercise constructor activation, preserved caps, baseline equality, invalid/ambiguous inputs, and invariants that YAML cannot fully verify. Local macOS/Python 3.13.9 whole-process wall time: 179.34 seconds, including setup; pytest body: 58.21 seconds. Peak RSS was unavailable because the sandbox denied time -l's sysctl; the process ran under the monitored 4 GB cap.
  • New YAML coverage: 26 hand-computed cases across three files, retaining at most five parameter combinations per file (5, 5, 3). The original monolithic local run reached the 4 GB cap after three cases. Local verification therefore splits cases into 13 scratch files with one parameter combination per process. The first split group passed 11 cases through the exact Core CLI. The remaining 15 cases passed using the official policyengine_core.tools.test_runner.run_tests on an initialized PE-US system, preserving the YAML assertions and Core pytest plugin while avoiding duplicate CLI baseline initialization. All 26 passed; completed split-run whole-process wall time totaled 4763.86 seconds.
  • Existing regression coverage: 60 passed: 39 baseline SECA/payroll YAML cases, 11 CBO YAML cases, 4 CBO Python tests, and 6 AIME YAML cases. Completed whole-process wall time totaled 6105.90 seconds. The CBO YAML files also used exact one-configuration scratch copies after a whole-file run reached the 4 GB cap. All existing YAML checks used the prescribed Core CLI.
  • CI guard coverage: 58 passed across the per-file reform-combination budget and Rest Python routing guards; whole-process wall time totaled 433.77 seconds.
  • Runs are foreground, sequential, single-file processes with the 4 GB cap and thread limits. YAML remains in the existing structural-other job, now including SSA; Python uses the existing Rest/remaining runner. No CI capacity is added. Measurements are local; no Linux full-group before/after benchmark was run, so they do not establish combined-group memory headroom.

impact: the hub will measure

axiom: n/a: contributed reform, not enacted law

@MaxGhenis
MaxGhenis marked this pull request as ready for review October 27, 2026 08:44

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