Channels
One Channel protocol; 5 channel adapters (WhatsApp + voice + web + Instagram + Messenger) + 1 SMS notification sink. The substrate that lets the FSM treat every surface uniformly.
Voice conversation
Full-duplex phone call handling — LiveKit SIP bridge, Deepgram streaming STT, ElevenLabs TTS, barge-in, backchannel, and WPM-adaptive speed.
Conversation FSM
LangGraph-backed booking / cancellation / reschedule / cross-sell state machine; Redis hot path + Postgres checkpointer; bilingual EN+SW.
Knowledge answers
Phase 0 "no-RAG RAG" — per-tenant knowledge snippets injected into the answer_shaper prompt; real retrieval deferred as YAGNI.
Identity & tenancy
Schema-per-tenant Postgres + phone-only deterministic cross-channel customer identity.
Payments
M-Pesa STK push (Daraja) + cards (PesaPal); reservation locks; one-shot stkpushquery; daily 3 AM EAT consolidated reaper.
Cross-sell
Slot-aware cross-sell — offer a complementary service when an adjacent slot exists. Atomic ordered-pair Redis Lua reservation; cap 1 per conversation; ±15-min adjacency window; relation graph seeded at catalog import.
Personality dials
6 curated dials (Tone / Greeting / Upsell / Cancellation / Honorific / Cross-sell) per-vertical YAML defaults + tenant overrides; user-template splice preserves Anthropic prompt-cache eligibility. Canonical page for the prompt-cache invariant and answer_shaper.
Catalog onboarding
Bulk catalog onboarding via Anthropic Vision (image / PDF / CSV / text) + LLM-inferred relation graph; idempotent re-imports; price never auto-filled (safety floor).
Admin orchestrator
Dual-channel admin rail (dashboard WS + WhatsApp inbound); handoff Pattern 3 + briefing card; 11 admin slash commands with two-turn YES/NO confirmation; NL fallback; 4h TTL auto-handback.