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

Declining Rate by Calendar Month:

Months TLP Rate
1-6 (Jan-Jun) 50%
7-9 (Jul-Sep) 35%
10-12 (Oct-Dec) 25%

Applied to earnings after the Standard Employment Expense deduction.

Note: Uses calendar month as proxy for participation months. The disregard cycle resets each January. In actual ND TANF policy, TLP tracks cumulative participation months and ends after 12 months (0% disregard for month 13+).

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 = TLP_Rate(month) × (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)

Where TLP_Rate(month) = 50% for months 1-6, 35% for months 7-9, 25% for months 10-12.

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

Example Calculation

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

  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% for January): $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 Month 13+ (0% disregard) – Calendar month proxy only covers months 1-12; cumulative participation tracking not modeled (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, 82 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 (10 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 56
Total 82

🤖 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 <noreply@anthropic.com>
@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 (f506aab) to head (09e51a9).
⚠️ Report is 15 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #7074   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            2         9    +7     
  Lines           32       127   +95     
=========================================
+ Hits            32       127   +95     
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.

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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
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 <noreply@anthropic.com>
@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