The pieces
A token scoped to one space, a webhook receiver that verifies the signature header, and one call to synapse send. That is the whole service.
Because the CLI speaks the public API, the bot does not need a special integration path, and nothing about it breaks when a client ships.
Keeping the channel useful
We post on state changes only: queued, building, live, rolled back. A bot that narrates every log line gets muted within a week, and a muted bot is worse than none.
Threads carry the detail. The top-level message stays one line with a link, so scrolling past it costs nothing.
Try it yourself
Install the CLI, create a space token, and point your CI at it after the deploy step. If the pipeline fails, send the same message with a different label — the channel becomes a build log you can read on your phone.