Plan: TANF Ruleset & Configuration Alignment

On this page

Status

Step Description Status

1

Add responsibility budgeting (deeming) to TANF determination flow

Done (2026-04-13) — deeming.rs with 6 deemer types, 6-step surplus calculation, 3 unit tests

2

Add lump sum ineligibility calculator

Done (2026-04-13) — proration.rs with lump sum period calculation, shortening events table, 2 unit tests

3

Add GRG (Grandparents Raising Grandchildren) CRISP payment support

Done (2026-04-13) — migration + store functions (create/list GRG payments) + API handlers (POST /v1/grg/payments, GET /v1/grg/payments/{person_id}) with RBAC. CRISP amount = 4×FM from params.

4

Add personal responsibility requirement tracking (immunization, school, prenatal)

Done (2026-04-13) — migration + store functions (create/update/list) + API handlers (GET/POST /v1/personal-responsibilities/{app_id}, PUT /v1/personal-responsibilities/status/{id}) with validation + RBAC

5

Update tanf-work-requirements.json with PAMMS 1820 activity types

Done (2026-04-13) — core/non-core activity classification, two-parent rules (35 hrs), 3rd trimester exemption, compliance status output

6

Add benefit proration calculator

Done (2026-04-13) — prorate_benefit() with $10 minimum threshold, 4 unit tests

7

Add TANF-specific verification thresholds

Done (2026-04-13) — [tanf.verification_thresholds] with resource_verification_pct=75, interest_verification_monthly_cents=1000

8

Fill TANF citation gaps in citations.toml

Done (2026-04-13) — all TANF citations filled in Plan 2

9

Integration tests for full TANF determination flow

Done (2026-04-13) — 12 tests (determine, work requirements, time limits, FTI audit, RBAC)

10

Update TANF rulesets for boarder income, child support gap budgeting

Done (2026-04-13) — tanf-benefit-calculation v2.0 with boarder exclusion ($70/mo), child support gap, FM from input (no hardcoded values)

Dependency: Plan 1 (Federal Parameter Data Completion)
Branch: feature/tanf-pamms-alignment

Context

TANF eligibility service (canopy-tanf) has Steps 1-8 complete: database schema, store layer, FTI-wrapped data access, rules client, determination handler, JWS signing, event publishing, and work requirement API. The comprehensive PAMMS read (104 pages, sections 1000-1915 + appendices) revealed additional complexity required for production accuracy.

The TANF budget flow (PAMMS 1605) involves responsibility budgeting (deeming income from non-AU members), which is substantially more complex than SNAP’s straightforward deduction cascade. PAMMS 1620-1632 describe 6 types of income deeming. Additionally, TANF has program features not yet implemented: lump sum ineligibility, GRG crisis payments, personal responsibility requirements, and benefit proration.

Design

Responsibility Budgeting (Deeming)

PAMMS 1620-1632 describe deeming income from 6 non-AU member types. The deeming process for each type (PAMMS 1620):

1. Deemer's gross earned income
2. - $250 standard work deduction
3. + Deemer's unearned income
4. - SON for deemer's own household (deemer + dependents not in AU)
5. - Alimony/child support paid to individuals outside AU
6. = Surplus (deemed as unearned income to AU)

Deeming types and PAMMS sections:

Type PAMMS Section When Applied

Stepparent

1622

Stepparent not in AU, married to parent in AU

Parent of minor HOH

1624

Parent lives with minor parent HOH

Ineligible parent

1626

Parent excluded from AU (citizenship, SSI, etc.)

Spouse of nonparent caretaker

1628

Nonparent caretaker’s spouse not in AU

Ineligible spouse

1630

Spouse excluded from AU

Sponsored alien sponsor

1632

I-864 affidavit sponsor (10-year deeming period)

Implementation: Add a deeming module to services/canopy-tanf/src/ that implements the 6-step surplus calculation. The determination handler calls deeming before the GIC test, adding surplus to the AU’s countable income.

Lump Sum Ineligibility

PAMMS 1650: Nonrecurring income >= 100% FPL = lump sum. Period of ineligibility = net lump sum / 100% FPL (rounded up to whole months). Begins month of receipt.

Migration:

CREATE TABLE tanf_lump_sum_periods (
    id UUID PRIMARY KEY,
    person_id UUID NOT NULL,
    lump_sum_amount NUMERIC(10,2) NOT NULL,
    net_amount NUMERIC(10,2) NOT NULL,
    fpl_100_pct NUMERIC(10,2) NOT NULL,
    ineligibility_months INTEGER NOT NULL,
    start_date DATE NOT NULL,
    end_date DATE NOT NULL,
    shortening_events JSONB DEFAULT '[]',
    created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

Shortening events (PAMMS 1650): theft/loss, casualty, eviction prevention (max 2×), utility disconnection (max 2×), funeral expenses.

GRG CRISP Payment

PAMMS 1210: Grandparents Raising Grandchildren Crisis Intervention Services Payment.

  • Amount: 4 × Family Maximum for AU size

  • One-time payment per grandchild

  • SOP: 10 days

  • Grandparent must be 55+ OR any age with disability

  • Household income < 160% FPL

Migration:

CREATE TABLE tanf_grg_payments (
    id UUID PRIMARY KEY,
    grandparent_person_id UUID NOT NULL,
    grandchild_person_id UUID NOT NULL,
    payment_type TEXT NOT NULL,  -- 'msp' ($100/month) or 'crisp' (one-time)
    amount NUMERIC(10,2) NOT NULL,
    effective_date DATE NOT NULL,
    created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

Personal Responsibility Requirements

PAMMS 1345-1370: Georgia requires specific personal responsibilities as conditions of eligibility.

Requirement PAMMS Section Verification

Immunization

1360

Form 3231 Certificate or GRITS system

School attendance

1347

Satisfactory attendance (ages 6-17)

Minor parent education

1347

Participation in education + passing grades

Prenatal care

1370

Checkup within 30 days of application, ongoing every 90 days

TFSP signature

1345

Form 196 signed by all parents/pregnant women/grantee relatives

Migration:

CREATE TABLE tanf_personal_responsibilities (
    id UUID PRIMARY KEY,
    tanf_application_id UUID NOT NULL REFERENCES tanf_applications(id),
    person_id UUID NOT NULL,
    requirement_type TEXT NOT NULL,
    status TEXT NOT NULL DEFAULT 'pending',  -- pending, compliant, non_compliant, good_cause
    verified_date DATE,
    next_review_date DATE,
    good_cause_reason TEXT,
    created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

Failure without good cause results in penalty (income counted, needs excluded — PAMMS 1345).

Proration Formula

PAMMS 1105: (Full Monthly Benefit) × (31 - date) / 30, rounded to nearest dollar. Benefits < $10 not issued for prorated month.

Date = earlier of approval date or 30th day from application.

Steps

Step 1: Add Responsibility Budgeting

Files: services/canopy-tanf/src/deeming.rs (new), services/canopy-tanf/src/determine.rs (integrate)

Create deeming module implementing the 6-step surplus calculation from PAMMS 1620. The determine() function calls calculate_deemed_income() for each non-AU member type present, then adds the total surplus to the AU’s countable unearned income before the GIC test.

Step 2: Add Lump Sum Calculator

Files: services/canopy-tanf/migrations/ (new migration), services/canopy-tanf/src/store/mod.rs (add functions)

Create tanf_lump_sum_periods table. Add store functions: create_lump_sum_period(), check_lump_sum_ineligibility(person_id, date), apply_shortening_event(). The determination handler checks lump sum ineligibility before proceeding.

Step 3: Add GRG CRISP

Files: services/canopy-tanf/migrations/ (new migration), services/canopy-tanf/src/api/grg_handlers.rs (new), services/canopy-tanf/src/api/mod.rs (register routes)

Add endpoints: POST /v1/grg/crisp (create CRISP payment), GET /v1/grg/payments/{person_id} (list payments). Eligibility check: grandparent 55+/disabled, income < 160% FPL, grandchild in TANF.

Step 4: Add Personal Responsibility Tracking

Files: services/canopy-tanf/migrations/ (new migration), services/canopy-tanf/src/store/mod.rs, services/canopy-tanf/src/api/mod.rs

Create tanf_personal_responsibilities table. Add endpoints: GET /v1/personal-responsibilities/{person_id}, PUT /v1/personal-responsibilities/{id} (update status). The determination handler checks all applicable requirements and flags non-compliance.

Step 5: Update Work Requirements Ruleset

File: rulesets/georgia/tanf-work-requirements.json

Add PAMMS 1820 activity types with core/non-core classification: * Core: unsubsidized employment, subsidized employment (public/private), job search/readiness (6-week limit), work experience, community service, OJT, vocational education (12-month limit) * Non-core: job skills training, education for employment, secondary school/GED

Add two-parent rules: 35 hrs/week combined (30 core + 5 non-core), or 55/50+5 if federally funded childcare.

Step 6: Add Proration Calculator

File: services/canopy-tanf/src/determine.rs or services/canopy-tanf/src/proration.rs (new)

Implement: fn prorate(benefit: Decimal, approval_date: u32) → Option<Decimal>. Formula: benefit × (31 - date) / 30. Returns None if result < $10.

Step 7: Add Verification Thresholds

File: rulesets/georgia/jurisdiction.toml

[tanf.verification_thresholds]
resource_verification_pct = 75     # Verify when total resources > $750 (75% of $1,000)
interest_verification_cents = 1000 # Verify when interest income > $10/month

Step 8: Fill TANF Citation Gaps

Run cargo xtask policy audit and fill all missing TANF citations. Key sections: * tanf.sanctions. — PAMMS 1351 * tanf.work_requirement_ — PAMMS 1349 * tanf.financial_standards. — PAMMS Appendix A * tanf.earned_income. — PAMMS 1615 * tanf.hardship_waiver_enabled — PAMMS 1392

Step 9: Integration Tests

Files: tests/canopy-tanf/ (new test files)

Test scenarios from PAMMS: 1. Standard approved determination (AU of 3, income below GIC, deprivation verified) 2. Denied for time limit exceeded (48 months used, no hardship waiver) 3. Denied for no qualifying deprivation 4. Lump sum ineligibility period calculation 5. Deeming from stepparent income 6. Sanction budgeting (25% reduction) 7. GRG CRISP payment eligibility check 8. Proration for mid-month approval 9. FTI audit log entries created for all FTI access 10. Events contain no FTI fields

Step 10: Update Rulesets

Files: rulesets/georgia/tanf-eligibility.json, rulesets/georgia/tanf-benefit-calculation.json

  • Add boarder income exclusion ($70/month first exclusion per boarder — PAMMS 1540)

  • Add child support gap calculation in benefit computation (SON − FM − net income = gap; gap payments excluded — PAMMS 1645)

  • Verify all Family Maximum values match PAMMS Appendix A exactly

PAMMS Source References

  • Application processing: dfcs-tanf/modules/tanf/pages/1105.adoc

  • AU composition: dfcs-tanf/modules/tanf/pages/1205.adoc

  • GRG: dfcs-tanf/modules/tanf/pages/1210.adoc

  • Deprivation: dfcs-tanf/modules/tanf/pages/1315.adoc through 1319.adoc

  • Work requirements: dfcs-tanf/modules/tanf/pages/1349.adoc

  • Sanctions: dfcs-tanf/modules/tanf/pages/1351.adoc

  • Personal responsibilities: dfcs-tanf/modules/tanf/pages/1345.adoc through 1370.adoc

  • Lifetime limit: dfcs-tanf/modules/tanf/pages/1390.adoc

  • Hardship waiver: dfcs-tanf/modules/tanf/pages/1392.adoc

  • Financial eligibility: dfcs-tanf/modules/tanf/pages/1501.adoc through 1540.adoc

  • Budgeting/deeming: dfcs-tanf/modules/tanf/pages/1605.adoc through 1670.adoc

  • Lump sum: dfcs-tanf/modules/tanf/pages/1650.adoc

  • Employment services: dfcs-tanf/modules/tanf/pages/1801.adoc through 1840.adoc

  • Issuance: dfcs-tanf/modules/tanf/pages/1905.adoc

  • Financial standards: dfcs-tanf/modules/tanf/pages/appendix-a.adoc

Edit this page · default