Backlog Groomer
Triage, prioritize, and research work tracked in the beads issue tracker. This
skill operates on the bd CLI — all mutations (create, close, update) require
explicit user approval before execution.
Determine which workflow the user needs based on their request. If ambiguous,
default to workflow 1 (review and triage) for grooming requests, or workflow 4
(investigate) for research requests.
Grooming Workflows
1. Review and triage
Scan the open backlog for issues that need attention: stale items, potential
duplicates, blocked chains, and missing context.
Steps:
Run bd list --status open and bd list --status in_progress to get the
full picture. Run bd stats for summary counts.
Run bd stale --days 60 to flag aging issues. Separately flag in_progress
issues stale >30 days as "stalled."
Run bd duplicates to detect content-hash matches (if available; if not,
use bd search with keywords from suspicious titles for near-matches).
Run bd blocked to identify issues stuck on unresolved dependencies.
Cross-reference with UPSTREAM-*.md files if they exist (use Glob to
find them). Note any UPSTREAM friction that should have a corresponding
beads issue.
If Basic Memory MCP tools are available, call
mcp__basic-memory__search_notes for key dependencies from package.json
to surface known friction not yet in the backlog. Skip silently if
unavailable.
Present a structured triage table:
| ID | Title | Age | Priority | Flags |
|----|-------|-----|----------|-------|
| vp-beads-xxx | ... | 45d | P3 | stale, missing description |
Suggest per-issue actions: close, reprioritize, merge with duplicate, refine
scope, or leave as-is. No mutations without explicit per-item approval.
2. Reprioritize
Propose a priority reordering based on current sprint goals and blocking
relationships.
Steps:
- Ask the user for current sprint goals if not obvious from conversation
context. Infer from recent commits and
bd list --status in_progress if
the user does not state goals explicitly.
- Run
bd list --status open to get all open issues with current priorities.
- Run
bd blocked to identify blocked chains. If bd dep tree is available,
use it to visualize blocking power — issues that unblock the most downstream
work should rank higher.
- Propose a reordered priority list with reasoning per change. Present as a
diff: current priority → proposed priority, with a one-line rationale.
- User approves, edits, or rejects each proposed change.
- Run
bd update <id> --priority N per approved change.
3. Suggest closures
Identify issues that are likely obsolete and propose closing them.
Steps:
- Run
bd list --status open, focusing on P3/P4 items and issues older than
60 days.
- Cross-reference
git log --oneline -50 with issue titles — use Grep to
match issue keywords against commit messages. Find issues already addressed
by commits but never formally closed.
- Check
bd list --status closed for issues that supersede open ones.
- Run
bd stale --days 90 for deeply stale items.
- Classify each closure candidate:
- Addressed by commit: cite the commit
- Superseded: cite the replacement issue
- Out of scope: note the scope shift (user must confirm)
- Stale beyond recovery: >120 days, no activity, low priority
- Present candidates with rationale per item.
bd close <id> --reason "..." per approved closure.
See references/backlog-health-heuristics.md for closure criteria and
staleness thresholds.
Research Workflows
4. Investigate a topic
Research a topic to inform future work. Takes a topic from the user's request
or the argument-hint.
Steps:
- Parse the user's topic. Classify: technology/library question, project
refactor, or feature request. This guides the research tool mix.
- Basic Memory search first (non-negotiable). Call
mcp__basic-memory__search_notes for the topic and related terms. For
relevant matches, call mcp__basic-memory__read_note to get full content —
surface existing engineering notes, package notes, or upstream friction
entries. If Basic Memory is unavailable, note the gap and proceed.
- Check existing beads issues:
bd search <keywords> to find overlap with
already-tracked work.
- Scan the codebase: use Glob and Grep for existing code related to the topic.
Understand the current state — what exists, what patterns are established.
- Check Raindrop bookmarks: call
mcp__raindrop__find_bookmarks with topic
keywords to surface previously bookmarked articles and resources. If
relevant bookmarks are found, use mcp__raindrop__fetch_bookmark_content
to extract key insights. Skip silently if unavailable.
- External research (if needed based on classification):
mcp__deepwiki__ask_question for package/framework architecture questions
mcp__tavily__tavily_search for broader implementation patterns
mcp__tavily__tavily_extract for deep-diving specific URLs found in search
If external tools are unavailable, proceed with what is available.
- Synthesize into a concise brief: what exists now, what needs to change, key
technical decisions, known pitfalls. Cap at 4-6 bullet points.
- Flag items that should become issues (hand off to workflow 5) or enrich an
existing issue (hand off to workflow 6).
5. Create issues from findings
Turn research findings into structured beads issues. Takes output from
workflow 4 or user-provided findings.
Steps:
- Review the findings and identify discrete, actionable items. Each issue
should be completable in roughly one session of focused work.
- Dedup check: run
bd search <keywords> for each proposed title against
existing issues. Surface near-matches for the user to review.
- Propose structured issues. For each:
- Title:
[Area] Action verb + subject convention
- Type: bug / task / feature / chore (see reference file for logic)
- Priority: 0-4 with explicit reasoning
- Description: problem + why it matters + suggested first step
- If >3 related issues emerge from one topic: propose a tracking issue
(
bd create -t epic) as a group container, with child issues linked.
- If >8 issues from one topic: suggest splitting into multiple research
sessions rather than creating a sprawling epic.
- User approves, edits, or rejects each proposed issue before any
bd create
command runs. Present the full list first, then confirm.
- Run
bd create "title" -t <type> -p <priority> --description "..." per
approved issue.
- Add dependencies where natural ordering exists:
bd dep add <child> <parent>.
- Report: created issue IDs, dependency graph, and suggested first issue to
start (highest priority with no unsatisfied dependencies).
See references/backlog-health-heuristics.md for title conventions, description
templates, and creation limits.
6. Enrich an existing issue
Add research context to an existing issue that needs more information before
work can begin.
Steps:
- User identifies the issue by ID or title. Run
bd show <id> to read the
current state (title, description, status, priority, dependencies).
- Research the topic using the same pipeline as workflow 4: Basic Memory
search → Raindrop bookmarks → codebase scan → external research (DeepWiki,
Tavily) as needed.
- Draft an enriched description. Preserve the original description and append
a
## Research Context section with findings, relevant links, and suggested
approach.
- Show the draft to the user for approval before applying.
- Run
bd update <id> --description "..." with the enriched description after
approval.
Guidelines
- User approval is non-negotiable. Every write operation (
bd create,
bd close, bd update) must be explicitly approved per item. Present
candidates first, confirm, then execute. Never auto-mutate.
- Beads is optional. Guard all
bd commands with availability checks.
If .beads/ does not exist or bd is not found, report that backlog
grooming requires beads and stop.
- Basic Memory is opportunistic. Check for BM tool availability and skip
silently if unavailable. BM enriches grooming with cross-project context but
is not required for the core workflows.
- Infer from context. When the user asks to groom or research, read the
conversation history for recent friction, decisions, and goals rather than
starting a Q&A. The user should not have to re-explain context.
- Keep output scannable. Use tables for triage results, diffs for priority
changes, numbered lists for issue proposals. Cap output at what fits in a
conversation turn.
- Respect the priority vocabulary. Use the 0-4 numeric scale consistently:
0=critical, 1=high, 2=medium, 3=low, 4=backlog.
1---2name: backlog-groomer3description: Manage the beads backlog for this project. Use when the user wants to review or triage open issues, reprioritize the backlog, identify obsolete issues to close, investigate a topic to inform future work, create new issues from research findings, or enrich an existing issue with external context. Trigger phrases: 'groom', 'triage', 'backlog review', 'reprioritize', 'stale issues', 'what should we close', 'too many issues', 'backlog health', 'investigate for backlog', 'research and create issues', 'add context to issue', 'enrich issue', 'plan the work for', 'break down into issues', or any request to audit, prune, or research work tracked in beads.4---5
6# Backlog Groomer
7
8Triage, prioritize, and research work tracked in the beads issue tracker. This
9skill operates on the `bd` CLI — all mutations (create, close, update) require
10explicit user approval before execution.
11
12Determine which workflow the user needs based on their request. If ambiguous,
13default to workflow 1 (review and triage) for grooming requests, or workflow 4
14(investigate) for research requests.
15
16## Grooming Workflows
17
18### 1. Review and triage
19
20Scan the open backlog for issues that need attention: stale items, potential
21duplicates, blocked chains, and missing context.
22
23**Steps:**
24
251. Run `bd list --status open` and `bd list --status in_progress` to get the
26 full picture. Run `bd stats` for summary counts.
272. Run `bd stale --days 60` to flag aging issues. Separately flag `in_progress`
28 issues stale >30 days as "stalled."
293. Run `bd duplicates` to detect content-hash matches (if available; if not,
30 use `bd search` with keywords from suspicious titles for near-matches).
314. Run `bd blocked` to identify issues stuck on unresolved dependencies.
325. Cross-reference with `UPSTREAM-*.md` files if they exist (use `Glob` to
33 find them). Note any UPSTREAM friction that should have a corresponding
34 beads issue.
356. If Basic Memory MCP tools are available, call
36 `mcp__basic-memory__search_notes` for key dependencies from `package.json`
37 to surface known friction not yet in the backlog. Skip silently if
38 unavailable.
397. Present a structured triage table:
40
41 ```
42 | ID | Title | Age | Priority | Flags |
43 |----|-------|-----|----------|-------|
44 | vp-beads-xxx | ... | 45d | P3 | stale, missing description |
45 ```
46
478. Suggest per-issue actions: close, reprioritize, merge with duplicate, refine
48 scope, or leave as-is. **No mutations without explicit per-item approval.**
49
50### 2. Reprioritize
51
52Propose a priority reordering based on current sprint goals and blocking
53relationships.
54
55**Steps:**
56
571. Ask the user for current sprint goals if not obvious from conversation
58 context. Infer from recent commits and `bd list --status in_progress` if
59 the user does not state goals explicitly.
602. Run `bd list --status open` to get all open issues with current priorities.
613. Run `bd blocked` to identify blocked chains. If `bd dep tree` is available,
62 use it to visualize blocking power — issues that unblock the most downstream
63 work should rank higher.
644. Propose a reordered priority list with reasoning per change. Present as a
65 diff: current priority → proposed priority, with a one-line rationale.
665. User approves, edits, or rejects each proposed change.
676. Run `bd update <id> --priority N` per approved change.
68
69### 3. Suggest closures
70
71Identify issues that are likely obsolete and propose closing them.
72
73**Steps:**
74
751. Run `bd list --status open`, focusing on P3/P4 items and issues older than
76 60 days.
772. Cross-reference `git log --oneline -50` with issue titles — use `Grep` to
78 match issue keywords against commit messages. Find issues already addressed
79 by commits but never formally closed.
803. Check `bd list --status closed` for issues that supersede open ones.
814. Run `bd stale --days 90` for deeply stale items.
825. Classify each closure candidate:
83 - **Addressed by commit**: cite the commit
84 - **Superseded**: cite the replacement issue
85 - **Out of scope**: note the scope shift (user must confirm)
86 - **Stale beyond recovery**: >120 days, no activity, low priority
876. Present candidates with rationale per item.
887. `bd close <id> --reason "..."` per approved closure.
89
90See `references/backlog-health-heuristics.md` for closure criteria and
91staleness thresholds.
92
93## Research Workflows
94
95### 4. Investigate a topic
96
97Research a topic to inform future work. Takes a topic from the user's request
98or the `argument-hint`.
99
100**Steps:**
101
1021. Parse the user's topic. Classify: technology/library question, project
103 refactor, or feature request. This guides the research tool mix.
1042. **Basic Memory search first** (non-negotiable). Call
105 `mcp__basic-memory__search_notes` for the topic and related terms. For
106 relevant matches, call `mcp__basic-memory__read_note` to get full content —
107 surface existing engineering notes, package notes, or upstream friction
108 entries. If Basic Memory is unavailable, note the gap and proceed.
1093. Check existing beads issues: `bd search <keywords>` to find overlap with
110 already-tracked work.
1114. Scan the codebase: use Glob and Grep for existing code related to the topic.
112 Understand the current state — what exists, what patterns are established.
1135. Check Raindrop bookmarks: call `mcp__raindrop__find_bookmarks` with topic
114 keywords to surface previously bookmarked articles and resources. If
115 relevant bookmarks are found, use `mcp__raindrop__fetch_bookmark_content`
116 to extract key insights. Skip silently if unavailable.
1176. External research (if needed based on classification):
118 - `mcp__deepwiki__ask_question` for package/framework architecture questions
119 - `mcp__tavily__tavily_search` for broader implementation patterns
120 - `mcp__tavily__tavily_extract` for deep-diving specific URLs found in search
121 If external tools are unavailable, proceed with what is available.
1227. Synthesize into a concise brief: what exists now, what needs to change, key
123 technical decisions, known pitfalls. Cap at 4-6 bullet points.
1248. Flag items that should become issues (hand off to workflow 5) or enrich an
125 existing issue (hand off to workflow 6).
126
127### 5. Create issues from findings
128
129Turn research findings into structured beads issues. Takes output from
130workflow 4 or user-provided findings.
131
132**Steps:**
133
1341. Review the findings and identify discrete, actionable items. Each issue
135 should be completable in roughly one session of focused work.
1362. Dedup check: run `bd search <keywords>` for each proposed title against
137 existing issues. Surface near-matches for the user to review.
1383. Propose structured issues. For each:
139 - **Title**: `[Area] Action verb + subject` convention
140 - **Type**: bug / task / feature / chore (see reference file for logic)
141 - **Priority**: 0-4 with explicit reasoning
142 - **Description**: problem + why it matters + suggested first step
1434. If >3 related issues emerge from one topic: propose a tracking issue
144 (`bd create -t epic`) as a group container, with child issues linked.
1455. If >8 issues from one topic: suggest splitting into multiple research
146 sessions rather than creating a sprawling epic.
1476. User approves, edits, or rejects each proposed issue before any `bd create`
148 command runs. Present the full list first, then confirm.
1497. Run `bd create "title" -t <type> -p <priority> --description "..."` per
150 approved issue.
1518. Add dependencies where natural ordering exists: `bd dep add <child> <parent>`.
1529. Report: created issue IDs, dependency graph, and suggested first issue to
153 start (highest priority with no unsatisfied dependencies).
154
155See `references/backlog-health-heuristics.md` for title conventions, description
156templates, and creation limits.
157
158### 6. Enrich an existing issue
159
160Add research context to an existing issue that needs more information before
161work can begin.
162
163**Steps:**
164
1651. User identifies the issue by ID or title. Run `bd show <id>` to read the
166 current state (title, description, status, priority, dependencies).
1672. Research the topic using the same pipeline as workflow 4: Basic Memory
168 search → Raindrop bookmarks → codebase scan → external research (DeepWiki,
169 Tavily) as needed.
1703. Draft an enriched description. Preserve the original description and append
171 a `## Research Context` section with findings, relevant links, and suggested
172 approach.
1734. Show the draft to the user for approval before applying.
1745. Run `bd update <id> --description "..."` with the enriched description after
175 approval.
176
177## Guidelines
178
179- **User approval is non-negotiable.** Every write operation (`bd create`,
180 `bd close`, `bd update`) must be explicitly approved per item. Present
181 candidates first, confirm, then execute. Never auto-mutate.
182- **Beads is optional.** Guard all `bd` commands with availability checks.
183 If `.beads/` does not exist or `bd` is not found, report that backlog
184 grooming requires beads and stop.
185- **Basic Memory is opportunistic.** Check for BM tool availability and skip
186 silently if unavailable. BM enriches grooming with cross-project context but
187 is not required for the core workflows.
188- **Infer from context.** When the user asks to groom or research, read the
189 conversation history for recent friction, decisions, and goals rather than
190 starting a Q&A. The user should not have to re-explain context.
191- **Keep output scannable.** Use tables for triage results, diffs for priority
192 changes, numbered lists for issue proposals. Cap output at what fits in a
193 conversation turn.
194- **Respect the priority vocabulary.** Use the 0-4 numeric scale consistently:
195 0=critical, 1=high, 2=medium, 3=low, 4=backlog.