Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Vet open issues for autonomous resolution and queue the qualifying ones with the autopilot-queued label — the start-of-day "fill the queue" half of the triage → run split.
.claude/skills/joshukraine-autopilot-triage/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 143% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 53% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 367% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 133% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 96% | 0% |
Vet a pool of open issues against the autonomy rubric and, after your confirmation, tag the ones that qualify with the autopilot-queued label. /autopilot-batch later reads that label and runs the batch. This is the vet half of the triage → run split; the two are decoupled on purpose — triage once (cheap, start-of-day), run the batch whenever and from wherever.
The autopilot-queued label is membership only: it means "vetted and pending," nothing more. Tier is decided at run time by your --merge opt-in, never encoded in it. The build model rides on a separate, pre-existing label (model: fable / model: opus / model: sonnet) that issue triage assigns — this skill reports that label, it does not assign one.
Run from the target application repository — you need the issues _and_ the code, because vetting scope means looking at what a fix would actually touch. Triage is read-only except for the label writes it makes _after_ your confirm.
[label-or-filter] — narrow the candidate pool, e.g. a phase label or chore / fix. Passed through to gh issue list --label.An issue qualifies for autopilot when all hold:
An issue is disqualified when it trips any of /autopilot's own escape-hatch triggers — the same guardrails, applied _before_ the run instead of during it:
When a candidate is borderline, disqualify it — a false negative costs you one manual issue; a false positive burns an unattended run on something that should have stopped. State a one-line reason for every skip; those reasons are useful signal.
For each qualifying issue, also note — as a preview, not a commitment:
model: label if it has one; that label is what /autopilot-batch will actually build with (see ~/.claude/docs/model-selection-strategy.md). If it has none, preview the rubric fallback the batch will use instead — Opus for data-model / security / ambiguous / cross-cutting; Sonnet for bounded pattern-work (i18n / views / config / a single test / CRUD / docs) — and mark it as a preview, not a fact. Either way this is so you can eyeball and adjust before the run. (A --merge opt-in overrides both at run time: merge issues are always Fable-built, because the merge go/no-go runs at the build model and the merge floor is Fable.)model: label in an adopted repo — flag it. Check adoption once per run:bash gh label list --json name --jq '[.[].name | select(startswith("model: "))]'
A non-empty result means the repo has adopted the convention, so a queued issue without a model: label is a triage gap — worth fixing, but never a reason to skip the issue. The batch treats it as Opus by convention via the rubric. Do not apply the label yourself: model tiering is assigned when the issue is triaged, and quietly stamping a tier here would launder a guess into the record. Point the gap at /model-triage --maintenance, which is the skill that owns that write.
--to merge (confined to config / locales / views / copy; no migration / route / dependency). These are _suggestions_ you opt into with --merge at run time; the batch defaults everything to --to pr.Before proposing anything, clean the existing queue so an interrupted prior run can't leave stale membership:
gh issue list --label autopilot-queued --state open --json number,title.bash gh pr list --state all --json number,headRefName,state \ --jq '.[] | select(.headRefName | test("gh-<n>-"))'
gh issue edit <n> --remove-label autopilot-queued.gh issue list --state open [--label <filter>] --json number,title,labels,body.autopilot-queued (already vetted) or already carrying a PR (from Step 1's check).Assess each candidate against the rubric — read the issue body and, where scope is unclear, the code a fix would touch. Assign a verdict (queue / skip), a one-line why, and for queue candidates the build model (from its model: label, or a rubric preview if unlabeled) + merge-tier flag.
Present the triage table — proposed queue and skips together, so the exclusions are visible:
textQueue: #851 Sonnet (label) pr localize checkout flash messages — complete spec, i18n pattern #863 Sonnet (label) merge? copy tweak on the about page — config/copy only, no code paths #847 Opus (label) pr recompute shipment weight rounding — bounded but touches money math #855 Opus (no label!) pr backfill the shipment CSV export — no `model:` label, rubric preview Skip: #870 needs a data-model decision (new column not in the schema) #872 spec ambiguous — two conflicting acceptance criteria Model-label gaps (adopted repo): #855 — run `/model-triage --maintenance` to fill it.
CONFIRM GATE: This is the human gate the lifecycle requires — the label is applied only after you confirm. Present the proposed queue and wait. You may trim, add, or adjust a model call. Nothing is labeled before you say go.
Only after confirmation:
gh label list and look for autopilot-queued; if absent, create it:bash gh label create autopilot-queued \ --description "Vetted by /autopilot-triage; pending an /autopilot-batch run" \ --color 5319e7
gh issue edit <n> --add-label autopilot-queued.Summarize: how many were queued (list + build model with its source + which are merge-tier candidates), how many reconciled/removed, how many skipped (with reasons), and any model: label gaps in an adopted repo. Then the handoff:
> Queue ready — _N_ issues. Run it from this repo with /autopilot-batch. To authorize merge for the flagged candidates, add --merge <#,#>.
autopilot-queued encodes neither model nor tier. Tier is a run-time decision; the model comes from the issue's own model: label (or the batch's rubric fallback). Do not invent autopilot-specific tier labels, and do not apply a model: label here — report what triage assigned, and flag what it missed.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-11 | fail→pass | 6,532 | 2,555 | -61% | 1 | 1 | 0% | 989 | 2,407 | +143% | 0 | 0 | — |
case-12 | fail→pass | 11,234 | 4,235 | -62% | 1 | 1 | 0% | 1,670 | 2,550 | +53% | 0 | 0 | — |
case-01 | fail→fail | 12,255 | 7,503 | -39% | 1 | 1 | 0% | 1,676 | 2,518 | +50% | 0 | 0 | — |
case-02 | fail→fail | 2,365 | 6,178 | +161% | 1 | 1 | 0% | 360 | 2,362 | +556% | 0 | 0 | — |
case-03 | fail→fail | 13,657 | 6,303 | -54% | 1 | 1 | 0% | 2,308 | 2,381 | +3% | 0 | 0 | — |
case-04 | fail→pass | 4,366 | 4,433 | +2% | 1 | 1 | 0% | 573 | 2,675 | +367% | 0 | 0 | — |
case-05 | fail→fail | 10,962 | 7,365 | -33% | 1 | 1 | 0% | 2,050 | 2,462 | +20% | 0 | 0 | — |
case-06 | fail→fail | 4,720 | 7,069 | +50% | 1 | 1 | 0% | 652 | 2,319 | +256% | 0 | 0 | — |
case-07 | pass→pass | 9,391 | 3,824 | -59% | 1 | 1 | 0% | 1,345 | 2,623 | +95% | 0 | 0 | — |
case-08 | fail→pass | 7,896 | 3,947 | -50% | 1 | 1 | 0% | 1,156 | 2,698 | +133% | 0 | 0 | — |
case-09 | fail→pass | 9,677 | 3,274 | -66% | 1 | 1 | 0% | 1,327 | 2,599 | +96% | 0 | 0 | — |
case-10 | fail→pass | 8,654 | 4,637 | -46% | 1 | 1 | 0% | 1,364 | 2,887 | +112% | 0 | 0 | — |
case-13 | pass→pass | 5,810 | 3,993 | -31% | 1 | 1 | 0% | 913 | 2,700 | +196% | 0 | 0 | — |
case-14 | fail→pass | 12,349 | 3,175 | -74% | 1 | 1 | 0% | 1,654 | 2,545 | +54% | 0 | 0 | — |
case-15 | pass→pass | 8,026 | 3,463 | -57% | 1 | 1 | 0% | 1,191 | 2,607 | +119% | 0 | 0 | — |
case-16 | pass→pass | 7,934 | 3,268 | -59% | 1 | 1 | 0% | 1,091 | 2,521 | +131% | 0 | 0 | — |
case-17 | pass→pass | 4,406 | 1,645 | -63% | 1 | 1 | 0% | 660 | 2,265 | +243% | 0 | 0 | — |
case-18 | pass→pass | 6,842 | 3,249 | -53% | 1 | 1 | 0% | 1,081 | 2,644 | +145% | 0 | 0 | — |
case-19 | pass→pass | 13,614 | 5,499 | -60% | 1 | 1 | 0% | 2,106 | 2,953 | +40% | 0 | 0 | — |
case-20 | pass→pass | 3,220 | 1,902 | -41% | 1 | 1 | 0% | 462 | 2,216 | +380% | 0 | 0 | — |
case-21 | pass→pass | 3,595 | 1,824 | -49% | 1 | 1 | 0% | 517 | 2,278 | +341% | 0 | 0 | — |
case-22 | fail→pass | 7,015 | 2,157 | -69% | 1 | 1 | 0% | 1,008 | 2,346 | +133% | 0 | 0 | — |
case-23 | pass→pass | 9,333 | 2,710 | -71% | 1 | 1 | 0% | 1,438 | 2,532 | +76% | 0 | 0 | — |
case-24 | fail→pass | 7,617 | 2,917 | -62% | 1 | 1 | 0% | 1,165 | 2,503 | +115% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 20 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +38 percentage points is the difference between those two pass rates over the 20 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.