Plan: SNAP Ruleset & Configuration Alignment

On this page

Status

Step Description Status

1

Fill remaining citation gaps in rulesets/georgia/citations.toml for all SNAP keys

Done (2026-04-09) — 148/148 keys cited, zero audit errors

2

Fix EBT expungement (365 → 274 days per month) and Medicaid child 0-1 limit (220% → 205%)

Done (2026-04-09)

3

Add ABAWD time clock status tracking to canopy-snap store layer

Done (2026-04-09) — migration, store module with 15 status enum, get_or_create/update/count functions

4

Add self-employment parameters to jurisdiction.toml

Done (2026-04-09) — [snap.self_employment] section with 40% deduction, boarder income method

5

Add verification threshold parameters to jurisdiction.toml

Done (2026-04-09) — [snap.verification_thresholds] with $50/$100/$25/$25/75%

6

Add DSNAP parameters to jurisdiction.toml

Done (2026-04-09) — [snap.dsnap] with 3-day SOP, net income basis, limits by HH size

7

Update SNAP rulesets for PAMMS-specific deduction rules

Done (2026-04-09) — added Georgia SMD ($161) option in medical deduction, homeless shelter deduction ($199) as alternative to excess shelter

8

Verify all corrections with cargo xtask policy audit

Done (2026-04-09) — 150/150 keys cited, zero staleness warnings

Dependency: Plan 1 (Federal Parameter Data Completion) — federal files must be FY2026 before jurisdiction alignment
Branch: feature/snap-pamms-alignment

Context

SNAP Phase 1 UAT is code-complete (512 tests, 67 E2E), but the comprehensive PAMMS read (98 pages, sections 3000-3810 + appendices) revealed data discrepancies and missing configuration values. The core SNAP eligibility engine is correct architecturally — the issues are in parameter values and missing tracking features.

Key findings from PAMMS that need addressing:

  • cargo xtask policy audit reports 84 missing citations across all programs — approximately 30 are SNAP-related

  • EBT expungement is 274 days per individual month, not 365 days flat (PAMMS 3805)

  • Medicaid child 0-1 income limit was 220% in jurisdiction.toml but PAMMS 2182 says 205% for non-Newborn Medicaid children

  • ABAWD time clock tracks 15 distinct monthly status values (C/E/D/A/G/H/M/N/O/P/R/S/W/X/T) — we currently track only hours

  • Self-employment 40% standard business deduction is a Georgia state option (PAMMS 3425)

  • Verification has specific monetary thresholds for when TPS verification is required ($50 earned income change, $100 unearned, $25 medical/child support, 75% of resource limit)

  • DSNAP (Disaster SNAP) has separate income limits and a 3-day SOP

  • Senior SNAP age threshold changed from 60 to 66 effective 2/2/2026 (PAMMS 3725)

Steps

Step 1: Fill SNAP Citation Gaps

Run cargo xtask policy audit and address every MISSING citation that starts with snap.. For each, read the corresponding PAMMS source file, verify the value in jurisdiction.toml, and add the citation to rulesets/georgia/citations.toml.

Missing SNAP citations to fill (from the audit output):

  • snap.abawd.discretionary_exemption_pct — PAMMS 3355

  • snap.abawd_waiver_areas — PAMMS 3355

  • snap.certification.* — PAMMS 3105 Chart 3105.1

  • snap.determination.* — PAMMS 3105

  • snap.disqualifications.* — PAMMS 3310, 3315

  • snap.expedited.* — PAMMS 3110

  • snap.ipv.* — PAMMS 3315

  • snap.issuance.* — PAMMS 3810

  • snap.sua.allow_actual_utility_costs — PAMMS 3617

  • snap.sua.available_tiers — PAMMS 3617

Each citation must include: value, authority, source_ref (PAMMS file path), effective_date, federal_citation, verified_date.

Step 2: Fix Remaining Incorrect Values

File: rulesets/georgia/jurisdiction.toml

Corrections with PAMMS citations:

Key Current Correct PAMMS Source

snap.issuance.expungement_days

365

274

PAMMS 3805 ("274 days" per month of benefits)

medicaid.magi_child_0_1_income_limit_pct_fpl

220

205

PAMMS 2182 (220% is pregnant women; children 0-1 = 205%)

medicaid.magi_child_1_5_income_limit_pct_fpl

149

149

Correct (verify against PAMMS A2)

medicaid.magi_child_6_18_income_limit_pct_fpl

133

133

Correct (verify against PAMMS A2)

Add citation entries for each corrected value.

Step 3: Add ABAWD Time Clock Status Tracking

Files: services/canopy-snap/migrations/ (new migration), services/canopy-snap/src/store/ (new or updated module)

PAMMS 3355 defines 15 ABAWD Time Clock (ATC) status values for each month of the 36-month window:

Code Meaning

C

Countable month (benefits received, work requirement not met)

E

Exempt (meets an exemption)

D

Discretionary exemption granted

A

ABAWD work requirement met

G

Good cause

H

Prorated month (does not count)

M

Month of regaining eligibility

N

Not receiving benefits

O

Over-issuance month

P

Pending (status not yet determined)

R

Regained eligibility (earned second 3-month period)

S

Second 3-month period month

W

Waived area

X

Not an ABAWD (aged out, exempt, not work registrant)

T

Transferred from another state

Migration:

CREATE TABLE abawd_time_clock (
    id UUID PRIMARY KEY,
    person_id UUID NOT NULL,
    period_start DATE NOT NULL,     -- 36-month period start (e.g., 2023-12-01)
    period_end DATE NOT NULL,       -- 36-month period end (e.g., 2026-11-30)
    month_statuses JSONB NOT NULL,  -- {"2024-01": "N", "2024-02": "C", ...}
    countable_months INTEGER NOT NULL DEFAULT 0,
    created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

CREATE INDEX idx_abawd_clock_person ON abawd_time_clock(person_id);

Store functions: get_or_create_time_clock(pool, person_id), update_month_status(pool, person_id, month, status), count_countable_months(pool, person_id).

The existing canopy-snap/src/api/abawd_handler.rs activity recording should update the time clock after checking if hours meet the 80-hour threshold.

Step 4: Add Self-Employment Parameters

File: rulesets/georgia/jurisdiction.toml

[snap.self_employment]
standard_deduction_pct = 40        # Georgia state option (PAMMS 3425)
standard_deduction_enabled = true  # AU must incur at least one allowable cost
farm_gross_minimum_for_loss_offset = 1000  # $1,000 annual gross to offset farm losses
boarder_income_deduction_method = "max_allotment_or_40pct"  # PAMMS 3425

Add citations for each.

Step 5: Add Verification Threshold Parameters

File: rulesets/georgia/jurisdiction.toml

[snap.verification_thresholds]
# When TPS verification is required for changes (PAMMS 3035, 3715)
earned_income_change_cents = 5000       # $50 change triggers TPS verification
unearned_income_change_cents = 10000    # $100 change triggers TPS verification
medical_expense_change_cents = 2500     # $25 change triggers TPS verification
child_support_change_cents = 2500       # $25 change triggers TPS verification
resource_verification_pct = 75          # Verify when resources > 75% of limit

These thresholds inform the worker portal when to require verification documents vs. accept client statement.

Step 6: Add DSNAP Parameters

File: rulesets/georgia/jurisdiction.toml

[snap.dsnap]
# Disaster SNAP parameters (PAMMS 3125)
sop_days = 3                          # 3 calendar days from interview
income_basis = "net"                  # Net income, NOT converted
proration_enabled = false             # DSNAP benefits not prorated
# DSNAP gross income limits by HH size (FY2026, PAMMS 3125)
income_limits = [2258, 2716, 3174, 3647, 4143, 4639, 5098, 5556]
each_additional = 459

Step 7: Update SNAP Rulesets

Review rulesets/georgia/snap-eligibility.json against the PAMMS 3610 budgeting cascade. The ruleset should already implement the correct deduction order, but verify:

  1. The standard deduction tiers reference the updated federal file values

  2. The medical deduction correctly applies the $35 threshold and Georgia’s $161 SMD

  3. The excess shelter deduction correctly applies the $744 cap (uncapped for elderly/disabled)

  4. The child support deduction is included in the cascade

  5. The homeless shelter deduction ($199) is an alternative to excess shelter

If the ruleset needs changes, update the JDM nodes. All threshold values must come from the input JSON (injected by params.rs from the federal/jurisdiction files), never hardcoded in the ruleset.

Step 8: Verify

  1. cargo xtask policy audit — zero missing SNAP citations

  2. cargo check --package canopy-snap — compiles

  3. cargo test --package canopy-snap — all tests pass

  4. Every value in jurisdiction.toml [snap.*] has a corresponding citation with PAMMS source_ref

PAMMS Source References

  • Application processing: dfcs-snap/modules/snap/pages/3105.adoc

  • Expedited: dfcs-snap/modules/snap/pages/3110.adoc

  • AU composition: dfcs-snap/modules/snap/pages/3205.adoc

  • Categorical eligibility: dfcs-snap/modules/snap/pages/3210.adoc

  • Verification: dfcs-snap/modules/snap/pages/3035.adoc

  • ABAWD: dfcs-snap/modules/snap/pages/3355.adoc

  • Resources: dfcs-snap/modules/snap/pages/3405.adoc

  • Income: dfcs-snap/modules/snap/pages/3420.adoc

  • Self-employment: dfcs-snap/modules/snap/pages/3425.adoc

  • Budgeting: dfcs-snap/modules/snap/pages/3610.adoc

  • Deductions: dfcs-snap/modules/snap/pages/3611.adoc through 3618.adoc

  • Senior SNAP: dfcs-snap/modules/snap/pages/3725.adoc

  • Periodic reporting: dfcs-snap/modules/snap/pages/3730.adoc

  • EBT/issuance: dfcs-snap/modules/snap/pages/3805.adoc, 3810.adoc

  • DSNAP: dfcs-snap/modules/snap/pages/3125.adoc

  • Financial standards: dfcs-snap/modules/snap/pages/appendix-a-food-stamp-income-limits.adoc

Edit this page · default