All tables live in ANR's shared Supabase project, prefixed sentinel_, with Row Level Security enabled throughout.


Intelligence Layer (7 tables)

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

Ingestion Layer (3 tables — Agent 0)

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

Key Schema Decisions

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.