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
categorylabel and onestatelabel. - 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:
- Unlabeled: never triaged.
triage_pending: needs evaluation or continuation.awaiting_infowith new activity since the last triage-notes comment.
Triage a specific issue
- Dispatch Explore agent to read full issue + all comments + related code paths.
- Present category and state recommendations with reasoning.
- For bugs: attempt reproduction. Run repo tests, trace logic.
- If underspecified, do a focused domain-model pass: map entities and constraints before re-categorizing.
- Apply outcome per state.
awaiting_info comment template
The Triage Notes template (established-so-far / need-from-reporter) lives in references/awaiting-info-template.md — read it when transitioning an issue to awaiting_info; other transitions (ready_for_agent, ready_for_human, wont_fix) don't need it.
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.