Skip to content

DC self-employment loss addition uses raw SE loss instead of federally-deducted amount, causing massive positive DC AGI on negative income #7408

@PavelMakarchuk

Description

@PavelMakarchuk

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 unchanged

Related Issues

Files to Fix

  • policyengine_us/variables/gov/states/dc/tax/income/additions/dc_self_employment_loss_addition.py

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions