Skip to content

Count only elective deferrals of self-employed plan contributions in the saver's credit - #10129

Draft
MaxGhenis wants to merge 3 commits into
mainfrom
fix-savers-credit-se-elective-deferrals
Draft

MaxGhenis wants to merge 3 commits into
mainfrom
fix-savers-credit-se-elective-deferrals

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Draft: still waiting on the local test runs (queued for the heavy lock), the impact run (queued) and the independent review.

Problem

The saver's credit list gov.irs.credits.retirement_saving.qualified_retirement_savings_contributions counts self_employed_pension_contributions. That is the person's whole Schedule 1 line 16 contribution to their own SEP, SIMPLE or qualified plan.

The credit counts less:

  • 26 U.S.C. 25B(d)(1)(B)(ii)(I) counts "any elective deferrals (as defined in section 402(g)(3))".
  • 402(g)(3) defines those as 401(k) cash-or-deferred contributions, salary reduction SEP (SARSEP) contributions, 403(b) salary reduction contributions and SIMPLE IRA elective contributions.
  • 402A(a)(1) treats designated Roth contributions as elective deferrals.
  • Excluded:
    • nonelective SEP and profit-sharing contributions a self-employed person makes for themself;
    • their matching contributions to their own 401(k) (402(g)(8));
    • their matching contributions to their own SIMPLE IRA (408(p)(9)).

Statute text was checked on 2026-10-11 against the axiom-corpus rows us/statute/26/25B/d/1, us/statute/26/402/g/3 and /8, us/statute/26/402A/a/1 and us/statute/26/408/p/9, and against govinfo USCODE-2023 §§ 25B and 402.

The IRS says the same:

  • Form 8880 line 2 instructions (2025, p. 2; 2022, p. 2): "Elective deferrals (including designated Roth contributions under section 402A, if applicable) to a 401(k), 403(b), governmental 457(b), SEP, SIMPLE, or the federal TSP".
  • Pub. 590-A (2025, p. 47; 2022, p. 45) lists "salary reduction contributions (elective deferrals …)" to a 401(k), 403(b), governmental 457 plan, SIMPLE IRA plan or salary reduction SEP.

So a sole proprietor whose SEP contribution PE counts in full should get no credit for it.

Decision: count line 16 as elective deferrals first, up to the remaining 402(g) room

The modeled input doesn't say which plan the person has, and Microcosm doesn't carry plan type. New self_employed_pension_elective_deferrals:

min(self_employed_pension_contributions,
    max(elective_deferral_limit − traditional/Roth 401(k) and 403(b) deferrals, 0))

The saver's credit list now counts this instead of self_employed_pension_contributions. elective_deferral_limit is the 402(g)(1) amount plus the person's 414(v) catch-up amount.

Why deferrals first:

  • It is the most of line 16 the law could let be elective deferrals. 402(g)(1) caps a person's deferrals across all plans, so whatever exceeds the room their employer-plan deferrals leave must be employer (nonelective or matching) money.
  • It assumes the same plan as the contribution limit. Limit self-employed plan contributions to the Pub. 560 maximum deduction #10121 computes the limit assuming a profit-sharing plan with a 401(k) arrangement into which the person defers all remaining room. Only deferrals can take a contribution above the SEP and profit-sharing limit, so any other split would contradict that limit.
  • It never cuts a credit the law could allow for some plan the person could have.

Alternatives considered:

The variable's documentation says all of this.

What it changes in practice. Take one person with other-plan deferrals W, room R = limit − W, line 16 contribution S, IRA contributions I, ABLE contributions A and testing-period distributions D. The fix changes the credit base only when S > R. The base then falls from max(I + W + S + A − D, 0) to max(I + limit + A − D, 0). The credit caps each person's base at $2,000, so the credit itself changes only when D > limit + I + A − $2,000. That is at least $21,500 in 2025 and $22,500 in 2026, more with catch-up. For a credit-eligible saver, the fix is mostly a correctness fix to the base and rarely moves the credit; the YAML and impact sections show both.

Change

  • New policyengine_us/variables/household/expense/retirement/self_employed_pension_elective_deferrals.py (Person, YEAR).
  • qualified_retirement_savings_contributions.yaml: self_employed_pension_contributions → self_employed_pension_elective_deferrals in the 2018 and 2026 lists. Also: description typo ("IRA" → "IRS"); references now cite 402(g)(3), Pub. 590-A 2025/2022 and Form 8880 2025/2022 at stable irs-prior URLs. The old references were the current-year PDFs with stale page numbers.

Invariants

policyengine_us/tests/unit/test_savers_credit_self_employed_deferral_properties.py tests these with Hypothesis. Each draw is a batch of 4–15 single filers over 2022, 2025 and 2026, run as one vectorized simulation. The reference uses the IRS-published limits (Notices 2021-61, 2024-80, 2025-67; 414(v)(2)(E) for ages 60–63), not model parameters. It takes from the model only the IRA contributions and the line 16 contribution after its own limit, neither of which this PR changes.

  1. counted = min(line 16, room); 0 ≤ counted ≤ line 16; counted ≤ room. Employer-plan deferrals equal min(desired, limit).
  2. Employer-plan deferrals + counted ≤ the 402(g) limit plus catch-up.
  3. base = max(IRA + employer-plan deferrals + counted − distributions, 0). It is never above the base that counts all of line 16, and falls short of it by at most line 16 − counted.
  4. 0 ≤ the person's credit ≤ 50% × min(base, $2,000).

A deterministic grid (age 55, five employer-plan deferral levels × five line 16 amounts) checks that counted rises with line 16, falls with employer-plan deferrals, and is 0 once those deferrals fill the room.

Tests

Readers checked

qualified_retirement_savings_contributions has one reader, savers_credit_qualified_contributions. The other readers of self_employed_pension_contributions don't change:

  • the ALD;
  • ira_active_participant;
  • the MN homestead and UT homeowner/renter household income lists, which count all of line 16 as income adjustments, not as saver's credit contributions;
  • the state AGI lists that use the ALD.

Impact

Pending: a base-vs-PR microsimulation pair for 2026 is queued for the heavy lock (~/reviews/savers-credit-se-deferrals-2026-10/impact/). Microcosm's SE pension inputs are about 3% of SOI dollars (PolicyEngine/microcosm#1117 item B1), and the arithmetic above limits where the credit can move, so expect a very small change.

Follow-ups

  • ABLE contributions (chipped). From 2026 the same list drops able_contributions_person. But the amended 25B(d)(1)(A) (corpus row us/statute/26/25B/d/1) and the 2025 Form 8880 "What's New" (OBBBA) keep ABLE contributions in every year, and from 2027 only ABLE contributions count (SECURE 2.0 § 103; Replace Savers Credit with Savers Match effective 2027 #5199).

axiom: TheAxiomFoundation/rulespec-us#1680 queued. us/statutes/26/25B.yaml takes elective_deferrals as a free input and has no 402(g) module, and no companion test exercises the input while the window is open.

🤖 Generated with Claude Code

MaxGhenis and others added 3 commits October 11, 2026 17:10
…the saver's credit

26 U.S.C. 25B(d)(1)(B) counts elective deferrals as defined in 402(g)(3).
Nonelective SEP and profit-sharing contributions, and matching
contributions a self-employed person makes for themself (402(g)(8)), are
employer contributions. Form 8880 line 2 (2025 and 2022, p. 2) and
Pub. 590-A (2025 p. 47, 2022 p. 45) say the same.

The new self_employed_pension_elective_deferrals counts the person's
Schedule 1 line 16 contributions as deferrals first, up to the 402(g)
limit plus catch-up less deferrals to other employers' 401(k)/403(b)
plans, and replaces self_employed_pension_contributions in the saver's
credit list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eferral share

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

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