Repository navigation
Conversation
… benefits veterans_benefits and railroad_benefits reached neither household_benefits nor spm_unit_benefits, so neither net income nor SPM resources counted them. Census P60-200 Appendix A lists veterans' payments as a source of money income and counts railroad retirement among government transfers. Both now sit in household_benefits and spm_unit_benefits. Veterans' benefits stay out of federal gross income under 38 U.S.C. 5301(a)(1). Railroad benefits' federal tax treatment follows in a separate change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… parity test #10663 made the parity test require every source in gov.irs.gross_income.sources to name the SPM resource that counts its cash. railroad_benefits, which #10693 adds to spm_unit_benefits, holds the whole annuity; taxable_railroad_pension_benefits and taxable_railroad_social_security_equivalent_benefits tax its parts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Add veterans_benefits and railroad_benefits to the six reform copies of the benefit lists (BOOST, End Child Poverty Act, EDAA End Child Poverty Act, Texas rebate), which otherwise dropped both benefits and showed a false loss under each reform, and to SHARED_CASH_PROGRAMS so the guard catches a copy that drops them. - Narrow the veterans' benefits property test to gross income and AGI, checking income tax only when neither household itemizes: the IRS counts veterans' benefits as income for the optional sales tax tables. New state_sales_tax.yaml cases show the 2025 Texas row moving. - Keep Combat-Related Special Compensation in veterans_benefits, as military_retirement_pay directs, and point VA education benefits and dependency and indemnity compensation, and railroad survivor annuities, to their own variables. - Cite the Census appendix once, with its page range. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- veterans_benefits: is_veteran reads this input, so a survivor or dependent whose VA payments go here should set is_veteran to false. - disability_benefits: VA disability compensation goes in veterans_benefits. - SSI unearned sources note: household net income now counts railroad benefits; SNAP, HUD and the other program lists still don't (#10551). - Parity test docstring: list the two new invariants, and say the veterans' income tax check covers filers under 65 without a disability, since the model doesn't yet reduce the section 22 credit by VA pensions (26 U.S.C. 22(c)(3)(A)(i)(III)). - Sales tax test comment: the table gives the amount a filer may deduct. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main's property tax credit invariant keeps number 7 in test_household_spm_resource_parity.py; this branch's two invariants become 8 and 9. test_aggregate_list_integrity.py lists the benefits beside main's state_property_tax_refunds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Review: Count veterans' and railroad retirement benefits in household and SPM benefitsSummaryThe PR adds Census counts both as money income, and the SPM starts from money income, so the treatment is right. I found no double count with #10696, which is stacked on this head, or with #10764. #10662 conflicts textually in six files (see Branch status). Two items need changes:
I did not run Python. The claims below rest on reading the code at the head, hand traces, the cited primary sources, and CI run 43118653441 at this head. The PR body's microsimulation figures and its account of how Microcosm fills these variables are taken as stated, not re-run. Critical (must fix)None. Should address1. New documentation sends VA education benefits into a variable SNAP counts as income (
Fix: Drop "education allowances" from the Related, and not a finding against this PR: RRB survivor annuities count for SNAP as 2. The new property tests add about two minutes per CI run and mostly repeat existing coverage ( CLAUDE.md, "Test design and CI cost", says: "Do not add a Python test when the existing YAML framework can exercise the same behavior", and "explain the distinct failure the new test detects." In run 43118653441 at this head (Rest, Python shard 7), the two new tests took 88.0 s and 34.8 s.
Suggestions
Verified correct
Axiom line assessment
CI statusAll 36 checks pass at fb34f7c (run 43118653441, started 2026-11-11 23:17 UTC; rechecked 2026-11-13). That run includes the PR validation and guard job, all Baseline and Contrib shards, Python Rest shards 1-9, Microsimulation, and Household API Partners. Branch status
Verdict: REQUEST_CHANGES |
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes: 0 critical, 2 should address, 3 suggestions (details in the report above). The substance is right. Census money income counts VA payments and railroad retirement, the SPM starts from money income, each benefit is counted once, and all six reform copies are updated.
- The new documentation sends VA education benefits to
veterans_benefits, which SNAP counts in full. 7 U.S.C. 2014(d)(3) and 7 CFR 273.9(c)(3)(i) exclude them, and the model keepseducational_assistanceout of SNAP, so they belong there. - The two new Hypothesis tests add about 123 s per CI run, and they mostly repeat YAML and existing coverage. That runs against CLAUDE.md's test-design rules. Adding the two benefits to
CASH_PAYMENTSand moving the income-tax check to YAML would cover the same ground.
What changes
On main, $10,000 of
veterans_benefitsor ofrailroad_benefitschanges neitherhousehold_net_incomenorspm_unit_net_income, because no benefit or market income list includes either variable.workers_compensation, by contrast, counts in both.In P60-200 Appendix A, the Census Bureau counts veterans' payments as money income (page 3) and U.S. railroad retirement as a nonmeans-tested government transfer (page 4). This PR adds both variables to
gov.household.household_benefitsandspm_unit_benefits. Four reforms swap in their own copies of those lists: the BOOST Middle Class Tax Credit, the End Child Poverty Act, that act's version in the Economic Dignity for All Agenda, and the Texas rebate check. The PR adds both benefits to all six copies, so each reform counts them as the baseline does.Double counting
veterans_benefitsfrom the ASEC veterans' payments field (VET_VAL), and no other model input carries those dollars. It fillsdisability_benefitsfrom the ASEC disability income fields andeducational_assistancefrom ED_VAL. It leavessurvivor_benefitsat zero, because its ASEC files hold survivor income only as family and household totals.railroad_benefits, so this PR moves no national total through railroad benefits. The variable's documentation tells users to enter Railroad Retirement Board payments only inrailroad_benefits, not also as Social Security, pension, disability or survivor income.veterans_benefitsnow covers Combat-Related Special Compensation (CRSC), asmilitary_retirement_payalready directs. The military departments pay CRSC to retirees under 10 U.S.C. 1413a, and the IRS lets them exclude it from income (Publication 525, page 19).educational_assistanceandsurvivor_benefitsnow sends VA education benefits and VA dependency and indemnity compensation toveterans_benefits, and Railroad Retirement Board survivor annuities torailroad_benefits, so a user enters each payment once.Invariants
household_benefitsandspm_unit_benefits, and so to market income plus benefits for the household and the SPM unit. A property test checks this over states and amounts.irs_gross_incomeoradjusted_gross_income, and they leave federalincome_taxunchanged for a filer who doesn't itemize (property test over amounts, earnings and states). The IRS bases a filer's row in the optional sales tax tables on AGI plus nontaxable income, veterans' benefits included (2025 Instructions for Schedule A, page 5). The model already adds them there, so they can lower income tax for an itemizer who deducts sales tax. For example, in two newstate_sales_tax.yamlcases, $30,000 of veterans' benefits raises the 2025 table amount for a Texas filer with $100,000 of AGI from $931 to $992.test_aggregate_list_integrity.pynow requires.test_household_spm_resource_parity.pyrecords a reason, so that test keeps passing.Tests
household_benefits.yamlandspm_unit_benefits.yaml, both benefits count for one household and for two SPM units in one household. In a newirs_gross_income/veterans_benefits.yaml, VA benefits stay out of gross income with and without earnings. Those three files, withstate_sales_tax.yamlandstate_sales_tax_income_bracket.yaml, hold 192 cases, and all pass locally.test_household_spm_resource_parity.pycheck invariants 1 and 2 against a twin household without the benefit. All 63 tests in that file pass locally and in CI run 42509094977.test_aggregate_list_integrity.pypass, and two of them fail when one reform's copies leave the benefits out. For a Texas adult with $500,000 of earnings in 2027, $10,000 of either benefit adds $10,000 tohousehold_benefitsandspm_unit_benefitsunder each of the four reforms, as it does in the baseline.The two new parity tests add about 100 seconds to Linux CI: 73.8 and 30.9 seconds in run 42509094977 at this head, and 70.8 and 27.5 seconds in run 42425411534 at f3dc6cd. At this head, the parity file's 63 tests took 369.9 seconds in the
rest-python-remaining-2group, which ran 71 files in 29 minutes 33 seconds and peaked at 6.01 GiB of memory. On main (run 42478927603 at 06553a9), its 61 tests took 196.3 seconds inrest-python-remaining-1, which ran 71 files in 22 minutes 32 seconds and peaked at 6.15 GiB. CI put the file in a different group in each run, so the group figures don't compare directly. The 61 tests that main also runs took 265.2 seconds at this head, against 196.3 on main. On a shared Mac (load about 20), with setup included, the file took 158 seconds and 1.99 GiB at main and 197 seconds and 2.01 GiB at this head. The guard file's 31 tests take 0.6 seconds.Impact
We ran the 2026 microsimulation on
hf://datasets/policyengine/populace-us/populace_us_2024.h5@populace-us-2024-spm-20260909twice, at main (06553a9) and at this head (e7ddd42). We estimate that counting veterans' benefits adds $130.3 billion tohousehold_benefits,spm_unit_benefitsand both net incomes, and leaves every federal and state tax total unchanged. The pinned file carries no railroad benefits, so they add nothing nationally.We estimate that SPM net income rises for all 13.6 million people in SPM units with veterans' benefits and stays the same for everyone else. Of them, 671,000 leave SPM poverty, no one enters it, and the poverty gap falls by $4.7 billion, to $258.0 billion.
axiom: n/a: income totals only; no tax or benefit rule changes.
🤖 Generated with Claude Code