diff --git a/skills/pipeline/triage-github-issue/SKILL.md b/skills/pipeline/triage-github-issue/SKILL.md index 0f63665..08c410e 100644 --- a/skills/pipeline/triage-github-issue/SKILL.md +++ b/skills/pipeline/triage-github-issue/SKILL.md @@ -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) | @@ -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 ""` and `release N issue agent:triage`, and return `#N failed: `. @@ -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.