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 |
|---|---|---|---|
|
canopy-tanf |
canopy-snap |
Create TSNAP 5-month transitional certification |
|
canopy-tanf |
canopy-medicaid |
Create TMA 12-month transitional coverage |
|
canopy-snap |
canopy-medicaid |
Express Lane check for children under 19 |
|
canopy-tanf |
canopy-snap |
TCOS categorical eligibility for SNAP |
|
canopy-snap |
(external) |
LIHEAP referral for SUA eligibility |
|
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:
-
Look up current SNAP case for the household
-
Calculate frozen benefit (current allotment minus TANF grant amount from event payload)
-
Create TSNAP certification (5 months, no periodic reporting)
-
Publish
snap.tsnap_createdevent
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.adocthrough2985.adoc -
EPSDT:
dfcs-medicaid/modules/medicaid/pages/2930.adoc