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)
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 → binaryniit = 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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- 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