-
Notifications
You must be signed in to change notification settings - Fork 203
Description
Summary
dc_self_employment_loss_addition computes the DC AGI addition from the raw self_employment_income, not from the amount of SE loss actually reflected in federal AGI. When combined with the federal §461(l) excess business loss limitation (which caps the deductible loss), this creates absurdly large positive DC AGI on taxpayers with large negative income.
Example (from policyengine-taxsim#684)
Input: Single, age 40, DC, self-employment income = -$25,000,000. No other income.
PE computes:
- Federal AGI: -$305,000 (correct — §461(l) limits loss to $305K for single filers)
- DC SE loss addition: max(0, $25,000,000 - $12,000) = $24,988,000
- DC AGI: -$305,000 + $24,988,000 = $24,683,000
- DC income tax: $2,635,878
Correct:
- DC SE loss addition should be: max(0, $305,000 - $12,000) = $293,000 (only add back what was actually deducted from federal AGI)
- DC AGI: -$305,000 + $293,000 = -$12,000
- DC income tax: $0
Root Cause
In policyengine_us/variables/gov/states/dc/tax/income/additions/dc_self_employment_loss_addition.py, line 17:
loss_person = max_(0, -person("self_employment_income", period)) # Uses raw SE loss ($25M)This uses the raw self_employment_income regardless of how much loss actually made it into federal AGI. The federal loss_ald variable caps the deductible SE loss at the §461(l) threshold ($305K for single, $610K for MFJ in 2024), but the DC addition ignores this cap and adds back the full raw loss minus the $12K DC threshold.
Background
The $12,000 threshold comes from DC's unincorporated business franchise tax (D-30). SE income/loss above $12,000 should be reported on D-30, not D-40. So D-40 adds back excess SE losses as a DC AGI addition. This is correct in principle, but the addition must be limited to the SE loss amount actually present in federal AGI (the starting point for DC AGI computation).
Suggested Fix
The DC SE loss addition should be capped at the amount of SE loss that actually flowed through loss_ald into federal AGI:
def formula(person, period, parameters):
# Raw SE loss
loss_person = max_(0, -person("self_employment_income", period))
loss_taxunit = person.tax_unit.sum(loss_person)
# Cap at the SE loss actually deducted from federal AGI (via loss_ald)
loss_ald = person.tax_unit("loss_ald", period)
# loss_ald includes both SE and capital losses; isolate SE portion
limited_capital_loss = person.tax_unit("limited_capital_loss", period)
se_loss_in_ald = max_(0, loss_ald - limited_capital_loss)
effective_loss = min_(loss_taxunit, se_loss_in_ald)
p = parameters(period).gov.states.dc.tax.income.additions
addition_taxunit = max_(0, effective_loss - p.self_employment_loss.threshold)
# ... rest of allocation logic unchangedRelated Issues
- policyengine-us#7015 — Partnership/S-corp losses not included in AGI (related §461(l) interaction)
- DC sngl 2024 -2500Kpsemp policyengine-taxsim#684
Files to Fix
policyengine_us/variables/gov/states/dc/tax/income/additions/dc_self_employment_loss_addition.py