From sidequest
Run a full board-grooming pass over a sidequest project, like a sprint grooming session: sweep every ticket, cross-check it against reality (git log, docs, recent session work) to find done-but-open tickets, superseded ones, stale claims, duplicates, and missing tickets for work that already exists in the repo, then act on what's clearly safe and batch the unclear ones into a few interactive questions for the user before closing anything ambiguous. Use when the user says "groom the board", "board grooming", "sprint grooming", "clean up the board", "tidy tickets", "audit the tickets", or "is the board still accurate". Never deletes tickets (closes with an evidence-bearing comment instead) and never touches a claim held by an active agent.
How this skill is triggered — by the user, by Claude, or both
Slash command
/sidequest:groomThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
A grooming pass is a periodic reality check on the board, not a one-off cleanup. Tickets drift: a fix
A grooming pass is a periodic reality check on the board, not a one-off cleanup. Tickets drift: a fix lands but the ticket stays open, a decision supersedes an old plan, an agent claims something and goes idle, two tickets describe the same work from different sessions, or a real chunk of work landed in the repo with no ticket ever filed for it. This skill runs that check end to end: sweep, categorize, act on what's safe, ask about what isn't, apply the answers, report.
Reference pass this is modeled on: the 2026-07-07 temporal-RL grooming pass — 17 tickets closed
with evidence-bearing notes, several stale claims released, and new frontier tickets filed with
depends-on links for the work that had already been decided but never ticketed. That's the shape a good
pass takes: mostly mechanical cleanup, a handful of real judgment calls surfaced to the user, nothing
silently dropped.
sidequest rm a ticket. Closing means sidequest update <ref> --status done, not deletion.
If a ticket is genuinely bogus (duplicate, never should have existed), close it with a comment
explaining why — the record stays, just off the active board.doing,
claimed by someone, and idle past the claim TTL (SIDEQUEST_CLAIM_TTL_MIN, default 60 minutes — check
the ticket's claim timestamp against "now"). If a claim is recent, leave it alone even if you don't
recognize the --by — another session may genuinely be mid-work. Never pass --force to release or
claim during a grooming pass; force overrides a live claim, which is exactly what this guardrail
forbids.done (or gets marked superseded) with a
comment that cites something concrete — a commit hash, a file path, a doc section, or a quoted decision
from another ticket's thread. "Looks done" is not evidence; git log --oneline -- <path> turning up the
actual commit is.Pull the full board and the recent project history in parallel:
sidequest list --json # every open ticket, this project
sidequest list --status doing --json # claims in flight, with claim.by / claim.at
sidequest list --archived --json # already-archived, for duplicate-checking only
git log --oneline -30 # what actually landed recently
For each open ticket, read its thread before judging it — a prior agent may have already left the evidence you need:
sidequest comments <ref>
Then cross-check each ticket against reality: does the repo already contain the change it describes
(git log --oneline -- <path>, git log --grep "<keyword>", read the file itself)? Does a newer ticket
or a doc override its plan? Is its claim stale?
Also sweep the other direction — work with no ticket: skim recent commits and any docs/changelogs for changes that don't trace back to an open or done ticket. That's a gap, not a cleanup, and it's filed, not fixed, in this pass (see Step 3).
Sort every ticket (and every untracked chunk of repo work you found) into one bucket:
doing, held by an agent, claim.at older than the TTL, no sign of
active work (no recent comment, no matching recent commit). Evidence: the claim timestamp vs. now.Keep a running list per bucket as you go — you'll need it for both the act step and the report.
Everything in (a)–(e) gets acted on now, each with a real command and, for closures, a cited comment:
# (a) done but open — close with the evidence
sidequest comment SQ-12 -m "Already shipped: see commit a1b2c3d (2026-07-05), which added the retry
path this ticket asked for. Closing as done."
sidequest update SQ-12 --status done
# (b) superseded — close, point at what replaced it
sidequest comment SQ-9 -m "Superseded by SQ-40's design: the plan changed from per-request retries to
a single backoff queue (see SQ-40 comment thread, 2026-07-06). This ticket's original approach won't be
built."
sidequest update SQ-9 --status done
# (c) stale claim — release, don't force, only past TTL
sidequest release SQ-21 --by <you> --status todo
sidequest comment SQ-21 -m "Claim by agent-xyz from 2026-07-05T10:00Z was idle past the 60min TTL with
no matching commit or comment since. Released back to todo."
# (d) duplicate — close the newer/thinner one, point at the survivor
sidequest comment SQ-33 -m "Duplicate of SQ-31 (same ask: retry queue for the ingest worker, filed a day
earlier). Closing this one; work continues on SQ-31."
sidequest update SQ-33 --status done
# (e) missing ticket — file it, with complexity + why, link it if it depends on something
sidequest add -t "Backfill retry metrics dashboard" --complexity 5 \
--why "one Grafana panel + one counter in the retry path; scoped, known pattern" \
-d "Work exists in commit a1b2c3d but was never ticketed. Filing after the fact so it's tracked."
sidequest link SQ-50 depends-on SQ-31
Normalize priorities while you're in each ticket if one is obviously miscalibrated against what you now know (e.g. a "todo/low" ticket for something that turned out urgent, or vice versa) — but only when the evidence you already gathered supports the change; don't relitigate priority calls that aren't part of what you found.
Don't guess on bucket (f). Group the unclear tickets into a small number of AskUserQuestion rounds (2-4
questions per round is plenty) — one question per unclear ticket or tightly related cluster, each with a
short context summary and options like keep / close / re-scope:
"SQ-17 — is this still relevant?"keep as-is, close (superseded/done/dropped), re-scope (needs new complexity/description),
plus a free-text option if the tool supports one.Present real findings, not a vague "not sure about this one" — the point of asking is that you already did the legwork and the last mile is a judgment call only the user can make (priorities, whether a feature is still wanted, whether a plan changed for reasons not visible in the repo).
For each answered question, act immediately using the same evidence-comment discipline as Step 3 — the user's answer is the evidence now, so cite it:
sidequest comment SQ-17 -m "Per grooming pass 2026-07-07: user confirmed this is superseded by the new
plan (dropped in favor of X). Closing."
sidequest update SQ-17 --status done
If the answer is "keep", leave the ticket untouched but note in the report that it was reviewed and confirmed. If "re-scope", update the description/complexity per what the user said and say so in a comment on the ticket.
Close the pass with a short report back to the user (chat, not a ticket comment) covering:
await still pending, a question the user didn't answer, or a
bucket-(f) item you couldn't even turn into a good question yet.Keep the report plain and specific — refs, commit hashes, file paths — not a vague "cleaned things up."
doing ticket with signs of
life — leave it. Grooming is for drift, not for interrupting live work.--project the
same way any other sidequest command does if they want another board.npx claudepluginhub eigenwise/eigenwise-toolshed --plugin sidequestOngoing backlog refinement for existing board items. Re-prioritize, reclassify, re-scope, archive stale items, decompose oversized issues, merge duplicates, refresh dependencies, and remediate board health findings.
Open the sidequest board (a live Kanban of tickets) or manage tickets from the CLI/MCP: file, list, update, move, close, prioritize, label, or delete tickets — "show me the dashboard", "close SQ-3". Use to WORK the board ("grab the next task") — atomically CLAIM first. Use when the user hands you substantial or multi-part work — decompose it into linked tickets BEFORE implementing. Use to comment, ask the user on-ticket questions (a question means pause-and-wait), or relate tickets. Categories drive model/effort routing. For a mid-task side issue, file it with `add` and keep working. Filing never asks you to work it.
Acts as a Product Manager to drive any issue board through its official MCP server — Linear and Jira/Atlassian supported. Discuss an idea, create/update/finalize an issue, refine an issue into a PRD/TechSpec/task breakdown with native child issues, execute an issue's children with test evidence, or (Jira) manage a GMUD — detecting the connected provider, applying the project's template conventions, and confirming every outward-facing write. Use when the user wants to work a board or tracker — brainstorm a task idea, open/update/move/close an issue or card, refine one into PRD/TechSpec/sub-issues, execute its children with evidence, or search issues. Do not use when no supported board MCP is available and the user declines to configure one, for unsupported trackers (GitHub Issues), or for bulk imports.