Incident Response Index¶
Start here during an incident. This index defines severity tiers and the escalation path, then routes to the component runbook that handles the specific failure. Keep the response practical: classify, page the right owner, follow the linked runbook, and capture evidence as you go.
Severity Tiers¶
| Severity | Definition | Examples | Response |
|---|---|---|---|
| SEV1 | Platform-wide outage or confirmed data loss/exposure. Core business endpoints down, customer data lost or leaked. | Inference gateway has zero ready endpoints; Qdrant data lost with no good backup; confirmed prompt/secret exfiltration. | Page on-call immediately, open an incident channel, engage platform + security leads. All hands until mitigated. |
| SEV2 | Major degradation, single critical component down, or error budget fast-burn. Service usable but impaired; no confirmed data loss. | One runtime backend absent; RAG service high error rate; budget Redis down (budgets fail open/closed); restore drill failing. | Page on-call. Mitigate within the hour; keep stakeholders updated. |
| SEV3 | Minor or contained issue, slow-burn, or single-tenant impact. Workarounds exist. | One sandbox over budget; elevated p95 latency; a single Kyverno-blocked deploy; backup stale but last backup good. | Handle in business hours. Track to closure; no paging unless it escalates. |
When unsure, round up: treat a possible data-loss or data-exposure event as SEV1 until proven otherwise.
Escalation Path¶
- On-call operator acknowledges the alert, classifies severity, and starts the matching runbook below.
- Platform lead is engaged for SEV1/SEV2, or when the operator cannot mitigate within the tier's response window.
- Security lead is engaged for any suspected data exposure, prompt-injection
exploitation, model-artifact tampering, or pipeline compromise (see
docs/threat-model.md). - Customer / incident manager owns external communication and the incident record for SEV1/SEV2.
Alerts carry a runbook_url annotation pointing at the relevant runbook; the
backend-absent and restore alerts also name the runbook in their summary.
Incident And Drill Runbooks¶
| Situation | Runbook |
|---|---|
| Inference gateway / runtime unavailable (502s, backend absent, no ready endpoints) | runbooks/incident-inference-runtime.md |
| RAG service errors or high latency | runbooks/rag-service.md |
| Argo CD sync blocked by Kyverno admission | runbooks/policy-blocked-deploy.md |
| Restore / backup failure or stale backup | runbooks/restore-drill.md |
| Controlled disruption and recovery drills | runbooks/chaos-drills.md |
| Sandbox budget rejections and admission limits | runbooks/budget-controls.md |
| Upgrade gone wrong / need to roll back | runbooks/upgrade.md |
| Vector store schema / collection migration | runbooks/qdrant-migration.md |
Gap Sections¶
The following failures did not have a dedicated runbook. Each section is the first-response procedure; escalate per the tiers above.
Budget Redis Outage¶
Severity. Usually SEV2: the shared budget backend (deploy/charts/budget-redis,
budget namespace) is down, so the gateway cannot read or write per-sandbox
usage. Inference availability itself may be unaffected, but budget enforcement is
degraded.
What to check.
kubectl -n budget get deploy,svc,networkpolicy,pods
kubectl -n budget exec deploy/budget-redis -- redis-cli ping # expect PONG
kubectl -n inference logs deploy/inference-gateway-inference-gateway --tail=100 | grep -E 'budget|redis'
Confirm SANDBOX_BUDGET_BACKEND=redis and that SANDBOX_BUDGET_REDIS_URL
resolves the budget namespace service. Check the gateway's
SANDBOX_BUDGET_REDIS_TIMEOUT_SECONDS -- a slow Redis can manifest as timeouts.
How to recover.
- Restart the backend and confirm it returns:
DRILL=budget-redis-rollout make chaos-drill(rollout-restarts Redis, checksredis-cli ping, runs gateway smoke). - If the Deployment is unschedulable, inspect events/PVC and node capacity; the chart renders a PDB and NetworkPolicies (default-deny + gateway allow), so a broken NetworkPolicy can also sever the gateway-to-Redis path.
- While Redis is down, decide budget posture deliberately: a managed/enterprise
Redis can be swapped in by pointing
budget.redisUrlat it (seerunbooks/budget-controls.md). Do not silently disable budgets in production. - Validate with the budget endpoint once recovered:
curl -H 'X-Sandbox-ID: <id>' http://127.0.0.1:18082/v1/sandbox/budget.
Vector-Store (Qdrant) Data Loss¶
Severity. SEV1 if customer vectors in the production
customer-platform-knowledge collection are lost or corrupted; SEV2 if only RAG
retrieval is degraded while data is intact.
What to check.
kubectl -n vector get pods,pvc,svc
kubectl -n vector logs deploy/qdrant-vector-store --tail=100
# collection presence and point counts (port-forward first):
kubectl -n vector port-forward svc/qdrant-vector-store 6333:6333 &
curl -s http://127.0.0.1:6333/collections
curl -s http://127.0.0.1:6333/collections/<collection>
Confirm whether the PVC still holds data (empty PVC vs. corrupted collection vs.
unreachable pod) and check the RAG service health for retrieval_backend=qdrant.
How to recover.
- If the pod is simply unhealthy, restart and revalidate:
DRILL=qdrant-vector-store-rollout make chaos-drill. - If data is actually lost, restore from the most recent Qdrant snapshot /
backup. The end-to-end recovery procedure (seed, snapshot, delete, restore,
assert point count) is in
runbooks/restore-drill.mdunder "Real Data-Recovery Drill (Qdrant)"; the production restore follows the same snapshot-restore path against the real collection. Backups are a customer prerequisite -- a metadata-only Velero backup restores an empty store, so the PVC/snapshot contents must have been captured (seedeploy/clusters/customer/README.mdhandoff checklist). - After restore, re-run RAG smoke and confirm recovered point counts match expectations before declaring recovery.
- If no good backup exists, this is a SEV1 data-loss event: engage the customer incident manager and rebuild the collection from the source-of-truth knowledge ingestion.
Kyverno-Blocked Deploys¶
Severity. Typically SEV3 (a single blocked manifest), escalating to SEV2 if it blocks a release-wide sync or a rollback during another incident.
What to check.
kubectl get events --all-namespaces --field-selector reason=PolicyViolation
kubectl -n argocd describe application <application>
kubectl get clusterpolicy
kyverno apply deploy/policies/kyverno/policies.yaml --resource <rendered-resource.yaml>
Common causes: missing required labels (including platform.ai/sandbox-id), a
latest image tag, missing CPU/memory requests/limits, running as root, an
egress CIDR that is too broad (ai-platform-restrict-egress-cidrs), or an image
that fails signature verification (ai-platform-verify-project-images, set to
Enforce with a keyless subject/issuer restricted to the approved CI identity).
How to recover.
- For a policy/manifest mismatch, fix the manifest -- see
runbooks/policy-blocked-deploy.md. Do not bypass policy; exceptions must be time-boxed, documented, and reviewed. - For an image-verification block on a fork, the keyless
subject/issuerindeploy/policies/kyverno/policies.yamland the image registry must point at your own identity (seedocs/threat-model.mdanddeploy/clusters/customer/README.md). A rejected image signed by an unexpected identity is the policy working as intended -- treat an unexplained verification failure as a potential supply-chain event and escalate to the security lead. - For a broad-egress block, add the destination to
platform/network/egress-catalog.yamland reference it bycatalogRefrather than widening the CIDR (runbooks/egress-governance.md).
Evidence¶
For every incident, record: the firing alert and severity, timeline, the runbook
followed, mitigation steps (including any paused Argo CD automation per
runbooks/upgrade.md), affected deploy/sandbox/request IDs, and -- for data-loss or
security events -- the deploy/backup/restore artifacts and the security-lead handoff.