Triage GitHub issues through a configurable label-based state machine. Use when user wants to triage incoming issues, prepare issues for an autonomous agent, or move an issue between workflow states. Repo inferred from `git remote`; all GitHub calls go through `gh`.
Scanned 5/27/2026
Install via CLI
openskills install OutlineDriven/odin-claude-plugin---
name: github-triage
description: Triage GitHub issues through a configurable label-based state machine. Use when user wants to triage incoming issues, prepare issues for an autonomous agent, or move an issue between workflow states. Repo inferred from `git remote`; all GitHub calls go through `gh`.
---
State-machine triage over GitHub issues. Every comment posted carries an AI disclaimer. Label names are configurable; state semantics are not.
## AI disclaimer (mandatory)
Every comment or new issue body posted during triage MUST begin with:
```
> *This was generated by AI during triage.*
```
No exceptions.
## Label map (configure per project)
Bind ODIN's abstract state tokens to your repo's actual label names. Edit this block before first use; defaults match Matt Pocock's upstream convention.
```
category:
bug: "bug" # something is broken
enhancement:"enhancement" # new feature or improvement
state:
triage_pending: "needs-triage" # maintainer must evaluate
awaiting_info: "needs-info" # waiting on reporter
ready_for_agent: "ready-for-agent" # fully specified, autonomous-agent-suitable
ready_for_human: "ready-for-human" # requires human judgment
wont_fix: "wontfix" # closed, not actioned
```
Body uses the abstract tokens (`triage_pending`, `ready_for_agent`, etc.). Replace with your repo's labels at apply time.
## Invariants
- Every issue carries exactly one `category` label and one `state` label.
- Conflicting state labels = halt and ask the maintainer which is correct.
- Maintainer can override any state directly; flag unusual transitions.
## State machine
| From | To | Trigger | Effect |
| --------------- | ----------------- | ------------------- | ------------------------------------------------------------------------ |
| unlabeled | triage_pending | skill (first look) | applies label after presenting recommendation |
| unlabeled | ready_for_agent | maintainer | post agent brief, apply label |
| unlabeled | ready_for_human | maintainer | post task summary, apply label |
| unlabeled | wont_fix | maintainer | comment + close |
| triage_pending | awaiting_info | maintainer | post triage notes capturing progress + reporter questions |
| triage_pending | ready_for_agent | maintainer | grilling complete; agent brief; apply label |
| triage_pending | ready_for_human | maintainer | grilling complete; task summary; apply label |
| triage_pending | wont_fix | maintainer | comment + close |
| awaiting_info | triage_pending | skill (reply seen) | reporter replied; surface for re-evaluation |
## Workflows
### Overview ("what needs my attention")
Group open issues into three buckets and display oldest-first:
1. Unlabeled — never triaged.
2. `triage_pending` — needs evaluation or continuation.
3. `awaiting_info` with new activity since the last triage-notes comment.
### Triage a specific issue
1. Dispatch Explore agent to read full issue + all comments + related code paths.
2. Present category and state recommendations with reasoning.
3. For bugs: attempt reproduction. Run repo tests, trace logic.
4. If underspecified, run a `/domain-model` session.
5. Apply outcome per state.
## `awaiting_info` comment template
```markdown
## Triage Notes
**Established so far:**
- point 1
- point 2
**Need from you (@reporter):**
- specific question 1
- specific question 2
```
Reporter questions must be specific and actionable.
## Parallel examples
**TypeScript repo:** label-map binds `ready_for_agent → "agent-ready"`, `awaiting_info → "blocked-on-reporter"`. State machine and prose unchanged.
**Rust repo:** label-map binds `triage_pending → "S-needs-triage"`, `wont_fix → "C-wont-fix"` per Rust-project conventions. State machine and prose unchanged.
No comments yet. Be the first to comment!