---
name: slack
description: "Router + guardrails for Slack work — search, read, summarize, triage, draft replies, and send messages. Use whenever the user asks to do anything in Slack (read a channel, catch up, reply, post, react, find a message/person). Delegates to the specialized slack-* skills."
emoji: "💬"
---

# Slack

The entry point for Slack work. Route the request to the right specialized skill,
and apply the safety + output rules below on every Slack action.

Slack tools come from whichever backend is configured:

- **Native MCP** (`NOMOS_SLACK_BACKEND=mcp`): Slack's official server, tools named
  `mcp__slack__*` (search messages/files/users/channels/emoji, read channels &
  threads, send message, add reactions, read/write canvases, fetch user info, list
  members). Confirm exact names by listing tools if unsure.
- **In-process** (default): `slack_send_message`, `slack_read_channel`,
  `slack_read_thread`, `slack_search`, `slack_list_channels`, `slack_user_info`,
  `slack_react`, `slack_edit_message`, `slack_delete_message`, `slack_pin_message`,
  `slack_upload_file`.

Use the tools that are actually registered this session. If Slack tools ARE
present, they work immediately — just call them; never tell the user Slack is
"connecting", "loading", or "will be available in a moment". If NO Slack tools are
present, say Slack isn't connected (Settings → Slack, or `nomos slack connect-mcp`)
and stop — do not invent channel names, message contents, or workspace-wide claims.

## Routing

- Summarize / "catch me up on" a channel → **slack-channel-summarization**
- "What happened across my channels today" / a standing digest → **slack-daily-digest**
- "What needs my attention" / prioritize mentions, threads, DMs → **slack-notification-triage**
- "Draft replies to what I'm behind on" → **slack-reply-drafting**
- Compose and send/post a specific message → **slack-outgoing-message**
- Analysis-only requests stay in chat unless the user asks to deliver to Slack.

## Guardrails (apply to every Slack action)

**Fail fast on missing coverage.** If the connector can't reach a channel or the
needed scope is missing, say so plainly instead of guessing. Never fabricate
channels, users, message text, decisions, or approvals.

**Write safety.** Before posting, do a _fresh read_ of the destination to resolve
relative targets ("reply to the last message", "in that thread"). Call out
high-impact actions explicitly (channel-wide `@channel`/`@here`, customer-facing
posts, DM fan-outs) and prefer a group DM over many individual DMs. An explicit
"post"/"send" bypasses drafting; otherwise draft for approval (respect the user's
message-consent settings).

**Rate limits.** Slack tools fall into three buckets — search, read, send/write.
On a 429, back off exponentially within that bucket (≈30s → 1m → 2m) rather than
retrying immediately or hammering a different method in the same bucket.

**Unsupported actions.** If a requested action isn't available (e.g. deleting
someone else's message, creating channels when the tool isn't present), refuse
briefly and offer the closest supported path.

## Output standards

Match the surface. In chat: a short opener, a few tight bullets, and a clear ask.
For a Slack-bound message: match the channel's tone, use Slack mrkdwn (`*bold*`,
`_italic_`, `` `code` ``, `<url|text>`, `<@U…>`, `<#C…>`), and don't over-format.
Distinguish a private summary (for the user) from a post-ready Slack message.

## Nomos extras

- **IDs**: `C`/`G` = channel, `D` = DM, `U`/`W` = user; `ts` identifies a message
  (threading, reactions, edits).
- **Action items**: when a Slack thread yields a promise or ask, capture it with
  `todo_add` (direction `mine` = the user owes; `theirs` = someone owes the user),
  setting `source: "slack"` and `sourceRef` to the thread `ts`.
- **Listen as the user / background monitoring**: nomos can respond as the user
  (`nomos slack listen`) and run periodic scans via the daemon + autonomous loops
  (`nomos cron enable slack-digest`). Run these yourself with Bash when asked;
  if blocked by a permission hook, show the exact command.
