$npx -y skills add tt-a1i/matt-skills-with-to-goal --skill triageMove issues and external PRs through a state machine of triage roles — categorise, verify, grill if needed, and write agent-ready briefs.
| 1 | # Triage |
| 2 | |
| 3 | Move issues on the project issue tracker through a small state machine of triage roles. |
| 4 | |
| 5 | If this repo treats external pull requests as a request surface (see the issue-tracker config), triage covers them too: **a PR is an issue with attached code** — same roles, same states, same machine, with a few deltas marked "for a PR" below. Resolve a bare `#42` to an issue or PR per the tracker config. |
| 6 | |
| 7 | Every comment or issue posted to the issue tracker during triage **must** start with this disclaimer: |
| 8 | |
| 9 | ``` |
| 10 | > *This was generated by AI during triage.* |
| 11 | ``` |
| 12 | |
| 13 | ## Reference docs |
| 14 | |
| 15 | - [AGENT-BRIEF.md](AGENT-BRIEF.md) — how to write durable agent briefs |
| 16 | - [OUT-OF-SCOPE.md](OUT-OF-SCOPE.md) — how the `.out-of-scope/` knowledge base works |
| 17 | |
| 18 | ## Roles |
| 19 | |
| 20 | Two **category** roles: |
| 21 | |
| 22 | - `bug` — something is broken |
| 23 | - `enhancement` — new feature or improvement |
| 24 | |
| 25 | Five **state** roles: |
| 26 | |
| 27 | - `needs-triage` — maintainer needs to evaluate |
| 28 | - `needs-info` — waiting on reporter for more information |
| 29 | - `ready-for-agent` — fully specified, ready for an AFK agent |
| 30 | - `ready-for-human` — needs human implementation |
| 31 | - `wontfix` — will not be actioned |
| 32 | |
| 33 | For a PR, the same states read against the attached code: `ready-for-agent` means a brief is attached and an agent should take the next step on the diff; `ready-for-human` means it's ready for a human to merge. |
| 34 | |
| 35 | Every triaged issue should carry exactly one category role and one state role. If state roles conflict, flag it and ask the maintainer before doing anything else. |
| 36 | |
| 37 | These are canonical role names — the actual label strings used in the issue tracker may differ. The mapping should have been provided to you - run `/setup-matt-pocock-skills` if not. |
| 38 | |
| 39 | State transitions: an unlabeled issue normally goes to `needs-triage` first; from there it moves to `needs-info`, `ready-for-agent`, `ready-for-human`, or `wontfix`. `needs-info` returns to `needs-triage` once the reporter replies. The maintainer can override at any time — flag transitions that look unusual and ask before proceeding. |
| 40 | |
| 41 | ## Invocation |
| 42 | |
| 43 | The maintainer invokes `/triage` and describes what they want in natural language. Interpret the request and act. Examples: |
| 44 | |
| 45 | - "Show me anything that needs my attention" |
| 46 | - "Let's look at #42" (issue or PR) |
| 47 | - "Move #42 to ready-for-agent" |
| 48 | - "What's ready for agents to pick up?" |
| 49 | |
| 50 | ## Show what needs attention |
| 51 | |
| 52 | Query the issue tracker and present three buckets, oldest first: |
| 53 | |
| 54 | 1. **Unlabeled** — never triaged. |
| 55 | 2. **`needs-triage`** — evaluation in progress. |
| 56 | 3. **`needs-info` with reporter activity since the last triage notes** — needs re-evaluation. |
| 57 | |
| 58 | When PRs are in scope, include external PRs in these buckets and tag each line `[PR]` or `[issue]`. Discovery surfaces only *external* PRs (the tracker config defines who counts as external) — a collaborator's in-flight PR is not triage work. This filter is discovery-only; an explicitly named PR is always triaged regardless of author. |
| 59 | |
| 60 | Show counts and a one-line summary per item. Let the maintainer pick. |
| 61 | |
| 62 | ## Triage a specific issue or PR |
| 63 | |
| 64 | 1. **Gather context.** Read the full issue or PR (body, comments, labels, author, dates; for a PR, the diff too). Parse any prior triage notes so you don't re-ask resolved questions. Explore the codebase using the project's domain glossary, respecting ADRs in the area. Run two checks against the codebase: (a) **redundancy** — search for an existing implementation of the requested behavior by domain concept (not just the request's wording), and report where you looked. If found, it's an already-implemented `wontfix` (step 5). (b) **prior rejection** — read `.out-of-scope/*.md` and surface any that resembles this request. |
| 65 | |
| 66 | 2. **Recommend.** Tell the maintainer your category and state recommendation with reasoning, plus a brief codebase summary relevant to the request — including whether it's already implemented. Wait for direction. |
| 67 | |
| 68 | 3. **Verify the claim.** Before any grilling, check that the claim holds up. For a bug, reproduce it from the reporter's steps. For a PR, confirm the diff does what it claims — check it out, run the relevant tests or commands. Report what happened: confirmed (with code path), failed, or insufficient detail (a strong `needs-info` signal). A confirmed verification makes a much stronger agent brief. |
| 69 | |
| 70 | 4. **Grill (if needed).** If the request needs fleshing out, run the `/grilling` and `/domain-modeling` skills together — grill it into shape one question at a time, sharpening domain terms and updating `CONTEXT.md`/ADRs inline as decisions land. |
| 71 | |
| 72 | 5. **Apply the outcome:** |
| 73 | - `ready-for-agent` — post an agent brief comment ([AGENT-BRIEF.md](AGENT-BRIEF.md)). |
| 74 | - `ready-for-human` — same structure as an agent brief, but note why it can't be delegated (judgment calls, external access, design decisions, manual tes |