AI incidents look different from ordinary outages: the system is up and answering, but wrongly or unsafely. Prepare specific playbooks.
- Bad output at scale — flag-flip to the previous prompt/model, then diagnose from traces. - Injection or exfiltration attempt — revoke the tool's credential, tighten egress, list every trace that touched the poisoned source, notify affected users if data left the system. - Provider outage or 5xx storm — fail over to a secondary model, degrade to a non-AI path (deterministic search, template reply, queue for later) rather than showing a spinner. - Cost spike — per-user and global circuit breakers trip automatically; investigate a retry loop first, since that is the usual cause.
ts
export async function withFallback(fn: () => Promise<string>) {
try { return await fn(); }
catch (e) {
if (isTerminal(e)) return TEMPLATE_REPLY; // 402/403: stop, do not retry
return await secondaryModel().catch(() => TEMPLATE_REPLY);
}
}Kill switches must be verified in a drill. An untested feature flag is a hope, not a control.
Exercise: run a game day — disable the primary model in staging and confirm the fallback path, the alert, and the user-facing message all behave as documented.