github-triage/SKILL.md
Triage GitHub issues through a label-based state machine. Use when user wants to create an issue, triage issues, review incoming bugs or feature requests, prepare issues for an AFK agent, or manage issue workflow.
npx skillsauth add paulund/skills github-triageInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Triage issues in the current repo using a label-based state machine. Infer the repo from git remote. Use gh for all GitHub operations.
Every comment or issue posted to GitHub during triage must include the following disclaimer at the top of the comment body, before any other content:
> *This was generated by AI during triage.*
.out-of-scope/ knowledge base worksThese labels are the standard set across all repos. Every repo should have them. Repo-specific labels (e.g. scope:crypto, blog-post) are allowed on top but are not managed by this skill.
| Label | Description |
| --------------- | ------------------------------ |
| bug | Something is broken |
| feature | New capability |
| chore | Maintenance, refactor, or deps |
| documentation | Docs-only changes |
| Label | Kanban Column | Description |
| -------------- | -------------- | -------------------------------------- |
| needs-triage | Needs Triage | New issue, maintainer to evaluate |
| needs-info | Needs Info | Waiting on reporter for more detail |
| planned | Planned | Fully specified, in backlog |
| in-progress | In Progress | Being worked on |
| in-review | In Review | PR open, awaiting merge |
| wontfix | — | Rejected; issue will be closed |
planned| Label | Description |
| ------ | -------------------------------------- |
| afk | Agent can ship this autonomously |
| hitl | Human-in-the-loop required |
| Label | Description |
| ----- | ----------------------- |
| p1 | Critical path |
| p2 | Important |
| p3 | Nice to have |
| Label | Description |
| --------- | ------------------------------------- |
| blocked | Waiting on an external dependency |
| stale | No recent activity (auto-applied) |
| prd | Issue has an associated PRD |
Conflict rule: if an issue has more than one state label, flag the conflict and ask the maintainer which is correct before doing anything else. Provide a recommendation.
States map directly to kanban board columns. The triage skill manages the early states (needs-triage → needs-info → planned). The /ship skill drives planned → in-progress → in-review → closed.
| Current State | Can transition to | Who triggers it | What happens |
| -------------- | ----------------- | ---------------------- | ----------------------------------------------------------------------------------------------------------------- |
| unlabeled | needs-triage | Skill (on first look) | Issue needs maintainer evaluation. Skill applies label after presenting recommendation. |
| unlabeled | planned | Maintainer (via skill) | Issue already well-specified. Skill applies planned + afk or hitl; writes agent brief if afk. |
| unlabeled | wontfix | Maintainer (via skill) | Spam, duplicate, or out of scope. Skill closes with comment (and writes .out-of-scope/ for features). |
| needs-triage | needs-info | Maintainer (via skill) | Underspecified. Skill posts triage notes with progress so far + questions for reporter. |
| needs-triage | planned | Maintainer (via skill) | Triage complete. Skill applies planned + afk or hitl; writes agent brief if afk. |
| needs-triage | wontfix | Maintainer (via skill) | Maintainer decides not to action. Skill closes with comment (and writes .out-of-scope/ for features). |
| needs-info | needs-triage | Skill (detects reply) | Reporter has replied. Skill surfaces to maintainer for re-evaluation. |
| planned | in-progress | /ship skill | Issue picked up for implementation. /ship applies label when work begins. |
| in-progress | in-review | /ship skill | PR opened. /ship applies label. |
| in-review | closed | /ship skill | PR merged, issue closed. |
blocked and stale are overlays — they can be added alongside any state and removed without changing the state.
An issue can only move along these transitions. The maintainer can override any state directly (see Quick State Override below), but the skill should flag if the transition is unusual.
The user describes what they want in natural language after invoking /github-triage.
When the maintainer asks for an overview, query GitHub and present a summary grouped into three buckets:
needs-triage issues — maintainer needs to evaluate or continue evaluating.needs-info issues with new activity — the reporter has commented since the last triage notes comment. Check comment timestamps to determine this.Display counts per group. Within each group, show issues oldest first (longest-waiting gets attention first). For each issue, show: number, title, age, and a one-line summary of the issue body.
Let the maintainer pick which issue to dive into.
Before presenting anything to the maintainer:
.out-of-scope/*.md files and check if this issue matches or is similar to a previously rejected conceptTell the maintainer:
.out-of-scope/concept-name.md — we rejected this before because X. Do you still feel the same way?"Then wait for direction before acting.
If the issue is categorized as a bug, attempt to reproduce it before starting a /domain-model session. This will vary by codebase, but do your best:
needs-infoThe reproduction attempt informs the /domain-model session and the agent brief. A confirmed reproduction with a known code path makes for a much stronger brief.
If the issue needs to be fleshed out before it's ready for an agent, interview the maintainer to build a complete specification. Use the /domain-model skill.
Depending on the outcome:
.out-of-scope/, link in comment, closeWhen the maintainer explicitly tells you to move an issue to a specific state (e.g. "move #42 to planned + afk"), trust their judgment and apply the labels directly.
Still show a confirmation of what you're about to do: which labels will be added/removed, and whether you'll post a comment or close the issue. But skip the /domain-model session entirely.
If moving to planned + afk without a /domain-model session, ask the maintainer if they want to write a brief agent brief comment or skip it.
When moving an issue to needs-info, post a comment that captures the interview progress and tells the reporter what's needed:
## Triage Notes
**What we've established so far:**
- point 1
- point 2
**What we still need from you (@reporter):**
- question 1
- question 2
Include everything resolved during the /domain-model session in "established so far" — this work should not be lost. The questions for the reporter should be specific and actionable, not vague ("please provide more info").
When triaging an issue that already has triage notes from a previous session:
development
Use when the user wants to run the project's lint + types + build sequence as a gate before pushing, opening a PR, or merging. Invoked by chained dev skills between phases. Trigger phrases - "/quality-gate", "run the quality gate", "check it builds".
tools
Use when the user wants to verify a PR's feature works at runtime by booting the dev server, exercising the affected UI via Chrome DevTools MCP, and posting a screenshot summary back to the PR. Idempotent — skips if `verified` or `verify-failed` is already on the PR. Trigger phrases - "/pr-verify", "verify this PR", "runtime check the pr".
testing
Use when the user wants a security-focused review pass on a PR with findings actioned as commits on the same branch. Trigger phrases - "/pr-security-review", "security review and fix".
testing
Use when the user wants to open a pull request for an already-pushed branch that implements a specific issue. Idempotent — returns the existing PR if one is already open for the branch. Trigger phrases - "/pr-open", "open the pr", "create pr for this branch".