Skip to content

Add a tax-only Roth conversion input#7946

Draft
MaxGhenis wants to merge 2 commits intomainfrom
codex/roth-conversions-benefits
Draft

Add a tax-only Roth conversion input#7946
MaxGhenis wants to merge 2 commits intomainfrom
codex/roth-conversions-benefits

Conversation

@MaxGhenis
Copy link
Copy Markdown
Contributor

@MaxGhenis MaxGhenis commented Apr 8, 2026

Summary

  • add a taxable_roth_conversions input variable for tax-only Roth conversion amounts
  • include that variable in IRS gross income without routing it through benefit-facing retirement-distribution income
  • add targeted policy tests for IRS gross income, SNAP unearned income, and SSI unearned income

Why

Downstream retirement modeling needs a way to represent direct Roth conversions that affect tax gross income without automatically treating them as spendable retirement-distribution income for means-tested benefits.

This keeps a cleaner separation between:

  • taxable Roth conversion amounts used for tax modeling
  • retirement distributions used in benefit income logic

That separation matches the legal structure more closely:

  • SSI uses its own income definition in 42 U.S.C. 1382a, not IRS gross income
  • SSI regulations exclude resource conversions from income in 20 CFR 416.1103(c)
  • SNAP uses its own income rules in 7 CFR 273.9; retirement benefits are listed in unearned income under 7 CFR 273.9(b)(2), while nonrecurring lump-sum payments are excluded from income under 7 CFR 273.9(c)(8)

This PR does not try to fully resolve every Roth-conversion treatment question for benefit programs. It just avoids forcing a tax-only Roth conversion input through retirement_distributions.

Verification

  • uv run policyengine-core test policyengine_us/tests/policy/baseline/household/income/person/retirement/taxable_roth_conversions.yaml -c policyengine_us
  • uv run policyengine-core test policyengine_us/tests/policy/baseline/gov/irs/irs_gross_income.yaml -c policyengine_us
  • uv run policyengine-core test policyengine_us/tests/policy/baseline/gov/ssa/ssi/income/ssi_unearned_income.yaml -c policyengine_us
  • uv run policyengine-core test policyengine_us/tests/policy/baseline/gov/usda/snap/income/snap_unearned_income.yaml -c policyengine_us
  • uv run python -m py_compile policyengine_us/variables/household/income/person/retirement/taxable_roth_conversions.py policyengine_us/tools/default_uprating.py

@codecov
Copy link
Copy Markdown

codecov bot commented Apr 8, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (cc51b69) to head (4abaf29).
⚠️ Report is 2977 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #7946   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            2         1    -1     
  Lines           43         8   -35     
=========================================
- Hits            43         8   -35     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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