Next Task: Group ยท diff
git:20260812.20bb4af to git:20260813.691c777
1 added, 0 removed. Audit A to A.
---
name: "Next: Task Group"
description: "{{ ๐ซ๐ซ๐ซ }} Show every currently unblocked roadmap task, grouped by milestone or topic"
when_to_use: "When you want the whole actionable frontier laid out to choose from โ next-task-suggest picks one; this shows them all."
model: haiku
effort: low
disable-model-invocation: true
allowed-tools: ["Bash(python3:*)"]
+ arguments: ["pivot"]
argument-hint: "[milestone|topic] (grouping pivot, default milestone)"
---
# Next: Task Group
Display the roadmap's complete ready-set โ every task whose effective status is `todo` โ grouped for choosing between, not choosing for you. Read-only: this skill writes nothing and picks nothing.
## Step 0 โ Parse the pivot
`$ARGUMENTS` is empty or `milestone` โ group by milestone with topic sub-groups. `$ARGUMENTS` is `topic` โ pivot: group by topic with the milestone on each task line. Anything else: say the two valid pivots and default to milestone.
A **topic** is the category prefix embedded in the task ID โ the letters between the milestone number and the sequence (`2TI.3` โ `TI`).
## Step 1 โ Locate the roadmap
Run `python3 "$HOME"/.claude/library/scripts/roadmap.py detect`. Exit **3** = old simple format โ tell the user to run `roadmap-migrate` first and stop. Exit **2** = could not locate/parse โ ask for the path. Proceed only on exit 0.
## Step 2 โ Get the data
Run both:
```bash
python3 "$HOME"/.claude/library/scripts/roadmap.py ready --json
python3 "$HOME"/.claude/library/scripts/roadmap.py stats
```
The `candidates` array is the complete ready-set โ every entry is unblocked by definition; never re-derive or second-guess status here. Each candidate carries `id`, `description`, `milestone`, `milestoneName`, `milestoneDonePct`, `transitiveUnblocks`, `isMilestoneSink`, `assignee` and `notes`.
If `candidates` is empty: say so, and use the `stats` breakdown to name the cheapest unblock โ which blocker or gate, if cleared, frees the most tasks.
## Step 3 โ Render
Header: phase name, ready count against the total from `stats`.
**Milestone pivot** (default):
```markdown
## M2 โ {milestoneName} ({milestoneDonePct}% done)
### {topic}
- **{id}** โ {full description}
โณ unblocks {transitiveUnblocks} ยท completes milestone ยท {assignee} ยท {notes}
```
Omit the `### {topic}` line when a milestone's ready tasks all share one topic. On the annotation line, include only what applies: drop `completes milestone` unless `isMilestoneSink`, drop the assignee when empty, drop notes when empty. `unblocks 0` still prints โ a task that frees nothing is worth knowing about.
**Topic pivot:**
```markdown
## {topic}
- **{id}** โ {full description} _({milestone} ยท {milestoneDonePct}% done)_
โณ unblocks {transitiveUnblocks} ยท completes milestone ยท {assignee} ยท {notes}
```
Both pivots preserve the `ready` command's ordering within each group (it sorts by leverage: `transitiveUnblocks` desc, then `milestoneDonePct` desc). Order the groups themselves by milestone number (milestone pivot) or alphabetically (topic pivot).
Full descriptions always โ never truncate them to tidy the layout.
<raw-arguments value="$ARGUMENTS" />