From 3c3f1cb0554f1a5893873f4e953a738e75ea2260 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 2 Jul 2026 07:36:44 +0200 Subject: [PATCH 1/3] Include non-Schedule-D capital gain distributions in gross income and NII non_sch_d_capital_gains (capital gain distributions reported on Form 1040 line 7 without Schedule D, PUF E01100) was populated in the enhanced CPS and referenced by the QDCGT worksheet (dwks09/dwks10), but never entered gross income or net investment income, so it was never taxed. Add it to gov.irs.gross_income.sources and gov.irs.investment.income.sources. On the 2026 enhanced CPS this raises federal income tax by $2.07B (incl. $0.10B NIIT) and state income tax by $0.42B via AGI conformity, across 4.0M tax units. Fixes #8828 Co-Authored-By: Claude Opus 4.8 --- changelog_entry.yaml | 4 ++ .../gov/irs/gross_income/sources.yaml | 2 + .../gov/irs/investment/income/sources.yaml | 2 + .../integration/non_sch_d_capital_gains.yaml | 69 +++++++++++++++++++ .../baseline/gov/irs/irs_gross_income.yaml | 7 ++ 5 files changed, 84 insertions(+) create mode 100644 changelog_entry.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/irs/integration/non_sch_d_capital_gains.yaml diff --git a/changelog_entry.yaml b/changelog_entry.yaml new file mode 100644 index 00000000000..9b6acfd3e2e --- /dev/null +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: patch + changes: + fixed: + - Include capital gain distributions received without Schedule D (non_sch_d_capital_gains) in IRS gross income and net investment income. diff --git a/policyengine_us/parameters/gov/irs/gross_income/sources.yaml b/policyengine_us/parameters/gov/irs/gross_income/sources.yaml index 43dde4ce80a..070cdb0b56a 100644 --- a/policyengine_us/parameters/gov/irs/gross_income/sources.yaml +++ b/policyengine_us/parameters/gov/irs/gross_income/sources.yaml @@ -9,6 +9,8 @@ values: - farm_rent_income - other_net_gain_gross_income - capital_gains + - non_sch_d_capital_gains + # Capital gain distributions received without filing Schedule D (Form 1040 line 7). - taxable_interest_income - rental_income # Royalties included in rental income diff --git a/policyengine_us/parameters/gov/irs/investment/income/sources.yaml b/policyengine_us/parameters/gov/irs/investment/income/sources.yaml index 782e0ad63f2..ef5b0eb67b7 100644 --- a/policyengine_us/parameters/gov/irs/investment/income/sources.yaml +++ b/policyengine_us/parameters/gov/irs/investment/income/sources.yaml @@ -5,6 +5,8 @@ values: - dividend_income - rental_income - loss_limited_net_capital_gains + - non_sch_d_capital_gains + # Capital gain distributions received without filing Schedule D (Form 1040 line 7). metadata: unit: currency-USD label: net investment income sources diff --git a/policyengine_us/tests/policy/baseline/gov/irs/integration/non_sch_d_capital_gains.yaml b/policyengine_us/tests/policy/baseline/gov/irs/integration/non_sch_d_capital_gains.yaml new file mode 100644 index 00000000000..3543caf8149 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/irs/integration/non_sch_d_capital_gains.yaml @@ -0,0 +1,69 @@ +- name: Case 1, wages plus capital gain distributions without Schedule D. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + is_tax_unit_head: true + age: 40 + employment_income: 60_000 + non_sch_d_capital_gains: 5_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX # no state income tax + output: + # Distributions enter AGI: 60,000 + 5,000. + adjusted_gross_income: 65_000 + # And the QDCGT worksheet taxes them at preferential rates. + dwks10: 5_000 + # They are net investment income (below the NIIT MAGI threshold here). + net_investment_income: 5_000 + net_investment_income_tax: 0 + +- name: Case 2, capital gain distributions below the standard deduction owe no tax. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + is_tax_unit_head: true + age: 70 + non_sch_d_capital_gains: 5_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX # no state income tax + output: + adjusted_gross_income: 5_000 + income_tax: 0 + +- name: Case 3, capital gain distributions are subject to NIIT above the MAGI threshold. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + is_tax_unit_head: true + age: 45 + employment_income: 300_000 + non_sch_d_capital_gains: 10_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX # no state income tax + output: + adjusted_gross_income: 310_000 + dwks10: 10_000 + net_investment_income: 10_000 + # 3.8% x min(NII 10,000, MAGI 310,000 - 200,000 threshold) = 380. + net_investment_income_tax: 380 diff --git a/policyengine_us/tests/policy/baseline/gov/irs/irs_gross_income.yaml b/policyengine_us/tests/policy/baseline/gov/irs/irs_gross_income.yaml index 3e8c504fc02..66ab14a9b70 100644 --- a/policyengine_us/tests/policy/baseline/gov/irs/irs_gross_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/irs/irs_gross_income.yaml @@ -65,3 +65,10 @@ output: # expected results from online TAXSIM35 10/24/22 version taxsim_tfica: 0.00 income_tax: -1400.00 + +- name: IRS gross income includes capital gain distributions not reported on Schedule D. + period: 2026 + input: + non_sch_d_capital_gains: 5_000 + output: + irs_gross_income: 5_000 From 40a24b898114c4f30aaffaa7495b1de9e97fe5b7 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 2 Jul 2026 08:17:27 +0200 Subject: [PATCH 2/3] Use changelog.d fragment instead of changelog_entry.yaml Co-Authored-By: Claude Opus 4.8 --- changelog.d/e01100-agi-inclusion.fixed.md | 1 + changelog_entry.yaml | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) create mode 100644 changelog.d/e01100-agi-inclusion.fixed.md delete mode 100644 changelog_entry.yaml diff --git a/changelog.d/e01100-agi-inclusion.fixed.md b/changelog.d/e01100-agi-inclusion.fixed.md new file mode 100644 index 00000000000..da35fbfae7a --- /dev/null +++ b/changelog.d/e01100-agi-inclusion.fixed.md @@ -0,0 +1 @@ +Include capital gain distributions received without Schedule D (non_sch_d_capital_gains) in IRS gross income and net investment income. diff --git a/changelog_entry.yaml b/changelog_entry.yaml deleted file mode 100644 index 9b6acfd3e2e..00000000000 --- a/changelog_entry.yaml +++ /dev/null @@ -1,4 +0,0 @@ -- bump: patch - changes: - fixed: - - Include capital gain distributions received without Schedule D (non_sch_d_capital_gains) in IRS gross income and net investment income. From 78ce0ca2e35119dc75c0f6d0e44ca9904a6a1366 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 4 Jul 2026 22:21:07 -0400 Subject: [PATCH 3/3] Route non-Schedule-D distributions into the preferential-rate base Adding the distributions only to gross income taxed them at ordinary rates: capital_gains_tax and the taxable-income exclusion key off net_capital_gain, which did not include them, while the dwks worksheet that did feeds only the AMT comparison. Include them in net_capital_gain (long-term by IRC 852(b)(3)(B), no Schedule D netting on the line 7 path), pin ordinary-vs-preferential splits in the integration tests, and restate the 2026 revenue effect at $1.20B (8.8% effective rate on the $13.69B base), down from the $2.07B ordinary-rate figure. Co-Authored-By: Claude Fable 5 --- changelog.d/e01100-agi-inclusion.fixed.md | 2 +- .../integration/non_sch_d_capital_gains.yaml | 52 ++++++++++++++++++- .../capital_gains/net_capital_gain.py | 7 ++- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/changelog.d/e01100-agi-inclusion.fixed.md b/changelog.d/e01100-agi-inclusion.fixed.md index da35fbfae7a..aad0fcc9066 100644 --- a/changelog.d/e01100-agi-inclusion.fixed.md +++ b/changelog.d/e01100-agi-inclusion.fixed.md @@ -1 +1 @@ -Include capital gain distributions received without Schedule D (non_sch_d_capital_gains) in IRS gross income and net investment income. +Included non-Schedule-D capital gain distributions in gross income, the preferential-rate capital gains base, and net investment income. diff --git a/policyengine_us/tests/policy/baseline/gov/irs/integration/non_sch_d_capital_gains.yaml b/policyengine_us/tests/policy/baseline/gov/irs/integration/non_sch_d_capital_gains.yaml index 3543caf8149..6cfbf35986a 100644 --- a/policyengine_us/tests/policy/baseline/gov/irs/integration/non_sch_d_capital_gains.yaml +++ b/policyengine_us/tests/policy/baseline/gov/irs/integration/non_sch_d_capital_gains.yaml @@ -18,12 +18,62 @@ output: # Distributions enter AGI: 60,000 + 5,000. adjusted_gross_income: 65_000 - # And the QDCGT worksheet taxes them at preferential rates. + # And the preferential-rate base, so ordinary tax excludes them. + net_capital_gain: 5_000 dwks10: 5_000 # They are net investment income (below the NIIT MAGI threshold here). net_investment_income: 5_000 net_investment_income_tax: 0 +- name: Case 1b, distributions are taxed at preferential rates, not ordinary rates. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + is_tax_unit_head: true + age: 40 + employment_income: 60_000 + non_sch_d_capital_gains: 10_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX # no state income tax + output: + # Taxable income 70,000 - 16,100 = 53,900; ordinary part 43,900 taxes + # identically to a wages-only return (5,020). + income_tax_main_rates: 5_020 + # Distributions straddle the 49,450 zero-rate breakpoint: 5,550 at 0% + # and 4,450 at 15% = 667.50. + capital_gains_tax: 667.50 + income_tax: 5_687.50 + +- name: Case 1c, distributions alone in the zero-rate bracket owe no tax. + absolute_error_margin: 0.01 + period: 2026 + input: + people: + person1: + is_tax_unit_head: true + age: 40 + non_sch_d_capital_gains: 30_000 + tax_units: + tax_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX # no state income tax + output: + adjusted_gross_income: 30_000 + # Taxable income 13,900 is entirely adjusted net capital gain below the + # 49,450 zero-rate breakpoint. + capital_gains_tax: 0 + income_tax: 0 + - name: Case 2, capital gain distributions below the standard deduction owe no tax. absolute_error_margin: 0.01 period: 2026 diff --git a/policyengine_us/variables/gov/irs/tax/federal_income/capital_gains/net_capital_gain.py b/policyengine_us/variables/gov/irs/tax/federal_income/capital_gains/net_capital_gain.py index 5756a71f121..b05d62b053d 100644 --- a/policyengine_us/variables/gov/irs/tax/federal_income/capital_gains/net_capital_gain.py +++ b/policyengine_us/variables/gov/irs/tax/federal_income/capital_gains/net_capital_gain.py @@ -30,4 +30,9 @@ def formula(tax_unit, period, parameters): lt_capital_gain - st_capital_loss - investment_income_election, ) qual_div_income = add(tax_unit, period, ["qualified_dividend_income"]) - return net_cap_gain + qual_div_income + # Capital gain distributions reported without Schedule D (Form 1040 + # line 7 with the box checked) are long-term gains under IRC + # 852(b)(3)(B) and enter the preferential-rate base directly, with no + # Schedule D netting available on that filing path. + non_sch_d_capital_gains = add(tax_unit, period, ["non_sch_d_capital_gains"]) + return net_cap_gain + qual_div_income + non_sch_d_capital_gains