diff --git a/api-reference/error-codes.mdx b/api-reference/error-codes.mdx
index 1dae07e..112fff8 100644
--- a/api-reference/error-codes.mdx
+++ b/api-reference/error-codes.mdx
@@ -179,13 +179,27 @@ Onboarding a Fleet template (the SKILL.md/TRIGGER.md package behind a Fleet) and
## Integration connect & token mint
+Codes here are the externally-observable subset of the server registry; a gap in a numbering sequence is a code that was superseded before release (`UZ-SLK-021` was superseded by the generic `UZ-CONN-002`, so the registry — and this table — skips it).
+
| Code | HTTP | Title | Common Causes |
|---|---|---|---|
-| `UZ-CONN-001` | 503 | Connector not configured | GitHub connect is unavailable on this deployment — the platform App slug or signing secret is unset. An operator must register the GitHub App and populate the admin vault before fleets can connect. |
+| `UZ-CONN-001` | 503 | Connector not configured | Connect is unavailable for this provider on this deployment — the platform app credentials (GitHub App slug / Slack app secrets) are unset. An operator must register the provider app and populate the admin vault before workspaces can connect. |
| `UZ-CONN-002` | 400 | Invalid connect state | The connect callback's `state` was missing, forged, expired, or already used. Start the connect again from the dashboard — each attempt issues a fresh single-use state. |
| `UZ-CRED-001` | 404 | Integration not connected | No connected integration matches this id for the fleet's workspace. Connect it first (e.g. GitHub via the dashboard **Connect** flow) before a fleet can mint a token for it. |
| `UZ-GH-001` | 409 | GitHub App reconnect required | The GitHub App installation is gone (uninstalled or revoked), so no token can be minted. Reconnect GitHub from the dashboard — the fleet stays blocked until the App is reinstalled. |
| `UZ-GH-002` | 502 | GitHub token mint failed | GitHub did not return an installation token (upstream 5xx, network, or a malformed exchange response). Transient — retry shortly; if it persists, check GitHub status and the App configuration. |
+| `UZ-SLK-022` | 502 | Slack token exchange failed | The Slack OAuth code could not be exchanged for a bot token. Retry the connect flow; if it persists, verify the platform Slack app credentials. |
+
+### Slack event handling
+
+Runtime codes for the channel bot's inbound mentions and outbound answers — distinct from the OAuth connect and token-mint flow above.
+
+| Code | HTTP | Title | Common Causes |
+|---|---|---|---|
+| `UZ-SLK-010` | 401 | Invalid Slack signature | The Slack request signature on `POST /v1/connectors/slack/events` did not verify. Confirm the platform Slack app's signing secret matches the one vaulted by the operator. |
+| `UZ-SLK-011` | 401 | Stale Slack timestamp | The Slack request timestamp is outside the 5-minute drift window — a replay attempt or a skewed clock. |
+| `UZ-SLK-020` | 200 | Slack team not installed | The Slack team that sent this event has no connector install; the event is acknowledged (200) and ignored so Slack does not retry. Re-run **Connect Slack** in the dashboard to (re)install. |
+| `UZ-SLK-030` | 502 | Slack answer post failed | The channel bot's answer could not be delivered to Slack (missing `chat:write`, a 429, or a Slack outage). Logged and retried with backoff; the run itself never fails. |
## Approval gate
diff --git a/changelog.mdx b/changelog.mdx
index 64ca871..474af05 100644
--- a/changelog.mdx
+++ b/changelog.mdx
@@ -22,6 +22,26 @@ export const STAGE_SELF_MANAGED_M66 = "$0.0001";
agentsfleet is in **stealth-mode testing** and pre-production. APIs and agent behavior may change between releases without long deprecation windows. Email [agentsfleet@agentmail.to](mailto:agentsfleet@agentmail.to) if you want a hand calibrating an agent or to join as a design partner.
+
+ ## Slack: mention @agentsfleet in a channel, get an answer in the thread
+
+ agentsfleet is now Slack-resident. Connect Slack from the dashboard Integrations page — a browser OAuth round-trip, no token to paste — invite `@agentsfleet` to a channel, and mention it. The first mention materializes a fleet that lives in that channel; it answers in the thread it was mentioned in, and what it learns in one thread it remembers across the channel's other threads. It is reactive and read-only: it speaks only when mentioned, and only in the thread that asked.
+
+ ## What's new
+
+ - **Connect Slack from Integrations.** A Slack row sits next to GitHub: **Connect** redirects to Slack's authorize page and the callback stores the bot token server-side in the workspace vault. The row shows the connected workspace ("Slack connected: {team}") and offers **Reconnect** if the install is revoked.
+ - **One fleet per channel.** The first `@agentsfleet` mention in a channel creates that channel's resident fleet; later mentions in any thread reuse it. Memory is channel-scoped — tell it a fact in one thread and it recalls it in another.
+ - **Answers land in-thread.** Replies post to the thread that mentioned the bot — never to the channel top level, never to another channel.
+ - **Recent thread context.** Each mention re-reads up to 20 recent messages in its thread, so a follow-up mention sees the conversation so far even where the bot wasn't mentioned in between. Best-effort: if Slack throttles the read, the mention still processes without it.
+
+ ## API reference
+
+ - **`POST /v1/workspaces/{workspace_id}/connectors/slack/connect`** (scope `connector:write`) — returns the Slack authorize URL carrying a signed single-use `state`; **`GET /v1/connectors/slack/callback`** finishes the round-trip and vaults the bot token.
+ - **`GET /v1/workspaces/{workspace_id}/connectors/slack`** (scope `connector:read`) — connector status as `{status, team}`, where `status` is `connected`, `reconnect_required`, or `not_connected`; never a secret.
+ - **`POST /v1/connectors/slack/events`** — the signed events ingress. Authenticated by Slack's request signature (HMAC over the raw body, 5-minute replay window), not a Bearer token.
+ - **New error codes:** `UZ-SLK-010` (401, invalid Slack signature), `UZ-SLK-011` (401, stale timestamp), `UZ-SLK-020` (200 — an event from a team with no install is acknowledged and ignored), `UZ-SLK-022` (502, OAuth token exchange failed), `UZ-SLK-030` (502, answer delivery to Slack failed — logged and retried; the run itself never fails). `UZ-CONN-001`/`UZ-CONN-002` now cover the Slack connect flow as well as GitHub.
+
+
## Bring your own Fleet templates
diff --git a/concepts.mdx b/concepts.mdx
index 1b14126..af6056b 100644
--- a/concepts.mdx
+++ b/concepts.mdx
@@ -77,9 +77,10 @@ A trigger lands on the event stream. A run opens. The fleet calls tools allow-li
- What wakes a fleet. Three sources, all feeding the same reasoning loop:
+ What wakes a fleet. Four sources, all feeding the same reasoning loop:
- - **Webhook** — an external system (GitHub, Slack, your monitoring) POSTs to `https://api.agentsfleet.net/v1/webhooks/{fleet_id}/{source}` (one URL per declared trigger source).
+ - **Webhook** — an external system (GitHub, your monitoring) POSTs to `https://api.agentsfleet.net/v1/webhooks/{fleet_id}/{source}` (one URL per declared trigger source). A Slack mention does **not** use this path — it has its own trigger below.
+ - **Slack mention** — with Slack connected, mentioning `@agentsfleet` in a channel wakes that channel's resident fleet, which answers in the thread (see the Jul 02, 2026 changelog entry).
- **Cron** — the fleet schedules its own future runs via the `cron_add` tool.
- **Steer** — a human invokes `agentsfleet steer "..."` for a manual run.
diff --git a/docs.json b/docs.json
index 5898e1a..f1f09de 100644
--- a/docs.json
+++ b/docs.json
@@ -214,11 +214,12 @@
]
},
{
- "group": "Fleet bundles",
+ "group": "Fleet templates",
"pages": [
"GET /v1/fleets/bundles",
- "POST /v1/workspaces/{workspace_id}/fleets/bundles/snapshots",
- "GET /v1/workspaces/{workspace_id}/fleets/bundles/snapshots/{bundle_id}"
+ "GET /v1/workspaces/{workspace_id}/fleet-templates",
+ "POST /v1/admin/fleet-templates",
+ "POST /v1/workspaces/{workspace_id}/fleet-templates"
]
},
{