Move local backlog issues through a triage state machine — read each open issue, sort it into the next canonical status (needs-triage → ready → blocked/done…), set its status frontmatter, and report the board. The triage roles/labels come from PROJECT.md. Operates on the local markdown issue tracker written by /to-issues. TRIGGER when: the user wants to triage the backlog, "what should I work on next", sort/label issues, groom the backlog, or move an issue to a new state. TRIGGER ALSO on the ...
Scanned 9/5/2026
Install to Claude Code
npx -y skills add mik2win/foureyes --skill triage --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Triage?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/mik2win-triage)More formats (shields.io, HTML) on the badges page.
---
name: triage
description: >-
Move local backlog issues through a triage state machine — read each open issue, sort it into the
next canonical status (needs-triage → ready → blocked/done…), set its status frontmatter, and
report the board. The triage roles/labels come from PROJECT.md. Operates on the local markdown
issue tracker written by /to-issues.
TRIGGER when: the user wants to triage the backlog, "what should I work on next", sort/label
issues, groom the backlog, or move an issue to a new state.
TRIGGER ALSO on the same request phrased as plain work, with this skill unnamed — "is this
issue still blocked", "what's actually ready to grab", "the board is out of date" — when the
target is the local issue tracker rather than one issue's implementation.
DO NOT TRIGGER, above all, on close-out — "I implemented the plans, check everything is done, can
I move the epic to done?" is /close-epic, not grooming. This skill looks FORWARD: it sorts work
that has not happened yet. Also DO NOT TRIGGER when: the user wants to create issues from a plan
(use /to-issues) or implement one (use /implement).
allowed-tools: Read, Glob, Grep, Bash, Edit, AskUserQuestion
effort: medium
---
# Triage: $ARGUMENTS
Walk the local backlog and move each issue to its correct **triage status**, so the board reflects
reality and "what's next" has an obvious answer. Triage is a small state machine: an issue carries
**one** status at a time and moves forward as it gets clarified, unblocked, or finished.
`$ARGUMENTS` optionally narrows scope — one issue id, or a status to sweep (e.g. `needs-triage`).
Empty = triage all open issues.
This skill carries only invariant logic. The issues directory and the **triage labels** (the
canonical status vocabulary) come from `.claude/PROJECT.md`.
**Routing check before anything else.** If the request is about work the user says they have
*already finished* ("реализовал/implemented the plans — check it's all done, can this go to
done?"), that is `/close-epic`, not triage: closing verifies what happened, triage sorts what
hasn't. This is the single most frequent misroute into this skill — 7 sessions, corpus
2026-07-31. Say which skill you are routing to and stop; do not groom the board instead.
---
## Phase 0 — Load profile & the label set
1. Read `.claude/PROJECT.md` — the **Issue tracker** convention (local; the issues directory) and
the **triage labels**: the canonical statuses and their order (set during `/bootstrap`). If
missing or `TEMPLATE`, fall back to the root `CLAUDE.md` (always in context) when it carries the
issues directory and triage labels — note you're running without a kit profile; **STOP** →
`/bootstrap` first only if *neither* has them.
- If no triage labels are defined yet, propose a sensible default state machine and ask the user
to confirm before using it:
`needs-triage → ready → in-progress → done`, plus `blocked` (off to the side).
2. If `CONTEXT.md` exists, read it so you reason about issues in the project's vocabulary.
---
## Phase 1 — Read the board
Glob the issues directory and read each issue's frontmatter (`id`, `title`, `status`,
`blocked_by`). Build the current board: count by status, and resolve `blocked_by` — an issue whose
blockers are all `done` is *unblocked* and a candidate to advance.
---
## Phase 2 — Triage each issue
**Triage owns the grooming transitions** — getting an issue *ready to be worked*. It does **not**
start or finish work: `in-progress` and `done` track *work*, which the user marks as it happens;
triage only **reflects** them on the board. Advance only when the entry condition holds:
| From | To | When (triage's job) |
|------|----|----|
| `needs-triage` | `ready` | scope is clear, acceptance is verifiable, no unmet blockers |
| `needs-triage` | `blocked` | depends on an unfinished issue or an external dependency |
| `blocked` | `ready` | its `blocked_by` are now all `done` (or a blocker was removed → treat as unblocked) |
**Work states — triage reflects, doesn't drive:** `ready → in-progress` and `in-progress → done`
track *work*, not grooming — triage never starts or finishes work itself. Set `in-progress` when
an issue is picked up and `done` once its work is verified; the user marks this and triage
reconciles it onto the board (and the index) on the next pass. (`/implement` stamps the *plan*
file's status, not the issue's — so nothing else advances an issue to these states.)
**Route-out (not a status):** an issue that's too big or covers multiple capabilities goes
**back to `/to-issues`** to be split — don't force it to `ready`.
When the next status is a genuine judgement call (is this *really* ready? is it one slice or
three?), ask the user via `AskUserQuestion` — present the issue and the candidate move. Don't
silently advance an issue whose acceptance is vague; send it back to `needs-triage` or `/to-issues`
instead.
---
## Phase 3 — Apply & report
1. **Set the `status` frontmatter** on each moved issue (`Edit`, frontmatter only — never rewrite
the body). Update the status column in the index (`<issues-dir>/00-index.md`) if it exists.
2. **Report the board:**
```
## Triage — <scope>
| Status | Count | Issues |
|--------|-------|--------|
| ready | 3 | 0002, 0004, 0007 |
| blocked| 1 | 0005 (waits on 0004) |
| needs-triage | 2 | 0008, 0009 |
### Moved
- 0004: needs-triage → ready (scope clear, acceptance verifiable)
- 0003: blocked → ready (0001 is done)
### Recommended next
- ⭐ 0002 — <title> (ready, unblocked, highest value) → /prepare 0002 or /implement 0002
```
---
## Hard rules
- **One status at a time.** Each issue carries exactly one triage label; moving forward replaces it.
- **Don't advance on vague acceptance.** No path to "ready" for an issue whose done-condition isn't
verifiable — send it back or split it.
- **Frontmatter only.** Triage edits the `status` field, never the issue body.
- **Labels from PROJECT.md.** Use the project's canonical statuses; don't invent ad-hoc ones.
- **Local files only.** Operates on the markdown backlog — no external tracker.
## See also
- **`/to-issues`** — creates the issues this skill sorts (and where an over-large issue gets split).
- **`/prepare` / `/implement`** — pick a `ready` issue and plan/build it; mark the issue `done`
once the work is verified (triage reconciles it on the next pass — `/implement` only stamps the
plan file).
- **`/epic-status`** — progress over a wave-structured *decomposition* (one epic directory);
triage grooms single issues, epic-status reads an epic's waves.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!