Slack
Slack connects two ways. Outbound, it mirrors block alerts to a channel your team watches. Inbound, it feeds your context graph through two distinct capture modes — passive reference scanning and explicit capture — described below.
Connecting
A team admin connects Slack from Dashboard → Integrations → connect Slack (an OAuth bot install). After connecting:
- Set the alert channel on the dashboard (e.g.
eng-alerts). - Invite the bot to that channel — it can only post where it's a member.
The bot token is stored encrypted and only decrypted in the background worker. Re-installing preserves your chosen channel.
Outbound: block alerts
When a blocker is raised or escalated, stndp mirrors it to the chosen channel so the team sees it where they already are. (@mentions of individuals stay email-only — Slack isn't used for personal notification.)
Inbound mode 1 — passive reference capture (mention-based)
stndp watches channel messages for references to work that already exists: a
tracker key like PROJ-123 or a GitHub PR / issue URL. When a message mentions one,
stndp links that ticket or PR into the graph — anchored on a Slack node, then
promoted by the resolver to a work-item node with live status, exactly as
stn link would.
- It never creates a decision — reference scanning surfaces existing work, it doesn't manufacture records.
- Messages with no ticket/PR reference are ignored (this mode is signal, not a transcript), as are edits, joins, and bot posts.
- A "bug" only captures this way if it's an actual ticket/PR reference (a Jira key or a GitHub issue URL) — free-text alone isn't scanned.
Inbound mode 2 — explicit capture (slash command or 📌)
When something in a thread is worth remembering, capture it deliberately. Two triggers, same result:
/stndp this is important — we're going with advisory locks, not Redis
/stndp capture <the decision or learning to remember> # the "capture" keyword is optional
…or react to any message with the 📌 (pushpin) emoji — that pins
the message's text as a capture without typing a command.
Either becomes a pending decision for your team, attributed to the Slack author (mapped to their stndp account), with a back-reference to the source message. Any ticket/PR keys in the captured text are linked too. You then promote it into the permanent record:
stn decisions --pending # review what Slack (and agents) captured
stn decision confirm ID # promote it into the team's record
stn search "advisory locks" # find it afterwards
The slash command acks privately (only you see it); duplicates and re-pins are de-duplicated, so nothing is captured twice.
Availability & privacy
Inbound capture is off by default behind a server setting
(CONTEXT_SLACK_ENABLED) — it creates rows and makes network calls — so it may need
enabling by your administrator. Org-level privacy switches apply on top: one disables all Slack
capture; another additionally disables the AI-curated captures (mode 2) while leaving plain
reference links (mode 1). Inbound Slack requests are verified with Slack's request signature (the
signing secret, not a bearer token), and bot tokens are encrypted at rest, decrypted only in the
worker. See Security & privacy.