Skip to content

Conversation

@hua7450
Copy link
Collaborator

@hua7450 hua7450 commented Dec 31, 2025

Summary

Implements North Dakota's Temporary Assistance for Needy Families (TANF) program.

Closes #7073


Regulatory Authority

Source Citation
State Statute N.D. Century Code Chapter 50-09
State Administrative Code N.D.A.C. Chapter 75-02-01.2
Policy Manual Service Chapter 400-19

Income Eligibility Tests

Net Income Test

Countable income must be less than the Standard of Need.

Source: Policy Manual 400-19-110-15


Income Deductions & Exemptions

1. Standard Employment Expense Allowance

Formula: Greater of 27% of gross earned income OR $180

Applied first to gross earned income before other deductions.

Source: Policy Manual 400-19-105-25

2. Time Limited Percentage (TLP) Disregard

Rate: 50% of remaining earned income (after Standard Employment Expense)

Applied to earnings after the Standard Employment Expense deduction.

Note: TLP is actually a declining 12-month disregard cycle (50% → 35% → 25% → 0%). This implementation uses the initial 50% rate.

Source: Policy Manual 400-19-105-25


Income Standards

Standard of Need (Effective 2025-10-01)

North Dakota uses a 2D lookup table based on the number of caretakers (0, 1, or 2) and children (0-10) in the household.

Caretakers 0 children 1 child 2 children 3 children 4 children 5 children
0 $0 $366 $536 $697 $866 $1,028
1 $523 $739 $962 $1,175 $1,393 $1,612
2 $739 $962 $1,175 $1,393 $1,612 $1,830

Historical Values: Parameters include values effective 2015-10-01, 2023-08-01, 2024-10-01, and 2025-10-01.

Sources:


Resource Limits

Household Size Resource Limit
1 person $3,000
2 persons $6,000
Each additional +$25

Source: Policy Manual 400-19-55-05-05 Asset Limits


Benefit Calculation

Formula

Standard Employment Expense = max(0.27 × Gross Earned, $180)
TLP Disregard = 0.50 × (Gross Earned - Standard Employment Expense)
Countable Earned Income = Gross Earned - Standard Employment Expense - TLP Disregard
Countable Income = Countable Earned Income + Unearned Income
Benefit = max(Standard of Need - Countable Income, 0)

Source: Policy Manual 400-19-110-20 Benefit Calculation

Example Calculation

Family of 3 (1 caretaker, 2 children) with $1,500/month earned income:

  1. Gross earned income: $1,500
  2. Standard Employment Expense: max($1,500 × 0.27, $180) = $405
  3. After SEE: $1,500 - $405 = $1,095
  4. TLP disregard (50%): $1,095 × 0.50 = $547.50
  5. Countable earned income: $1,095 - $547.50 = $547.50
  6. Standard of Need (1 caretaker, 2 children): $962
  7. Benefit: $962 - $547.50 = $414.50

Out of Scope

The following are not modeled in this implementation:

Benefit Rules

Income Deductions

  • Dependent Care Deduction – Maximum deduction amounts vary by child age, tied to Child Care Assistance Program rates (N.D.A.C. 75-02-01.2-53)

Special Allowances

Time Limits

  • 60-Month Lifetime Limit – Federal lifetime limit on TANF benefits (42 U.S.C. § 608(a)(7))
  • TLP Declining Disregard Cycle – Full 12-month cycle (50% → 35% → 25% → 0%) not modeled; only initial 50% rate implemented (Policy Manual 400-19-105-25)

Files Added

Parameters (7 files)

policyengine_us/parameters/gov/states/nd/dhs/tanf/
├── benefit/
│   ├── max_children.yaml
│   └── standard_of_need.yaml
├── income/
│   └── deductions/
│       ├── standard_employment_expense/
│       │   ├── minimum.yaml
│       │   └── rate.yaml
│       └── time_limited_percentage/
│           └── rate.yaml
└── resources/
    └── limit/
        ├── base.yaml
        └── increment.yaml

Variables (9 files)

policyengine_us/variables/gov/states/nd/dhs/tanf/
├── nd_tanf.py
├── nd_tanf_standard_of_need.py
├── eligibility/
│   ├── nd_tanf_eligible.py
│   ├── nd_tanf_income_eligible.py
│   └── nd_tanf_resources_eligible.py
└── income/
    ├── nd_tanf_countable_earned_income.py
    ├── nd_tanf_countable_earned_income_person.py
    ├── nd_tanf_countable_income.py
    └── nd_tanf_countable_unearned_income.py

Tests (8 files, 81 tests)

policyengine_us/tests/policy/baseline/gov/states/nd/dhs/tanf/
├── integration.yaml (26 tests)
├── nd_tanf.yaml (6 tests)
├── nd_tanf_countable_earned_income_person.yaml (9 tests)
├── nd_tanf_countable_unearned_income.yaml (5 tests)
├── nd_tanf_eligible.yaml (7 tests)
├── nd_tanf_income_eligible.yaml (5 tests)
├── nd_tanf_resources_eligible.yaml (10 tests)
└── nd_tanf_standard_of_need.yaml (13 tests)

Test Coverage

Category Count
Integration tests 26
Unit tests 55
Total 81

🤖 Generated with Claude Code

hua7450 and others added 2 commits December 31, 2025 17:26
Starting implementation of North Dakota TANF program.
Documentation and parallel development will follow.

Related to PolicyEngine#7073
Implements the North Dakota Department of Health and Human Services
TANF program including:
- Income eligibility (50% FPL standard of need)
- Earned income deductions (Standard Employment Expense, TLP)
- Resource limits ($3k/1 person, $6k/2+)
- Benefit calculation (standard of need - countable income)
- Comprehensive test coverage (75 tests)

Closes PolicyEngine#7073

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@codecov
Copy link

codecov bot commented Dec 31, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (0b01827) to head (9c039bb).
⚠️ Report is 17 commits behind head on main.

Additional details and impacted files
@@             Coverage Diff              @@
##             main     #7074       +/-   ##
============================================
+ Coverage   73.03%   100.00%   +26.96%     
============================================
  Files        3550         9     -3541     
  Lines       51113       125    -50988     
  Branches      263         0      -263     
============================================
- Hits        37328       125    -37203     
+ Misses      13770         0    -13770     
+ Partials       15         0       -15     
Flag Coverage Δ
unittests 100.00% <100.00%> (+26.96%) ⬆️

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.

hua7450 and others added 11 commits January 3, 2026 14:01
- Rename nd_tanf_resource_eligible.py to nd_tanf_resources_eligible.py
  to match the class name nd_tanf_resources_eligible
- Remove orphaned parameters not used by any variable:
  - housing_supplement.yaml ($50)
  - out_of_home_allowance.yaml ($45)
  - self_employment/rate.yaml (25%)
- Update resource limit references from NCCP (nonprofit source) to
  official North Dakota Policy Manual 400-19-55-05-05 Asset Limits
- Add nd_tanf_time_limited_percentage_deduction.yaml unit tests (7 tests)
  covering zero income, low income, SEE crossover, and multiple earners

All 87 ND TANF tests pass.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Update standard employment expense and time limited percentage
parameter references to use Policy Manual 400-19-105-25 Employment
Disregards, which explicitly defines both deductions.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
PolicyEngine cannot simulate lifetime limits due to single-period
architecture, so this parameter is not used by any variable.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
Document that TLP is actually a declining 12-month disregard cycle
(50%/35%/25%/0%) and that we use 50% as a simplification since
PolicyEngine cannot track months on TANF across periods.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
The $10 minimum benefit threshold is not modeled. Update nd_tanf
variable to use simple benefit formula and update tests accordingly.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@hua7450 hua7450 marked this pull request as ready for review January 4, 2026 15:12
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.

Implement North Dakota TANF program

1 participant