Skip to content

Commit 4264fd5

Browse files
committed
Enforce elective deferral limits in tax-facing variables
1 parent ee7e58b commit 4264fd5

27 files changed

Lines changed: 411 additions & 22 deletions
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Cap traditional and Roth 401(k) and 403(b) contributions at the IRC Section 402(g) elective deferral limit, including age-based catch-ups.

policyengine_us/parameters/gov/contrib/crfb/surtax/increased_base/sources.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ values:
33
2010-01-01:
44
# Retirement contributions (IRA, 401k, 403b)
55
- traditional_ira_contributions
6-
- traditional_401k_contributions
7-
- traditional_403b_contributions
6+
- capped_traditional_401k_contributions
7+
- capped_traditional_403b_contributions
88
# HSA contributions (no Archer MSA variable exists)
99
- health_savings_account_ald
1010
# Deductible student loan interest

policyengine_us/parameters/gov/irs/credits/retirement_saving/qualified_retirement_savings_contributions.yaml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@ description: The IRA sums the following elements as qualified retirement savings
22
values:
33
2018-01-01:
44
- traditional_ira_contributions
5-
- traditional_401k_contributions
6-
- traditional_403b_contributions
5+
- capped_traditional_401k_contributions
6+
- capped_traditional_403b_contributions
77
- roth_ira_contributions
8-
- roth_401k_contributions
9-
- roth_403b_contributions
8+
- capped_roth_401k_contributions
9+
- capped_roth_403b_contributions
1010
- self_employed_pension_contributions
1111
- able_contributions_person
1212

1313
2026-01-01:
1414
- traditional_ira_contributions
15-
- traditional_401k_contributions
16-
- traditional_403b_contributions
15+
- capped_traditional_401k_contributions
16+
- capped_traditional_403b_contributions
1717
- roth_ira_contributions
18-
- roth_401k_contributions
19-
- roth_403b_contributions
18+
- capped_roth_401k_contributions
19+
- capped_roth_403b_contributions
2020
- self_employed_pension_contributions
2121

2222
metadata:

policyengine_us/parameters/gov/irs/gross_income/pre_tax_contributions.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ values:
33
2010-01-01:
44
# Assumes all are pre-tax.
55
# Roth 401(k)/403(b) contributions are post-tax and intentionally excluded.
6-
- traditional_401k_contributions
7-
- traditional_403b_contributions
6+
- capped_traditional_401k_contributions
7+
- capped_traditional_403b_contributions
88
# Only explicit pre-tax payroll health premiums reduce taxable wages.
99
- pre_tax_health_insurance_premiums
1010
# HSA contributions can be either through pre-tax.

policyengine_us/parameters/gov/irs/gross_income/retirement_contributions/catch_up/limit/k401.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ brackets:
1717
2023-01-01: 7_500
1818
2024-01-01: 7_500
1919
2025-01-01: 7_500
20+
2026-01-01: 8_000
2021
metadata:
2122
uprating:
2223
parameter: gov.irs.uprating
@@ -35,6 +36,7 @@ brackets:
3536
# SECURE 2.0 enhanced catch-up begins in 2025
3637
# The greater of $10,000 or 150% of the standard catch-up
3738
2025-01-01: 11_250
39+
2026-01-01: 11_250
3840
metadata:
3941
uprating:
4042
parameter: gov.irs.uprating
@@ -51,6 +53,7 @@ brackets:
5153
2023-01-01: 7_500
5254
2024-01-01: 7_500
5355
2025-01-01: 7_500
56+
2026-01-01: 8_000
5457
metadata:
5558
uprating:
5659
parameter: gov.irs.uprating
@@ -70,5 +73,7 @@ metadata:
7073
href: https://www.law.cornell.edu/uscode/text/26/414#v_2_E
7174
- title: IRS announcement - 401(k) limit increases for 2025
7275
href: https://www.irs.gov/newsroom/401k-limit-increases-to-23500-for-2025-ira-limit-remains-7000
76+
- title: IRS announcement - 401(k) limit increases for 2026
77+
href: https://www.irs.gov/newsroom/401k-limit-increases-to-24500-for-2026-ira-limit-increases-to-7500
7378
- title: Cost-of-Living Adjustments for Retirement Items
7479
href: https://www.irs.gov/pub/irs-tege/cola-table.pdf#page=1

policyengine_us/parameters/gov/states/ut/tax/property/homeowner_renter_relief/nontaxable_income/sources.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ values:
88
- tax_exempt_interest_income
99
- tax_exempt_pension_income
1010
- tax_exempt_retirement_distributions
11-
- traditional_401k_contributions
12-
- traditional_403b_contributions
11+
- capped_traditional_401k_contributions
12+
- capped_traditional_403b_contributions
1313
- traditional_ira_contributions
1414
- self_employed_pension_contributions
1515
- veterans_benefits

policyengine_us/tests/core/test_payroll_contributions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def make_simulation(
4848
PERIOD: pre_tax_health_insurance_premiums
4949
},
5050
"tip_income": {PERIOD: tip_income},
51-
"traditional_401k_contributions": {
51+
"traditional_401k_contributions_reported": {
5252
PERIOD: traditional_401k_contributions
5353
},
5454
}

policyengine_us/tests/policy/baseline/gov/irs/income/taxable_income/adjusted_gross_income/above_the_line_deductions/retirement/k401_catch_up_limit.yaml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,24 @@
104104
output:
105105
# No enhanced catch-up before 2025
106106
k401_catch_up_limit: 7_500
107+
108+
- name: Case 15, age 50 in 2026 receives 2026 standard limit.
109+
period: 2026
110+
input:
111+
age: 50
112+
output:
113+
k401_catch_up_limit: 8_000
114+
115+
- name: Case 16, age 62 in 2026 receives 2026 enhanced limit.
116+
period: 2026
117+
input:
118+
age: 62
119+
output:
120+
k401_catch_up_limit: 11_250
121+
122+
- name: Case 17, age 64 in 2026 reverts to 2026 standard limit.
123+
period: 2026
124+
input:
125+
age: 64
126+
output:
127+
k401_catch_up_limit: 8_000
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
- name: Case 1, reported deferrals below the elective deferral limit.
2+
period: 2025
3+
input:
4+
age: 35
5+
traditional_401k_contributions: 12_000
6+
roth_401k_contributions: 8_000
7+
output:
8+
elective_deferral_limit: 23_500
9+
traditional_401k_contributions: 12_000
10+
roth_401k_contributions: 8_000
11+
capped_traditional_401k_contributions: 12_000
12+
capped_roth_401k_contributions: 8_000
13+
14+
- name: Case 2, legacy deferral inputs above the base elective deferral limit.
15+
period: 2025
16+
absolute_error_margin: 0.01
17+
input:
18+
age: 35
19+
traditional_401k_contributions: 20_000
20+
roth_401k_contributions: 10_000
21+
output:
22+
elective_deferral_limit: 23_500
23+
traditional_401k_contributions: 20_000
24+
roth_401k_contributions: 10_000
25+
capped_traditional_401k_contributions: 15_666.67
26+
capped_roth_401k_contributions: 7_833.33
27+
pre_tax_contributions: 15_666.67
28+
29+
- name: Case 3, reported inputs use the enhanced catch-up limit across 401(k) and 403(b) deferrals.
30+
period: 2025
31+
absolute_error_margin: 0.01
32+
input:
33+
age: 62
34+
traditional_401k_contributions_reported: 20_000
35+
roth_401k_contributions_reported: 10_000
36+
traditional_403b_contributions_reported: 5_000
37+
roth_403b_contributions_reported: 5_000
38+
output:
39+
elective_deferral_limit: 34_750
40+
capped_traditional_401k_contributions: 17_375
41+
capped_roth_401k_contributions: 8_687.50
42+
capped_traditional_403b_contributions: 4_343.75
43+
capped_roth_403b_contributions: 4_343.75
44+
45+
- name: Case 4, SECURE 2.0 enhanced catch-up applies from ages 60 through 63.
46+
period: 2025
47+
input:
48+
people:
49+
person1:
50+
age: 49
51+
person2:
52+
age: 50
53+
person3:
54+
age: 59
55+
person4:
56+
age: 60
57+
person5:
58+
age: 63
59+
person6:
60+
age: 64
61+
output:
62+
elective_deferral_limit: [23_500, 31_000, 31_000, 34_750, 34_750, 31_000]
63+
64+
- name: Case 5, capped traditional deferrals reduce income tax wages.
65+
period: 2025
66+
input:
67+
age: 40
68+
employment_income: 100_000
69+
traditional_401k_contributions: 50_000
70+
output:
71+
traditional_401k_contributions: 50_000
72+
capped_traditional_401k_contributions: 23_500
73+
pre_tax_contributions: 23_500
74+
irs_employment_income: 76_500
75+
76+
- name: Case 6, capped traditional deferrals do not reduce FICA wages.
77+
period: 2025
78+
input:
79+
age: 40
80+
employment_income: 100_000
81+
traditional_401k_contributions: 50_000
82+
output:
83+
capped_traditional_401k_contributions: 23_500
84+
payroll_tax_gross_wages: 100_000
85+
86+
- name: Case 7, capped Roth deferrals count for the saver's credit.
87+
period: 2025
88+
input:
89+
age: 40
90+
traditional_401k_contributions: 30_000
91+
roth_401k_contributions: 17_000
92+
retirement_distributions: 0
93+
output:
94+
capped_traditional_401k_contributions: 15_000
95+
capped_roth_401k_contributions: 8_500
96+
savers_credit_qualified_contributions: 23_500
97+
98+
- name: Case 8, the 2026 standard catch-up applies from ages 50 through 59.
99+
period: 2026
100+
input:
101+
age: 55
102+
traditional_401k_contributions: 32_500
103+
output:
104+
elective_deferral_limit: 32_500
105+
capped_traditional_401k_contributions: 32_500
106+
107+
- name: Case 9, the SECURE 2.0 enhanced catch-up applies in 2026.
108+
period: 2026
109+
input:
110+
age: 62
111+
traditional_401k_contributions: 35_750
112+
output:
113+
elective_deferral_limit: 35_750
114+
capped_traditional_401k_contributions: 35_750
115+
116+
- name: Case 10, age 64 returns to the standard catch-up in 2026.
117+
period: 2026
118+
input:
119+
age: 64
120+
traditional_401k_contributions: 35_750
121+
output:
122+
elective_deferral_limit: 32_500
123+
capped_traditional_401k_contributions: 32_500

policyengine_us/tests/policy/contrib/crfb/agi_surtax.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@
7979
traditional_401k_contributions: 30_000
8080
filing_status: SINGLE
8181
output:
82-
# AGI 80k + 401k 30k = 110k expanded base
83-
# (110k - 100k) * 1% = 100
84-
agi_surtax: 100
82+
# AGI 80k + capped 401k 24.5k = 104.5k expanded base
83+
# (104.5k - 100k) * 1% = 45
84+
agi_surtax: 45
8585

8686
- name: Expanded base with tax-exempt interest
8787
period: 2026

0 commit comments

Comments
 (0)