Skip to content

Route otherprop to rental_income for correct NIIT, suppress auto-QBID#961

Merged
PavelMakarchuk merged 1 commit into
mainfrom
otherprop-rental-niit
Jun 4, 2026
Merged

Route otherprop to rental_income for correct NIIT, suppress auto-QBID#961
PavelMakarchuk merged 1 commit into
mainfrom
otherprop-rental-niit

Conversation

@PavelMakarchuk

Copy link
Copy Markdown
Collaborator

Summary

  • Switch otherprop mapping from miscellaneous_income to rental_income in variable_mappings.yaml.
  • Set rental_income_would_be_qualified = False in policyengine_runner.py for any chunk where otherprop is non-zero.

Why

TAXSIM otherprop represents Schedule E passive property income (rents, royalties, trusts). Per IRC § 1411(c)(1)(A)(i) this income belongs in the NIIT base. The prior mapping to miscellaneous_income (PR #931) put it in AGI correctly but excluded it from gov.irs.investment.income.sources, so PE never applied the 3.8% NIIT.

PE-US rental_income is the natural Schedule E concept — its gross_income/sources.yaml even comments # Royalties included in rental income. It is already in the NIIT base.

PR #931 deliberately avoided rental_income because PE-US auto-applies the 20% QBID to all rental, while TAXSIM only triggers QBID via the explicit pbusinc input. PE-US's qualified_business_income formula gates each source on a <source>_would_be_qualified boolean. Setting rental_income_would_be_qualified = False for TAXSIM-routed rental aligns with the TAXSIM convention and is statutorily defensible: § 199A(c)(3)(A) requires a qualified trade or business under § 162, which passive individual rental generally does not satisfy without the § 1.199A-1(b)(14) safe harbor that TAXSIM input cannot signal.

Statute / source-code evidence

  • TAXSIM probe: otherprop=$1M, no other incomefiitax=$353,188, niit=$30,400 (= 3.8% × ($1M − $200K threshold)). Confirms otherprop is in TAXSIM's NIIT base.
  • TAXSIM Fortran law87.for:1986: dinc = max(0, d(14)+d(12)+capgn+schede - d(213)). schede = d(73..79) (rent, royalty, partnership, trust, S-corp per estate.for:24-31).
  • PE-US parameters/gov/irs/investment/income/sources.yaml: rental_income is in the NIIT base.
  • PE-US parameters/gov/irs/gross_income/sources.yaml: rental_income # Royalties included in rental income.

Smoke test

otherprop=$1M, single age 45, no other income → PE fiitax=$353,186, niit=$30,400 (TAXSIM $353,188 / $30,400). Exact match; no spurious QBID.

eCPS n=2000 TY 2025 (non-S-corp, opt1=30, --disable-salt --assume-w2-wages)

Metric Baseline (#931) This PR Δ
Federal $$ off $4,218,673 $432,768 −$3,786K (−89.7%)
Federal $15 match 92.0% 93.6% +1.6pp
Federal 1%-AGI match 98.6% 99.9% +1.3pp
State $$ off $121,528 $124,685 +$3K (noise)
>$1M bucket $$ off $3,809,042 $329,279 −$3,480K (−91.4%)

By income bucket (federal $15 match rate)

Bucket n Baseline This PR Δpp
≤$25K 560 100.0% 100.0% +0.0
$25–50K 390 99.2% 99.7% +0.5
$50–100K 374 97.3% 98.9% +1.6
$100–250K 293 90.8% 94.9% +4.1
$250K–1M 74 16.2% 20.3% +4.1
>$1M 36 0.0% 11.1% +11.1

Known follow-up items

Two narrow regressions to investigate post-merge (combined $123K vs $3.79M closed):

  • 2 IL records (taxsimid 13544402, 10430302) overshoot — PE now applies NIIT but appears to double-count by ~$260K and ~$0K respectively relative to the baseline offset
  • 2 UT records with otherprop=$0 regress by $1,412 each on state tax — chunk-level QBI gate override may be touching them

Test plan

  • Existing test suite (running)
  • Synthetic NIIT probe matches TAXSIM exactly ($353,186 vs $353,188)
  • eCPS n=2000 confirms 89.7% federal $$ reduction with no per-bucket regression

TAXSIM input field 15 (otherprop) represents Schedule E passive
property income — rents, royalties, trusts. Per IRC § 1411(c)(1)(A)(i)
this belongs in the NIIT base. The prior mapping to
miscellaneous_income (PR #931) flowed correctly into AGI but missed
NIIT entirely, driving roughly $3.5M of federal mismatch
concentrated in the >$1M income bucket.

Switch the mapping to rental_income (the PE-US Schedule E concept,
which explicitly includes royalties and is already in
gov.irs.investment.income.sources). Avoid the QBID over-application
that motivated #931 by setting rental_income_would_be_qualified to
False whenever otherprop is present in the chunk; § 199A(c)(3)(A)
requires the activity to rise to a § 162 trade or business, which
TAXSIM input never signals.

eCPS n=2000 2025 (non-S-corp):
  Federal $$ off:    $4,218,673 → $432,768  (−89.7%)
  Federal $15 match:      92.0% → 93.6%
  Federal 1%-AGI match:   98.6% → 99.9%
  >$1M bucket $$ off: $3,809,042 → $329,279

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 4, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
policyengine-taxsim Ready Ready Preview, Comment Jun 4, 2026 12:59am

Request Review

@PavelMakarchuk PavelMakarchuk merged commit fdd35a0 into main Jun 4, 2026
12 checks passed
@PavelMakarchuk PavelMakarchuk deleted the otherprop-rental-niit branch June 4, 2026 01:31
PavelMakarchuk added a commit that referenced this pull request Jun 4, 2026
policyengine-us 1.711.0 includes PR #8564 which unwires the Utah
Homeowner/Renter Relief credit from TC-40 refundable credits. Utah
Code § 59-2A-205 (homeowner) and § 59-2A-305 (renter) administer the
Circuit-Breaker credit on TC-90H and TC-90CB respectively — separate
refund applications — and the TC-40 income-tax instructions for tax
year 2025 carry no reference to either form. The fix removes a
phantom $1,412 refundable credit that PE-US 1.710.6 was applying to
qualifying UT seniors and pulls the credit back through the existing
state_property_tax_credits aggregate (sptcr / v40).

Also add a small regression test pinning the TAXSIM `otherprop` →
PE-US `rental_income` routing introduced in PR #961:
  • IRC § 1411(c)(1)(A)(i) rents/royalties in NIIT base
  • Form 8960 Line 4a
  • TAXSIM-35 binary smoke test ($1M otherprop single → fiitax
    $353,188, NIIT $30,400)
The QBID gate override in policyengine_runner.py is asserted by the
fiitax target — auto-QBID on rental_income would knock the fiitax by
roughly $170K, well outside the $50 tolerance.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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