From 1627942627d7ca09ed465f60a4a14ef52c26ba34 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Tue, 24 Feb 2026 02:35:38 +0100 Subject: [PATCH] feat(skills): add sprint-status cleanup sweep skill Orchestrates sprint sweep + tea pr list to produce a consistent health report: tickets by status, PR cross-reference, bookkeeping issues, and open work by team summary. Co-Authored-By: Claude Opus 4.6 --- .claude/skills/sprint-status/SKILL.md | 69 ++++++++++++++++++ .../references/output-template.md | 70 +++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 .claude/skills/sprint-status/SKILL.md create mode 100644 .claude/skills/sprint-status/references/output-template.md diff --git a/.claude/skills/sprint-status/SKILL.md b/.claude/skills/sprint-status/SKILL.md new file mode 100644 index 000000000..5673405aa --- /dev/null +++ b/.claude/skills/sprint-status/SKILL.md @@ -0,0 +1,69 @@ +--- +name: sprint-status +description: > + Sprint health check and cleanup sweep. Lists all tickets in the active + sprint grouped by status, detects bookkeeping issues (stale tickets, + orphan PRs, done-but-open PRs, unassigned work), and shows open work + by team. Use when checking sprint progress, before sprint close, or + when housekeeping feels off. Triggers on "sprint status", "cleanup + sweep", "what's open", "sprint health". +user-invocable: true +--- + +# Sprint Status + +Produce a consistent, scannable sprint health report. Closed work scrolls +off the top; open work by team is visible at the bottom. + +## Step 1 — Gather data + +Run these two commands in parallel: + +```bash +db/connectors/sprint sweep +``` + +```bash +tea pr list --login schweitz --repo jpmschweitzer/settled-reach --state open --output simple +``` + +The `sweep` command returns JSON with: +- `sprint` — id, name, status, goal +- `progress` — total, done, pct +- `by_status` — tickets grouped into done, review, in_progress, blocked, backlog +- `by_team` — per-team counts +- `issues` — bookkeeping problems with suggested fix commands + +The `tea pr list` returns open PRs as `#N title` lines. + +## Step 2 — Cross-reference PRs with tickets + +Parse PR head branches from the `tea pr list` output. Known team branches: +`server`, `client`, `copy`, `audio`, `visual`, `ci`. + +Detect additional issues: + +- **done_team_open_pr**: A team's tickets are all done but an open PR + still exists for that team branch. +- **orphan_pr**: An open PR exists on a branch that has no tickets in + the active sprint. + +Add these to the issues list from step 1. + +## Step 3 — Format output + +Read `references/output-template.md` for the exact format spec. + +Render the report using data from steps 1-2. Key rules: +- Sections ordered: Completed, In Review, In Progress, Blocked, Backlog +- Sort tickets within sections by team then ticket ID +- Empty sections: show header with "(0)" and "(none)" +- Bookkeeping Issues table: merge ticket-side issues from `sweep` with + PR-side issues from step 2 +- Open Work by Team: summary table at the bottom + +## Step 4 — Suggest actions + +After the formatted report, if there are bookkeeping issues, add a +"Suggested fixes" section with the fix command for each issue. Group +by issue type for readability. diff --git a/.claude/skills/sprint-status/references/output-template.md b/.claude/skills/sprint-status/references/output-template.md new file mode 100644 index 000000000..74f51eab1 --- /dev/null +++ b/.claude/skills/sprint-status/references/output-template.md @@ -0,0 +1,70 @@ +# Sprint Status Output Template + +Use this template exactly when formatting `/sprint-status` output. + +## Sprint {N}: {Theme} — Status Report + +**Goal:** {goal} +**Status:** {status} | {done}/{total} tickets ({pct}%) +**Open PRs:** {count} ({branches}) + +--- + +### Completed ({count}) + +| # | Team | Title | Assigned | +|---|------|-------|----------| +| #{id} | {team} | {title} | {assigned} | + +### In Review ({count}) + +| # | Team | Title | PR | +|---|------|-------|----| +| #{id} | {team} | {title} | #{pr} | + +### In Progress ({count}) + +| # | Team | Title | Assigned | Note | +|---|------|-------|----------|------| +| #{id} | {team} | {title} | {assigned} | | + +### Blocked ({count}) + +| # | Team | Title | Blocked by | +|---|------|-------|------------| +| #{id} | {team} | {title} | #{ids} | + +### Backlog ({count}) + +| # | Team | Title | Note | +|---|------|-------|----| +| #{id} | {team} | {title} | not started | + +--- + +### Bookkeeping Issues + +| Issue | Detail | Fix | +|-------|--------|-----| +| {type} | {detail} | `{command}` | + +If no issues: "No bookkeeping issues found." + +### Open Work by Team + +| Team | Backlog | In Progress | Review | Blocked | Done | +|------|---------|-------------|--------|---------|------| +| {team} | {n} | {n} | {n} | {n} | {n} | +| **Total** | **{n}** | **{n}** | **{n}** | **{n}** | **{n}** | + +## Rendering rules + +- Sections with 0 items: show header with "(0)" and a single line "(none)" — no empty table. +- Sort tickets within each section by team, then by ticket ID. +- Use the exact markdown table format above (pipe-separated, header row, separator row). +- Bookkeeping issue types map to human-readable labels: + - `unassigned_in_progress` → "Unassigned in_progress" + - `stale_backlog` → "Stale backlog" + - `assigned_but_done` → "Assigned but done" + - `done_team_open_pr` → "Done team with open PR" + - `orphan_pr` → "Orphan PR"