Triage
Move tickets through the pre-implementation part of the board: from raw
to a fully groomed
or
, so
only ever
executes work that is already spec'd. Division of labour:
triage grooms,
engineer executes,
reviewer merges. All three share one vocabulary.
Every comment posted during triage MUST start with:
> *This was generated by AI during triage.*
Resolve the tracker first (tracker-agnostic)
Look up the repo root (
git rev-parse --show-toplevel
) in
under
. The entry names the
(
,
, or any future
one) and the board coordinates. If there is no entry, suggest
.
This skill is written in a canonical vocabulary; the actual status/label
strings live on the board, and boards SHOULD be configured to use these names
verbatim. Any tracker only needs to support these five operations:
- fetch a ticket (title, body, comments, labels, status, reporter, dates, blockers)
- set status (to a canonical column)
- add / remove a label
- post a comment
- close / cancel a ticket
Adapters today:
GitHub Projects (
,
),
Linear (MCP
/
/
/
,
loaded via ToolSearch).
Any new tracker: implement those five operations and
map the canonical names to its strings; nothing else here is tracker-specific.
The board vocabulary (shared with engineer + reviewer)
Status = pipeline stage (columns). Triage works the left end:
- : raw; needs evaluation/grooming. Triage's input.
- : fully spec'd; an AFK agent can pick it up. Triage output.
- : fully spec'd, but needs a human (judgment, manual testing,
or access an agent lacks). Triage output.
- / / / : owned by
and ; triage does not move these.
- Terminal: / (close the ticket).
Category = kind of work (labels), orthogonal to status (same set as engineer):
,
,
,
,
,
.
Sub-state labels:
- : a ticket blocked on the reporter. Stays in ;
clears when they reply.
Priority = urgency, a required field (the board's native priority, not a
label). Every groomed ticket carries one. Linear's names and our shorthand:
| Linear | Shorthand | When |
|---|
| Urgent | P0 | drop-everything: broken prod, data loss, a live security hole |
| High | P1 | and by default; anything blocking other work |
| Medium | P2 | the default: features, enhancements, tech-debt |
| Low | P3 | nice-to-have, no near-term cost |
Default to Medium. A
or
ticket is at least High, Urgent if it is
actively breaking production or losing/leaking data; use judgment beyond that. Set
a best-guess priority when you CREATE an issue, and make sure it is set by the time
the ticket leaves
. On a tracker with no native priority field, carry it as
a
..
label.
A groomed ticket carries exactly one category label, a priority, and lands in
exactly one status. If signals conflict, flag it and ask the maintainer before acting.
Invocation
The maintainer invokes
and describes intent in natural language.
Interpret and act. Examples:
- "Show me anything that needs my attention"
- "Triage JAM-12" / "let's look at #42"
- "Move #42 to Ready for Agent"
- "What's ready for agents to pick up?"
Show what needs attention
Query the board and present, oldest first:
- Untriaged: never evaluated (no category label).
- : evaluation in progress.
- with reporter activity since the last triage notes: needs re-evaluation.
Show counts and a one-line summary per ticket. Let the maintainer pick.
Triage one ticket
- Gather context. Read the full ticket (body, comments, labels, reporter,
dates) and any prior triage notes (don't re-ask resolved questions). Explore
the codebase via the repo's knowledge vault (start at
docs/<repo>-vault/_index.md
if present) and the domain glossary, respecting ADRs in the area. Read
and surface any prior rejection that resembles this ticket.
- Recommend. State your category + priority + target-status recommendation
with reasoning, plus a brief relevant codebase summary. Wait for direction.
- Reproduce (bugs only). Before any grilling, attempt reproduction: read the
steps, trace the code, run tests/commands. Report the result: successful repro
with code path, failed repro, or insufficient detail (a strong
signal). A confirmed repro makes a much stronger brief.
- Grill (if needed). If the ticket needs fleshing out, run .
- Apply the outcome:
- : post an agent brief (
references/agent-brief.md
), set the
priority (required; see the priority table), and set status .
- : same brief structure, plus why it can't be delegated
(judgment calls, external access, design decisions, manual testing); set the
priority and status .
- : add the label, post triage notes (template below), keep status
.
- (bug): polite explanation, then close.
- (enhancement): write to (
references/out-of-scope.md
),
link to it from a comment, then close.
Quick status override
If the maintainer says "move #42 to Ready for Agent", trust them and apply it
directly. Confirm what you're about to do (status change, label, comment, close),
then act. Skip grilling. If moving to
without a grilling session,
ask whether they want an agent brief written first.
Needs-info template
markdown
## Triage Notes
**What we've established so far:**
- point 1
- point 2
**What we still need from you (@reporter):**
- question 1
- question 2
Capture everything resolved during grilling under "established so far" so the work
isn't lost. Questions must be specific and actionable, not "please provide more info".
Resuming a previous session
If prior triage notes exist on the ticket, read them, check whether the reporter
has answered outstanding questions, and present an updated picture before
continuing. Don't re-ask resolved questions.
Pairs with
- engineer pulls (and co-pilots ).
- reviewer owns -> merge / .
Keep the vocabulary identical across all three; that is what lets a ticket flow
Triage -> Ready -> In Progress -> In Review -> Done on any tracker.
References (load on demand)
references/agent-brief.md
: the durable agent-brief format (the contract an
agent works from; survives refactors, no file paths/line numbers).
references/out-of-scope.md
: the rejected-request knowledge
base (institutional memory + dedup of feature rejections).