From 91238371138f220cee68ab4922f5541592c77bc7 Mon Sep 17 00:00:00 2001 From: Sama Setty Date: Mon, 23 Mar 2026 12:25:50 -0700 Subject: [PATCH 1/9] Add Slack Notification Triage UI metadata Add the missing agents/openai.yaml for the Slack notification triage skill so the UI uses a human-readable display name instead of the raw slug. Co-authored-by: Codex --- .../skills/slack-notification-triage/agents/openai.yaml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 plugins/slack/skills/slack-notification-triage/agents/openai.yaml diff --git a/plugins/slack/skills/slack-notification-triage/agents/openai.yaml b/plugins/slack/skills/slack-notification-triage/agents/openai.yaml new file mode 100644 index 00000000..49bb09d8 --- /dev/null +++ b/plugins/slack/skills/slack-notification-triage/agents/openai.yaml @@ -0,0 +1,7 @@ +interface: + display_name: "Slack Notification Triage" + short_description: "Triage Slack attention signals" + icon_small: "../slack/assets/slack-small.svg" + icon_large: "../slack/assets/slack.svg" + brand_color: "#611F69" + default_prompt: "Use $slack-notification-triage to triage recent Slack activity into what likely needs my attention, separating items that need a reply from things worth skimming." From dd4480519ce956dcae833c454f01f0d3d85ad7f5 Mon Sep 17 00:00:00 2001 From: Sama Setty Date: Mon, 23 Mar 2026 12:53:19 -0700 Subject: [PATCH 2/9] Tighten Slack thread_ts guidance Add a reusable skill guardrail that tells Slack drafting and sending workflows to omit thread_ts entirely for DMs and top-level messages, and to include it only for real thread replies with a parent timestamp. Co-authored-by: Codex --- plugins/slack/skills/slack-messages/SKILL.md | 5 +++++ plugins/slack/skills/slack-reply-drafting/SKILL.md | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/slack/skills/slack-messages/SKILL.md b/plugins/slack/skills/slack-messages/SKILL.md index 99e4e87d..6fc606cc 100644 --- a/plugins/slack/skills/slack-messages/SKILL.md +++ b/plugins/slack/skills/slack-messages/SKILL.md @@ -23,6 +23,11 @@ Read this reference **before finalizing any outgoing Slack text**: 2. Determine whether the user wants a **draft**, a **send-ready message**, or content for a **Slack canvas**. **Default to a draft** unless the user has approved the wording or explicitly asked to send. 3. Read `../slack/references/mrkdwn.md` and use that syntax directly instead of generic Markdown. +## Tool Parameter Hygiene + +- For `slack_send_message`, `slack_send_message_draft`, and `slack_schedule_message`, include `thread_ts` only when replying inside an existing thread and you have the parent message timestamp. +- For top-level channel messages, DMs, and group DMs, omit `thread_ts` entirely. Do not pass an empty string, whitespace, `null`, or a placeholder value. + ## Destination Safety - If the user wants to **cc, mention, or tag** someone, first check whether that person is already in the destination channel or group DM. If they are not, **warn the user** instead of implying the mention will notify them or that they will see the message. diff --git a/plugins/slack/skills/slack-reply-drafting/SKILL.md b/plugins/slack/skills/slack-reply-drafting/SKILL.md index d7d5d8f9..a6b29568 100644 --- a/plugins/slack/skills/slack-reply-drafting/SKILL.md +++ b/plugins/slack/skills/slack-reply-drafting/SKILL.md @@ -45,7 +45,7 @@ Use this skill to identify messages that likely need a reply and produce Slack-r 5. Keep only candidates where the latest relevant message is from someone else, or where newer replies appeared after the user's last reply or mention. 6. Expand only the threads or surrounding messages needed to answer accurately. Answer the question first, then add clarification or next steps when the context supports it. 7. If the context is incomplete, write the smallest useful clarifying reply instead of pretending the answer is known. -8. Create the draft with `slack_send_message_draft` in the source channel or DM, and include `thread_ts` for thread replies. +8. Create the draft with `slack_send_message_draft` in the source channel or DM. Include `thread_ts` only for a real thread reply with a parent message timestamp; for DMs or top-level messages, omit `thread_ts` entirely and never pass an empty string. ## Drafting Rules From 4dd627c59ecae7f51ece5547e865094b8e2e2b21 Mon Sep 17 00:00:00 2001 From: Sama Setty Date: Mon, 23 Mar 2026 13:04:18 -0700 Subject: [PATCH 3/9] Refine Slack thread_ts skill guidance Move the thread_ts reminder into the Slack Messages common-mistakes section and drop the duplicate wording from Slack Reply Drafting. Co-authored-by: Codex --- plugins/slack/skills/slack-messages/SKILL.md | 9 ++++----- plugins/slack/skills/slack-reply-drafting/SKILL.md | 1 - 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/plugins/slack/skills/slack-messages/SKILL.md b/plugins/slack/skills/slack-messages/SKILL.md index 6fc606cc..d1b0c3a3 100644 --- a/plugins/slack/skills/slack-messages/SKILL.md +++ b/plugins/slack/skills/slack-messages/SKILL.md @@ -23,11 +23,6 @@ Read this reference **before finalizing any outgoing Slack text**: 2. Determine whether the user wants a **draft**, a **send-ready message**, or content for a **Slack canvas**. **Default to a draft** unless the user has approved the wording or explicitly asked to send. 3. Read `../slack/references/mrkdwn.md` and use that syntax directly instead of generic Markdown. -## Tool Parameter Hygiene - -- For `slack_send_message`, `slack_send_message_draft`, and `slack_schedule_message`, include `thread_ts` only when replying inside an existing thread and you have the parent message timestamp. -- For top-level channel messages, DMs, and group DMs, omit `thread_ts` entirely. Do not pass an empty string, whitespace, `null`, or a placeholder value. - ## Destination Safety - If the user wants to **cc, mention, or tag** someone, first check whether that person is already in the destination channel or group DM. If they are not, **warn the user** instead of implying the mention will notify them or that they will see the message. @@ -39,3 +34,7 @@ Read this reference **before finalizing any outgoing Slack text**: - Resolve **Slack user groups** before writing when the message should tag a group, and use canonical Slack mrkdwn syntax: ``. - Do not rely on bare `@name` text in outgoing Slack messages. - If you cannot resolve the correct user or group, **tell the user** and compose the draft or message without implying the mention will work. + +## Common Mistakes + +- Include `thread_ts` only when replying inside an existing thread and you have the parent message timestamp; otherwise, omit it entirely. \ No newline at end of file diff --git a/plugins/slack/skills/slack-reply-drafting/SKILL.md b/plugins/slack/skills/slack-reply-drafting/SKILL.md index a6b29568..e35ca2fe 100644 --- a/plugins/slack/skills/slack-reply-drafting/SKILL.md +++ b/plugins/slack/skills/slack-reply-drafting/SKILL.md @@ -45,7 +45,6 @@ Use this skill to identify messages that likely need a reply and produce Slack-r 5. Keep only candidates where the latest relevant message is from someone else, or where newer replies appeared after the user's last reply or mention. 6. Expand only the threads or surrounding messages needed to answer accurately. Answer the question first, then add clarification or next steps when the context supports it. 7. If the context is incomplete, write the smallest useful clarifying reply instead of pretending the answer is known. -8. Create the draft with `slack_send_message_draft` in the source channel or DM. Include `thread_ts` only for a real thread reply with a parent message timestamp; for DMs or top-level messages, omit `thread_ts` entirely and never pass an empty string. ## Drafting Rules From d48ad3b4ace4a11a6689bb28f6f9a7597798fdc7 Mon Sep 17 00:00:00 2001 From: Sama Setty Date: Mon, 23 Mar 2026 15:44:37 -0700 Subject: [PATCH 4/9] Document Slack zero-width-space spacing hack Add the Slack blank-line workaround to slack-messages common mistakes so drafting and sending flows use a zero-width-space line for double spacing and after bold standalone section labels. Co-authored-by: Codex --- plugins/slack/skills/slack-messages/SKILL.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/slack/skills/slack-messages/SKILL.md b/plugins/slack/skills/slack-messages/SKILL.md index d1b0c3a3..cc5e3cd1 100644 --- a/plugins/slack/skills/slack-messages/SKILL.md +++ b/plugins/slack/skills/slack-messages/SKILL.md @@ -37,4 +37,6 @@ Read this reference **before finalizing any outgoing Slack text**: ## Common Mistakes -- Include `thread_ts` only when replying inside an existing thread and you have the parent message timestamp; otherwise, omit it entirely. \ No newline at end of file +- Include `thread_ts` only when replying inside an existing thread and you have the parent message timestamp; otherwise, omit it entirely. +- Slack draft/send may collapse true blank lines. When you need a visible blank separator, use a line that contains only a zero-width space (`U+200B`, `\u200B`) instead of an empty line. +- After a bold standalone section label such as `*Latest status*` or `*Timeline*`, add a zero-width-space line (`U+200B`) before the next bullet or paragraph so Slack preserves the section break. From 39453d478a4837462d4f22a0fcf34cd928d17e1f Mon Sep 17 00:00:00 2001 From: Sama Setty Date: Mon, 23 Mar 2026 15:47:38 -0700 Subject: [PATCH 5/9] Rename Slack outbound writing skill Rename slack-messages to slack-outgoing-message, broaden the frontmatter description so trigger selection matches the intended final-text workflow, and update the UI metadata and related-skill links to the new identity. Co-authored-by: Codex --- .../skills/slack-channel-summarization/SKILL.md | 2 +- .../slack/skills/slack-messages/agents/openai.yaml | 7 ------- .../SKILL.md | 13 +++++++------ .../slack-outgoing-message/agents/openai.yaml | 7 +++++++ plugins/slack/skills/slack-reply-drafting/SKILL.md | 4 ++-- plugins/slack/skills/slack/SKILL.md | 2 +- 6 files changed, 18 insertions(+), 17 deletions(-) delete mode 100644 plugins/slack/skills/slack-messages/agents/openai.yaml rename plugins/slack/skills/{slack-messages => slack-outgoing-message}/SKILL.md (64%) create mode 100644 plugins/slack/skills/slack-outgoing-message/agents/openai.yaml diff --git a/plugins/slack/skills/slack-channel-summarization/SKILL.md b/plugins/slack/skills/slack-channel-summarization/SKILL.md index 43f54efb..76438cae 100644 --- a/plugins/slack/skills/slack-channel-summarization/SKILL.md +++ b/plugins/slack/skills/slack-channel-summarization/SKILL.md @@ -11,7 +11,7 @@ Use this skill to summarize activity from one Slack channel, using a requested t | Workflow | Skill | | --- | --- | -| Draft, send, or rewrite the final Slack update | [../slack-messages/SKILL.md](../slack-messages/SKILL.md) | +| Draft, send, or rewrite the final outbound Slack update | [../slack-outgoing-message/SKILL.md](../slack-outgoing-message/SKILL.md) | ## Start Here diff --git a/plugins/slack/skills/slack-messages/agents/openai.yaml b/plugins/slack/skills/slack-messages/agents/openai.yaml deleted file mode 100644 index 971ec0bc..00000000 --- a/plugins/slack/skills/slack-messages/agents/openai.yaml +++ /dev/null @@ -1,7 +0,0 @@ -interface: - display_name: "Slack Messages" - short_description: "Write Slack messages and drafts" - icon_small: "../slack/assets/slack-small.svg" - icon_large: "../slack/assets/slack.svg" - brand_color: "#611F69" - default_prompt: "Use $slack-messages to write, draft, or rewrite Slack message content for sending, saving as a draft, or creating a canvas with correct mrkdwn and explicit Slack mentions." diff --git a/plugins/slack/skills/slack-messages/SKILL.md b/plugins/slack/skills/slack-outgoing-message/SKILL.md similarity index 64% rename from plugins/slack/skills/slack-messages/SKILL.md rename to plugins/slack/skills/slack-outgoing-message/SKILL.md index cc5e3cd1..e7cddd63 100644 --- a/plugins/slack/skills/slack-messages/SKILL.md +++ b/plugins/slack/skills/slack-outgoing-message/SKILL.md @@ -1,13 +1,14 @@ --- -name: slack-messages -description: Compose or rewrite standalone Slack messages with correct mrkdwn, destination-aware recipient checks, and explicit mention handling. +name: slack-outgoing-message +description: Primary skill for composing, drafting, or refining any outbound Slack content. Use this whenever the task will end in `slack_send_message`, `slack_send_message_draft`, or `slack_create_canvas`, including thread summaries rewritten into Slack-ready posts, DMs, replies, status updates, or announcements. Use `slack` to read or analyze Slack context; use this skill to produce the final outgoing message. --- -# Slack Messages +# Slack Outgoing Message ## Overview -Use this skill to compose, draft, or refine Slack-ready messages and related Slack content. Apply it when the next step involves `slack_send_message`, `slack_send_message_draft`, or `slack_create_canvas`. +Use this skill whenever the task involves producing final Slack text for a draft, send, or canvas. +If another Slack skill is used to read or summarize source context, switch to this skill before finalizing outgoing text. ## Reference Notes @@ -38,5 +39,5 @@ Read this reference **before finalizing any outgoing Slack text**: ## Common Mistakes - Include `thread_ts` only when replying inside an existing thread and you have the parent message timestamp; otherwise, omit it entirely. -- Slack draft/send may collapse true blank lines. When you need a visible blank separator, use a line that contains only a zero-width space (`U+200B`, `\u200B`) instead of an empty line. -- After a bold standalone section label such as `*Latest status*` or `*Timeline*`, add a zero-width-space line (`U+200B`) before the next bullet or paragraph so Slack preserves the section break. +- Slack draft/send collapses true blank lines. When you need a visible blank separator, use a line that contains only a zero-width space instead of an empty line. +- After any section label, add a zero-width-space line before the next bullet or paragraph so Slack preserves the section break. diff --git a/plugins/slack/skills/slack-outgoing-message/agents/openai.yaml b/plugins/slack/skills/slack-outgoing-message/agents/openai.yaml new file mode 100644 index 00000000..8adf851b --- /dev/null +++ b/plugins/slack/skills/slack-outgoing-message/agents/openai.yaml @@ -0,0 +1,7 @@ +interface: + display_name: "Slack Outgoing Message" + short_description: "Compose final outbound Slack text" + icon_small: "../slack/assets/slack-small.svg" + icon_large: "../slack/assets/slack.svg" + brand_color: "#611F69" + default_prompt: "Use $slack-outgoing-message to turn source context into final Slack-ready text for a draft, send, or canvas with correct mrkdwn and explicit Slack mentions." diff --git a/plugins/slack/skills/slack-reply-drafting/SKILL.md b/plugins/slack/skills/slack-reply-drafting/SKILL.md index e35ca2fe..83a00768 100644 --- a/plugins/slack/skills/slack-reply-drafting/SKILL.md +++ b/plugins/slack/skills/slack-reply-drafting/SKILL.md @@ -11,7 +11,7 @@ Use this skill to identify messages that likely need a reply and produce Slack-r | Workflow | Skill | | --- | --- | -| Refine, draft, or send the final Slack text | [../slack-messages/SKILL.md](../slack-messages/SKILL.md) | +| Refine, draft, or send the final Slack text | [../slack-outgoing-message/SKILL.md](../slack-outgoing-message/SKILL.md) | ## Start Here @@ -48,7 +48,7 @@ Use this skill to identify messages that likely need a reply and produce Slack-r ## Drafting Rules -- Use the [../slack-messages/SKILL.md](../slack-messages/SKILL.md) skill to draft outgoing Slack text. +- Use the [../slack-outgoing-message/SKILL.md](../slack-outgoing-message/SKILL.md) skill to draft outgoing Slack text. ## Formatting diff --git a/plugins/slack/skills/slack/SKILL.md b/plugins/slack/skills/slack/SKILL.md index b6cb99f1..e2ccbd7b 100644 --- a/plugins/slack/skills/slack/SKILL.md +++ b/plugins/slack/skills/slack/SKILL.md @@ -13,7 +13,7 @@ Use this skill to turn channel and thread context into concise, post-ready Slack | Workflow | Skill | | --- | --- | -| Message composition, rewrites, drafts, and canvas-writing workflows | [../slack-messages/SKILL.md](../slack-messages/SKILL.md) | +| Compose final outbound Slack text, drafts, sends, and canvases | [../slack-outgoing-message/SKILL.md](../slack-outgoing-message/SKILL.md) | | Bounded channel recaps and thematic Slack summaries | [../slack-channel-summarization/SKILL.md](../slack-channel-summarization/SKILL.md) | | Daily digests across selected channels or topics | [../slack-daily-digest/SKILL.md](../slack-daily-digest/SKILL.md) | | Find messages that likely need a response and prepare reply drafts | [../slack-reply-drafting/SKILL.md](../slack-reply-drafting/SKILL.md) | From 0f323d59a7b10b2d21dce9faefd4995dde2cc6cc Mon Sep 17 00:00:00 2001 From: Sama Setty Date: Mon, 23 Mar 2026 15:48:10 -0700 Subject: [PATCH 6/9] changes --- plugins/slack/skills/slack-outgoing-message/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/slack/skills/slack-outgoing-message/SKILL.md b/plugins/slack/skills/slack-outgoing-message/SKILL.md index e7cddd63..cebd7613 100644 --- a/plugins/slack/skills/slack-outgoing-message/SKILL.md +++ b/plugins/slack/skills/slack-outgoing-message/SKILL.md @@ -1,6 +1,6 @@ --- name: slack-outgoing-message -description: Primary skill for composing, drafting, or refining any outbound Slack content. Use this whenever the task will end in `slack_send_message`, `slack_send_message_draft`, or `slack_create_canvas`, including thread summaries rewritten into Slack-ready posts, DMs, replies, status updates, or announcements. Use `slack` to read or analyze Slack context; use this skill to produce the final outgoing message. +description: Primary skill for composing, drafting, or refining any outbound Slack content. Use this whenever the task will require using `slack_send_message`, `slack_send_message_draft`, or `slack_create_canvas`. Use `slack` to read or analyze Slack context; use this skill to produce the final outgoing message. --- # Slack Outgoing Message From 4fe477b6abef088148ce33a1da938974ca762f3e Mon Sep 17 00:00:00 2001 From: Sama Setty Date: Mon, 23 Mar 2026 15:53:46 -0700 Subject: [PATCH 7/9] minor --- plugins/slack/skills/slack-reply-drafting/SKILL.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/slack/skills/slack-reply-drafting/SKILL.md b/plugins/slack/skills/slack-reply-drafting/SKILL.md index 83a00768..1f155ab4 100644 --- a/plugins/slack/skills/slack-reply-drafting/SKILL.md +++ b/plugins/slack/skills/slack-reply-drafting/SKILL.md @@ -11,7 +11,7 @@ Use this skill to identify messages that likely need a reply and produce Slack-r | Workflow | Skill | | --- | --- | -| Refine, draft, or send the final Slack text | [../slack-outgoing-message/SKILL.md](../slack-outgoing-message/SKILL.md) | +| Refine, draft, or send the final Slack text | [../slack-messages/SKILL.md](../slack-messages/SKILL.md) | ## Start Here @@ -45,10 +45,11 @@ Use this skill to identify messages that likely need a reply and produce Slack-r 5. Keep only candidates where the latest relevant message is from someone else, or where newer replies appeared after the user's last reply or mention. 6. Expand only the threads or surrounding messages needed to answer accurately. Answer the question first, then add clarification or next steps when the context supports it. 7. If the context is incomplete, write the smallest useful clarifying reply instead of pretending the answer is known. +8. Create the draft with `slack_send_message_draft`, and *only* nclude `thread_ts` for real thread replies. ## Drafting Rules -- Use the [../slack-outgoing-message/SKILL.md](../slack-outgoing-message/SKILL.md) skill to draft outgoing Slack text. +- Use the [../slack-messages/SKILL.md](../slack-messages/SKILL.md) skill to draft outgoing Slack text. ## Formatting From e2ae6e2f25a2588e39cee82a462d9c784add4122 Mon Sep 17 00:00:00 2001 From: Sama Setty Date: Tue, 24 Mar 2026 00:06:45 -0700 Subject: [PATCH 8/9] changes --- .../slack-channel-summarization/SKILL.md | 31 ++++++++++---- .../slack/skills/slack-daily-digest/SKILL.md | 40 ++++++++++++++----- .../skills/slack-notification-triage/SKILL.md | 36 +++++++++++++---- .../skills/slack-outgoing-message/SKILL.md | 26 +++++++++--- .../skills/slack-reply-drafting/SKILL.md | 19 +++++---- plugins/slack/skills/slack/SKILL.md | 4 +- 6 files changed, 117 insertions(+), 39 deletions(-) diff --git a/plugins/slack/skills/slack-channel-summarization/SKILL.md b/plugins/slack/skills/slack-channel-summarization/SKILL.md index 76438cae..dfe84823 100644 --- a/plugins/slack/skills/slack-channel-summarization/SKILL.md +++ b/plugins/slack/skills/slack-channel-summarization/SKILL.md @@ -11,7 +11,7 @@ Use this skill to summarize activity from one Slack channel, using a requested t | Workflow | Skill | | --- | --- | -| Draft, send, or rewrite the final outbound Slack update | [../slack-outgoing-message/SKILL.md](../slack-outgoing-message/SKILL.md) | +| Draft, send, or rewrite the final Slack update | [../slack-outgoing-message/SKILL.md](../slack-outgoing-message/SKILL.md) | ## Start Here @@ -24,29 +24,44 @@ Use this skill to summarize activity from one Slack channel, using a requested t 1. Resolve the named channel with `slack_search_channels`. 2. Collect the initial pass with `slack_read_channel` and `limit: 100`. If the user gave a window, set `oldest` and `latest`. If not, read the latest messages. 3. Read a thread using `slack_read_thread` when the parent message looks important to the summary, for example a decision, blocker, launch, incident, or open question. Default to the last `50` replies unless the request requires more. -4. Consolidate the channel activity into a short summary grouped by topic. The summary should include recurring conversations, key decisions or follow-ups, notable updates, and important threads. -5. Match the delivery format to the request: +4. Read the full `## Formatting Rules` section below. +5. Consolidate the channel activity into a short summary grouped by topic. The summary should include recurring conversations, key decisions or follow-ups, notable updates, and important threads. +6. Match the delivery format to the request: - short recap or brief: reply in chat or draft/send a compact Slack message - summary doc: use `slack_create_canvas` -6. If the user wants the result delivered in Slack, draft by default unless they explicitly asked to send. +7. If the user wants the result delivered in Slack, draft by default unless they explicitly asked to send. -## Formatting +## Formatting Rules + +- For a concise Slack or chat summary, you MUST use exactly this structure unless the user explicitly requests a different format. +- If you use `../slack-outgoing-message/SKILL.md` to draft or send the final message, this output contract remains binding. The downstream skill does not relax or rename these sections. -For a concise Slack or chat summary, format as: ```md -*Channel Summary — * -*Overview:* <1–2 sentence summary of the main themes and biggest updates> +*Channel Summary - * +[ZWSP line] +*Overview* +[ZWSP line] +<1-2 sentence summary> +[blank line] +[ZWSP line] *Topic: * +[ZWSP line] - ... - ... +[blank line] +[ZWSP line] *Topic: * +[ZWSP line] - ... - ... +[blank line] +[ZWSP line] *Notes* +[ZWSP line] - ``` diff --git a/plugins/slack/skills/slack-daily-digest/SKILL.md b/plugins/slack/skills/slack-daily-digest/SKILL.md index 54f556f5..ffb46349 100644 --- a/plugins/slack/skills/slack-daily-digest/SKILL.md +++ b/plugins/slack/skills/slack-daily-digest/SKILL.md @@ -19,33 +19,55 @@ Use this skill to produce a daily digest of today's important Slack activity fro 3. Named channels: Resolve IDs through `slack_search_channels`, then call `slack_read_channel` for today's window with `limit` at `50` per channel. 4. Named topics: Use `slack_search_public_and_private` for each topic phrase. If channels were also provided, run one search per topic and channel with `query` set to ` in:<#CHANNEL_ID>` so the search stays inside the selected channels. If no channels were provided, set `query` to the topic phrase. Then read the returned channels with `slack_read_channel` or parent threads with `slack_read_thread` when a result looks important. 5. Prioritize decisions, blockers, incidents, asks, ownership changes, deadline changes, and status changes. +6. Read the full `## Formatting Rules` section below. -## Formatting +## Formatting Rules -Format the digest as: +- For a concise Slack or chat summary, you MUST use exactly this structure unless the user explicitly requests a different format. +- If you use `../slack-messages/SKILL.md` to draft or send the final message, this output contract remains binding. The downstream skill does not relax or rename these sections. ```md -*Daily Slack Digest — YYYY-MM-DD* +*Daily Slack Digest - YYYY-MM-DD* +[ZWSP line] +*Scope* +[ZWSP line] +- +- -*Scope:* -*Summary:* <1–2 line overview of volume + key signals> +[blank line] +[ZWSP line] +*Summary* +[ZWSP line] +<1-2 sentence summary of volume + key signals> -*Details (by )* -** +[blank line] +[ZWSP line] +*Topic: * +[ZWSP line] - ... - ... -** +[blank line] +[ZWSP line] +*Topic: * +[ZWSP line] - ... - ... +[blank line] +[ZWSP line] *Needs attention* +[ZWSP line] - ... +[blank line] +[ZWSP line] *Notes* +[ZWSP line] - ``` +- Group the digest by topic or channel, whichever better matches the request. - Use short group headers and keep each group to 1–3 bullets. - Keep the digest compact; aim for 4–10 bullets total across all sections. - Start each bullet with the key update, then add implication, owner, blocker, or action if relevant. @@ -53,4 +75,4 @@ Format the digest as: - If grouping by channel, include the topic when helpful. - Preserve exact channel names. - Include *Needs attention* only for items requiring user action, decisions, or input. -- Include *Notes* for gaps, absences, sparse results, or caveats. +- Include *Notes* for gaps, absences, sparse results, or caveats.the exact safe transition required by `../slack-messages/SKILL.md`: prior content line, true blank line, `U+200B` line, next `*Section*` label, `U+200B` line, section content. diff --git a/plugins/slack/skills/slack-notification-triage/SKILL.md b/plugins/slack/skills/slack-notification-triage/SKILL.md index 7a1768c2..41ffa577 100644 --- a/plugins/slack/skills/slack-notification-triage/SKILL.md +++ b/plugins/slack/skills/slack-notification-triage/SKILL.md @@ -20,29 +20,51 @@ Use this skill to produce a priority queue or task list for the user from recent 4. **Named channels:** Resolve IDs through `slack_search_channels`, then call `slack_read_channel` with `limit` at `100` per channel. 5. **Named people or DMs:** Resolve people through `slack_search_users`, then use `slack_search_public_and_private` with several small searches using filters `from:<@USER_ID>`, `to:<@USER_ID>`, or `in:<@USER_ID>` to surface relevant DM or person-specific activity. 6. **Named topics:** Use `slack_search_public_and_private`, and if channels were also provided, keep the search inside those channels. -7. **No explicit scope:** Run several small `slack_search_public_and_private` searches using filters such as `to:me`, `<@USER_ID>`, and `is:thread`, then expand the strongest results with `slack_read_thread` for threads or `slack_read_channel` for surrounding channel context. +7. **No explicit scope:** Search in this order: + - unanswered direct conversations: run `slack_search_public_and_private` over `channel_types="im"`, paging until you have a reasonable set of unique conversations, then dedupe and expand promising DMs with `slack_read_channel` + - unanswered group DMs: repeat over `channel_types="mpim"`, again preferring unique conversations over repeated hits from one chat + - direct mentions: `slack_search_public_and_private` with `query` set to `<@USER_ID>` + - threads with prior user participation: `slack_search_public_and_private` with `query` set to `from:<@USER_ID> is:thread`, then `slack_read_thread` + - threads with prior user mention: `slack_search_public_and_private` with `query` set to `<@USER_ID> is:thread`, then `slack_read_thread` 8. Use `slack_read_thread` when the thread could hold more necessary context. -9. Prioritize messages that likely need a reply or could create a concrete follow-up or task for the user. +9. Prioritize messages that likely need a reply or could create a concrete follow-up or task for the user. Explicit asks, review or approval requests, blockers, and bumps should rank above casual questions, FYIs, or repeated snippets from the same conversation. +10. Read the full `## Formatting Rules` section below. +11. Before sending the final answer, map the findings into the exact structure in **Formatting Rules**. Do not invent alternate section names or top-level layouts. -## Formatting +## Formatting Rules -Format the triage as: +- For a concise Slack or chat summary, you MUST use exactly this structure unless the user explicitly requests a different format. +- If you use `../slack-outgoing-message/SKILL.md` to draft or send the final message, this output contract remains binding. The downstream skill does not relax or rename these sections. ```md -*Slack Notification Triage — YYYY-MM-DD* - -*Summary:* <1–2 line overview of what the user most likely needs to read, reply to, or do next> +*Slack Notification Triage - YYYY-MM-DD* +[ZWSP line] +*Overview* +[ZWSP line] +<1-2 sentence summary of what the user most likely needs to read, reply to, or do next> +[blank line] +[ZWSP line] *Tasks for you* +[ZWSP line] - ... +[blank line] +[ZWSP line] *Worth skimming* +[ZWSP line] - ... +[blank line] +[ZWSP line] *Can ignore for now* +[ZWSP line] - ... +[blank line] +[ZWSP line] *Notes* +[ZWSP line] - ``` diff --git a/plugins/slack/skills/slack-outgoing-message/SKILL.md b/plugins/slack/skills/slack-outgoing-message/SKILL.md index cebd7613..b8367791 100644 --- a/plugins/slack/skills/slack-outgoing-message/SKILL.md +++ b/plugins/slack/skills/slack-outgoing-message/SKILL.md @@ -9,6 +9,7 @@ description: Primary skill for composing, drafting, or refining any outbound Sla Use this skill whenever the task involves producing final Slack text for a draft, send, or canvas. If another Slack skill is used to read or summarize source context, switch to this skill before finalizing outgoing text. +This skill is not complete until you reread the full `## Formatting Rules` section immediately before any outgoing Slack tool call and verify the final text follows every rule. ## Reference Notes @@ -18,11 +19,30 @@ Read this reference **before finalizing any outgoing Slack text**: | --- | --- | | Exact Slack mrkdwn syntax for emphasis, lists, links, code, and mentions | [../slack/references/mrkdwn.md](../slack/references/mrkdwn.md) | +## Formatting Rules + +- Distinguish parser breaks from visible spacing: + - Use a true blank line (`\n\n`) after quotes and also whenever a `*Section*` label follows a numbered list, bulleted list, paragraph, or code block. + - Use a line containing only a zero-width space (`U+200B`) when you need a visible blank line separator, since Slack collapses truly empty lines. + - Do not use vertical tabs (`U+000B`) +- After any section label, insert a line containing only a zero-width space (`U+200B`) before the next bullet, numbered item, or paragraph. +- If a quote should end before the next section, add a true blank line after the quoted line. If you also want visible spacing before the next section label, follow that with a line containing only `\u200B` (`U+200B`). +- Whenever a new `*Section*` label follows a list item, paragraph, or code block, use this safe transition pattern exactly: prior content line, true blank line, `U+200B` line, `*Section*` label, `U+200B` line, section content. +- Prefer labels like `*Section: Foo*` or `*Foo*` instead of numbered sections. + ## Workflow 1. Identify the **intended destination** before drafting: channel, thread, DM, or group DM. 2. Determine whether the user wants a **draft**, a **send-ready message**, or content for a **Slack canvas**. **Default to a draft** unless the user has approved the wording or explicitly asked to send. 3. Read `../slack/references/mrkdwn.md` and use that syntax directly instead of generic Markdown. +4. Read the full `## Formatting Rules` section above. + +## Tool Guardrails + +- Treat optional Slack tool parameters as absent-by-default. +- `thread_ts` is valid only for replies in an existing thread. For normal channel posts, DMs, and new group DMs, omit the `thread_ts` key entirely. +- `slack_send_message_draft` cannot overwrite an existing attached draft, and do not claim that you verified the destination is draft-free before calling the tool. +- If `slack_send_message_draft` returns `draft_already_exists`, stop immediately. Tell the user there is already an attached draft in that destination and that Slack cannot overwrite it. ## Destination Safety @@ -35,9 +55,3 @@ Read this reference **before finalizing any outgoing Slack text**: - Resolve **Slack user groups** before writing when the message should tag a group, and use canonical Slack mrkdwn syntax: ``. - Do not rely on bare `@name` text in outgoing Slack messages. - If you cannot resolve the correct user or group, **tell the user** and compose the draft or message without implying the mention will work. - -## Common Mistakes - -- Include `thread_ts` only when replying inside an existing thread and you have the parent message timestamp; otherwise, omit it entirely. -- Slack draft/send collapses true blank lines. When you need a visible blank separator, use a line that contains only a zero-width space instead of an empty line. -- After any section label, add a zero-width-space line before the next bullet or paragraph so Slack preserves the section break. diff --git a/plugins/slack/skills/slack-reply-drafting/SKILL.md b/plugins/slack/skills/slack-reply-drafting/SKILL.md index 1f155ab4..8872a553 100644 --- a/plugins/slack/skills/slack-reply-drafting/SKILL.md +++ b/plugins/slack/skills/slack-reply-drafting/SKILL.md @@ -11,7 +11,7 @@ Use this skill to identify messages that likely need a reply and produce Slack-r | Workflow | Skill | | --- | --- | -| Refine, draft, or send the final Slack text | [../slack-messages/SKILL.md](../slack-messages/SKILL.md) | +| Refine, draft, or send the final Slack text | [../slack-outgoing-message/SKILL.md](../slack-outgoing-message/SKILL.md) | ## Start Here @@ -38,30 +38,33 @@ Use this skill to identify messages that likely need a reply and produce Slack-r - named person or DM: `slack_search_users`, then `slack_search_public_and_private` - bounded keyword search: `slack_search_public_and_private` 4. If no scope was provided, search these default categories: - - unanswered direct conversations: `slack_search_public_and_private` across `im,mpim`, then `slack_read_channel` to keep conversations where the latest relevant message is from someone else + - unanswered direct conversations: `slack_search_public_and_private` across `im,mpim` to generate candidate conversations, then `slack_read_channel` for each plausible candidate before deciding whether it needs a reply; do not decide from the search snippet alone - direct mentions: `slack_search_public_and_private` with `query` set to `<@USER_ID>` - threads with prior user participation: `slack_search_public_and_private` with `query` set to `from:<@USER_ID> is:thread`, then `slack_read_thread` for newer replies - threads with prior user mention: `slack_search_public_and_private` with `query` set to `<@USER_ID> is:thread`, then `slack_read_thread` for newer replies after the mention -5. Keep only candidates where the latest relevant message is from someone else, or where newer replies appeared after the user's last reply or mention. +5. Keep only candidates where the latest unresolved ask is from someone else, or where newer replies appeared after the user's last substantive reply or mention. Do not count emoji-only, acknowledgement-only, or other non-answer chatter from the user as a reply. 6. Expand only the threads or surrounding messages needed to answer accurately. Answer the question first, then add clarification or next steps when the context supports it. 7. If the context is incomplete, write the smallest useful clarifying reply instead of pretending the answer is known. -8. Create the draft with `slack_send_message_draft`, and *only* nclude `thread_ts` for real thread replies. +8. Create the draft with `slack_send_message_draft` in the source channel or DM. Include `thread_ts` only for thread replies; otherwise omit the parameter entirely. If Slack returns `draft_already_exists`, stop and tell the user you cannot overwrite the existing attached draft via API. ## Drafting Rules -- Use the [../slack-messages/SKILL.md](../slack-messages/SKILL.md) skill to draft outgoing Slack text. +- Use the [../slack-outgoing-message/SKILL.md](../slack-outgoing-message/SKILL.md) skill to draft outgoing Slack text. ## Formatting +- For a concise Slack or chat summary, you MUST use exactly this structure unless the user explicitly requests a different format. +- If you use `../slack-outgoing-message/SKILL.md` to draft or send the final message, this output contract remains binding. The downstream skill does not relax or rename these sections. + Format multiple drafts as: ```md -*Reply Drafts — * +**Reply Drafts — ** -** +**** Draft: -** +**** Draft: ``` diff --git a/plugins/slack/skills/slack/SKILL.md b/plugins/slack/skills/slack/SKILL.md index e2ccbd7b..0400a439 100644 --- a/plugins/slack/skills/slack/SKILL.md +++ b/plugins/slack/skills/slack/SKILL.md @@ -8,12 +8,13 @@ description: Summarize Slack conversations and draft channel-ready posts. Use wh ## Overview Use this skill to turn channel and thread context into concise, post-ready Slack communication. Read the conversation first, preserve the intended audience and tone, and format messages with Slack-native mrkdwn. +If the task will produce outgoing Slack text, switch to [../slack-outgoing-message/SKILL.md](../slack-outgoing-message/SKILL.md) before finalizing and reread that file's `## Formatting Rules` section immediately before any draft or send. ## Related Skills | Workflow | Skill | | --- | --- | -| Compose final outbound Slack text, drafts, sends, and canvases | [../slack-outgoing-message/SKILL.md](../slack-outgoing-message/SKILL.md) | +| Message composition, rewrites, drafts, and canvas-writing workflows | [../slack-outgoing-message/SKILL.md](../slack-outgoing-message/SKILL.md) | | Bounded channel recaps and thematic Slack summaries | [../slack-channel-summarization/SKILL.md](../slack-channel-summarization/SKILL.md) | | Daily digests across selected channels or topics | [../slack-daily-digest/SKILL.md](../slack-daily-digest/SKILL.md) | | Find messages that likely need a response and prepare reply drafts | [../slack-reply-drafting/SKILL.md](../slack-reply-drafting/SKILL.md) | @@ -46,6 +47,7 @@ Use this skill to turn channel and thread context into concise, post-ready Slack - Prefer a short opener, a few tight bullets, and a clear ask or next step. - Use mrkdwn formatting rules from `references/mrkdwn.md` for emphasis, lists, links, quotes, mentions, and code. +- For any outgoing Slack text, use the `slack-outgoing-message` skill. - Distinguish clearly between a private summary for the user and a post-ready message for Slack. - When summarizing a thread, lead with the latest status and then list blockers, decisions, and owners. - When drafting a reply, match the tone of the channel and avoid over-formatting. From c0aea056d2a7fba699b50f003ba5ebde89eb34ed Mon Sep 17 00:00:00 2001 From: Sama Setty Date: Tue, 24 Mar 2026 00:08:40 -0700 Subject: [PATCH 9/9] Fix Slack daily digest skill references Point the daily digest formatting contract at slack-outgoing-message and repair the malformed safe-transition guidance so the Slack plugin is internally consistent. Co-authored-by: Codex --- plugins/slack/skills/slack-daily-digest/SKILL.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/slack/skills/slack-daily-digest/SKILL.md b/plugins/slack/skills/slack-daily-digest/SKILL.md index ffb46349..6b70c02c 100644 --- a/plugins/slack/skills/slack-daily-digest/SKILL.md +++ b/plugins/slack/skills/slack-daily-digest/SKILL.md @@ -24,7 +24,7 @@ Use this skill to produce a daily digest of today's important Slack activity fro ## Formatting Rules - For a concise Slack or chat summary, you MUST use exactly this structure unless the user explicitly requests a different format. -- If you use `../slack-messages/SKILL.md` to draft or send the final message, this output contract remains binding. The downstream skill does not relax or rename these sections. +- If you use `../slack-outgoing-message/SKILL.md` to draft or send the final message, this output contract remains binding. The downstream skill does not relax or rename these sections. ```md *Daily Slack Digest - YYYY-MM-DD* @@ -75,4 +75,5 @@ Use this skill to produce a daily digest of today's important Slack activity fro - If grouping by channel, include the topic when helpful. - Preserve exact channel names. - Include *Needs attention* only for items requiring user action, decisions, or input. -- Include *Notes* for gaps, absences, sparse results, or caveats.the exact safe transition required by `../slack-messages/SKILL.md`: prior content line, true blank line, `U+200B` line, next `*Section*` label, `U+200B` line, section content. +- Include *Notes* for gaps, absences, sparse results, or caveats. +- Between sections, use the exact safe transition required by `../slack-outgoing-message/SKILL.md`: prior content line, true blank line, `U+200B` line, next `*Section*` label, `U+200B` line, section content.