Assistant streaming, persona, memory, or grounded-mode response path is failing for a material fraction of sessions. Use when the assistant itself — not the shell, not Sophia grounding — is the failure boundary.
Scope#
Covers assistant degradation across:
- Streaming token timeouts or repeated stalls (
assistant.stream.tokenintertoken latency > SLO). - Refusal-rate spike (policy or Lilith-persona rule mis-tuning).
- Persona drift (wrong tone, missing disclosure, identity confusion).
- Memory adapter (Iris) errors causing memory-off fallback.
- Grounded-mode unavailable for assistant sessions specifically (delegate to
grounding-failure.mdfor the upstream cause but stay in this runbook for the assistant-surface mitigation). - Voice/avatar mode failure where the assistant-product team owns the customer-visible mitigation.
For provider-side outages (network/auth/region), use provider-failover.md. For
shell-level breakage (bootstrap, route, auth), use shell-outage.md.
Severity classification#
| Sev | Condition |
|---|---|
| sev1 | >5% of assistant sessions fail to receive any tokens for >5 min, OR a persona violates AI-disclosure compliance in customer-visible flows. |
| sev1 | Memory adapter writes succeed against the wrong tenant, OR a refusal is bypassed for a Lilith-controlled policy class. |
| sev2 | Streaming stall rate above the SLO; refusal-rate change beyond ±2 sigma; voice/avatar fallback rate > 5%. |
| sev3 | Latency-only regression with delivery success intact; cosmetic persona issues. |
Source events for these thresholds are assistant.stream.token_received,
assistant.refusal.applied, assistant.persona.identity_confirmed,
assistant.memory.write_attempted from assistant-taxonomy.ts.
Detection signals#
- Alerts:
assistant-provider-outage,persona-policy-violationfromalerts-manifest.ts. - Dashboards:
dashboards-assistant.tsquality + compliance panels — intertoken latency p90, turn success rate, disclosure compliance, refusal rate, memory write success. - Customer signals: spike in
assistant.session.error_shown,assistant.disclosure.banner_dismissed. - Admin signals: T&S queue spike for
review.assistant.policy_appeal.
Initial triage (first 5 minutes)#
- Acknowledge
oshun-bff-assistant-oncall. - Determine failure boundary:
- Streaming stall → upstream provider, BFF, or token-distribution path.
- Refusal spike → Lilith policy version or model alignment change.
- Persona drift → persona-version regression (delegate to
persona-rollback.mdif identified). - Memory error → Iris adapter or downstream Postgres/Redis.
- If a Lilith policy or persona promotion happened in the last 60 min, prepare the rollback command before further diagnosis.
- If memory writes are crossing tenants, stop all memory writes before investigating (mitigation step 1).
Diagnosis#
- Open the assistant trace for a failing session — span
bff.assistant.turn→ child spans forlilith.policy.evaluate,iris.memory.fetch,sophia.retriever.query, and the provider call. The slowest or failing child is the prime suspect. - Inspect the provider health from
release-taxonomy.ts— provider state, region, current circuit breaker state, recent failover event. - Inspect the persona-rollout cohort: persona-taxonomy events
persona.version.activatedcorrelated with the failure-onset minute. - Inspect refusal classes: group
assistant.refusal.appliedbypolicy_classover the last 60 min; a single class spiking implicates a policy tightening. - Inspect memory writes:
iris.memory.write_attemptedgrouped by tenant — any cross-tenant write triggers a sev1 reclassification. - Inspect voice/avatar paths if relevant:
assistant.voice.session_startedandassistant.avatar.session_startedsuccess rate; the voice/avatar teams own the deeper diagnostic.
Mitigation#
- Memory write quarantine (if cross-tenant write suspected): set the Iris
kill switch
memory.writes_enabled=falseimmediately. All subsequent sessions fall back to non-persistent memory and theassistant.memory.write_quarantinedevent is emitted to admin audit. - Persona rollback: if persona drift is implicated, follow
persona-rollback.md. - Policy rollback: if a Lilith policy version is implicated, revert via the Lilith release-taxonomy hook and observe refusal-rate recovery.
- Provider failover: if the upstream provider is failing, follow
provider-failover.mdand verify the assistant cohort moves to the alternate. - Grounded-mode disable: if grounded mode is the failure surface, disable
grounded-mode for assistant sessions via the assistant
grounded_mode_enabledflag while keeping non-grounded answers available. Disclosure shifts to non-grounded copy automatically percustomer-taxonomy.ts. - Streaming fallback: enable non-streaming responses
(
assistant.stream_mode=batch) when intertoken latency stalls cannot be resolved within 30 min; this restores delivery at the cost of perceived latency. - Voice/avatar fallback: degrade voice → text and avatar → non-animated
portrait per the assistant-fallback policy. The
assistant.voice.fallback_shownandassistant.avatar.fallback_shownevents emit for analytics.
Communication cadence#
Identical structure to shell-outage.md. For sev1 with disclosure or memory
implications, the resolved customer email must clearly state the cohort, the
remediation, and the option to delete affected memory entries. Coordinate copy
with the privacy lead before sending.
Escalation#
Standard escalation. For sev1 with persona/disclosure/memory implications, pre-emptively page T&S and privacy in parallel with assistant_product.
Recovery verification#
- Turn success rate ≥ 99% for 15 min.
- Intertoken latency p90 within SLO for 15 min.
- Refusal rate within ±1 sigma of baseline.
- Memory writes succeeding with tenant integrity verified by a fresh
cross-tenant audit pass (no
memory.cross_tenant_detectedevents for 30 min). - Voice/avatar fallback rate < 1%.
Post-incident#
- Postmortem must include the persona-version, policy-version, model-version, and provider-route active at incident open, plus the recovered versions.
- Attach the audit export of
assistant.*,iris.*, andlilith.*events in the incident window. - If memory was affected, file a privacy-impact note even if no data was exposed — the customer-visible memory state must be reconciled.
- If a refusal class was tightened in error, the Lilith policy review packet must explain the false-positive sample and the recertified policy.