Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
6f9c3b9
Limit the self-employed health insurance deduction to 401(c) earned i…
MaxGhenis Oct 11, 2026
a885a16
Test the self-employed health insurance earned income limit against F…
MaxGhenis Oct 11, 2026
06f215b
Add Form 7206 property tests for the self-employed health insurance d…
MaxGhenis Oct 11, 2026
1bad2f1
Update SSTB and Ohio expectations for the 401(c) earned income limit
MaxGhenis Oct 11, 2026
32aec88
Widen the self-employed health insurance limit to farm, partnership a…
MaxGhenis Oct 11, 2026
97e05a7
Extend the Form 7206 properties to farm, partnership and S corporatio…
MaxGhenis Oct 11, 2026
319445c
Add changelog fragment
MaxGhenis Oct 11, 2026
572c882
State the property 5 floor without depending on the plan contribution…
MaxGhenis Oct 11, 2026
47bba5e
Clarify the default plan business and the S corporation premium gate
MaxGhenis Oct 11, 2026
b03f96f
Address review: name partnership and S corporation in YAML, document …
MaxGhenis Oct 13, 2026
f6d142c
Merge main into the plan business branch after #10109 landed
claude Nov 2, 2026
4c3a6c7
Allocate line 15 by each business's share, as main does
claude Nov 3, 2026
3019e6c
Say where entity-paid premiums go and that every business kind is pooled
claude Nov 3, 2026
95b566c
Make the S corporation case a valid return and check the reference limit
claude Nov 3, 2026
0c191f0
Merge remote-tracking branch 'origin/main' into pr-10120
claude Nov 3, 2026
da6240b
Carry the plan business choice into the owners' draw reform's SEHI limit
claude Nov 3, 2026
735cb03
Name the smaller-plan-business case in the plan business input's docs
claude Nov 4, 2026
577118d
Merge main into sehi-plan-business-base
MaxGhenis Nov 7, 2026
69a8b3b
Test long-term care premiums under every plan business
MaxGhenis Nov 7, 2026
031c6bc
Say the model taxes reimbursed long-term care premiums as payroll wages
MaxGhenis Nov 7, 2026
eddc35a
Tell partners where guaranteed payments go and cite Notice 2008-1
MaxGhenis Nov 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/sehi-plan-business-base.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Let the self-employed health insurance deduction's earned income limit come from a Schedule F farm, a partnership's K-1 box 14 code A earnings, or a more-than-2% S corporation shareholder's wages when the plan is established under that business (26 U.S.C. 162(l)(2)(A) and (l)(5), Form 7206); the business can be named, and otherwise the person's business with the largest earned income is used.
6 changes: 5 additions & 1 deletion docs/contributed_reforms/owners_draw.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,11 @@ on. These are the draw profits whose SECA the deduction includes. Draw
profits beyond the OASDI room with HI off stay out of line 5. With
`half_seca_deduction: false` the draw's SECA is not deductible, so line 5
omits the draw and the limit follows the baseline formula. Disabled years
use the baseline formula.
use the baseline formula. The draw enters line 5 only: the plan business is
chosen as in the baseline, from the Schedule C business, the farm, the
partnership or the S corporation named by
`self_employed_health_insurance_plan_business`, or the one with the largest
line 13 when none is named.

## Benefit credit and active NIIT interaction

Expand Down
32 changes: 6 additions & 26 deletions policyengine_us/reforms/ssa/owners_draw.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
)
from policyengine_us.variables.gov.irs.income.taxable_income.adjusted_gross_income.above_the_line_deductions.self_employed_health_insurance_earned_income_limit import (
self_employed_health_insurance_earned_income_limit as baseline_sehi_limit,
form_7206_line_13,
)
from policyengine_us.variables.gov.ssa.social_security.ss_aime import (
ss_aime as baseline_aime,
Expand Down Expand Up @@ -247,32 +248,11 @@ def formula(person, period, parameters):
person("owners_draw_niit_exclusion", period),
0,
)
plan_business_profit = max_(
0, person("total_self_employment_income", period)
)
all_business_profits = (
plan_business_profit
+ max_(0, person("farm_operations_income", period))
+ max_(0, person("partnership_self_employment_net_earnings", period))
+ draw_profits_in_line_7
)
plan_business_share = np.divide(
plan_business_profit,
all_business_profits,
out=np.zeros_like(all_business_profits),
where=all_business_profits > 0,
)
self_employment_tax_deduction = (
person("self_employment_tax_ald_person", period) * plan_business_share
)
retirement_plan_deduction = person(
"self_employed_pension_contribution_ald_person", period
)
return max_(
0,
plan_business_profit
- self_employment_tax_deduction
- retirement_plan_deduction,
# The draw profits enter line 5 only: the plan business is still
# chosen among the baseline's Schedule C, farm, partnership and
# S corporation businesses.
return form_7206_line_13(
person, period, other_line_5_profits=draw_profits_in_line_7
)

class ss_aime(baseline_aime):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,3 +162,147 @@
# The child takes it on their own return.
self_employed_health_insurance_ald: 0
dependents_self_employed_health_insurance_ald: 2_788.05675

- name: Case 9, a farmer whose plan is established under the farm deducts up to farm earned income.
period: 2024
absolute_error_margin: 0.01
input:
is_self_employed: true
farm_operations_income: 20_000
health_insurance_premiums: 25_000
output:
# Form 7206: line 3 is 25,000; line 13 is 20,000 - 1,412.955.
self_employed_health_insurance_ald_person: 18_587.045
# 20,000 - 1,412.955 - 18,587.045.
adjusted_gross_income: 0

- name: Case 10, a partner deducts up to their K-1 box 14 code A earnings less half of self-employment tax.
period: 2025
absolute_error_margin: 0.01
input:
is_self_employed: true
partnership_income: 30_000
partnership_self_employment_net_earnings: 30_000
health_insurance_premiums: 40_000
output:
# Form 7206 line 13: 30,000 - 2,119.4325.
self_employed_health_insurance_ald_person: 27_880.5675
adjusted_gross_income: 0

- name: Case 11, an S corporation shareholder deducts up to their wages from the corporation.
period: 2025
absolute_error_margin: 0.01
input:
is_self_employed: true
# The corporation reimburses the 12,000 of premiums and reports them in
# W-2 box 1, so box 1 wages are 22,000. Box 5 Medicare wages leave them
# out (26 U.S.C. 3121(a)(2)(B)): 10,000.
employment_income: 22_000
s_corp_shareholder_medicare_wages: 10_000
health_insurance_premiums: 12_000
output:
# Form 7206: line 3 is 12,000; line 13 is line 11, 10,000.
self_employed_health_insurance_ald_person: 10_000
# 22,000 - 10,000.
adjusted_gross_income: 12_000

- name: Case 12, a plan named under the smaller farm is limited to the farm's earned income.
period: 2024
absolute_error_margin: 0.01
input:
is_self_employed: true
self_employment_income: 30_000
farm_operations_income: 10_000
self_employed_health_insurance_plan_business: SCHEDULE_F
health_insurance_premiums: 20_000
output:
# Form 7206 line 13: 10,000 - 0.25 x 2,825.91.
self_employed_health_insurance_ald_person: 9_293.5225

- name: Case 13, an S corporation shareholder's wages cover the medical premiums first, then eligible long-term care premiums.
period: 2026
absolute_error_margin: 0.01
input:
age: 55
is_self_employed: true
# The corporation pays the 8,500 of premiums and reports them in W-2
# box 1 (Form 7206 instructions), so box 1 wages are 15,500. The case
# sets box 5 Medicare wages to 7,000.
employment_income: 15_500
s_corp_shareholder_medicare_wages: 7_000
health_insurance_premiums: 6_000
long_term_health_insurance_premiums: 2_500
output:
# Line 1 is 6,000; line 2 is min(2,500, 1,860) = 1,860 (ages 51 to 60);
# line 3 is 7,860; line 13 is line 11, 7,000.
self_employed_health_insurance_ald_person: 7_000
# 7,000 - 6,000 of medical premiums.
self_employed_health_insurance_ald_long_term_care_part: 1_000
# Schedule A keeps line 3 less the deduction: 7,860 - 7,000.
itemized_medical_expenses: 860
# 15,500 - 7,000.
adjusted_gross_income: 8_500

- name: Case 14, a farmer whose plan is established under the farm deducts eligible long-term care premiums up to farm earned income.
period: 2024
absolute_error_margin: 0.01
input:
age: 75
is_self_employed: true
farm_operations_income: 20_000
health_insurance_premiums: 15_000
long_term_health_insurance_premiums: 7_000
output:
# Line 2 is min(7,000, 5,880) = 5,880 (over 70); line 3 is 20,880.
# Line 13: 20,000 - 20,000 x 0.9235 x 0.153 / 2 = 18,587.045.
self_employed_health_insurance_ald_person: 18_587.045
# 18,587.045 - 15,000 of medical premiums.
self_employed_health_insurance_ald_long_term_care_part: 3_587.045
# 20,880 - 18,587.045.
itemized_medical_expenses: 2_292.955
# 20,000 - 1,412.955 - 18,587.045.
adjusted_gross_income: 0

- name: Case 15, a partner deducts eligible long-term care premiums up to their K-1 box 14 code A earnings less half of self-employment tax.
period: 2025
absolute_error_margin: 0.01
input:
age: 62
is_self_employed: true
partnership_income: 10_000
partnership_self_employment_net_earnings: 10_000
health_insurance_premiums: 8_000
long_term_health_insurance_premiums: 6_000
output:
# Line 2 is min(6,000, 4,810) = 4,810 (ages 61 to 70); line 3 is 12,810.
# Line 13: 10,000 - 10,000 x 0.9235 x 0.153 / 2 = 9,293.5225.
self_employed_health_insurance_ald_person: 9_293.5225
# 9,293.5225 - 8,000 of medical premiums.
self_employed_health_insurance_ald_long_term_care_part: 1_293.5225
# 12,810 - 9,293.5225.
itemized_medical_expenses: 3_516.4775
# 10,000 - 706.4775 - 9,293.5225.
adjusted_gross_income: 0

- name: Case 16, with no plan business named, the larger farm's earned income covers line 3, long-term care premiums included.
period: 2026
absolute_error_margin: 0.01
input:
age: 45
is_self_employed: true
self_employment_income: 2_000
farm_operations_income: 30_000
health_insurance_premiums: 20_000
long_term_health_insurance_premiums: 1_500
output:
# Line 15: 32,000 x 0.9235 x 0.153 / 2 = 2,260.728. Line 13 for the farm
# is 30,000 - 30/32 x 2,260.728 = 27,880.5675, and for the Schedule C
# business 2,000 - 2/32 x 2,260.728 = 1,858.7045. The model takes the farm.
self_employed_health_insurance_earned_income_limit: 27_880.5675
# Line 2 is min(1,500, 930) = 930 (ages 41 to 50); line 3 is 20,930.
self_employed_health_insurance_ald_person: 20_930
self_employed_health_insurance_ald_long_term_care_part: 930
# 20,930 - 20,930.
itemized_medical_expenses: 0
# 32,000 - 2,260.728 - 20,930.
adjusted_gross_income: 8_809.272
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
# Form 7206 lines 4-13 (Pub. 535 Worksheet 6-A before 2023). Expected values
# are hand-computed from the form: the deductible part of self-employment tax
# is net profit x 0.9235 x 15.3% / 2 below the Social Security wage base.
# One Form 7206 per plan: the limit is the earned income of the business under
# which the plan is established (self_employed_health_insurance_plan_business),
# or of the person's business with the largest earned income when that input
# is not supplied.

- name: Case 1, one business, the limit is net profit less half of self-employment tax.
period: 2022
Expand Down Expand Up @@ -85,12 +89,13 @@
self_employment_tax_ald_person: 0
self_employed_health_insurance_earned_income_limit: 400

- name: Case 8, a Schedule C loss leaves no limit.
- name: Case 8, a plan established under a Schedule C business with a loss has no limit.
period: 2025
absolute_error_margin: 0.01
input:
self_employment_income: -5_000
partnership_self_employment_net_earnings: 20_000
self_employed_health_insurance_plan_business: SCHEDULE_C
output:
self_employed_health_insurance_earned_income_limit: 0

Expand Down Expand Up @@ -119,3 +124,139 @@
self_employment_tax_ald_person: 1_412.955
# Lines 4 and 5 are both 20,000, so line 6 is 1; 20,000 - 1,412.955.
self_employed_health_insurance_earned_income_limit: 18_587.045

- name: Case 11, a Schedule C loss leaves the partnership as the plan business.
period: 2025
absolute_error_margin: 0.01
input:
self_employment_income: -5_000
partnership_self_employment_net_earnings: 20_000
output:
# Schedule 1 line 15: (20,000 - 5,000) x 0.9235 x 0.153 / 2 = 1,059.71625.
self_employment_tax_ald_person: 1_059.71625
# Line 5 leaves out the loss, so line 6 is 1: 20,000 - 1,059.71625.
self_employed_health_insurance_earned_income_limit: 18_940.28375

- name: Case 12, a farm is the only business.
period: 2024
absolute_error_margin: 0.01
input:
farm_operations_income: 20_000
output:
# Schedule 1 line 15: 20,000 x 0.9235 x 0.153 / 2 = 1,412.955.
self_employment_tax_ald_person: 1_412.955
# Lines 4 to 8 for Schedule F: 20,000 - 1,412.955.
self_employed_health_insurance_earned_income_limit: 18_587.045

- name: Case 13, a partnership with K-1 box 14 code A earnings is the only business.
period: 2025
absolute_error_margin: 0.01
input:
partnership_self_employment_net_earnings: 30_000
output:
# Schedule 1 line 15: 30,000 x 0.9235 x 0.153 / 2 = 2,119.4325.
self_employment_tax_ald_person: 2_119.4325
self_employed_health_insurance_earned_income_limit: 27_880.5675

- name: Case 14, without a named business the larger farm is the plan business.
period: 2024
absolute_error_margin: 0.01
input:
self_employment_income: 5_000
farm_operations_income: 40_000
output:
# Schedule 1 line 15: 45,000 x 0.9235 x 0.153 / 2 = 3,179.14875.
self_employment_tax_ald_person: 3_179.14875
# Farm: 40,000 - 40,000 / 45,000 x 3,179.14875 = 37,174.09.
# Schedule C: 5,000 - 5,000 / 45,000 x 3,179.14875 = 4,646.76125.
self_employed_health_insurance_earned_income_limit: 37_174.09

- name: Case 15, a named Schedule C business sets the limit even when the farm earns more.
period: 2024
absolute_error_margin: 0.01
input:
self_employment_income: 5_000
farm_operations_income: 40_000
self_employed_health_insurance_plan_business: SCHEDULE_C
output:
# Schedule C line 13, as in Case 14: 5,000 - 5,000 / 45,000 x 3,179.14875.
self_employed_health_insurance_earned_income_limit: 4_646.76125

- name: Case 16, a named farm business takes its own share of the self-employment tax deduction.
period: 2024
absolute_error_margin: 0.01
input:
self_employment_income: 30_000
farm_operations_income: 10_000
self_employed_health_insurance_plan_business: SCHEDULE_F
output:
# Schedule 1 line 15: 40,000 x 0.9235 x 0.153 / 2 = 2,825.91.
# Lines 5 to 8: 10,000 / 40,000 = 0.25; 10,000 - 0.25 x 2,825.91.
self_employed_health_insurance_earned_income_limit: 9_293.5225

- name: Case 17, the plan deduction is attributable to Schedule C, so the partnership earns more.
period: 2023
absolute_error_margin: 0.01
input:
self_employment_income: 20_000
self_employed_pension_contributions_desired: 15_000
partnership_self_employment_net_earnings: 10_000
output:
# Schedule 1 line 15: 30,000 x 0.9235 x 0.153 / 2 = 2,119.4325.
self_employment_tax_ald_person: 2_119.4325
self_employed_pension_contribution_ald_person: 15_000
# Schedule C: 20,000 - 2 / 3 x 2,119.4325 - 15,000 = 3,587.045.
# Partnership (line 9 is 0): 10,000 - 1 / 3 x 2,119.4325 = 9,293.5225.
self_employed_health_insurance_earned_income_limit: 9_293.5225

- name: Case 18, an S corporation shareholder's wages are the earned income.
period: 2025
absolute_error_margin: 0.01
input:
employment_income: 50_000
s_corp_shareholder_medicare_wages: 50_000
self_employment_income: 10_000
output:
# Line 11: 50,000. The Schedule C business would give
# 10,000 - 10,000 x 0.9235 x 0.153 / 2 = 9,293.5225.
self_employed_health_insurance_earned_income_limit: 50_000

- name: Case 19, a named Schedule C business ignores the S corporation wages.
period: 2025
absolute_error_margin: 0.01
input:
employment_income: 50_000
s_corp_shareholder_medicare_wages: 50_000
self_employment_income: 10_000
self_employed_health_insurance_plan_business: SCHEDULE_C
output:
# Schedule 1 line 15: 10,000 x 0.9235 x 0.153 / 2 = 706.4775. Schedule C
# line 13: 10,000 - 706.4775; line 11 does not apply.
self_employment_tax_ald_person: 706.4775
self_employed_health_insurance_earned_income_limit: 9_293.5225

- name: Case 20, a named partnership sets the limit even when the farm earns more.
period: 2025
absolute_error_margin: 0.01
input:
farm_operations_income: 40_000
partnership_self_employment_net_earnings: 10_000
self_employed_health_insurance_plan_business: PARTNERSHIP
output:
# Schedule 1 line 15: 50,000 x 0.9235 x 0.153 / 2 = 3,532.3875.
self_employment_tax_ald_person: 3_532.3875
# Lines 5 to 8: 10,000 / 50,000 = 0.2; 10,000 - 0.2 x 3,532.3875.
self_employed_health_insurance_earned_income_limit: 9_293.5225

- name: Case 21, a named S corporation sets the limit even when the Schedule C business earns more.
period: 2025
absolute_error_margin: 0.01
input:
employment_income: 10_000
s_corp_shareholder_medicare_wages: 10_000
self_employment_income: 50_000
self_employed_health_insurance_plan_business: S_CORPORATION
output:
# Line 11: 10,000. The Schedule C business would give
# 50,000 - 50,000 x 0.9235 x 0.153 / 2 = 46,467.6125.
self_employed_health_insurance_earned_income_limit: 10_000
Loading
Loading