Skip to content

Add North Dakota CCAP Workforce Benefit and co-payment waivers - #10816

Merged
MaxGhenis merged 4 commits into
mainfrom
nd-ccap-waivers
Nov 14, 2026
Merged

MaxGhenis merged 4 commits into
mainfrom
nd-ccap-waivers

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

Add North Dakota CCAP Workforce Benefit income and co-payment waivers from June 1, 2024, following 400-28-20-40 and Manual Letter 3819.

Add Crossroads, Diversion and ARSEN co-payment waivers, and apply the TANF and Diversion exceptions in 400-28-90-20 and 400-28-45-05, including the caretaker-SSI exception North Dakota applied until October 2026.

Exempt the second caretaker of a Workforce Benefit household from the activity test from June 2024 through December 2025.

Closes #10710

Closes #10711

Sources

  • In the current 400-28-90-20 and 400-28-45-05 (Release 26.3, October 1, 2026), North Dakota names the waived families and four TANF-related co-pay situations, starting with "The child is in receipt of SSI."
  • In the archived 400-28-90-20 from ML 3278 (October 1, 2011), North Dakota charged the co-pay for an activity of a TANF caretaker "In receipt of SSI", a disqualified alien or an ineligible non-legally responsible caretaker.
  • In the ML 3605 version (April 1, 2021), North Dakota kept that list, added the ineligible kinship caretaker exception and added the ARSEN waiver.
  • In Release 26.3, North Dakota repealed 400-28-45-15. On page 4, that section's text covered care for an SSI, disqualified alien, non-legally responsible or ineligible kinship caretaker's activity: "these cases are subject to Co-pay requirements."
  • In ML 3819, ML 3862 and ML 3909, North Dakota exempted the second caretaker of a Workforce Benefit household from the activity requirement. In ML 3819 Example 1, it approved such a household for an 18-month eligibility period.
  • From January 1, 2026, North Dakota requires the second caretaker of a Workforce Benefit household to be in an allowable activity. Under Release 26.1, it denies an application when that caretaker has "no activity".
  • On page 2 of Release 26.1, North Dakota adds that the second caretaker's "activity search will not be time limited". In the current 400-28-20-40, North Dakota denies Example 1.

Invariants

These invariants apply within the existing North Dakota household scope.

  • Co-payments stay nonnegative and never exceed the existing worksheet amount or federal family-share ceiling. Adding a waiver input cannot raise the co-payment.
  • A qualifying Workforce Benefit family passes the income test at application and review, at any income, while its qualifying employment continues.
  • From June 2024 through December 2025, a Workforce Benefit family passes the activity test whatever its second caretaker does. From January 2026, North Dakota applies the requirement to Workforce Benefit applications, and the model applies the ordinary activity test in every month.
  • With every new input false, results equal main's, with two intended changes for TANF families. They owe a co-payment when a caretaker receives SSI before October 2026, or when a child in care receives SSI from October 2026.
  • Crossroads, ARSEN, Workforce Benefit and the low-income waiver remain independent of TANF and Diversion exceptions. Each family's inputs affect that family alone.

test_nd_ccap_waivers_preserve_bounds_and_default_behavior in policyengine_us/tests/core/test_nd_ccap_waivers_invariants.py checks these properties across generated and explicit cases.

The YAML tests exercise effective dates, application and review income tests, the second-caretaker exemption, individual waivers, caretaker exceptions, SSI ages and care, kinship treatment, low-income overrides and family isolation.

Methodology choices

  • Use a monthly person-level boolean for a caretaker who meets the verified Workforce employment test. All new inputs default to false. Existing hours inputs do not identify employment at a qualifying child care provider.
  • Treat the tax unit head and spouse as the family's caretakers, as the existing activity test does. North Dakota waives the income limit and co-payment when at least one caretaker qualifies; other eligibility conditions continue to apply.
  • Document the employment, licensing, ownership, verification and temporary-leave conditions in that input.
  • Start Workforce eligibility on June 1, 2024. North Dakota requires at least 25 hours weekly, employer verification on SFN 354, and qualifying provider status under Manual Letter 3819.
  • Document the permission for employees to care for their own children from September 1, 2024, following Manual Letter 3862. Owners do not qualify unless their children attend a different licensed program.
  • Document the provider operating-hours condition and maternity-leave exception from May 1, 2025, following Manual Letter 3909.
  • Document average weekly hours, employer-confirmed temporary exceptions and review verification from April 1, 2026, following Release 26.2.
  • Apply no 85%-of-SMI cap at review while Workforce qualification continues. North Dakota restores income testing after qualifying employment, licensing or hours end. An enrolled family then faces the existing 85% limit.
  • Keep the Workforce input true through the month qualification ends, and set it false the following month. The model reads this monthly status; it does not reconstruct termination dates or reporting deadlines.
  • Pass the activity test for a Workforce Benefit family from June 1, 2024 through December 31, 2025. We set both dates in the new parameter gov.states.nd.dhs.ccap.workforce.second_caretaker_activity_exempt. North Dakota counts the qualifying caretaker's own employment as an allowable activity.
  • Apply the ordinary activity test to every Workforce Benefit family from January 2026. North Dakota describes the change in Release 26.1 as a rule for applications, and a family approved in 2025 can hold an 18-month eligibility period into 2026. The shared child care note records that no implementation tracks eligibility periods.
  • Retain the existing North Dakota household restriction. North Dakota also permits Workforce eligibility for nonresident households employed at qualifying North Dakota licensed programs under 400-28-20-40.
  • Start Crossroads and Diversion categorical formulas on October 1, 2011, the earliest confirmed manual version. North Dakota then charged the co-pay when care followed from the activity of a TANF caretaker in receipt of SSI, a disqualified alien or an ineligible non-legally responsible caretaker.
  • Identify a TANF caretaker in receipt of SSI as a tax unit head or spouse with positive ssi, through September 30, 2026. Apply that exception to the whole family, as the disqualified-alien and non-legally responsible inputs do, even when the care follows from another caretaker's activity.
  • Start ARSEN and the ineligible-kinship-caretaker exception on April 1, 2021, following the archived waiver section. PolicyEngine-US carries the July 2024 co-payment schedule back to 2015, its first modeled year, so the 2011 and 2021 start dates also change co-payments before July 2024.
  • Apply all four exceptions to Diversion as well as TANF, following 400-28-45-05. North Dakota continues to waive co-payments for Crossroads, ARSEN and Workforce Benefit families, or families at or below 30% of SMI, even when a TANF or Diversion exception applies.
  • Start the SSI co-payment exception for children and the kinship waiver for TANF-eligible children on October 1, 2026, following Release 26.3. The TANF-eligible-child flag overrides the kinship exception alone.
  • Identify an SSI child from positive ssi, reported child care hours or days, and is_child or disability below North Dakota's disabled-child age limit. Under 400-28-45-05, "Child care for an SSI child remains subject to co-pay requirements," so an SSI child outside care leaves the waiver in place.
  • Include nondisabled children aged 17 and disabled children aged 18 without applying CCAP's separate immigration or ordinary age test. Retain existing annual-age precision around birthdays.
  • Charge one family co-payment when an SSI child attends care, including for a sibling in care whose care North Dakota would waive.
  • Keep the TANF and Diversion categorical income exemptions and their retained co-payment waiver after benefits end outside this change. North Dakota exempts qualifying TANF and Diversion families from income requirements and retains their waiver after benefits end under 400-28-45-05.
  • List these gaps in the North Dakota coverage note and keep its status partial: that income exemption and retained waiver, nonresident Workforce households and provider registration fees.
  • Leave four existing approximations outside the note. First, a flat age-13 cutoff and annual ages miss the carry-over to the month a child turns 14 and the month of a 19th birthday. Second, proxies stand in for court-order and disability verification. Third, the meets_ccdf_activity_test input carries new employment and job search, including the second caretaker's untimed activity search. Fourth, the child support deduction does not track private support or garnishment fees.
  • Keep waitlists, eligibility-period tracking and the family-unit approximation in the shared CCDF note; assess North Dakota's status from its remaining state-specific gaps.

Hand calculations

For the waiver examples, annual SMI of $120,000 gives monthly SMI of $10,000. At monthly countable income of $4,500, North Dakota uses the 44%-46% band:

min(0.02 * 0.44 * 10,000, 0.07 * 4,500) = min(88, 315) = 88.

A TANF or Diversion family whose caretaker receives SSI owes that 88 in September 2026 and nothing in October 2026. A TANF family whose SSI child attends care owes 88 from October 2026; if the SSI child attends no care, it owes nothing.

The ordinary application and continuing thresholds equal 0.75 * 10,000 = 7,500 and 0.85 * 10,000 = 8,500. Annual earnings of $240,000 give monthly income of $20,000; a qualifying Workforce family passes both income tests and owes no co-payment.

In ML 3819 Example 1, one caretaker qualifies for the Workforce Benefit and the other has no activity. With $240,000 in annual earnings, the household passes the income and activity tests in January 2025 and fails the activity test in January 2026.

Tests

Pull request run 43565599078 at 6e175fe802 passed all 36 jobs on GitHub's merge with main 0575612a77.

The policy YAML files pass, one file per run:

CCAP test file Passed
copay/nd_ccap_copay.yaml 41
copay/nd_ccap_tanf_copay_exception.yaml 4
copay/nd_ccap_categorical_copay_waiver.yaml 2
eligibility/nd_ccap_income_eligible.yaml 12
eligibility/nd_ccap_workforce_benefit_eligible.yaml 3
eligibility/nd_ccap_activity_eligible.yaml 10
eligibility/nd_ccap_eligible.yaml 8
rates/nd_ccap_base_subsidy.yaml 3
nd_ccap.yaml 3
integration.yaml 17
missing_hours/integration.yaml 6
court_supervision.yaml 8

The property test passes, and policyengine_us/tests/test_programs_registry.py passes 872 cases with 10 skipped.

Without this change's formulas, the new caretaker-SSI, second-caretaker, caretaker-only Workforce and SSI-child-in-care cases fail, and so does the property test. Four mutants each fail a YAML case: an exemption that never ends, an exemption without a Workforce caretaker, a disabled 19-year-old counted as an SSI child, and any member's SSI counted as a caretaker's.

No test checks the activity exemption in its first month (June 2024) or last month (December 2025); the activity cases sit in May 2024, January 2025 and January 2026.

Ruff format, Ruff check and git diff --check pass.

Microsimulation impact

We estimate that this branch changes none of the outputs below in 2026 on the default dataset. We compared main at 75aee22d6d with this branch at 6e175fe802.

Output Main total Change Records changed (weighted)
nd_ccap $0 $0 0 (0)
nd_child_care_subsidies $0 $0 0 (0)
child_care_subsidies $1.72bn $0 0 (0)
state_income_tax $577.2bn $0 0 (0)
income_tax $2,594.9bn $0 0 (0)
household_benefits $2,060.4bn $0 0 (0)
household_net_income $17,199.2bn $0 0 (0)

On that dataset, we estimate $0 of North Dakota child care assistance in 2026 at both commits, so the household tests above show what this change does.

axiom: TheAxiomFoundation/rulespec-us#2233 queued (N.D.A.C. 75-02-01.3-04 and CCAP manual 400-28-20-40, 400-28-35-02, 400-28-45-05 and 400-28-90-20; the pinned release lacks them, and the corpus lacks ML 3819, Releases 26.1 and 26.3 and the archived 90-20, so the signed encoder can't run yet)

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits November 11, 2026 19:19
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 2 commits November 13, 2026 18:10
…ce second caretakers

From October 2011 through September 2026, North Dakota charged the TANF
and Diversion co-pay for child care that followed from the activity of a
caretaker who received SSI. Release 26.3 repealed that rule on October 1,
2026.

From June 2024 through December 2025, North Dakota approved Workforce
Benefit households whose second caretaker had no allowable activity (ML
3819, 3862 and 3909). Release 26.1 ended that exemption in January 2026,
and a dated parameter sets both dates.

The Workforce test now counts only the tax unit head and spouse. From
October 2026, only an SSI child in care triggers the TANF co-pay. One
in-care variable replaces two copies of that test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review November 13, 2026 23:20
@codecov

codecov Bot commented Nov 13, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (aae7f98) to head (6e175fe).
⚠️ Report is 259 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##              main    #10816    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files            1        17    +16     
  Lines           37       242   +205     
==========================================
+ Hits            37       242   +205     
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 Harness.
📢 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.

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

US + core hub merge audit, us#10816 at 6e175fe8024f3bc1e4e5fd2ef6716275a38f601b (squash): Add North Dakota CCAP Workforce Benefit and co-payment waivers.

  • Reviews:
    • The PR has no GitHub reviews. Two independent review rounds ran outside GitHub, with a fix round between them.
    • The first round, at 50c610d3d4, read the current CCAP manual 400-28-90-20, 400-28-45-05 and 400-28-20-40, Manual Letters 3819, 3862 and 3909, Releases 26.1, 26.2 and 26.3, and the archived 400-28-90-20 versions of 2011 and 2021. It ran 39 monthly households and an annual case on the head and on the merge base 75aee22d6d, and every head result matched its hand figures.
    • It found two gaps. The model dropped the caretaker-SSI exception for October 2011 through September 2026, so a TANF family whose caretaker received SSI paid $0 where North Dakota charged a co-payment. From June 2024 through December 2025, it also denied the Workforce Benefit household with an inactive second caretaker that North Dakota approved in ML 3819 Example 1.
    • It added four minor findings. The North Dakota coverage note listed no gap, the Workforce test counted any family member, and the child-SSI exception reached a child outside care. No case guarded the under-19 limit, and a mutant that turned < into <= survived.
    • The fix round, at 10ea78a604, added the caretaker-SSI exception for heads and spouses and a dated parameter that exempts the second caretaker from June 1, 2024 through December 31, 2025. It limited the Workforce test to heads and spouses, required the SSI child to attend care, restored the coverage note's gaps and added a disabled 19-year-old case.
    • Without the fix round's formulas, eight new cases and the property test fail. Each of four mutants failed a case. A comment-only commit, 6e175fe802, followed and changed no formula, value or test case.
    • The second round approved 6e175fe802 with no blocking finding. It rechecked both fixes against the archived 400-28-90-20, Release 26.1 and ML 3819. CI run 43526401330 passed all 36 of its jobs at the head. A probe gave the right activity result at both edges of the exemption, and git merge-tree against main showed no conflict.
    • It listed three minor findings, still open at the head. The code comment and coverage note don't say that the caretaker-SSI exception reaches the whole family. The parameter comments don't say that Release 26.1 describes a rule for applications. No case sits in the exemption's first or last month.
    • The reviews listed corrections to the description, and I made each before merge. The description now uses an accepted axiom: form and puts the archived manual text in the past tense. It names each modeling gap once, says Release 26.1 covers applications and states the whole-family caretaker-SSI reading.
  • Methodology choices for maintainers:
    • Through September 2026, the model charges the whole family whenever a tax unit head or spouse has positive SSI. Under the archived 400-28-90-20, North Dakota charged the co-pay when care resulted from the SSI caretaker's activity. In a two-caretaker TANF family whose disabled caretaker receives SSI while the other works, the model charges the worksheet co-payment, and a reading tied to the activity would keep the waiver. No test has such a family.
    • The model ends the second-caretaker exemption for every family on January 1, 2026. Release 26.1 describes the change as a rule for applications, and in ML 3819 Example 1 North Dakota approved an 18-month eligibility period, so a family approved in 2025 could keep eligibility into 2026. The model tracks no eligibility periods, as the shared child care note records.
    • From October 2026, an SSI child in care triggers the whole family co-payment, including for a sibling whose care North Dakota would waive. Under 400-28-45-05, North Dakota attaches the co-pay to "child care for an SSI child", and the model computes one co-payment per family. An SSI child counts when under 18, or disabled and under 19, without CCAP's ordinary age or immigration test.
    • The Crossroads and Diversion waivers and the first three exceptions start on October 1, 2011, the earliest archived 400-28-90-20. The co-payment schedule takes effect on July 1, 2024, and the model carries it back to 2015, its first modeled year, so the caretaker-SSI exception changes default-input co-payments from 2015.
    • One monthly input per caretaker carries every Workforce employment condition: hours, provider type, SFN 354 verification, ownership and leave. Callers keep it true through the month qualification ends, and the model then restores income testing and co-payments.
  • Gates checked live at merge:
    • gh pr checks exits 0;
    • the latest Pull request run at the head, 43565599078, passed and tested this head merged into main at 0575612a77;
    • MERGEABLE;
    • not a draft;
    • no reviewer's latest review requests changes;
    • the semantic-overlap guard: since 0575612a77, main has changed no area this PR touches. Between the PR's merge base 75aee22d6d and main at 93444c3052, main changed one file this PR touches, programs.yaml. There it edited the New York CCAP notes and LIHEAP entries, North Dakota's among them, and this PR edits the North Dakota CCAP notes. Main changed nothing under nd/dhs/ccap, and it changed no definition of a variable this PR reads, such as ssi, is_tanf_enrolled, is_tax_unit_head_or_spouse, hhs_smi or meets_ccdf_activity_test. Among open PRs, Count railroad retirement benefits as income in state and county benefit programs #10764 changes North Dakota CCAP income sources and Respect alternate care-hour inputs in state child care pricing #9557, a draft, changes nd_ccap_time_category.py; neither shares a file with this PR. The branch merges into main at 93444c3052 without conflict;
    • the merge pins the head.
  • Impact: we estimate no change in 2026 on the default dataset. nd_ccap and nd_child_care_subsidies total $0 at main 75aee22d6d and at 6e175fe802, and child_care_subsidies, state and federal income tax, household benefits and household net income don't move. The household tests show the change.
  • Next:
    • Say in the caretaker-SSI code comment and the North Dakota coverage note that the model applies the exception to the whole family whenever a head or spouse receives SSI.
    • Say in the parameter and activity-test comments that North Dakota applies the second-caretaker requirement to Workforce applications from January 1, 2026, while the model applies it to every month. The second caretaker's untimed activity search reaches the model through meets_ccdf_activity_test alone.
    • Add ML 3819 Example 1 at June 2024 and at December 2025 to nd_ccap_activity_eligible.yaml, each expecting true. No current case would catch a start moved to July 2024.
    • Model the TANF and Diversion income exemption and the co-pay waiver kept after TANF or Diversion ends, under 400-28-45-05, and Workforce eligibility for households outside North Dakota. The coverage note lists both as gaps.
  • Axiom: Encode North Dakota child care assistance: the Workforce Benefit, program co-payment waivers and TANF co-payment exceptions (N.D.A.C. 75-02-01.3-04; CCAP manual 400-28-20-40, 400-28-35-02, 400-28-45-05 and 400-28-90-20) (PE-US #10816) TheAxiomFoundation/rulespec-us#2233 queued, a new pe-parity issue for N.D.A.C. 75-02-01.3-04 and CCAP manual 400-28-20-40, 400-28-35-02, 400-28-45-05 and 400-28-90-20, with companion rows from this PR's YAML. The signed encoder can't run yet: the corpus lacks ML 3819, Releases 26.1 and 26.3, the archived 400-28-90-20 versions and the repealed 400-28-45-15, and rulespec-us's pinned release carries no North Dakota child care scope.

🤖 Generated with Claude Code

@MaxGhenis
MaxGhenis deleted the nd-ccap-waivers branch November 14, 2026 07:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant