npx skills add ...
npx skills add getsentry/junior --skill slack-development
npx skills add getsentry/junior --skill slack-development
Implement Slack bot behavior with correct Slack-documented message formats, inbound mention/event routing, and long-running task UX. Use when asked to "format Slack messages", "fix Slack markdown", "debug thread mentions", "improve Slack bot UX", "add streaming in Slack", or "build Slack Chat SDK behavior". Covers mrkdwn quirks, Events API payload patterns, routing guardrails, and Chat SDK implementation patterns.
Implement Slack-facing behavior with predictable formatting, inbound routing, and responsive long-running UX.
Determine which category applies before writing code:
| Category | Typical request | Primary reference |
|---|---|---|
| Output formatting | "Fix markdown", "why does Slack render this weirdly?" | ${CLAUDE_SKILL_ROOT}/references/slack-output-formatting.md |
| Slack event payloads | "What does Slack send?", "why did raw event parsing fail?" | ${CLAUDE_SKILL_ROOT}/references/slack-inbound-message-formats.md |
| Chat SDK payload contract | "What fields do handlers actually receive?", "which fields are reliable in onSubscribedMessage?" | ${CLAUDE_SKILL_ROOT}/references/chat-sdk-payload-contract.md |
| Thread routing | "Passive detector skips thread replies", "reply/no-reply logic is wrong" | ${CLAUDE_SKILL_ROOT}/references/slack-thread-routing.md |
| Assistant-thread APIs | "Why does assistant.threads.setStatus fail?", "should this DM have assistant status/title?", "does Chat tab DM count as an assistant thread?" | Read Slack docs for assistant_thread_started, assistant_thread_context_changed, message.im, and assistant.threads.* first, then load ${CLAUDE_SKILL_ROOT}/references/assistant-thread-apis.md and ${CLAUDE_SKILL_ROOT}/references/chat-sdk-payload-contract.md |
| Long-running behavior | "No feedback while it runs", "show progress", "stream output" | ${CLAUDE_SKILL_ROOT}/references/chat-sdk-patterns.md |
| Multiple categories | Change touches formatting, routing, and/or runtime UX | Read only the needed references above |
If the request is ambiguous, ask one focused question and continue after clarification.
Use the selected reference files as the implementation guide. Keep SKILL.md high-level and put details in references.
Slack assistant-thread guardrails:
channel plus thread_ts ?? ts. For message.im, require the live channel and explicit thread_ts. For lifecycle events, use assistant_thread.channel_id and assistant_thread.thread_ts.assistant.threads.*.assistant_thread_started and assistant_thread_context_changed differently. Context changes can refresh prompts/context, but should not clobber a conversation-specific thread title back to a generic default.packages/junior/dist/* output before trusting source edits against runtime behavior.When modifying this repository:
waitUntil behavior so long-running handlers finish after HTTP response.Use this checklist:
mrkdwn expectations, escapes, mentions/links).assistant.threads.* calls use the live inbound assistant-thread context; non-DM message events may use thread_ts ?? ts, message.im must carry explicit thread_ts, and runtime code does not synthesize DM assistant roots for status/title updates.text strategy.