Agent skill

QA Triage

by joshukraine in joshukraine/dotfiles

Triage a QA-labeled report — investigate it against the code, classify it, and draft the technical issue(s) it warrants, stopping for approval before creating anything.

MITAuto-check passed

Install QA Triage

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

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

GitHub CLI
$ gh skill install joshukraine/dotfiles qa-triage --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 .claude/skills/qa-triage && 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
GitHub stars
429
Token cost
~2.9k tokens
SKILL.md length
1,557 words
Files
1
Skills in repo
24
Repo updated
First seen
Licence
MIT

At a glance

Triage a QA-labeled report — investigate it against the code, classify it, and draft the technical issue(s) it warrants, stopping for approval before creating anything.

  • Works in 8 steps: Fetch the report → Orient on project conventions → Investigate against the codebase → …
  • SKILL.md covers The core guardrail, Your task, @-mention logic… and Conventions to encode (the…, plus 2 more sections
  • Calls gh

What it does

QA Triage is an agent skill from joshukraine/dotfiles. Triage a QA-labeled report — investigate it against the code, classify it, and draft the technical issue(s) it warrants, stopping for approval before creating anything.

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

The repository describes itself as: :roundpushpin: My dotfiles for macOS using Neovim, Zsh, and Ghostty + Tmux. The licence is MIT.

Example prompts

  • “/qa-triage”

Workflow steps

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

  1. Fetch the report
  2. Orient on project conventions
  3. Investigate against the codebase
  4. Classify
  5. Draft the proposal
  6. Decision gate — STOP
  7. On approval, act
  8. Hand off

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

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

  • Network

    No URLs in SKILL.md. Its commands use gh, 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 loads about 2.9k tokens when it runs. Until then it costs about 45 tokens; SKILL.md has 1,557 words of instructions outside code blocks.

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

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,557 words, ~2,869 tokens.

Download SKILL.mdSave it as .claude/skills/qa-triage/SKILL.md (or your agent's skills folder).
name
qa-triage
description
Triage a QA-labeled report — investigate it against the code, classify it, and draft the technical issue(s) it warrants, stopping for approval before creating anything.
argument-hint
[report# …]

QA Triage

Turn a QA report into a triaged decision and, where warranted, one or more well-formed technical issues — without resolving the report off the bat or writing any app code.

QA reports (filed by a tester, usually carrying a qa label) are the tester's view of a problem. They describe user-visible symptoms; the engineering fix is often differently scoped — one report may need several tech issues, or several reports may share one root cause. This skill does the standard review-and-extrapolate ritual: read the report, confirm it against the codebase, decide what (if anything) to build, and draft the issue(s) — then stop for the human to approve before anything is created.

Where it sits in the workflow. This is the first step for a qa-labeled issue. Its output feeds the normal pipeline: an approved tech issue goes to /resolve-issue → /create-pr → /walkthrough + /code-review → merge. This skill never implements; it only triages and drafts. When several qa reports accumulate, /qa-triage-batch fans this skill out across the whole queue and reconciles shared root causes across reports behind one consolidated gate — use it for a backlog; use this skill directly for a single report.

Applicability. Needs a GitHub repo (gh). Built around a QA-report labeling convention but otherwise project-agnostic — no project names, tester identities, or paths are hardcoded. It reads the project's CLAUDE.md for local conventions (board, workflow, bilingual i18n, etc.) and embeds the rest itself.

Not the same as:

  • /resolve-issue — it implements an approved issue. This one creates the issue for it to implement. Hand off; don't duplicate.
  • /qa-handoff, /walkthrough — those help a tester exercise the app and file reports. This one processes a report after it's filed.

The core guardrail

A QA report is an input, not a directive. It is taken seriously, but it is not gospel: a tester may misread intended behavior, or suggest a change that would be counterproductive. The product decision — whether and how to act, including on items framed as "fixes" — belongs to the human, worked through a separate tech issue. So this skill's job ends at a decision gate: it analyzes and proposes; the human decides. The only thing it ever routes straight to resolution — instead of into a drafted tech issue — is an explicit, approved trivial-cosmetic fix, and even that is handed to /resolve-issue; this skill never writes app code itself.

Your task

When passed more than one issue number, triage each in turn, presenting a full analysis and decision gate per report before moving to the next.

1. Fetch the report
  • gh issue view <N> --json number,title,body,labels,author,comments,url — capture the symptom, steps, expected vs actual, locale, screenshots, and the author (needed later for the verification @-mention).
  • Note whether it carries the qa label. If it clearly isn't a QA report, say so and confirm the user still wants to triage it.
  • If the body references a Honeybadger fault, note it — the eventual fix should mark that fault Resolved (re-arms notifications).
2. Orient on project conventions
  • Read the project's CLAUDE.md (and any QA-workflow notes it points to) for: whether the project uses a separate-tech-issue workflow, a project board, type-label taxonomy, bilingual/i18n requirements, and viewport/mobile rules. Adapt to what you find; default to the separate-tech-issue pattern for non-trivial work.
  • Resolve the invoker once: gh api user --jq .login. You'll compare it to the report author for the @-mention.
3. Investigate against the codebase
  • Search the code for the surface the report describes and confirm the symptom is real. Reproduce the logic path; find the root cause; note the file(s) involved.
  • Distinguish what the tester saw from what the code actually does — this is where "not-a-bug" and "wrong-assumption" cases surface. State your evidence (e.g. "no validates :event_type exists on the model; the field is an unbacked string column").
  • Weigh evidence of design intent before calling something a bug. Guards (if x.present?), defaults, the absence or presence of a validation, and existing tests reveal whether the current behavior was chosen. Code that consistently tolerates the reported state was most likely written to allow it — a strong signal the report is a feature ask or working-as-intended, not a regression.
  • For UI/text reports, find the exact source (e.g. the i18n key) and check every affected locale, not just the one in the report.
4. Classify

Sort the report into exactly one bucket and recommend the matching action:

BucketWhat it looks likeRecommended action
Not a bug / intendedThe reported behavior is correct, or the suggestion would be counterproductivePropose closing the QA report with an explanatory comment (@-mention the author so they understand the reasoning and can push back). No tech issue.
Trivial cosmeticTypo, label wording, a one-line i18n change with an obvious, low-risk fixResolve the QA report directly — recommend handing it straight to /resolve-issue <qa-N>. No separate tech issue.
One tech issueA real defect or feature with a single, coherent fixDraft one tech issue (template below).
Multiple / clusterThe report spans several code areas, or several reports share one root causeDraft each tech issue; apply the multi-PR closing rule below.

When unsure between buckets, surface the ambiguity at the gate rather than guessing — especially the "is this even intended behavior?" question, which is the human's to answer.

5. Draft the proposal

For every tech issue you'd create, draft it in full (don't create yet) using the Tech issue template below:

  • Title: Conventional Commits prefix matching the work (feat:/fix:/chore:/docs:). This doubles as the type label so /resolve-issue can infer the branch prefix.
  • Acceptance criteria: a - [ ] checklist /resolve-issue can check off. Include "mark the Honeybadger fault Resolved after deploy" when applicable.
  • Back-link: a Triggered by QA report #<qa> line. ("Triggered by" is deliberately a non-keyword verb — it creates a reference, never an auto-close.)
  • Closing plan: how the eventual PR should close things (see @-mention logic and multi-PR rule below).
  • Labels: the type label, plus any the project's taxonomy calls for. Do not add the qa label to tech issues — that label belongs to reports.
Show full SKILL.md (569 more words)Show less
6. Decision gate — STOP

Present, per report: what you found in the code, the classification with reasoning, and the full draft of each proposed issue (title, body, labels) plus the proposed @-mention. Then STOP and ask for approval. The human may approve as-is, edit, reclassify, decline (e.g. close as working-as-intended), or defer. Do not create, comment, edit, or close anything before you get a clear yes.

7. On approval, act
  • Create each approved tech issue: gh issue create --title … --body-file <tmp> --label <type>. Use a temp file for the body to avoid shell-quoting pitfalls; remove it after.
  • Board: if the project uses a GitHub Projects board (per CLAUDE.md or gh project list), add the new issue(s); otherwise skip.
  • Trivial-cosmetic approval: no tech issue — hand off to /resolve-issue <qa-N> directly. Its closing PR resolves the QA report, so it must still carry the verification @-mention; record this closing line for it: Closes #<qa> — please verify after deploy, @<author> (the resolver emits a bare Closes #N by default).
  • Not-a-bug approval: post the agreed explanatory comment and close the QA report (with the @-mention).
  • The QA report itself stays open for non-trivial work — it closes only when the implementing PR merges (per the closing plan).
8. Hand off

Report what was created and recommend the next command: /resolve-issue <tech-N>. Do not start implementing.

@-mention logic (project-agnostic)

The QA-report @-mention is a verification ping — it tells whoever should confirm the fix after deploy. That person is, by definition, the report's author.

  • Default: propose @<report-author> (from step 1) in the closing plan.
  • Skip when author == invoker (step 2) — you don't ping yourself. Say so rather than dropping it silently.
  • Always confirmable at the decision gate: accept, swap, add others, or clear. There is no fixed-reviewer config — the author default plus the gate covers the cases without hardcoding anyone.
  • Browser-only / non-GitHub testers: the issue's author is whoever actually filed it; mention that account (or skip if it's you), and note that an out-of-band heads-up to the real tester is the human's call. The skill can't notify someone who isn't on GitHub.
  • If the author looks like a bot, propose no mention.

Conventions to encode (the error-prone ones)

  • Closing-keyword hazard. GitHub auto-closes an issue on merge when a closing keyword (close/closes/closed, fix/fixes/fixed, resolve/resolves/resolved) appears immediately before any #N anywhere in the PR body — not just on the Closes: line. When a PR should reference but not close an issue, never put a keyword right before its #N: drop the # ("QA report 503") or use a non-keyword verb ("addresses", "wraps up"). This is the trap that prematurely closes QA reports.
  • Dual-close + verification @-mention, on the single PR that closes the QA report: Closes #<tech>, Closes #<qa> — please verify after deploy, @<author>
  • Multi-PR rule (one report → multiple tech issues): only the final PR closes the QA report. Earlier tech issues' closing plans say close this tech issue only (Closes #<tech>) and must carry no auto-closing reference to the QA report. The last tech issue's closing plan carries the full dual-close + @-mention line.

Tech issue template

markdown
<One-paragraph problem statement grounded in the triage: the real defect/need and
its root cause in the code — not a restatement of the tester's symptom.>

Triggered by QA report #<qa>.

## Acceptance criteria

- [ ] <observable, testable outcome>
- [ ] <edge case / affected locale / regression guard>
- [ ] Mark Honeybadger fault <id> Resolved after deploy   ← only if the report cites one

## Closing plan

When the PR for this issue lands, close with:
`Closes #<this>, Closes #<qa> — please verify after deploy, @<author>`

<For a multi-issue report, replace the line above on every issue EXCEPT the final
one with: "Closes #<this> only — do NOT reference the QA report with a closing
keyword (see closing-keyword hazard)." The final issue carries the dual-close line.>

Tone

  • You are triaging for a technical lead who wants the why, not just the what. Show your evidence from the code; make the classification defensible.
  • Be the skeptic the report needs: confirm the symptom, but don't assume the tester's diagnosis or proposed fix is correct.
  • When you spot adjacent problems while investigating, flag them as notes — don't silently fold them into scope.

© 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 of joshukraine/dotfiles.

Open the folder on GitHubat commit b59ad5b

Compare with similar skills

QA Triage 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 compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
QA Triage this skilljoshukraine/dotfiles429—~2.9kAutomated safety check: PassMIT
.NET MAUI Issue Label Triagedotnet/maui23k—~9.8kAutomated safety check: PassMIT
Triaging Issuespytorch/pytorch104k—~4.2kAutomated safety check: PassCustom licence
Triagepnpm/pnpm37k—~2.9kAutomated safety check: PassMIT
Distributed Triagepytorch/pytorch104k—~2.8kAutomated safety check: PassCustom licence
Verdaccio Issue Triageverdaccio/verdaccio18k—~2.4kAutomated safety check: PassMIT

Similar skills

  • Official

    Applies the full manual-label policy of the dotnet/maui issue triage command, judging type, area, platform, status, regression and priority against the evidence in each issue.

    23k GitHub stars~9.8k tokensUpdated yesterday
    DevelopmentAuto-check passed
  • Triaging Issues

    pytorch/pytorch

    Triages GitHub issues by routing to oncall teams, applying labels, and closing questions.

    104k GitHub stars~4.2k tokensUpdated today
    AI & LLM EngineeringAuto-check passed
  • Triage

    pnpm/pnpm

    Triage an incoming GitHub issue against the pnpm codebase and related open issues, then apply exactly one implementation-readiness label using pnpm's state: taxonomy.

    37k GitHub stars~2.9k tokensUpdated today
    DevelopmentAuto-check passed
  • Distributed Triage

    pytorch/pytorch

    Sub-triages issues in the oncall:distributed queue by assigning distributed module labels, routing to sub-oncalls, and marking triaged.

    104k GitHub stars~2.8k tokensUpdated today
    DevOps & CloudAuto-check passed
  • Verdaccio Issue Triage

    verdaccio/verdaccio

    Triages an incoming verdaccio/verdaccio issue against the code, the affected release line and related issues, and picks labels from the repository's existing taxonomy.

    18k GitHub stars~2.4k tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Issue Triage

    paperclipai/paperclip

    Triage Paperclip inbox issues that are stale, blocked, in-review, or assigned-but-not-progressing, and decide a single next action per issue (resume, reassign, unblock, escalate, or close).

    100k GitHub stars~1k tokensUpdated today
    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

Questions about QA Triage

What does QA Triage do?

Triage a QA-labeled report — investigate it against the code, classify it, and draft the technical issue(s) it warrants, stopping for approval before creating anything. QA Triage is an agent skill from joshukraine/dotfiles. Triage a QA-labeled report — investigate it against the code, classify it, and draft the technical issue(s) it warrants, stopping for approval before creating anything.

How do I install QA Triage in Claude Code?

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

How do I install QA Triage in Codex?

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

Can I use QA Triage 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 -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, .gemini/skills/qa-triage, .github/skills/qa-triage and .opencode/skills/qa-triage in your project.

What does QA Triage need to run?

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

Does QA Triage access the network?

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

Is QA Triage 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 use?

QA Triage 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 use?

About 2.9k tokens (SKILL.md is roughly 11k 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?

Skills that share tags, products or a category with QA Triage: .NET MAUI Issue Label Triage (dotnet/maui, 23k stars), Triaging Issues (pytorch/pytorch, 104k stars), Triage (pnpm/pnpm, 37k stars) and Distributed Triage (pytorch/pytorch, 104k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains QA Triage?

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.