Skip to content

Mirroring to Slack

Josh edited this page Nov 5, 2026 · 1 revision

Describes robot-council/core v0.8.3.

Set a webhook and each event is posted for humans to read:

ROBOT_COUNCIL_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...
ROBOT_COUNCIL_SLACK_QUEUE=robot-council-slack

Leave it unset and no mirror runs at all. The mirror is one-way: nothing in this package reads from Slack, and no coordination decision depends on it, so an outage there costs visibility and never correctness. It sends only the event type, the actor's login and a truncated body — never meta, a payload, or a result — escapes what Slack would read as markup or a mention, and honors Slack's Retry-After. Run a worker on that queue, or events are recorded and never mirrored, and on a database queue the jobs accumulate.

Three things worth knowing before you enable it:

  • Do not leave the mirror on a sync queue connection. On sync the job runs inline inside the agent's own request, the queue name is ignored, a rate-limit release is silently dropped, and a Slack failure surfaces on a request whose event is already committed. Set ROBOT_COUNCIL_SLACK_CONNECTION to a real queue connection. The package will not fail a write because Slack is unreachable, but it cannot move the work off the request for you.
  • The restricted events are mirrored by default, and the feed's visibility rule does not apply to Slack. That covers narration, lane.quiet, lane.condition and placement.instruction. The rule governs what one developer's agent may read from another's, because event content is untrusted input to something that may have shell access. A Slack channel is a human surface, and being a narration channel for humans is the point of having one — but it does mean everyone with channel access reads every agent's narration and every placement's instructions. Set ROBOT_COUNCIL_SLACK_MIRROR_RESTRICTED=false to mirror only state changes and directives. The older name, ROBOT_COUNCIL_SLACK_MIRROR_NARRATION, is still read when the new one is unset, and the new one wins when both are set (#366).
  • The mirror's rate limit needs a shared cache store. It is one limit across every worker, because Slack's is per webhook. On CACHE_STORE=array or file it is per process or per machine, and on null there is no limit at all.

Clone this wiki locally