Skip to content

Comments

Fix TANF benefit cap across all 38+ states#7433

Closed
MaxGhenis wants to merge 5 commits intoPolicyEngine:mainfrom
MaxGhenis:fix-tanf-negative-income-cap
Closed

Fix TANF benefit cap across all 38+ states#7433
MaxGhenis wants to merge 5 commits intoPolicyEngine:mainfrom
MaxGhenis:fix-tanf-negative-income-cap

Conversation

@MaxGhenis
Copy link
Contributor

@MaxGhenis MaxGhenis commented Feb 19, 2026

Summary

  • Cap all state TANF benefit formulas to prevent negative countable income from inflating benefits above the maximum payment standard
  • Fixes NC TANF household size bare .sum() bug (summed across entire population instead of within SPM unit)
  • Adds min_(benefit, payment_standard) caps to 42 state TANF programs across both standard-named ({st}_tanf) and non-standard-named programs (AK ATAP, AR TEA, CT TFA, FL TCA, IA FIP, LA FITAP, MA TAFDC, MD TCA, MI FIP, MN MFIP, NE ADC, NH FANF, NJ WFNJ, NM Works, OH OWF, RI Works, UT FEP, VT Reach Up, WV Works, WY POWER)
  • Adds 7 YAML regression tests for negative income cap behavior

Impact

Metric Before After
Total TANF (microsim) $17.9T $32.1B
Max household TANF $12.9M $25,084
Max per-state TANF $117T (FL) $25K (CA)

The remaining gap ($32B vs ~$9B target) is a takeup issue — takes_up_tanf_if_eligible currently defaults to True for all eligible SPM units. Companion PR PolicyEngine/policyengine-us-data#542 adds a 22% TANF takeup rate to the calibration pipeline, which would bring the total to ~$5-7B pre-calibration.

Root cause

All state TANF formulas used max_(payment_standard - countable_income, 0) which correctly prevents benefits when income exceeds the payment standard, but does NOT prevent benefits from exceeding the payment standard when countable income is negative (e.g., from deductions, labor supply responses, or data issues). The fix adds min_(benefit, payment_standard) to cap the result.

Additionally, NC's nc_tanf_household_size used bare .sum() instead of spm_unit.sum(), summing eligible members across the entire population (42,874) instead of within each SPM unit.

Test plan

  • 7 new YAML tests for negative income cap (CA, PA, NY, FL, NC, MN, OH)
  • All existing TANF tests pass (IL 81, CO 26, DE 91, GA 99, NC 44, IN 49+, KS 50+)
  • Microsim max household TANF now $25K (was $12.9M)
  • Pre-takeup max per household verified at $25,084 across all states

🤖 Generated with Claude Code

MaxGhenis and others added 4 commits February 18, 2026 19:39
… above max payment

All 38+ state TANF benefit formulas used `max_(payment - income, 0)` which protects
against income exceeding payment, but not against negative income inflating benefits
above the payment standard. Added `min_(benefit, payment_standard)` caps to all affected
states. Also fixes NC TANF household size bare `.sum()` bug (from prior commit).

Before: Total TANF in microsim = $17.9T (target $9B), max household = $12.9M
After:  Total TANF in microsim = $32.1B, max household = $25K (reasonable CalWORKs)

Remaining gap ($32B vs $9B) is a takeup/calibration issue, not a formula bug.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Give spm_unit_assets an `adds` attribute pointing to spm_unit_cash_assets,
so that ~35 state TANF resource eligibility tests actually check imputed
assets instead of always seeing $0 (bare input default).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The adds attribute broke existing tests that set spm_unit_cash_assets
for other purposes. Since SIPP-imputed assets aren't in the released
dataset yet, this forward-looking change can be a separate PR when the
data is ready.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@MaxGhenis
Copy link
Contributor Author

Replacing with a clean PR that excludes unrelated CBO data files.

@MaxGhenis MaxGhenis closed this Feb 19, 2026
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