Per-desk Slack delivery already works (Slice 5: OAuth install via Setup → Connect Slack; api/slack/interactions handles buttons with the 3s-ack deferred-work pattern). Today's message is plain mrkdwn (lib/notify/compose.ts: "New draft — from a post by @handle / quoted source / draft", with a revised variant).
This issue: upgrade the message to Block Kit —
No install/setup changes — delivery path and per-desk app are unchanged; only the payload shape changes.
Depends on #73. Blocks #75.
Tooling note (2026-07-26): No Slack app-dev CLI/plugin/MCP is installed (searched user skills, plugin cache, user+repo MCP configs — none; install the official Slack CLI fresh if wanted). Available: the claude.ai Slack connector MCP (workspace messaging — use it to VERIFY delivered Block Kit messages in-channel during QC) and the vercel:chat-sdk skill (Slack bot guidance: cards, modals, webhooks — evaluate against this repo's raw-fetch/no-vendor-SDK convention in lib/slack + lib/notify before adopting anything from it). Slack's official Block Kit docs are the source of truth.
Docs grounding (2026-07-26): A slack-docs agent now exists in the user config (~/.claude/agents/slack-docs.md) — a curated docs.slack.dev URL index; delegate Slack-API questions to it instead of fetching ad hoc. Highest-leverage facts for this issue: every docs page is raw markdown via a .md suffix; prototype the payload in Block Kit Builder (https://api.slack.com/tools/block-kit-builder) and paste the exported JSON into the raw chat.postMessage call; 50-block message limit; button element limits (text ≤75 chars, value ≤2000 — the draft id goes in value); see /concepts/designing-with-block-kit for post-click message cleanup rules.
Bonus (2026-07-26): the installed Slack plugin ships a slack:block-kit skill that builds and validates layouts via Slack's blocks.validate API — use it during implementation instead of eyeballing JSON.
Per-desk Slack delivery already works (Slice 5: OAuth install via Setup → Connect Slack;
api/slack/interactionshandles buttons with the 3s-ack deferred-work pattern). Today's message is plain mrkdwn (lib/notify/compose.ts: "New draft — from a post by @handle / quoted source / draft", with arevisedvariant).This issue: upgrade the message to Block Kit —
compose.tsin lockstep (one input, two renderings — existing convention)No install/setup changes — delivery path and per-desk app are unchanged; only the payload shape changes.
Depends on #73. Blocks #75.
Tooling note (2026-07-26): No Slack app-dev CLI/plugin/MCP is installed (searched user skills, plugin cache, user+repo MCP configs — none; install the official Slack CLI fresh if wanted). Available: the claude.ai Slack connector MCP (workspace messaging — use it to VERIFY delivered Block Kit messages in-channel during QC) and the vercel:chat-sdk skill (Slack bot guidance: cards, modals, webhooks — evaluate against this repo's raw-fetch/no-vendor-SDK convention in
lib/slack+lib/notifybefore adopting anything from it). Slack's official Block Kit docs are the source of truth.Docs grounding (2026-07-26): A
slack-docsagent now exists in the user config (~/.claude/agents/slack-docs.md) — a curated docs.slack.dev URL index; delegate Slack-API questions to it instead of fetching ad hoc. Highest-leverage facts for this issue: every docs page is raw markdown via a.mdsuffix; prototype the payload in Block Kit Builder (https://api.slack.com/tools/block-kit-builder) and paste the exported JSON into the rawchat.postMessagecall; 50-block message limit; button element limits (text ≤75 chars, value ≤2000 — the draft id goes invalue); see/concepts/designing-with-block-kitfor post-click message cleanup rules.Bonus (2026-07-26): the installed Slack plugin ships a
slack:block-kitskill that builds and validates layouts via Slack'sblocks.validateAPI — use it during implementation instead of eyeballing JSON.