Runbook: channels outbound failure rate
Alert source: packages/testkit/alerts/channels.rules.yaml
Canonical markdown: docs/runbooks/channels-outbound-failure-rate.md
Severity: critical.
Symptom
More than 1% of outbound sends on channel {{ id }} are failing over a
rolling 5-minute window. Dashboards show the channel.outbound.failed
rate climbing while channel.outbound.sent stays flat or drops.
Likely cause
- Platform returned
429faster than the one-shot retry can absorb. - Auth token rotated out-of-band and the adapter is presenting stale credentials.
- Downstream template / payload validation is failing (WhatsApp, Slack block-kit).
Decision tree:
- 429 codes dominate → rate-limit path. Go to
channels-rate-limit-sustained. - 401 / 403 dominate → token invalid. Rotate + redeploy.
- 400 dominates → payload-shape problem; check recent release diffs.
Immediate mitigation
Disable the offending channel instance temporarily:
# There is no channel-pause verb — comment the channel out of
# channels.yaml and restart:
declaragent down && declaragent up -d
Removing only the failing channel leaves the other channels' outbound flowing after the restart.
Root-cause investigation
# Outbound channel audit records from the last 15 minutes (filter in jq):
declaragent audit query --kind channel_outbound --since -15m --json
# Correlate with the platform's status API (Slack / Meta / Discord).
# Grafana: "Channels" dashboard → "Outbound failure rate" panel.
If the adapter supports it, bump deps.logger to debug level and
capture one round of failed sends verbatim.
Post-incident
- Capture: channel id, failure mode, top 3 error bodies, restoration action.
- Close when: failure rate < 0.1% sustained for 10 minutes.
- Post-mortem: required for any outage > 30 minutes or any breach of a customer-facing SLA window.