Plan: TANF Ruleset & Configuration Alignment
On this page
- Status
- Context
- Design
- Steps
- Step 1: Add Responsibility Budgeting
- Step 2: Add Lump Sum Calculator
- Step 3: Add GRG CRISP
- Step 4: Add Personal Responsibility Tracking
- Step 5: Update Work Requirements Ruleset
- Step 6: Add Proration Calculator
- Step 7: Add Verification Thresholds
- Step 8: Fill TANF Citation Gaps
- Step 9: Integration Tests
- Step 10: Update Rulesets
- PAMMS Source References
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 ( |
4 |
Add personal responsibility requirement tracking (immunization, school, prenatal) |
Done (2026-04-13) — migration + store functions (create/update/list) + API handlers ( |
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).
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.adocthrough1319.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.adocthrough1370.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.adocthrough1540.adoc -
Budgeting/deeming:
dfcs-tanf/modules/tanf/pages/1605.adocthrough1670.adoc -
Lump sum:
dfcs-tanf/modules/tanf/pages/1650.adoc -
Employment services:
dfcs-tanf/modules/tanf/pages/1801.adocthrough1840.adoc -
Issuance:
dfcs-tanf/modules/tanf/pages/1905.adoc -
Financial standards:
dfcs-tanf/modules/tanf/pages/appendix-a.adoc