PolicyEngine / PolicyEngine/policyengine-taxsim

S-corp income: emulator treats scorp as active (no NIIT, no passive-loss limit); TAXSIM treats it as passive (3.8% NIIT)

Open
#1,053 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
17
Forks
10
Avg merge
15h 55m
Merged PRs (30d)
1

Description

Surfaced while reviewing #1051 (which fixes QBID routing for pass-through inputs but explicitly defers the passive/active question to a tax-expert review). This tracks the remaining S-corp divergence.

NIIT

The taxsimtest binary treats scorp as passive net investment income and applies the 3.8% NIIT:

  • scorp = $300,000, single, TY2025 → binary niit = 3,800.00 (3.8% × ($300k − $200k)).

PolicyEngine treats S-corp income as active (material participation) — net_investment_income = 0, so NIIT = $0 — for both s_corp_income and partnership_s_corp_income. (Note: #1051's description of partnership_s_corp_income as "NIIT-eligible" does not match PE's actual behavior — it applies no NIIT.)

Passive-loss limitation (§469)

Related: PE allows a $100k S-corp loss to fully offset other income (no §469 limitation); if scorp is passive, TAXSIM may limit it. Tracked alongside #1003.

Prevalence

15.6% of all eCPS records have |scorp| > $200,000 (66.5% of scorp records), so the NIIT divergence is material, not an edge case — though the exact per-record impact interacts with the §199A wage limit / --assume-w2-wages handling at high income.

The question (needs the tax-expert read @feenberg flagged)

Should the emulator treat TAXSIM scorp as passive (→ NIIT + §469 passive-loss limitation) or active? This depends on what taxsimtest assumes about material participation for S-corp income. Once decided, the fix is to set the appropriate passive/material-participation characteristic on the mapped PE variable.

Related: #384 (FICA/QBI umbrella), #1003 (pass-through losses), #1018 (scorp characteristics), #1051 (QBID routing, merged).

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by comparing the taxsimtest binary's scorp behavior with the PolicyEngine mappings for s_corp_income and partnership_s_corp_income. Get the flagged tax-expert decision on material participation before changing anything. Done means the chosen passive or active treatment consistently matches NIIT and §469 behavior, with the relevant mapping tests updated.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
backend, fintech-quant
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.