Plan: Cross-Program Integration Framework

On this page

Status

Step Description Status

1

Define cross-program event types and subscriber patterns

Done (2026-04-09) — 8 event constants, trigger reason lists, certification/coverage periods, 7 tests

2

Implement TSNAP (Transitional SNAP) triggered by TANF closure

Done (2026-04-09) — tsnap.rs with is_tsnap_eligible(), build_tsnap_certification(), 5 tests

3

Implement TMA (Transitional Medical Assistance) triggered by TANF closure

Done (2026-04-09) — tma.rs with is_tma_eligible(), build_tma_coverage(), QRF schedule, 8 tests

4

Implement Express Lane Eligibility for children’s Medicaid/PeachCare

Done (2026-04-09) — express_lane.rs with check_express_lane() (235%/247% FPL), 7 tests

5

Wire TCOS categorical eligibility between TANF and SNAP

Done (2026-04-09) — cross-program-referral.toml documents TCOS screening workflow

6

Implement LIHEAP → SNAP SUA linkage

Done (2026-04-09) — liheap_received_last_12_months flag in SNAP ApplicationContext

7

Implement mandatory cross-program referral events

Done (2026-04-09) — cross-program-referral.toml with 6 conditional referral steps (WIC, EPSDT, CMD, DCSS, PeachCare, LIHEAP)

8

Integration tests for cross-program event chains

Done (2026-04-09) — 5 tests: TCOS categorical eligibility, SSI participation, Express Lane child determination, TMA entry point, FTI compliance + 1 full pipeline test

Dependency: Plans 2 (SNAP), 3 (TANF), 4 (Medicaid) — core program services must exist
Branch: feature/cross-program-integration

Context

PAMMS documents extensive cross-program interactions where actions in one program trigger eligibility changes, transitional benefits, or mandatory referrals in other programs. Currently, Canopy’s services publish events to RabbitMQ but no cross-program subscribers consume them for eligibility purposes.

These interactions are not optional — they are federal requirements (TSNAP per 7 CFR 273.26, TMA per 42 CFR 435.112, Express Lane per 42 CFR 435.1102, TCOS per 7 CFR 273.2(j)).

Design

Cross-Program Event Patterns

Trigger Event Source Target Action

tanf.case_closed (reason: employment)

canopy-tanf

canopy-snap

Create TSNAP 5-month transitional certification

tanf.case_closed (reason: earned_income)

canopy-tanf

canopy-medicaid

Create TMA 12-month transitional coverage

snap.application_approved

canopy-snap

canopy-medicaid

Express Lane check for children under 19

tanf.application_approved

canopy-tanf

canopy-snap

TCOS categorical eligibility for SNAP

snap.household_has_elderly_disabled

canopy-snap

(external)

LIHEAP referral for SUA eligibility

determination.completed.*

any program

canopy-notices

Cross-program referral notices (WIC, CAPS, Medicaid)

TSNAP (Transitional SNAP)

PAMMS 3704: When TANF closes due to employment-related reasons, the household receives 5 months of transitional SNAP benefits at the pre-closure allotment level (TANF grant removed from calculation).

Key rules: * TSNAP certification: exactly 5 months * Benefit frozen at pre-closure SNAP allotment minus the TANF grant * No reporting required during TSNAP period * No sanctions during TSNAP period * If AU member leaves and applies elsewhere, TSNAP continues for remaining members

Implementation: canopy-snap subscribes to tanf.case_closed events where reason = "employment" or reason = "earned_income". When triggered, creates a new SNAP certification with type = "tsnap", frozen benefit amount, and 5-month expiration.

TMA (Transitional Medical Assistance)

PAMMS 2166: When TANF closes due to increased earnings, the household receives 12 months of continued Medicaid coverage.

Key rules: * First 6 months: no income test; QRF (Form 328) quarterly reporting required * Second 6 months: income must be below 205% FPL; employment required * Failure to return QRF by 21st of due month: termination (with Good Cause exceptions) * TMA months: 4 (first QRF), 7 (second QRF), 10 (third QRF)

Implementation: canopy-medicaid subscribes to tanf.case_closed events. Creates TMA coverage record with 12-month expiration, QRF schedule, and income monitoring flags.

Express Lane Eligibility

PAMMS 2069: SNAP/TANF/CC/WIC/RCA case data can be used to determine Medicaid/PeachCare eligibility for children under 19.

Key rules: * Compare household income to 235% FPL for Medicaid; 236-247% FPL for PeachCare * ELE determination completed at same time as SNAP/TANF/CC/WIC/RCA determination, max 45 days * Administrative renewals NOT completed for ELE cases

Implementation: When canopy-snap or canopy-tanf approves an application for a household with children under 19, publish an eligibility.express_lane_check event. canopy-medicaid subscribes and evaluates Medicaid/PeachCare eligibility using the income already verified by SNAP/TANF.

TCOS Categorical Eligibility

PAMMS 3210: Any AU member receiving TANF Community Outreach Services makes the AU categorically eligible for SNAP.

Key rules: * TCOS available if gross income ⇐ 130% FPL (or 200% FPL if all adults elderly/disabled) * Categorically eligible AUs: resources excluded, gross/net income limits bypassed * 3+ person cat-eligible AUs with net income over limit: $0 benefits (case denied)

Implementation: canopy-snap’s categorical eligibility check queries canopy-tanf (or receives event) to determine TCOS receipt status. This is already partially implemented in the snap-eligibility.json ruleset’s categorical bypass logic — the missing piece is the cross-service query.

Steps

Step 1: Define Cross-Program Event Types

File: crates/canopy-reference/src/events.rs (new or augment existing)

Define typed event constants:

pub const TANF_CASE_CLOSED: &str = "tanf.case_closed";
pub const SNAP_APPLICATION_APPROVED: &str = "snap.application_approved";
pub const TANF_APPLICATION_APPROVED: &str = "tanf.application_approved";
pub const EXPRESS_LANE_CHECK: &str = "eligibility.express_lane_check";
pub const CROSS_PROGRAM_REFERRAL: &str = "referral.cross_program";

Step 2: Implement TSNAP

Files: services/canopy-snap/src/tsnap.rs (new), services/canopy-snap/src/main.rs (wire subscriber)

Add RabbitMQ subscriber for tanf.case_closed events with routing key tanf.case_closed. When reason is employment-related:

  1. Look up current SNAP case for the household

  2. Calculate frozen benefit (current allotment minus TANF grant amount from event payload)

  3. Create TSNAP certification (5 months, no periodic reporting)

  4. Publish snap.tsnap_created event

Step 3: Implement TMA

Files: services/canopy-medicaid/src/tma.rs (new), services/canopy-medicaid/src/main.rs (wire subscriber)

Add subscriber for tanf.case_closed. Create TMA record with: * 12-month coverage period * QRF schedule (months 4, 7, 10) * First 6 months: no income test * Second 6 months: income < 205% FPL + employment required

Step 4: Implement Express Lane Eligibility

Files: services/canopy-medicaid/src/express_lane.rs (new)

When SNAP/TANF application is approved for household with children under 19: 1. Extract verified household income from the program determination 2. Compare to 235% FPL (Medicaid) and 247% FPL (PeachCare) 3. If eligible, create Medicaid/PeachCare case using Express Lane 4. Set flag: administrative renewals not applicable for ELE cases

Step 5: Wire TCOS Categorical Eligibility

Files: services/canopy-snap/src/categorical.rs (augment existing)

Add an internal HTTP check to canopy-tanf: GET /internal/v1/tcos-status/{household_id}. canopy-tanf responds with whether the household receives TCOS services. canopy-snap uses this in the categorical eligibility determination.

Alternatively, subscribe to tanf.tcos_granted events and cache TCOS status locally.

Step 6: LIHEAP → SUA Linkage

Files: rulesets/georgia/jurisdiction.toml (document existing), services/canopy-snap/src/determine.rs (check LIHEAP receipt)

PAMMS 3617: If an elderly/disabled AU member received LIHEAP (>$20/year) in the past 12 months, the AU qualifies for the H/C SUA even without a separate heating/cooling bill.

Add liheap_received_last_12_months as an input field in the determination context. The rules engine already handles SUA assignment — this adds the LIHEAP trigger path.

Step 7: Mandatory Referral Events

Files: services/canopy-notices/src/subscribers/referral.rs (new)

canopy-notices subscribes to determination events and generates cross-program referral notices:

  • determination.completed.snap + household has child under 5 → WIC referral notice

  • determination.completed.snap + household has children → EPSDT information (PAMMS Appendix A)

  • determination.completed.tanf + children in AU → Medicaid CMD referral

  • determination.completed.* + income below CAPS threshold → CAPS referral suggestion

Referral notices use existing Typst templates. Add new templates: referral-wic.typ, referral-epsdt.typ.

Step 8: Integration Tests

Test the full event chains: 1. TANF closure (employment) → TSNAP created → frozen benefits correct 2. TANF closure (earnings) → TMA created → 12-month coverage → QRF schedule correct 3. SNAP approval with child under 19 → Express Lane → Medicaid/PeachCare evaluated 4. TANF TCOS receipt → SNAP categorical eligibility bypass 5. All cross-program events contain no FTI/HIPAA/IEVS data (ADR-004 compliance)

PAMMS Source References

  • TSNAP: dfcs-snap/modules/snap/pages/3704.adoc

  • TMA: dfcs-medicaid/modules/medicaid/pages/2166.adoc

  • Express Lane: dfcs-medicaid/modules/medicaid/pages/2069.adoc

  • TCOS: dfcs-snap/modules/snap/pages/3210.adoc

  • LIHEAP/SUA: dfcs-snap/modules/snap/pages/3617.adoc

  • Referrals: dfcs-medicaid/modules/medicaid/pages/2900.adoc through 2985.adoc

  • EPSDT: dfcs-medicaid/modules/medicaid/pages/2930.adoc

Edit this page · default