The problem it exists for
Support questions arrive on Discord, get answered from memory, scroll away, and get asked again a week later. The problems worth tracking rarely become GitLab issues, and quite often the answer was already sitting in the docs.
phpbotscout answers what the docs already cover, with citations, and treats every question it can’t answer as “a documentation gap with a timestamp on it”. Picking its model was a costed decision: on 36 calibration questions run through the real answer path, the small model matched the big one closely enough that the difference came down to about £5 a month at fifty questions a day, against £38 (spec 0009).
How it works
Answer only from what it was shown
It reads the public channels, searches an index built from the estate’s public docs and code, and hands the model eight passages per question. The model answers only from those passages, and an answer that cites nothing, or cites something it was never given, is turned into a decline instead (how answering works). The most tempting corpus in any repository is about what went into that index and what didn’t.
Discord behind a contract
Discord sits behind go/comms, a contract for chat platforms with no vendor SDK in its core, and go/comms-discord is the provider that speaks Discord.
Decisions and what they cost
- The small model, for now. Haiku 4.5 scored nearly as well as Opus and was the fastest of the three. Sonnet was turned down at four times the cost for identical scores and the worst slow-case latency, and Opus at 7.6 times the cost, partly because it writes so much more (spec 0009). What it cost: the choice is provisional, because citation accuracy, which the spec calls the worst failure there is, wasn’t measured.
- A library that resumes. disgo was picked because it was the only one that resumes on the reconnect address Discord gives it, proved live by replaying messages posted during a twenty-second outage (spec 0004). What it cost: the heaviest dependency footprint of the three, a slower connect, and a library that’s still below 1.0.
- Quiet until a server opts in. By default it composes answers without posting them, and a server only gets posts if its own setting says so. A server that hasn’t opted in gets a bot built read-only, with no way to post at all (spec 0025). What it cost: that setting had to be restructured per server.
- Logs carry no message text. No message text or author ends up in a log line, so retention stays where the policy enforces it (spec 0028). What it cost: the per-message trace is gone.
Proof in use
- It’s been running in shadow mode since September 2026, reading every public channel and composing answers, and posting only where a server has opted in.
- Its index covers 2,025 documents from the estate’s public projects.
- A round of tuning across 142 real questions cut the ones with no answering passage from 22 to 12, and lifted the questions where the top passage answered it from 61 to 76.
- 19 releases of the bot since August 2026, built on go-tool-base and answering through chat.
Use it when, and when not to
Use it as a pattern if you run a community around your own docs and want questions answered from them, with sources, without letting a model make things up.
It doesn’t moderate or raise GitLab issues yet, it works for one project’s servers, only in public channels, with keyword retrieval rather than semantic search, and only with Anthropic models. Answers are only as current as its last refresh, and releases are checksummed but not yet signed.
Where it’s going
Following up inside a thread and a way for a member to ask to be forgotten are both drafted. Local inference has landed but isn’t used yet, and the hybrid retrieval that would use it, finding a page that answers a question even when they share no words, is in review. Posting everywhere waits on thirty human-reviewed answers to real questions (The bot couldn’t answer it. Neither could I.).
What it covers
- comms Receive, reply and moderate across chat platforms with no vendor SDK in the core. The other side of the chat modules: those talk to models, this one talks to the people.
- comms-discord The Discord provider: read channels, reply in threads, moderate and run slash commands.
The story in posts
Last reviewed .
