Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions skills/pipeline/triage-github-issue/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Make one issue ready for an agent to implement, or route it to a human.
| `lease_ttl_triage` | `1 hour` | How long the Triaging lease stays valid without a renewal |
| `max_item_failures` | `3` | Failed runs of one step on one item before it is escalated |
| `dedupe_closed_days` | `30` | The "recently closed" window the duplicate search runs over |
| `runner` | `unknown` | Name recorded in the run id and the run log |
| `runner` | `unknown` | Name recorded in the run id, the run log, and every comment this skill posts |
| `log_window_days` | `14` | Days one run-log issue is appended to before a new one starts |
| `unattended` | `true` | `true`: no human is present, so never ask (see **Unattended runs** in the protocol). `false`: a human may be asked |
| `trusted_authors` | *(none)* | Extra GitHub logins whose markers count, comma-separated (see **Trust** in the protocol) |
Expand All @@ -43,24 +43,25 @@ Make one issue ready for an agent to implement, or route it to a human.
- `needs-info`: open questions remain (including a missing required section). Only a human removes this label.
- `ready-for-agent`: an agent can implement from the issue, comments, images, ADRs and codebase.
- `ready-for-human`: needs a human (product decision, access, judgment). Also used when `unattended-triage` recommends closing it as `wontfix` (the issue is not closed).
- An outcome comment as the last comment of the pass: an **Agent Brief**, **Triage Notes**, or the ready-for-human structure (see `unattended-triage` and `references/handoff.md`).
- An outcome comment as the last comment of the pass: an **Agent Brief**, **Triage Notes**, or the ready-for-human structure (see `unattended-triage` and `references/handoff.md`). The comment always records the runner name (e.g. `**Runner:** $runner`).
- Optional description updates and minimized resolved comments.
- Lease released (`release N issue agent:triage`).

## Process

1. **Claim.** `claim N issue agent:triage Triaging "$lease_ttl_triage"`. If `failures N Triaging` is at least `$max_item_failures`, follow `references/escalate.md` and stop. Release on every exit path from here on (see step 9).
2. **Dedupe.** Follow `references/dedupe.md`, using the **Triaging** column. If your issue is a duplicate and is now closed, skip to step 9.
3. **Link related issues** in a comment, or in the description if that reads better.
1. **Claim.** `claim N issue agent:triage Triaging "$lease_ttl_triage"`. If `failures N Triaging` is at least `$max_item_failures`, follow `references/escalate.md` and stop. Release on every exit path from here on (see step 10).
2. **Dedupe.** Follow `references/dedupe.md`, using the **Triaging** column. If your issue is a duplicate and is now closed, skip to step 10.
3. **Link related issues** in a comment, or in the description if that reads better. Any comment this skill posts must include the runner name (`**Runner:** $runner`).
4. **Check the format.** Decide the category, then compare the description with `references/issue-format.md` (its **Triaging's check** section). Fill in what the evidence supports. Note what is missing and cannot be inferred. Those become questions in step 5.
5. **Decide.** Call the Skill tool with `unattended-triage` for this issue. Give it the duplicate and related findings from steps 2 and 3, and the gaps from step 4 (each missing required section becomes a question). It checks for an existing implementation and for prior rejections, tries to reproduce a bug, asks its open questions through `grill-via-github-comments`, and returns the category (`bug` or `enhancement`), the state, the outcome comment, and any proposed repository changes. **For a feature, the use case is always a question if it is not already clear.**
6. **Update the description** as the discussion warrants. Minimize comments whose questions are now answered, with the classifier "Resolved".
7. **Post the outcome comment** that `unattended-triage` returned, as the **last comment** of this pass, disclaimer first. It is the handoff for an issue (see `references/handoff.md`). Put any proposed `GLOSSARY.md`, ADR or `.out-of-scope/` changes in it as text. Do not make them.
8. **Set the state.** One command that removes any old state label, **including `needs-triage`**, and adds the category label if absent and exactly one of these:
7. **Read all comments and reconcile prior outcomes.** Before posting a new outcome or setting labels, read **every** comment on the issue (not only the latest). Look for a prior trusted Agent Brief, Triage Notes, or ready-for-human structure that already recommends a state. Trusted means written by a repository collaborator, owner, member, the agent's own account, or a login in `$trusted_authors` (see **Trust** in the protocol). If such a comment exists and clearly implies one of `ready-for-agent`, `ready-for-human`, or `needs-info`, treat that as the current recommended state unless newer evidence (human answers, new code, or a later trusted outcome) supersedes it. Do not ignore a prior outcome merely because labels were never applied or the previous pass failed partway.
8. **Post the outcome comment** that `unattended-triage` returned (or a reconciliation note if you are only aligning labels to an existing trusted outcome), as the **last comment** of this pass, disclaimer first. It is the handoff for an issue (see `references/handoff.md`). Put any proposed `GLOSSARY.md`, ADR or `.out-of-scope/` changes in it as text. Do not make them. **Always include the runner:** a line `**Runner:** $runner` near the top of the comment body (after any disclaimer).
9. **Set the state.** One command that removes any old state label, **including `needs-triage`**, and adds the category label if absent and exactly one of these (prefer the reconciled state from step 7 when it is still valid):
- `needs-info`: any question is open, **including a missing required section** from `references/issue-format.md`. A feature with no stated use case is never `ready-for-agent`: if `unattended-triage` returned `ready-for-agent` despite that, set `needs-info` and say why. A missing screenshot alone never blocks.
- `ready-for-agent`: an agent can get everything needed to implement from the issue, its comments, any images in them, the ADRs and the codebase.
- `ready-for-human`: a human is needed (product decision, access, judgment call). Also use this when `unattended-triage` recommends `wontfix`: do not close the issue, and say why in the outcome comment.
9. **Release.** `release N issue agent:triage`.
10. **Release.** `release N issue agent:triage`.


If any step fails, leave the state labels as they were, run `fail_item N issue Triaging "<reason>"` and `release N issue agent:triage`, and return `#N failed: <reason>`.
Expand All @@ -77,3 +78,4 @@ Return one line: `#N ready-for-agent`, `#N needs-info`, `#N ready-for-human`, `#
- Remove `needs-info`. Only a human does.
- Apply `ready-for-agent` while questions are open or a required section is missing.
- Modify an issue you have not claimed, except for the comments `references/dedupe.md` allows.
- Set state labels without reading all existing comments for a prior trusted outcome.
Loading