Slack Rules
Agent behavioral rules for Slack operations
Slack Agent Rules
Personal Profile
The profile at <a href="/ui/context.connections.profiles" class="bullet-pill"><img src="/icons/bullets/ui.svg" alt="ui" class="bullet-pill-icon" /><span class="pill-name">Connection Profiles</span></a> shows how THIS user uses Slack:
- Top channels — where they're most active, with activity percentages
- Frequent contacts — who they DM and collaborate with most, with context on relationships
- Topics — what they typically discuss
- Writing style — how they write in Slack (captured in
Writing Style)
- Quick access — channel and DM IDs for fast lookups without searching
The profile is narrative-focused, describing how the person uses Slack rather than just listing channels. Use this to understand their workflow, who they work with, and communication patterns. When they mention "my team channel" or "message Sarah", check their profile first.
Always Use Tasks, Not Code Directly
Route through the appropriate task:
- "Read messages" / "What's happening in" / "Check #channel" / "Show conversation" →
<a href="/task/slack.workspace.read" class="bullet-pill"><img src="/icons/bullets/task.svg" alt="task" class="bullet-pill-icon" /><span class="pill-name">Read Slack Messages</span></a> - "Send message" / "DM someone" / "Post to" / "Tell them" / "Announce" →
<a href="/task/slack.workspace.send" class="bullet-pill"><img src="/icons/bullets/task.svg" alt="task" class="bullet-pill-icon" /><span class="pill-name">Send Slack Message</span></a>
Tasks contain interpretation logic and human-friendly behavior. Calling code directly bypasses that.
Interpret Intent, Not Just Words
Users say "#eng" not "channel ID C12345ABC". They say "DM Sarah" not "send to D98765XYZ".
The pattern: Understand what they want → resolve IDs from <a href="/ui/context.connections.profiles" class="bullet-pill"><img src="/icons/bullets/ui.svg" alt="ui" class="bullet-pill-icon" /><span class="pill-name">Connection Profiles</span></a> → construct proper API calls.
If you can't resolve something, ask: "I found 2 channels with 'eng' in the name: #engineering and #eng-support. Which one?"
Destination Resolution
Channels
- Check
<a href="/ui/context.connections.profiles" class="bullet-pill"><img src="/icons/bullets/ui.svg" alt="ui" class="bullet-pill-icon" /><span class="pill-name">Connection Profiles</span></a>Quick Access table first - Fuzzy match on name: "#eng" → "#engineering"
- Prefer channels from their profile (where they're active)
- If ambiguous, ask the user
People
- Check frequent contacts in profile first
- Match on display name or real name
- "Sarah" finds the right Sarah if there's only one in their contacts
- If multiple matches, ask: "Did you mean Sarah Chen or Sarah Miller?"
Message Sending
Confirmation Required
Before sending any message, confirm the destination and content with the user. Never send without explicit approval.
Format Selection
| Use | When |
|---|---|
| Plain text | Quick replies, simple one-liners, "tell them I'll be late" |
| Block Kit | Announcements, status updates, metrics, anything needing visual hierarchy |
Don't over-engineer simple messages. But for anything substantive, use Block Kit formatting from the artifact-composer dependency.
Block Kit Workflow
- Draft the message content
- Construct valid Block Kit JSON
- Write blocks to
session/slack-blocks.json - Show user a preview and get approval
- Send with the blocks file path
- Clean up the blocks file after
Reading Messages
Extract the useful parts:
- Lead with recent and relevant messages
- Summarize long threads rather than dumping everything
- Note important reactions or reply counts
- For ongoing conversations, highlight what's actionable
When history is long, summarize first: "There are 47 messages in the last week. The main topics are X and Y. Want the full history or a specific thread?"
Error Handling
Common issues and responses:
- channel_not_found: "I can't find that channel. It might be private, archived, or the name changed. Want me to search?"
- not_in_channel: "I need to be added to that channel first. Can you invite me, or should I try a different channel?"
- msg_too_long: "That message is too long for Slack (40k char limit). Want me to split it into multiple messages?"
- invalid_blocks: "The formatting didn't work. Let me try with simpler formatting."
- restricted_action: "Workspace permissions are blocking this action. You may need to check with your Slack admin."
Rate Limits
Slack allows ~50 messages/minute for posting, ~20 reads/minute.
For bulk operations, warn users: "Sending to 10 channels—this'll take about 15 seconds."
Understanding User's Slack Usage
The profile at <a href="/ui/context.connections.profiles" class="bullet-pill"><img src="/icons/bullets/ui.svg" alt="ui" class="bullet-pill-icon" /><span class="pill-name">Connection Profiles</span></a> is built during setup by analyzing 90 days of activity. It captures:
- Channel patterns — where they spend time, activity levels
- Collaboration — who they work with (from thread interactions)
- Topics — what they discuss
- Writing style — tone, formality, patterns (also saved to
<a href="/ui/context.style.writing" class="bullet-pill"><img src="/icons/bullets/ui.svg" alt="ui" class="bullet-pill-icon" /><span class="pill-name">Writing Style</span></a>)
Always check the profile before searching or asking. The profile tells you HOW this specific user uses Slack, not just what channels exist.
# Slack Agent Rules
## Personal Profile
The profile at ``./documents/connections/[service-name].md`` shows how THIS user uses Slack:
- **Top channels** — where they're most active, with activity percentages
- **Frequent contacts** — who they DM and collaborate with most, with context on relationships
- **Topics** — what they typically discuss
- **Writing style** — how they write in Slack (captured in `./documents/user/writing_style.md`)
- **Quick access** — channel and DM IDs for fast lookups without searching
The profile is narrative-focused, describing how the person uses Slack rather than just listing channels. Use this to understand their workflow, who they work with, and communication patterns. When they mention "my team channel" or "message Sarah", check their profile first.
## Always Use Tasks, Not Code Directly
Route through the appropriate task:
- "Read messages" / "What's happening in" / "Check #channel" / "Show conversation" → ``./skills/sauna//resources/recipes/slack.workspace.read.md ``
- "Send message" / "DM someone" / "Post to" / "Tell them" / "Announce" → ``./skills/sauna//resources/recipes/slack.workspace.send.md ``
Tasks contain interpretation logic and human-friendly behavior. Calling code directly bypasses that.
## Interpret Intent, Not Just Words
Users say "#eng" not "channel ID C12345ABC". They say "DM Sarah" not "send to D98765XYZ".
**The pattern:** Understand what they want → resolve IDs from ``./documents/connections/[service-name].md`` → construct proper API calls.
If you can't resolve something, ask: "I found 2 channels with 'eng' in the name: #engineering and #eng-support. Which one?"
## Destination Resolution
### Channels
1. Check ``./documents/connections/[service-name].md`` Quick Access table first
2. Fuzzy match on name: "#eng" → "#engineering"
3. Prefer channels from their profile (where they're active)
4. If ambiguous, ask the user
### People
1. Check frequent contacts in profile first
2. Match on display name or real name
3. "Sarah" finds the right Sarah if there's only one in their contacts
4. If multiple matches, ask: "Did you mean Sarah Chen or Sarah Miller?"
## Message Sending
### Confirmation Required
Before sending any message, confirm the destination and content with the user. Never send without explicit approval.
### Format Selection
| Use | When |
| ---------- | ------------------------------------------------------------------------- |
| Plain text | Quick replies, simple one-liners, "tell them I'll be late" |
| Block Kit | Announcements, status updates, metrics, anything needing visual hierarchy |
Don't over-engineer simple messages. But for anything substantive, use Block Kit formatting from the artifact-composer dependency.
### Block Kit Workflow
1. Draft the message content
2. Construct valid Block Kit JSON
3. Write blocks to `session/slack-blocks.json`
4. Show user a preview and get approval
5. Send with the blocks file path
6. Clean up the blocks file after
## Reading Messages
Extract the useful parts:
- Lead with recent and relevant messages
- Summarize long threads rather than dumping everything
- Note important reactions or reply counts
- For ongoing conversations, highlight what's actionable
When history is long, summarize first: "There are 47 messages in the last week. The main topics are X and Y. Want the full history or a specific thread?"
## Error Handling
Common issues and responses:
- **channel_not_found**: "I can't find that channel. It might be private, archived, or the name changed. Want me to search?"
- **not_in_channel**: "I need to be added to that channel first. Can you invite me, or should I try a different channel?"
- **msg_too_long**: "That message is too long for Slack (40k char limit). Want me to split it into multiple messages?"
- **invalid_blocks**: "The formatting didn't work. Let me try with simpler formatting."
- **restricted_action**: "Workspace permissions are blocking this action. You may need to check with your Slack admin."
## Rate Limits
Slack allows ~50 messages/minute for posting, ~20 reads/minute.
For bulk operations, warn users: "Sending to 10 channels—this'll take about 15 seconds."
## Understanding User's Slack Usage
The profile at ``./documents/connections/[service-name].md`` is built during setup by analyzing 90 days of activity. It captures:
- **Channel patterns** — where they spend time, activity levels
- **Collaboration** — who they work with (from thread interactions)
- **Topics** — what they discuss
- **Writing style** — tone, formality, patterns (also saved to ``./documents/user/writing_style.md``)
Always check the profile before searching or asking. The profile tells you HOW this specific user uses Slack, not just what channels exist.