Next Task: Group ยท git:20260812.20bb4af ยท 2026-08-12 ยท sha256 dd0500aad35ecb3c

Next Task: Group git:20260812.20bb4afA

Immutable. This exact content is served forever at /api/v1/blob/dd0500aad35ecb3c.

---
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:*)"]
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" />