All tables live in ANR's shared Supabase project, prefixed sentinel_, with Row Level Security enabled throughout.
| Table | Purpose |
|---|---|
| sentinel_clients | Master account records — contract value, engagement type, account owner, renewal date |
| sentinel_signals | Classified relationship signals — the output of Agent 1, the input to every downstream agent |
| sentinel_health_scores | Score history per client — score, state, delta, rationale, risk/positive signal citations |
| sentinel_diagnostics | Root-cause reports for at-risk/drifting accounts, linked to the health score that triggered them |
| sentinel_actions | Drafted outreach awaiting human review — status moves pending_review → approved / dismissed |
| sentinel_generator_runs | The pipeline run ledger — every run logged with status, signals created, and errors |
| sentinel_weekly_digests | Portfolio-wide Monday briefings summarizing health movement across all accounts |
| Table | Purpose |
|---|---|
| sentinel_raw_events | One immutable row per communication event — email, calendar, or manual note. Judgment-free by design; sentiment lives downstream in sentinel_signals, never here |
| sentinel_client_identity_map | Maps email domains and individual addresses to clients, with a UNIQUE constraint making one identifier mapping to two clients structurally impossible |
| sentinel_unmatched_events | The holding queue for events that couldn't be attributed — reviewed and resolved through the dashboard, teaching the identity map with every correction |
sentinel_raw_events.processing_status moves through a crash-safe state machine: received (raw content persisted before any LLM touches it) → ready (summarized, awaiting classification) → processed (signal created) or skipped (deliberately no signal — an out-of-office autoreply, an internal-only calendar block) — with failed recoverable from either stage without data loss, since the raw content was never dependent on the LLM step succeeding.
key_quotes is stored as a JSONB array of objects ({quote, speaker, context}), not plain strings — preserving who said what and why it matters, and giving the no-hallucination rule something checkable to enforce against.