Agent skill

QA Triage Batch

by joshukraine in joshukraine/dotfiles

Fan out /qa-triage across a queue of qa-labeled reports in parallel, reconcile them across reports to cluster shared root causes, present one consolidated decision gate, and — on approval — create…

MITAuto-check passedDevelopment

Install QA Triage Batch

skills CLI
$ npx skills add joshukraine/dotfiles --skill qa-triage-batch -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install joshukraine/dotfiles qa-triage-batch --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/joshukraine/dotfiles.git skills-src && mkdir -p .claude/skills && cp -r skills-src/claude/.claude/skills/qa-triage-batch .claude/skills/qa-triage-batch && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
qa-triage-batch
GitHub stars
429
Token cost
~3.2k tokens
SKILL.md length
1,559 words
Files
1
Skills in repo
24
Repo updated
First seen
Licence
MIT

At a glance

Fan out /qa-triage across a queue of qa-labeled reports in parallel, reconcile them across reports to cluster shared root causes, present one consolidated decision gate, and — on approval — create…

  • Works in 7 steps: Preconditions → Assemble the batch (self-healing) → Fan out the analysis → …
  • Tasks that involve Root cause analysis
  • SKILL.md covers Where this runs (read first), Arguments, The model policy — "Opus… and Escape hatch (batch-level), plus 2 more sections
  • Calls gh and git

What it does

QA Triage Batch is an agent skill from joshukraine/dotfiles. Fan out /qa-triage across a queue of qa-labeled reports in parallel, reconcile them across reports to cluster shared root causes, present one consolidated decision gate, and — on approval — create the resulting tech issues.

Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Root cause analysis. The repository describes itself as: :roundpushpin: My dotfiles for macOS using Neovim, Zsh, and Ghostty + Tmux. The licence is MIT.

When your agent uses it

  • Tasks that involve Root cause analysis

Example prompts

  • “/qa-triage-batch”

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Preconditions
  2. Assemble the batch (self-healing)
  3. Fan out the analysis
  4. Barrier + reconcile
  5. Consolidated gate — STOP
  6. Act on approval
  7. Completion report + handoff

What it can do on your machine

Read from SKILL.md and the folder at commit b59ad5b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • gh
    • git

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use gh and git, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

QA Triage Batch loads about 3.2k tokens when it runs. Until then it costs about 60 tokens; SKILL.md has 1,559 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~60
When it runs · the whole SKILL.md, loaded when a task matches
~3.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from joshukraine/dotfiles at commit b59ad5b, republished under its MIT licence (© joshukraine). 1,559 words, ~3,165 tokens.

Download SKILL.mdSave it as .claude/skills/qa-triage-batch/SKILL.md (or your agent's skills folder).
name
qa-triage-batch
description
Fan out /qa-triage across a queue of qa-labeled reports in parallel, reconcile them across reports to cluster shared root causes, present one consolidated decision gate, and — on approval — create the resulting tech issues.
disable-model-invocation
true
argument-hint
[report# …]

QA Triage Batch

Run the open qa-labeled reports as a parallel batch: one background subagent per report runs /qa-triage's analysis to its draft, a cross-report pass reconciles all the drafts at once, and a single consolidated gate replaces the N separate per-report STOPs. On approval, the orchestrator creates the tech issues, closes the not-a-bugs, and recommends /resolve-issue for trivial-cosmetics.

Use this when a backlog of QA reports has accumulated. For a single report, use /qa-triage directly — the batch only earns its keep when there are several, because its real value is cross-report reconciliation: a single run is blind to the others, so it can't see that several reports share one root cause. A batch is the only vantage that sees all N at once.

Sibling to /autopilot-batch in the autopilot family (Phase 3). It mirrors that skill's shape — announce → fan out → gate → act → report, plus the escape hatch — but its back half differs on purpose (it creates issues rather than merging PRs, gates before creation rather than after, and reconciles across items). The two share conventions, not code.

Where this runs (read first)

Run this from the target application repository — the repo whose qa reports and app code these are (e.g. the Rails app). Not from dotfiles. You need the reports and the code, because /qa-triage confirms every symptom against the source. Unlike /autopilot-batch, there is no worktree dependency — the fan-out is read-only code investigation (no server, no port 3000, no shared DB, no file writes), so all subagents share the one working tree safely. If the cwd is dotfiles (or any repo that doesn't own these reports), stop and say so.

Arguments

  • (no args) — triage every open qa-labeled report (minus any already in-flight; see Step 1).
  • [report# …] — scope to the listed reports only (e.g. 503 511 488). Everything else is untouched. Use this to re-run a subset without re-triaging the whole backlog.

The model policy — "Opus analyzes, Fable reconciles"

Analysis runs at Opus 5; the reconcile runs at Fable. Unlike /autopilot-batch's fan-out scale — where cheaper builds under a gating review floor save real latency and limit headroom — a QA batch is low-volume (a handful of reports), so there is no cost case for going below Opus on analysis, and classification ("is this a bug or intended behavior?") is judgment work. There is no review floor behind the analysis the way /autopilot-batch has one; the human gate is the only safety net, so favor quality. The reconcile is the genuinely hard cross-report judgment — the whole reason to batch — and it is a single subagent, so running it at Fable buys the best judgment exactly where it matters most, for a negligible cost delta. Earn a Sonnet-analyze split later (rule of three) only if the volume grows or an obviously-bounded report pattern emerges.

Escape hatch (batch-level)

A single report that can't be confidently triaged must not halt the batch. If an analysis subagent can't reproduce the symptom in the code, or the report is genuinely ambiguous, it stops and reports — that report is surfaced at the consolidated gate as "needs your eyes," never silently dropped, and nothing is drafted for it. One uncertain report never stops the rest. Halt the whole batch only for a systemic problem: the cwd is the wrong repo, or there are no open qa reports to triage.

Your task

Announce the run first: how many qa reports are open, how many are being triaged vs. skipped as already in-flight (Step 1), and that you will fan out one background subagent per report.

Step 0 — Preconditions
  • Confirm the cwd is the target app repo (see "Where this runs"), on a clean default branch, then git pull.
  • Resolve the invoker once: gh api user --jq .login. Each report's analysis needs it to decide the verification @-mention (skip the mention when author == invoker), and the orchestrator needs it again when acting.
Step 1 — Assemble the batch (self-healing)
  • gh issue list --label qa --state open --json number,title,author,body. If scoped by arg, restrict to those numbers.

  • Skip reports already in-flight. A report that has already been triaged carries a tech issue back-referencing it (Triggered by QA report #<n>). Drop those — they are being handled, not pending. Use search only to narrow, then confirm the exact back-reference client-side — GitHub full-text search tokenizes #<n> loosely, so it neither guarantees the exact number nor an exact phrase, and matching on it alone would both miss links and skip the wrong reports:

    bash
    # Fetch every issue carrying the back-reference phrase, then filter by exact substring.
    gh issue list --state all --search 'Triggered by QA report in:body' \
      --json number,body \
      --jq '[.[] | select(.body | contains("Triggered by QA report #<n>")) | .number]'

    A non-empty result means report <n> is already linked — skip it. This mirrors /autopilot-triage's self-heal (which keys on a structured headRefName match for existing PRs), keyed here on an exact body substring instead. Report what was skipped and why.

  • If nothing remains: stop — the QA queue is clear.

Step 2 — Fan out the analysis

For each report, spawn a background subagent:

  • model: opus, run_in_background: true. No isolation: worktree — read-only investigation, shared tree is safe.

  • prompt: run /qa-triage <n> through its analysis and draft (steps 1–5) and STOP at its decision gate (step 6). Create, comment on, close, and edit nothing — you have no human to approve, and the skill's gate is exactly where you halt. Then return, as the final message, a structured triage record (not prose):

    text
    report:        #<n> — <title>
    author:        <login>   (mention: <@author | skip: == invoker | skip: bot>)
    bucket:        not-a-bug | trivial-cosmetic | one-issue | multiple
    root_cause:    <one-line root cause grounded in the code>
    files:         <the file(s)/surface the fix touches>   ← the clustering key
    drafts:        <for each proposed tech issue: title, full body, labels, closing plan>
    ambiguities:   <anything to raise at the gate — or "none">
    escape_hatch:  <"" | "STOPPED — <why>: couldn't confirm / genuinely ambiguous">

Spawn them together so they run in parallel. Since they create nothing, there is no per-report label lifecycle to manage and no worktree to reclaim.

Show full SKILL.md (670 more words)Show less
Step 3 — Barrier + reconcile

Wait for all analysis subagents (this is a genuine barrier — cross-report clustering needs every record). Then spawn one model: fable reconcile subagent, passing it all N structured records:

  • prompt: cluster reports that share a root cause (overlapping root_cause / files → one tech issue that closes all of them — see the cluster closing plan in Step 5), flag duplicate drafts to collapse, and flag conflicts (two reports asking for opposite behavior). Return the clusters as suggestions with a one-line rationale each — never auto-merge. A report that doesn't cluster stays standalone.

The reconcile proposes; the human disposes. Do not collapse drafts on the reconcile's say-so alone.

Step 4 — Consolidated gate — STOP

Present one board-level view — every report's classification, its drafted issue(s), and the reconcile's proposed clusters — grouped so the shared-root-cause suggestions are visible:

text
Cluster A — order.rb weight rounding (reconcile: high confidence)
  #503  one-issue   fix: round shipment weight up      @tester1
  #511  one-issue   [dup of #503 draft — collapse?]    @tester2

Ungrouped
  #488  not-a-bug   event_type unvalidated by design   @tester3
  #492  trivial     typo in uk.yml checkout label       → /resolve-issue
  #495  STOPPED     can't reproduce in code — needs your eyes

Approve / edit / decline / reclassify across the batch?

Show the full drafted body for each proposed issue (or write drafts to temp files and reference them — you need those files anyway for --body-file in Step 5). Then STOP and wait. The human may approve as-is, accept or split a cluster, edit a draft, reclassify a report, decline one (e.g. close as working-as-intended), or defer. Create, close, comment on, and edit nothing before a clear yes.

Step 5 — Act on approval

The orchestrator acts centrally (not the subagents), applying /qa-triage's closing-keyword hazard and each issue's closing plan in one place:

  • Create each approved tech issue as drafted: gh issue create --title … --body-file <tmp> --label <type>; remove the temp file after. The /qa-triage draft already carries its closing plan — a standalone Closes #<tech>, Closes #<qa> — please verify after deploy, @<author>, or, when /qa-triage split one report into several issues (the "multiple" bucket), that report's multi-PR plan where only the final issue's PR closes the report. Create those as drafted; don't rewrite them.
  • Clustered reports (N reports → 1 issue): the batch's own case — /qa-triage never sees a cluster, so the closing plan is the orchestrator's to write. Create one merged tech issue whose single PR closes the tech issue and every clustered report at once: Closes #<tech>, Closes #<qa1>, Closes #<qa2>, … — please verify after deploy, @<author1> @<author2> (each Closes keyword sits directly before its own #N; @-mention each report's author, skipping any that == invoker). This is the opposite mapping from /qa-triage's multi-PR rule (1 report → N issues) — do not conflate them.
  • Board: if the project uses a GitHub Projects board, add the new issue(s); otherwise skip.
  • Not-a-bug (approved): post the agreed explanatory comment and close the QA report, with the verification @-mention (skip if author == invoker).
  • Trivial-cosmetic (approved): do not implement — this skill produces planning artifacts, not fixes. Surface the recommended /resolve-issue <qa-N> command in the report; its closing PR must still carry the report's Closes #<qa> — please verify after deploy, @<author> line.
  • The QA reports for non-trivial work stay open — they close only when the implementing PR merges (per each closing plan).
Step 6 — Completion report + handoff

Post a batch summary:

text
## QA triage batch — N reports

| Report | Bucket | Action | Result |
| ------ | ------ | ------ | ------ |
| #503   | one-issue (cluster A) | created #560 | open — awaiting fix |
| #511   | one-issue (cluster A) | folded into #560 | open — awaiting fix |
| #488   | not-a-bug | closed w/ comment @tester3 | done |
| #492   | trivial   | → /resolve-issue 492 | recommended |
| #495   | —         | STOPPED — needs you | pending |

- Created: <list of tech issues>.  Closed: <not-a-bug reports>.  Stopped: <reports needing you>.
- Next: the created tech issues are ready for /autopilot-triage to vet into the autopilot queue,
  then /autopilot-batch to fan them out to PRs.

Important

  • Run from the target app repo, never dotfiles — you need the reports and the code together.
  • The subagents create nothing. Every analysis subagent stops at /qa-triage's own gate and returns a draft; all creation/closing happens once, centrally, only after the consolidated human gate. This is the load-bearing guardrail.
  • Cross-report reconciliation is the point. Speed is a bonus; seeing all N at once to cluster shared root causes is the reason to batch. The reconcile suggests clusters — the human confirms.
  • One consolidated gate, not N. The batch's whole ergonomic win is replacing N per-report STOPs with a single board-level decision.
  • One stop never halts the batch. A report that can't be confidently triaged is surfaced at the gate for you; the rest proceed.
  • Compose, don't re-implement. Subagents run the real /qa-triage; this skill only orchestrates the fan-out, the reconcile, the gate, and the central act-on-approval — so improvements to /qa-triage flow through untouched. It does not implement fixes (that stays /resolve-issue → PR, optionally via /autopilot-batch), and it is a sibling skill, not a flag on /autopilot-batch — do not extract a shared batch engine (still under rule-of-three).

© joshukraine, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in claude/.claude/skills/qa-triage-batch of joshukraine/dotfiles.

Open the folder on GitHubat commit b59ad5b

Compare with similar skills

QA Triage Batch next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

QA Triage Batch compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
QA Triage Batch this skilljoshukraine/dotfiles429—~3.2kAutomated safety check: PassMIT
Code Design Rationale Investigatorcursor/plugins11k9 repos~2.6kAutomated safety check: PassNone
OpenLogi macOS Permissions TriageAprilNEA/OpenLogi23k—~2.5kAutomated safety check: NotesApache-2.0
Bug Finder for daisyUIsaadeghi/daisyui43k—~2.3kAutomated safety check: PassMIT
Root Cause Debugginggarrytan/gstack136k—~1.4kAutomated safety check: PassMIT
Review PRapache/shardingsphere21k—~6.4kAutomated safety check: PassApache-2.0

Similar skills

  • Official

    Digs into why code is shaped the way it is by checking git history, pull requests and connected tools in parallel, then reporting a cited read on the tradeoffs.

    11k GitHub starsUsed in 9 repos~2.6k tokens
    DevelopmentAuto-check passed
  • Decides whether an OpenLogi device problem on macOS is a privacy-permission (TCC) problem, using agent log lines, and says which identity needs which grant.

    23k GitHub stars~2.5k tokensUpdated today
    DevelopmentAuto-check: notes
  • Bug Finder for daisyUI

    saadeghi/daisyui

    Investigates suspected bugs in the daisyUI monorepo through read-only analysis, then writes a decision-ready fix plan in tmp/bugs without changing any product code.

    43k GitHub stars~2.3k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Root Cause Debugging

    garrytan/gstack

    Investigates bugs, errors and stack traces in phases and requires a root-cause hypothesis to be confirmed before any fix is written.

    136k GitHub stars~1.4k tokensUpdated today
    DevelopmentAuto-check passed
  • Review PR

    apache/shardingsphere

    Review Apache ShardingSphere or user-authorized downstream pull requests and PR discussions from public or authorized repository evidence.

    21k GitHub stars~6.4k tokensUpdated today
    DevelopmentAuto-check passed
  • Graph-Based Bug Tracing

    tirth8205/code-review-graph

    Traces a bug through a code knowledge graph, following callers, callees and execution flow before opening source files, within a small token budget.

    32k GitHub starsUsed in 1 repo~287 tokens
    DevelopmentAuto-check passed

More from joshukraine/dotfiles

All 24 skills in this repo
  • Todoist CLI

    joshukraine/dotfiles

    Manage Todoist tasks, projects, labels, filters, sections, comments, reminders, and workspaces via the td CLI.

    429 GitHub starsUsed in 1 repo~6.9k tokens
    Auto-check passed
  • Autopilot Triage

    joshukraine/dotfiles

    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.

    429 GitHub stars~2.1k tokensUpdated 4 days ago
    Auto-check passed
  • Checkpoint

    joshukraine/dotfiles

    Quick 2-minute status update on current phase, completed work, blockers, and health check.

    429 GitHub stars~600 tokensUpdated 4 days ago
    Auto-check passed
  • Create PR

    joshukraine/dotfiles

    Create a pull request with auto-generated description, issue linking, ROADMAP updates, and PR-metadata validation.

    429 GitHub stars~1.3k tokensUpdated 4 days ago
    Auto-check passed
  • Debrief

    joshukraine/dotfiles

    Detailed technical walkthrough covering architecture, test coverage, product tour, and key design decisions.

    429 GitHub stars~2.5k tokensUpdated 4 days ago
    Auto-check passed
  • Drift Check

    joshukraine/dotfiles

    Pre-PR advisory check for deviations from the project spec. An agent skill from joshukraine/dotfiles.

    429 GitHub stars~1.2k tokensUpdated 4 days ago
    Auto-check passed

Categories

Questions about QA Triage Batch

What does QA Triage Batch do?

Fan out /qa-triage across a queue of qa-labeled reports in parallel, reconcile them across reports to cluster shared root causes, present one consolidated decision gate, and — on approval — create…. QA Triage Batch is an agent skill from joshukraine/dotfiles. Fan out /qa-triage across a queue of qa-labeled reports in parallel, reconcile them across reports to cluster shared root causes, present one consolidated decision gate, and — on approval — create the resulting tech issues.

When should I use QA Triage Batch?

QA Triage Batch fits situations like: tasks that involve Root cause analysis.

How do I install QA Triage Batch in Claude Code?

Run `npx skills add joshukraine/dotfiles --skill qa-triage-batch -a claude-code`. Or copy the skill folder (claude/.claude/skills/qa-triage-batch in joshukraine/dotfiles) into .claude/skills/qa-triage-batch in your project. Claude Code loads it when a task matches its description.

How do I install QA Triage Batch in Codex?

Run `npx skills add joshukraine/dotfiles --skill qa-triage-batch -a codex`. Or copy the skill folder (claude/.claude/skills/qa-triage-batch in joshukraine/dotfiles) into .agents/skills/qa-triage-batch in your project. Codex loads it when a task matches its description.

Can I use QA Triage Batch in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add joshukraine/dotfiles --skill qa-triage-batch -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/qa-triage-batch, .gemini/skills/qa-triage-batch, .github/skills/qa-triage-batch and .opencode/skills/qa-triage-batch in your project.

What does QA Triage Batch need to run?

Going by SKILL.md and its folder, QA Triage Batch needs the command-line tools its instructions call (gh and git).

Does QA Triage Batch access the network?

SKILL.md contains no URLs. Its commands use gh and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is QA Triage Batch safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does QA Triage Batch use?

QA Triage Batch is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does QA Triage Batch use?

About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to QA Triage Batch?

Skills that share tags, products or a category with QA Triage Batch: Code Design Rationale Investigator (cursor/plugins, 11k stars), OpenLogi macOS Permissions Triage (AprilNEA/OpenLogi, 23k stars), Bug Finder for daisyUI (saadeghi/daisyui, 43k stars) and Root Cause Debugging (garrytan/gstack, 136k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains QA Triage Batch?

joshukraine (a GitHub user) maintains it in joshukraine/dotfiles, which has 429 GitHub stars. The repository holds 24 skills in this directory. The repository was last updated on October 6, 2026.

Source: joshukraine/dotfiles on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.