From 1e22a583eb3572f86b6b3acb3bfcba940c8a5388 Mon Sep 17 00:00:00 2001 From: Luke Heath Date: Fri, 15 May 2026 14:48:21 -0500 Subject: [PATCH] Add /release-retro skill for working group retros (#45642) --- .claude/skills/release-retro/SKILL.md | 141 ++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 .claude/skills/release-retro/SKILL.md diff --git a/.claude/skills/release-retro/SKILL.md b/.claude/skills/release-retro/SKILL.md new file mode 100644 index 0000000000..7a46e5dd4a --- /dev/null +++ b/.claude/skills/release-retro/SKILL.md @@ -0,0 +1,141 @@ +--- +name: release-retro +description: Format release retro notes for a Fleet working group into a Slack recap post and ~timebox GitHub issues. Use when asked to "post retro recap", "format retro notes", "create release retro", or after a retrospective when feedback needs to land in Slack and action items need to be tracked. +allowed-tools: Bash(gh *), Bash(grep *), Bash(date *), Read, Grep, Glob, mcp__claude_ai_Slack__slack_search_channels, mcp__claude_ai_Slack__slack_search_users, mcp__claude_ai_Slack__slack_list_channel_members, mcp__claude_ai_Slack__slack_send_message_draft +model: sonnet +effort: medium +--- + +# Release retro: format and post + +Process a working group's release retro notes into (1) one Slack draft summarizing the feedback, and (2) one `~timebox` GitHub issue per action item. + +## Inputs + +Invoked without arguments. Prompt the user for each input in sequence: + +1. **Working group's Slack channel** (e.g. `g-first-impressions`, `g-power-to-pc`). Accept with or without a leading `#`; normalize internally. +2. **Release version** covered (e.g. `4.86.0`). Always use the user's answer verbatim, even if the notes reference a different version. If you notice a mismatch, call it out as a brief FYI in your review summary (e.g. "FYI the notes reference 4.86.0 but I'm using `1` per your input"), but do NOT ask the user to swap it or block on the discrepancy. +3. **Retro notes**: ask the user to paste the raw notes. If the notes are long, accept them across multiple messages and confirm when they're done. + +Retro notes typically have two parts. Both may appear in any format the user pastes: + +- **Feedback** — often broken out per attendee (Wins / What went well, Friction / What could have gone better, Things to remember). Your job is to *synthesize across people into thematic bullets*. Do not list per person in the recap. +- **Action items** — usually prefixed `TODO :` or similar. Each becomes one GitHub issue with the named people as assignees. + +## Process + +### 1. Resolve the working group + +- Slack channel ID: call `slack_search_channels` with the channel name; pick the matching result. +- GitHub label: matches the channel name with a `#` prefix (e.g. `#g-first-impressions`). Verify with `gh label list --repo fleetdm/fleet --search ""`. + +### 2. Resolve GitHub handles + +For each name mentioned in an action item, find their GitHub handle: + +```bash +grep -r "" handbook/ | grep -i "github" +``` + +The handle appears as `_([@handle](https://github.com/handle))_`. If you cannot find it, ask the user. + +### 3. Resolve relative dates + +If the notes say "by Wednesday" or "next Monday," anchor against today via `date -u +%Y-%m-%d` and convert to absolute dates in the issue body so the timebox stays interpretable later. + +### 4. Draft the GitHub issues + +For each action item, draft an issue using the timebox template (`.github/ISSUE_TEMPLATE/timebox.md`): + +``` +## Related user story + + +## Task + + +## Condition of satisfaction + +``` + +- Labels: `~timebox` + the working group's channel label (e.g. `#g-first-impressions`). +- Assignees: every named person on the action item. + +### 5. Draft the Slack recap + +Template: + +``` +:recycle: release retro recap + +_Summary via Claude_ + +. Quick summary: + +Wins +• + +Friction +• + +Themes worth calling out +• + +Action items +• +• +• ... + +Thanks team for the honest feedback. +``` + +Style: +- Casual, conversational, first-person plural ("we"). +- Short, punchy bullets. +- **No em dashes.** Use periods, commas, colons, or parentheses instead, even if the source notes use em dashes. +- Slack link syntax: ``. +- Issue links: ``. + +Section headings may be renamed to fit the cycle (e.g. "What went well" instead of "Wins"). Keep the order. + +### 6. Show the user for review BEFORE creating anything + +Present: +1. The list of issues you plan to create: title, assignees, labels, full body. +2. The full Slack draft text. + +If the recap body references individuals by @-mention, render them as friendly handles in chat previews (e.g. `@allenhouchins`), not the raw `<@ID>` form. Use the canonical raw form in the actual API call. + +Wait for explicit confirmation. + +### 7. Create the issues and Slack draft + +On confirmation: + +1. Create the GitHub issues in parallel: + ```bash + gh issue create --repo fleetdm/fleet \ + --title "" \ + --label "~timebox,<channel-label>" \ + --assignee <handle> [--assignee <handle> ...] \ + --body "<timebox-template-body>" + ``` +2. Replace the action-item placeholders in the Slack draft with the real issue numbers and titles. +3. Save the Slack post as a draft (not sent) via `slack_send_message_draft` with `channel_id=<resolved channel ID>`. +4. Report back: list of issue URLs, channel link for the draft. + +## Constraints + +- **Default to drafting, never sending.** Only post to Slack if the user explicitly says to. +- **Never use `@channel`, `@here`, or `@<group>` mentions in the header.** The post lands in the working group's own channel, so the audience is implicit. +- **No em dashes** in the recap, even if source notes use them. +- If an action item lacks an obvious assignee, ask before creating. +- If a name doesn't resolve to a GitHub handle from the handbook, ask before creating. + +## Example + +Cached pointers from the 4.86.0 cycle (re-verify with the Slack API in case they change): + +- `#g-first-impressions`: channel `C0ACJ8L1FD0`, label `#g-first-impressions` +- `#g-power-to-pc`: channel `C0AQY8D7FM4`, label `#g-power-to-pc`