Runbook: channels rate limit sustained
Alert source: packages/testkit/alerts/channels.rules.yaml
Canonical markdown: docs/runbooks/channels-rate-limit-sustained.md
Severity: warning.
Symptom
channel.outbound.rate_limit_retries on channel {{ id }} holds above
0.5/s for 10 minutes. The platform is continuously returning 429.
Likely cause
- Broadcast campaign volume exceeds the platform's per-workspace ceiling.
- Audience includes unsubscribed / invalid recipients the platform is deliberately throttling.
- The adapter's token is shared with another caller outside Declaragent.
Immediate mitigation
Reduce the outbound rate:
# Lower the channel's outbound rate in channels.yaml, then restart:
declaragent down && declaragent up -d
If the surge is a campaign, pause the skill emitting it.
Root-cause investigation
# Recent retry samples — the retry counter plus outbound audit records:
curl -s http://127.0.0.1:9464/metrics | grep channel_outbound_rate_limit_retries
declaragent audit query --kind channel_outbound --since -30m --json
# Grafana: "Channels" dashboard → "Rate-limit retries" panel.
Compare against the platform's published rate-limit tiers (Slack Tier 4, Meta Business messaging tier, etc.).
Post-incident
- Capture: peak retries/s, driving skill, effective QPS after mitigation.
- Close when: retries/s < 0.1 sustained for 10 minutes.
- If the incident was tier-related, open an escalation ticket with the platform partner team.