Skip to content

Count SSI and TANF in North Dakota renter's refund income - #10724

Draft
MaxGhenis wants to merge 6 commits into
nd-renters-refund-federal-exclusionsfrom
nd-renters-refund-public-assistance
Draft

MaxGhenis wants to merge 6 commits into
nd-renters-refund-federal-exclusionsfrom
nd-renters-refund-public-assistance

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #10697, which rewrites nd_renters_refund_income.py; this PR retargets to main and rebases once #10697 merges.

What changes

North Dakota renter's refund income now counts SSI and TANF. N.D.C.C. 57-02-08.1(5)(c) defines income as income "from all sources ... including any county, state, or federal public assistance benefits", and leaves out "any amount excluded from income by federal or state law with the exception of income from social security benefits". No federal or North Dakota law excludes SSI or TANF from income. The IRS leaves need-based public assistance out of gross income under its general welfare exclusion, which "is not based on any specific statutory or regulatory authority" (CRS IF12326). If the exclusion clause took in that doctrine, the public assistance clause would have almost nothing to count. N.D.C.C. 1-02-07 and 1-02-38(2) call for a reading that gives both clauses effect: the inclusion counts public assistance, and the exclusion removes what a statute or regulation excludes. The model already counted general assistance on this reading.

The exception for social security says which excluded amounts come back. The Legislative Assembly added it in House Bill 1174 (2019), the Act that created a state income tax deduction for social security. In its fiscal note, the Tax Commissioner's office wrote that section 1 of that Act keeps the full benefit in the homestead income test, so the exception says nothing about benefits no statute excludes.

  • SSI raises no conflict: the application (SFN 24777, line 7) asks for "S.S.I.", and the Tax Commissioner's 2026 homestead credit application lists "SSI benefits" as income. The IRS leaves SSI out of gross income only under the general welfare exclusion, so the Commissioner's forms read the exclusion clause as this PR does. Add North Dakota renter's refund #8314's review dropped SSI in May 2026, reading 42 U.S.C. 1382 as a federal exclusion; that section sets SSI eligibility and excludes nothing from income.
  • TANF conflicts with item 11 of the Tax Commissioner's guideline, which lists TANF among items that are not income, in the same list as food stamps and federal fuel assistance. The statute governs (the repo's conflicting-sources rule). The guideline's May 2013 edition counted TANF as income under item 10. This PR logs the reading as candidate us-nd:renters-refund-tanf in source_conflicts/candidates.yaml.
  • SNAP and LIHEAP stay out. 7 U.S.C. 2017(b) and 42 U.S.C. 8624(f)(1) exclude them from income "for any purpose" under state law, and social security is the only exception the clause makes.

Known limit. PolicyEngine pays TANF to an SPM unit, and add() gives each member an equal share that counts in the member's tax unit. So a tax unit that shares an SPM unit with a TANF family (a grandparent living with a daughter and grandchild, say) counts a per-person share of the family's TANF. Wisconsin's homestead income (wi_homestead_income), Rhode Island's property tax relief income (ri_property_tax_household_income) and Michigan's household resources (mi_household_resources) add TANF into tax-unit income the same way.

Tests

  • YAML, with expected values from the statute. nd_renters_refund_income.yaml: case 3 now counts $6,000 of SSI ($18,000); a new case counts $3,600 of TANF and leaves out $2,400 of SNAP ($13,600); another counts a dependent's $9,000 of SSI ($27,000). nd_renters_refund.yaml case 8 carries SSI through to the refund ($360 rather than $600).
  • Two Leave federally excluded income out of North Dakota renter's refund income #10697 cases now enter the parents' wages as employment_income_before_lsr. The YAML runner leaves employment_income inputs where they are, and TANF reads wages before any labor supply response, so a family whose case enters wages as employment_income draws ND TANF and the case breaks. (Python Simulation moves the input itself; 152 state test files already enter wages this way.)
  • core/test_medical_expense_premium_conservation.py gives its households no SSI or TANF. Its ND oracle tests the medical base, and without that input a two-person household in it with no income draws $8,553 of computed TANF.
  • Property-based tests (test_nd_renters_refund_public_assistance.py, Hypothesis). Dropping ssi and tanf from income_sources fails both tests, and adding snap or nd_liheap fails the SNAP and LIHEAP check.

Invariants

These hold for every input; the property tests check them over random SPM units.

  1. A dollar of a tax unit's SSI, general assistance or TANF share raises its renter's refund income by at most a dollar and never lowers it, and by exactly a dollar when income without the benefits exceeds zero (only the zero floor can absorb any).
  2. SNAP and North Dakota LIHEAP never change renter's refund income or the refund. The test also checks that both inputs reach the model, so the guard can fail.
  3. Public assistance never raises the refund (the refund falls as income rises).
  4. TANF counts once in total across the tax units of an SPM unit, in proportion to members. The test pins this attribution, the known limit above.

Impact (2026)

We estimate no change in the 2026 refund on the default Populace US 2024 release (populace-us-2024-spm-20260909), comparing base ac21cd383b (#10697) with head 73fd800090. Later commits on both branches change only tests and the source-conflict register.

Base This PR Change
Renter's refund $6,631,322 $6,631,322 $0
Recipients (weighted tax units) 12,625 12,625 0
Refund income, tax units that can reach the refund $3,204.8M $3,207.8M +$3.06M
Refund income, all ND tax units $44,562.4M $44,592.4M +$30.0M

The sample holds 850 North Dakota tax unit records. Of those, 69 have a head or spouse who meets the age or disability test and pays rent, and 25 get the refund. One of the 69 (314 weighted units) has SSI: its income rises by $9,750, and with $13,916 of rent its refund stays at the $600 cap. None of the 69 has general assistance or a TANF share, so the per-person split in the known limit reaches no refund in this sample. A household below the cap does lose: in nd_renters_refund.yaml case 8, $9,000 of SSI cuts the refund from $600 to $360.

The comparison script checks that income rises by a unit's SSI and TANF share wherever base income exceeds zero (largest gap $0.0007), stays within that amount at the zero floor, and that no refund rises. All three hold.

Test cost

The new test file joins CI's remaining Python group. Locally it takes 8.2 s in pytest and 35 s with interpreter start and system build, and peaks at 1.34 GB RSS. The medical conservation test's five cases take 38 s.

axiom: TheAxiomFoundation/rulespec-us#2042 queued (extended with the public assistance reading and companion tests 11 to 13; blocked on corpus capture of chapter 57-02 and a billed encoder run)

🤖 Generated with Claude Code

MaxGhenis and others added 6 commits November 9, 2026 06:21
N.D.C.C. 57-02-08.1(5)(c) counts "any county, state, or federal public
assistance benefits" and excludes only amounts "excluded from income by
federal or state law". No federal or North Dakota law excludes SSI or
TANF: the IRS leaves them out of gross income under its general welfare
exclusion, which no statute or regulation enacts. Federal law does
exclude SNAP (7 U.S.C. 2017(b)) and LIHEAP (42 U.S.C. 8624(f)(1)) for
any purpose under state law, so those stay out.

SFN 24777 line 7 already asks for S.S.I. The test cases take their
expected values from the statute. The medical premium conservation test
now gives its households no public assistance, so its North Dakota
expectation still tests the medical base alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Tax Commissioner's guideline lists TANF among items that are not
income; N.D.C.C. 57-02-08.1(5)(c) counts public assistance benefits and
no law excludes TANF. The May 2013 guideline counted TANF as income.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…riants

Hypothesis checks four properties over random SPM units: a dollar of SSI,
TANF or general assistance adds at most a dollar of income, and exactly a
dollar above the zero floor; SNAP changes neither income nor the refund;
public assistance never raises the refund; and TANF counts once in total
across the tax units of an SPM unit, split per member. Dropping ssi and
tanf from income_sources fails both tests, and adding snap fails the
SNAP check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Dakota public assistance invariants

Answers the independent review of 7c476bc:

- Invariant 1 speaks of a tax unit's share of TANF, so a tax unit in a
  shared SPM unit fits it, and says "exceeds zero".
- Invariant 2 covers North Dakota LIHEAP, which 42 U.S.C. 8624(f)(1)
  excludes from income, and the test checks that the SNAP and LIHEAP
  inputs reach the model, so the guard is not vacuous.
- situation() gives each SPM unit its own family. Without explicit
  families, the model puts every person in one.
- A new example sits above the floor in a shared SPM unit.
- The parameter comment and the candidate say the general welfare
  exclusion rests on IRS rulings, not a statute or regulation. The
  candidate adds that the Tax Commissioner's forms count SSI, which the
  IRS leaves out only under that doctrine: SFN 24777 line 7 and the 2026
  homestead credit application.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
N.D.C.C. 57-02-08.1(5)(c) leaves out amounts excluded by federal or state
law "with the exception of income from social security benefits". The
clause excepts nothing else, so public assistance that a statute does
exclude, SNAP and LIHEAP, stays out. The candidate and the test docstring
now quote the whole clause.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The candidate said the particular inclusion controls the general exclusion.
N.D.C.C. 1-02-07 first asks for a reading that gives both provisions effect,
and reaches the special provision only on an irreconcilable conflict. The note
now says that, and says where the social security exception came from: House
Bill 1174 (2019) added it in the Act that created the state income tax
deduction for social security, so it says nothing about benefits no statute
excludes. It also cites the two forms and the Act as sources, and rewraps the
property test's docstring.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis force-pushed the nd-renters-refund-public-assistance branch from c8e9bdb to d366827 Compare November 9, 2026 11:22

This branch has not been deployed

No deployments
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