# Signal CGM powered by STTIL Solutions

B2B CGM documentation worklist tool for DMEPOS suppliers. Ingests CSV shipment data
(Brightree/WellSky exports), calculates coverage expiration per patient using
device wear-day rules, and produces a prioritized worklist for proactive outreach
— so small DME teams act before claims deny, not after.

**Self-hosted. Data never leaves the supplier network.**

---

## What It Does

Most DMEPOS suppliers manage CGM coverage reactively: a claim denies, then staff
scramble to appeal. Signal CGM flips that. The system watches coverage windows
continuously and surfaces patients approaching expiration before the denial
condition exists.

- Ingests shipment CSV from Brightree or WellSky
- Calculates coverage expiration per patient per device using payer-specific
  wear-day rules
- Flags each patient: `REFILL_WINDOW`, `VISIT_DUE`, `OUT_OF_COVERAGE`, or `OK`
- Delivers a prioritized worklist to DME staff via encrypted email
- Staff handle outreach locally — Signal CGM never contacts patients directly

## Stack

| Layer | Technology |
|-------|-----------|
| Backend | Python / FastAPI |
| Database | PostgreSQL (encrypted at rest) |
| Orchestration | n8n (self-hosted, 24-hour batch trigger) |
| Notifications | Mailcow (self-hosted SMTP — staff email only) |
| Hosting | Hostinger VPS — data stays on-prem |

## PHI Architecture

Signal CGM is designed to minimize PHI surface area:

- **Sole crosswalk key:** `patient_id` (the supplier's internal MRN or account
  number). No names, SSNs, DOBs, or contact information enter the system.
- DME staff maintain the `patient_id` ↔ real identity mapping in their own
  systems (Brightree, EHR, etc.).
- The calculation layer sees: `patient_id`, `device_type`, `shipment_date`,
  `quantity`, `payer` — nothing else.
- All audit logs hash `patient_id` before storage. Raw identifiers never appear
  in logs.

## Coverage Flag Logic

| Flag | Meaning |
|------|---------|
| `REFILL_WINDOW` | Patient is within the refillable window — safe to ship |
| `VISIT_DUE` | Physician visit renewal is approaching (Medicare: 180 days) |
| `OUT_OF_COVERAGE` | Coverage has lapsed — outreach required before next shipment |
| `OK` | No action needed at this time |

## Directory Structure

```
signal-cgm/
├── python-backend/
│   ├── core/
│   │   ├── coverage_calculator.py   # Coverage clock logic
│   │   ├── audit_logger.py          # PHI-safe audit logging
│   │   └── db_models.py             # PostgreSQL models
│   └── config/
│       └── payer_rules.json         # Wear-day rules by device and payer
├── n8n-workflows/                   # n8n batch trigger exports
└── CLAUDE.md                        # Active dev context
```

## BAA Status (Level 1)

| Vendor | BAA Required | Status |
|--------|-------------|--------|
| Hostinger VPS | Yes — PHI host | Pending |
| Anthropic API | Only if AI layer touches PHI | Not applicable (Level 1) |
| All other components | Self-hosted — operator is STTIL | N/A |

---

© 2026 STTIL Solutions LLC. Proprietary software — see LICENSE.md.
