Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Count partnership and S corporation income, farm rental income, capital gain distributions reported without Schedule D, Form 4797 gains and losses, and employer-plan disability benefits in person `market_income`, and so in SPM resources, since `spm_unit_taxes` already subtracted the tax on them (#9919). Household market income now also counts the last three, so the person and household lists match except for discharged debt. A new `other_net_gain_person` splits the tax unit's Form 4797 net gain or loss between the head and spouse. Programs whose income adds `market_income` (North Dakota's renter's refund, Washington's ECEAP and Missouri's Supplemental Nursing Care) and the ranking that picks which adults get a simulated marginal tax rate now see these sources too. North Dakota's renter's refund leaves out the disability benefits federal law excludes from income, as NDCC 57-02-08.1(5)(c) requires.
27 changes: 27 additions & 0 deletions docs/spm.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,33 @@ aggregates count actual `housing_assistance`; only SPM resources count
`spm_unit_capped_housing_subsidy`. The cap uses the canonical housing amount before
the final model storage conversion.

## Cash income in resources

SPM resources add person `market_income` and `spm_unit_benefits`, and
`spm_unit_taxes` subtracts the tax on every source of federal gross income. Each
source in `gov.irs.gross_income.sources` therefore needs a place in resources:
without one, the SPM takes a family's tax on the income and never counts the
income. `test_household_spm_resource_parity.py` maps each source to the variable
that counts its cash, and it fails when a new source has none. Market income
keeps a source's losses where the source has them, such as partnership, farm
rental and Form 4797 losses.

Three sources stay out of resources on purpose:

- `debt_relief`: discharged debt brings the family no cash.
- `taxable_roth_conversions`: a conversion moves savings from one retirement
account to another.
- `salt_refund_income`: the refund returns state or local tax from an earlier
year, and the SPM subtracts each year's tax as the family owes it.

Census money income leaves out capital gains
([CPS subject definitions](https://www.census.gov/programs-surveys/cps/technical-documentation/subject-definitions.html#incomemeasurement)).
PolicyEngine's market income counts realized capital gains, and it counts
capital gain distributions and Form 4797 gains alongside them, so resources hold
every gain whose tax the SPM subtracts. Disability benefits from an employer plan
count in full, the part federal tax exempts included, since Census lists
disability benefits among the sources of money income.

## Housing allocation and its assumptions

The country sums modeled `housing_assistance` within each household, then
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,20 @@ values:
- farm_operations_income
- farm_rent_income
- capital_gains
# Capital gain distributions reported without Schedule D.
- non_sch_d_capital_gains
# Form 4797 other gains and losses.
- other_net_gain_person
- interest_income
- rental_income
# Royalties included in rental income
- dividend_income
- pension_income
# Pension income includes annuities and endowment contracts
- military_retirement_income
# Disability benefits from an employer plan, taxable or not.
- disability_benefits
# Discharged debt. person market_income, and so SPM resources, leave it out.
- debt_relief
# Income from estates and trusts (Schedule E Part III), including income
# in respect of a decedent received through an estate or trust.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,3 +225,27 @@
output:
# Medical costs paid: 10,000 + 6,400 = 16,400.
nd_renters_refund_income: 13_600

- name: North Dakota counts partnership income and capital gain distributions from all sources (#9919).
period: 2025
input:
state_code: ND
partnership_income: 20_000
s_corp_income: -2_000
farm_rent_income: 1_500
non_sch_d_capital_gains: 500
output:
# NDCC 57-02-08.1(5)(c): income for the year from all sources.
nd_renters_refund_income: 20_000

- name: North Dakota leaves out disability benefits that federal law excludes from income.
period: 2025
input:
state_code: ND
employment_income: 10_000
disability_benefits: 12_000
tax_exempt_disability_benefits: 5_000
output:
# The 5,000 from a plan the recipient paid for is excluded by IRC
# 104(a)(3), and NDCC 57-02-08.1(5)(c) excludes it: 10,000 + 7,000.
nd_renters_refund_income: 17_000
Original file line number Diff line number Diff line change
Expand Up @@ -101,3 +101,63 @@
members: [parent, child]
output:
household_market_income: 75_000

- name: Partnership, S corporation and farm rental income are market income, with their signs.
period: 2026
input:
people:
person:
partnership_income: 40_000
s_corp_income: -5_000
farm_rent_income: 3_000
households:
household:
members: [person]
output:
household_market_income: 38_000

- name: Capital gain distributions reported without Schedule D are market income.
period: 2026
input:
people:
person:
non_sch_d_capital_gains: 2_500
households:
household:
members: [person]
output:
household_market_income: 2_500

- name: Employer disability benefits are market income, taxable or not.
period: 2026
input:
people:
person:
disability_benefits: 9_000
tax_exempt_disability_benefits: 9_000
households:
household:
members: [person]
output:
taxable_disability_benefits: 0
household_market_income: 9_000

- name: Form 4797 gains are market income for the household as a whole.
period: 2026
input:
people:
head:
age: 50
is_tax_unit_head: true
spouse:
age: 48
is_tax_unit_spouse: true
tax_units:
tax_unit:
members: [head, spouse]
other_net_gain: 8_000
households:
household:
members: [head, spouse]
output:
household_market_income: 8_000
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,86 @@
ak_permanent_fund_dividend: 1_000
market_income: 1_000
household_market_income: 1_000

- name: Partnership and S corporation income is market income, with its sign.
period: 2026
input:
partnership_income: 50_000
s_corp_income: -20_000
output:
partnership_s_corp_income: 30_000
market_income: 30_000

- name: Farm rental income is market income, with its sign.
period: 2026
input:
employment_income: 30_000
farm_rent_income: -4_000
output:
market_income: 26_000

- name: Capital gain distributions reported without Schedule D are market income.
period: 2026
input:
non_sch_d_capital_gains: 1_200
output:
market_income: 1_200

- name: Employer disability benefits are market income, taxable or not.
period: 2026
input:
disability_benefits: 12_000
tax_exempt_disability_benefits: 5_000
output:
taxable_disability_benefits: 7_000
market_income: 12_000

- name: A Form 4797 loss is split between the head and spouse, and not the dependent.
period: 2026
input:
people:
head:
age: 50
is_tax_unit_head: true
spouse:
age: 48
is_tax_unit_spouse: true
child:
age: 10
is_tax_unit_dependent: true
tax_units:
tax_unit:
members: [head, spouse, child]
other_net_gain: -6_000
output:
other_net_gain_person: [-3_000, -3_000, 0]
other_net_gain_gross_income: [0, 0, 0]
market_income: [-3_000, -3_000, 0]

- name: A Form 4797 gain is split between the head and spouse, and both parts are gross income.
period: 2026
input:
people:
head:
age: 50
is_tax_unit_head: true
spouse:
age: 48
is_tax_unit_spouse: true
tax_units:
tax_unit:
members: [head, spouse]
other_net_gain: 10_000
output:
other_net_gain_person: [5_000, 5_000]
other_net_gain_gross_income: [5_000, 5_000]
market_income: [5_000, 5_000]

- name: A single filer's Form 4797 gain is all theirs.
period: 2026
input:
other_net_gain: 7_500
output:
other_net_gain_person: 7_500
other_net_gain_gross_income: 7_500
market_income: 7_500
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,38 @@
state_code: WA
output:
spm_unit_market_income: 0

- name: Partnership income and employer disability benefits reach SPM unit market income.
period: 2026
input:
people:
parent:
age: 45
partnership_income: 287_010
grandparent:
age: 70
disability_benefits: 6_000
spm_units:
spm_unit:
members: [parent, grandparent]
households:
household:
members: [parent, grandparent]
state_code: TN
output:
spm_unit_market_income: 287_010 + 6_000
household_market_income: 287_010 + 6_000

- name: A farm rental loss and capital gain distributions reach SPM unit market income.
period: 2026
input:
people:
person:
age: 60
farm_rent_income: -2_000
non_sch_d_capital_gains: 3_500
spm_units:
spm_unit:
members: [person]
output:
spm_unit_market_income: 1_500
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,25 @@
spm_unit_spm_expenses: 0
output:
spm_unit_net_income: 1 + 2 + 3 + 4 + 5 + 6

- name: Partnership income below the standard deduction is all SPM net income (#9919).
period: 2026
input:
people:
person:
age: 40
partnership_income: 10_000
spm_units:
spm_unit:
members: [person]
takes_up_snap_if_eligible: false
households:
household:
members: [person]
state_code: TN
output:
spm_unit_market_income: 10_000
spm_unit_benefits: 0
spm_unit_taxes: 0
spm_unit_spm_expenses: 0
spm_unit_net_income: 10_000
Loading
Loading