Repository navigation
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-slackLeave 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
syncqueue connection. Onsyncthe 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. SetROBOT_COUNCIL_SLACK_CONNECTIONto 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.conditionandplacement.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. SetROBOT_COUNCIL_SLACK_MIRROR_RESTRICTED=falseto 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=arrayorfileit is per process or per machine, and onnullthere is no limit at all.