Repository navigation
Conversation
Publication 596 Worksheet 1 lines 11 and 12 name Schedule E line 34a column (d) and line 34b column (c), the passive income and loss from estates and trusts, and line 13 nets them with the other passive activities before the zero floor. The passive basket left them out. Add passive_estate_income, the section 469 passive part of estate_income, defaulting to all of it as the model treats its undifferentiated rental income, and net it in the passive basket over the head and spouse. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SOI Publication 4801 (tax year 2023) puts 38% of positive Schedule E Part III income in the passive column (d), so most estate and trust income is nonpassive and estate_income alone does not establish passive income. Make passive_estate_income a pure input defaulting to zero, like passive_partnership_s_corp_income. A formula default also misbehaved in core: once any member set the input, every member who left it unset got zero rather than the formula. Add YAML cases at the 2024 $11,600 boundary, a property-based test of the estate-specific invariants, and estate income in the Worksheet 1 differential test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 2024 EITC table and the $11,600 investment income limit (section 3.06) are on PDF page 9 of Rev. Proc. 2023-34, not page 10. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- passive_estate_income: column (c) also takes box 9 deductions, box 5 goes only to column (f), and cite the Schedule K-1 (Form 1041) form page that maps boxes to columns. - estate_income: point to passive_estate_income for the passive part. - YAML: add the missing "Before" notes. - Drop the separate invariants file, which the extended Worksheet 1 differential already implies, per the repo's CI cost rule; keep its basket-isolation assertion in the differential test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
marked this pull request as ready for review
October 13, 2026 07:37
Contributor
Author
Hand-off to the US + core hub
🤖 Generated with Claude Code |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changes
The EITC investment income test now counts passive income and losses from estates and trusts.
eitc_relevant_investment_incomenets a new person-level input,passive_estate_income, with rental, farm rental and passive partnership and S corporation income in the passive basket (Publication 596 Worksheet 1 lines 11–13). It sums the head's and spouse's amounts and floors the total at zero. A passive estate or trust loss therefore offsets other passive income, but never interest, dividends or capital gains.passive_estate_incomeis the section 469 passive subset ofestate_income: Schedule E Part III line 34a column (d) less line 34b column (c). It defaults to zero, likepassive_partnership_s_corp_income.estate_incomeitself (the Part III total in AGI since #9633) is unchanged.Part of #9635, which listed this as a known gap: "Passive estate and trust income or loss (Schedule E lines 34a/34b) is not in the basket."
What the sources say
So only columns (d) and (c) belong in the passive basket, not the Part III total.
Why the passive part defaults to zero
estate_incomehas no passive split, so I needed a default. Most Part III income is nonpassive. SOI Publication 4801 (Rev. 6-2026, tax year 2023, PDF page 50) shows column (d) passive income of $19.0 billion against column (f) nonpassive income of $31.1 billion. That puts 37.9% of positive Part III income in the passive column. On page 49, 277,770 returns report passive income and 451,903 report nonpassive income.Treating all of
estate_incomeas passive, as the model does for its undifferentiated rental income, would therefore overstate disqualified income for most beneficiaries. That would wrongly deny the credit to someone whose trust income is an annuity or an inherited IRA's distribution. The worksheet itself also starts from the passive columns. Sopassive_estate_incomedefaults to zero, and the data layer can impute the split (a follow-up is proposed).I first tried a formula default (all of
estate_income, overridable). The differential test showed it is unsafe in policyengine-core. Once any person in a simulation sets the input, every person who left it unset getsdefault_value(0), not the formula. That includes people in other households.simulation_builder.pyfills a whole-population default array and sets it as input. A pure input with default zero has no such trap.estate_income_niit_magi_adjustmenthas the same latent problem; a separate fix is proposed.Tests
YAML cases.
eitc_investment_income_estate_trust.yamlhas 17 hand-computed cases at the 2024 $11,600 limit:On main's formula, 10 cases fail (each carries a "Before" note) and 7 pass.
Differential test.
test_dependent_eitc_investment_income_invariants.pynow covers estate and trust income. Its Hypothesis batches and seeded 200-unit population drawestate_incomeandpassive_estate_incomefor filers and dependents. The passive amount is unset, all, half or none of the estate amount, or an unrelated signed amount, so each simulation mixes people who set the input with people who don't. Each tax unit's result must equal an independent numpy computation of Worksheet 1 over the head and spouse. The seeded population has 8 (2021) and 4 (2025) units whose eligibility turns on the passive estate amount. A new bound checks that no passive loss reaches the interest or capital gain baskets.Mutation checks. On the YAML and the differential, the tests catch each of these:
estate_incomeas passive;Other suites. The surrounding EITC and income YAML suites pass (660 cases).
Invariants
These hold for every tax unit. The extended differential checks each one on every drawn unit, because it asserts the exact Worksheet 1 value. The YAML cases pin the legal mapping by hand, and they also check the AGI half of invariant 1, which the differential doesn't assert.
estate_incomemoves AGI, but onlypassive_estate_incomemoves the test.CI cost
The only Python test change extends
tests/core/test_dependent_eitc_investment_income_invariants.py, in the Restcoregroup. I measured it locally on macOS at a load average of about 20–30, so these aren't Linux CI numbers:The draws only add inputs to the same simulations, so the change is not measurable. I dropped a separate invariants file I had first written, because the differential already implies its properties (repo CLAUDE.md, "Test design and CI cost").
Impact
There's no change in microsimulation aggregates. This is deduced, not run:
passive_estate_incomeis new, defaults to zero, and no Microcosm dataset carries it (git grep passive_estateon microcosmmainfinds nothing). Household results change only when a user enters it. When one does, the change reaches every credit that readseitc_relevant_investment_incomeoreitc_investment_income_eligible, whether directly or through the federal EITC. Direct readers include:calculate_eitc_like_amounthelper;Not in scope
Schedule K-1 box 5 royalties in Schedule E Part III column (f) are "rents or royalties" under 32(i)(2)(C) as the statute is written. Worksheet 1 line 8 reads only Part I royalties (line 23b), and the model has no separate lines 8–10 basket. This predates this PR.
Also
The 2024 Rev. Proc. 2023-34 links in
max_investment_income.yaml,max.yamlandphase_out/start.yamlpointed to PDF page 10. The 2024 EITC table and the $11,600 limit (§3.06) are on page 9.axiom: rulespec-us#1416 queued (extended with the estate and trust scope, a
review_findingaddendum and companion cases T1–T7: TheAxiomFoundation/rulespec-us#1416 (comment))🤖 Generated with Claude Code