Skip to content

Exclude employer-plan-eligible premiums from the self-employed health insurance deduction - #10122

Draft
MaxGhenis wants to merge 3 commits into
mainfrom
fix-sehi-employer-plan-exclusion
Draft

MaxGhenis wants to merge 3 commits into
mainfrom
fix-sehi-employer-plan-exclusion

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Problem

self_employed_health_insurance_premiums was adds = ["health_insurance_premiums"] for any self-employed person. Its documentation said the premiums were for people "not covered by any employer-sponsored health insurance", but nothing enforced that.

The law bars the deduction for months with access to an employer plan:

  • 26 U.S.C. 162(l)(2)(B): "Paragraph (1) shall not apply to any taxpayer for any calendar month for which the taxpayer is eligible to participate in any subsidized health plan maintained by any employer of the taxpayer or of the spouse of, or any dependent, or individual described in subparagraph (D) of paragraph (1) with respect to, the taxpayer." Verified on 2026-10-11 against govinfo USCODE-2023 and the Axiom corpus row us/statute/26/162/l/2/B.
  • Form 7206 line 1 (2023, 2024, 2025, PDF p. 1, first bullet) leaves out "Amounts for any month you were eligible to participate in a health plan subsidized by your employer or your spouse's employer".
  • The Form 7206 instructions (2025, p. 2, "Other coverage"; same text in 2023 and 2024) add "even if you didn't actually participate".
  • Before Form 7206, the Form 1040 instructions for the deduction said the same thing: 2022, Schedule 1 line 17, pp. 88–89, and 2018, Schedule 1 line 29, p. 93. They also treat a QSEHRA as a subsidized employer plan.

Example (2025). A joint couple:

  • The head has Schedule C profit of $50,000 and pays $6,000 of premiums.
  • The spouse earns $40,000 of wages with employer coverage.
  • Main deducts the $6,000, so AGI is $80,467.61. The law allows nothing: AGI is 50,000 + 40,000 − 3,532.39 (half of SE tax) = $86,467.61.

Change

New self_employed_health_insurance_employer_plan_eligible (Person, bool) is true when either of these holds:

  • The person has employer coverage (has_esi), is offered it (offered_aca_disqualifying_esi), or has an employer that pays some or all of their premiums (employer_contribution_to_health_insurance_premiums_category SOME or ALL). Enrollment or an offer shows the person can take part in the plan, and an employer that pays premiums subsidizes it. oh_employer_subsidized_health_plan_eligible uses the same three inputs for Ohio's version of this rule.
  • The other of the head and spouse in the person's tax unit (a joint return) meets that test.

A tax unit dependent is barred only by their own coverage. A parent's employer is not among the employers the statute lists for the dependent's own deduction.

self_employed_health_insurance_premiums is now a formula: the premiums, or 0 when the person is eligible.

Not modeled (documented in the variables):

  • Months. The law applies the bar month by month; PE's inputs are annual, so a person eligible at any point is treated as eligible all year.
  • A spouse who files separately. The spouse is in another tax unit. The variable cannot read filing_status, which closes a cycle:
    • filing_status → surviving_spouse_eligible → dependents → dependent_gross_income → dependent_taxable_ss_magi → this deduction.
    • The marital unit cannot stand in for it either: without explicit marital units it holds every person.
    • The default dataset has no married couple split across tax units: 0 of 130,729 marital units span two.
  • A dependent's or under-27 child's employer plan. It bars the deduction only for a taxpayer who can take part in it, and no input records that.
  • Long-term care plans. (l)(2)(B)(i)–(ii) apply the bar separately to them. They are not in this premium base (the Limit the self-employed health insurance deduction to net profit less half of SE tax and plan deductions #10109 follow-up on 213(d)(10)).

Premium tax credit (Pub. 974): filed as #10124

PE deducts the full premiums and also pays a PTC on the modeled Marketplace plan. 26 U.S.C. 280C(g) allows no deduction for the part the credit pays, and Rev. Proc. 2014-41 / Pub. 974 resolve the circularity with the iterative or the simplified ("alternative") calculation. I assessed both:

  • Netting inside the formula closes a cycle. A reform that nets aca_ptc out of the base raises CycleError: deduction → premiums → aca_ptc → is_aca_ptc_eligible → aca_magi → medicaid_magi → AGI → … → deduction.
  • The simplified method could avoid the cycle with a simulation branch (get_override_branch, as tax_liability_if_itemizing does). It needs two things the model doesn't have yet:
    • A premium split. PE's credit applies to a separately modeled plan, while health_insurance_premiums in Microcosm data is the reported out-of-pocket premium, already net of the advance credit. Netting PE's credit from it would subtract the credit twice: 515 of the 1,379 self-employed premium records report Marketplace coverage.
    • Branch cost. The branch recomputes the AGI → Medicaid → ACA chain for every tax unit.
  • Scale of the household-level overlap: a Miami-Dade filer with $30,000 of profit deducts the full $6,976.57 benchmark premium and also gets a $6,976.57 credit.

#10124 has the evidence, the design and acceptance tests from Pub. 974 (2025) pp. 60–63 (deduction $6,138, AGI $103,337, Form 8962 line 26 $1,794). The premium variable's documentation points to it.

Invariants

Tested with Hypothesis in tests/unit/test_self_employed_health_insurance_employer_plan_properties.py. Each batch places every drawn tax unit twice, as drawn and with every coverage flag cleared, in one vectorized simulation over 2024–2026.

  1. Reference: each person's premium base equals a closed-form reference on the inputs (premiums if self-employed and neither they nor the other filer is eligible, else 0).
  2. Bounds: 0 ≤ deduction ≤ premium base ≤ premiums.
  3. Monotone: clearing the flags never lowers anyone's base or deduction.
  4. Differential: the flags move AGI only through the head's and spouse's deductions.

A deterministic grid runs all 16 × 16 × 2 combinations of the head's, spouse's and a dependent's flags.

Checked against mutants: main's premium variable (4 tests fail), dropping the spouse route (4 fail), and counting dependents as spouses (3 fail). Each was reverted afterwards.

Tests

New YAML self_employed_health_insurance_employer_plan.yaml, 9 cases:

  • own enrollment, an offer, and employer payment;
  • the spouse's plan, with and without explicit marital units, including the $86,467.61 AGI;
  • guard cases: no plan, a housemate's plan, a dependent child's own plan, and a parent's plan for a self-employed dependent.

Profit of $50,000 keeps the earned income limit above the premiums, so the expectations hold with or without #10109.

Fails on main. With the sources reverted in place and the new variable's lines removed:

  • the 5 barred cases fail by exactly $6,000 on the premiums, the deduction and AGI (AGI 80,467.61 vs 86,467.61);
  • the 4 guard cases pass, as intended.

Local runs.

  • self_employed_health_insurance_employer_plan.yaml: 9 passed.
  • The property file: 7 passed, 15 Hypothesis examples.
  • Every YAML file that sets self-employment or the deduction, or combines premiums with employer coverage: 28 files, 314 cases, all passed. These cover the deduction, QBI, ID, OH, NJ, MS, MO, MI, AL, AZ, MA, MT, CA, the CA local general relief programs and the TAXSIM outputs.
  • 9 pytest files on the same path: 51 passed and 1 xfailed (pre-existing). These are the dependent-ALD and ALD-determinism invariants, ID, MI, MT, OH, the Schedule A pre-tax premium invariants, and the cached-arrays guard.
  • Each file ran in its own process (log: targeted-53fe0ac784.log in the lane folder). Later commits change only documentation and tests.

Impact

IMPACT_PENDING

Consumers checked

The only reader of self_employed_health_insurance_premiums is self_employed_health_insurance_ald_person. Everything else reads the deduction:

  • federal AGI and the QBI deduction;
  • the Medicaid MAGI person map, dependent_taxable_ss_magi, dependents_self_employed_health_insurance_ald;
  • MO, MS, NJ, AL, SC and MI;
  • the premium nets in ID and OH.

States that net the deduction from premiums keep the premiums it no longer covers. That matches Form 7206's instructions: "any medical insurance payments not deductible on Schedule 1 (Form 1040), line 17, can be included as medical expenses on Schedule A (Form 1040)".

Data. In the default dataset (populace_us_2024, build populace-us-2024-spm-20260909), Microcosm already gives health_insurance_premiums only to self-employed people without their own ESI. Its attribution stage calls that "the conservative, incomplete proxy" for this bar and documents the spouse case as residual overbreadth. In the 2024 data that case is 75 records, 228,000 weighted people and $0.87 billion of premiums. This PR closes it.

Open PRs.

axiom: us/statute/26/162/l queued (TheAxiomFoundation/rulespec-us#1676; (l)(2)(B) addendum with monthly companion tests: TheAxiomFoundation/rulespec-us#1676 (comment))

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits October 11, 2026 16:21
… insurance deduction

26 U.S.C. 162(l)(2)(B) disallows the deduction for any month the taxpayer
is eligible for a subsidized plan of their own or their spouse's employer
(Form 7206 line 1). The premium base now leaves out the premiums of a
person who has or is offered employer coverage, whose employer pays part of
the premiums, or whose spouse on a joint return does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…oyer-plan bar

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…issue (#10124)

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