qa
- 信任分
- 88/100
- 兼容 Agent
- 1
- 领域
- AI 智能
- 兼容 Agent
- Claude Code
- 信任分
- 88 / 100 · 社区维护
- 作者 / 版本 / 许可
- @mattpocock · 未声明 license
- 安装命令数
- 1 条
需要注意: 未限定 allowed-tools,默认拥有全部工具权限。
想读作者英文原文? ↓ 滚到正文区切换 · 在 GitHub 查看 ↗
设计思路
qa-mattpocock 是 mattpocock 的「QA → 提 issue」工作流——不是自动化测试,而是把用户 / tester 报告的每个问题转成结构化、可独立修的 GitHub issue。哲学:多薄 issue 优于少厚 issue——每条 issue 都能独立修、独立验,多个人 / 多个 agent 才能并行。
Issue 模板(按作者原文)
单条 issue:
## What happened
[实际行为,平实语言]
## What I expected
[预期行为]
## Steps to reproduce
1. [开发者能照做的具体步骤]
2. [用 codebase 的领域词汇,不是内部模块名]
3. [包含相关输入 / flag / config]
## Additional context
[来自用户或代码探查的额外观察——例如「只在 Docker layer 出,filesystem layer 不出」——用领域语言但**不引用文件**]
子 issue(属于一个父 issue 的拆分):
## Parent issue
#<parent-number>(如有 tracking issue)或 "Reported during QA session"
## What's wrong
[针对这个 slice 的问题,不是整份]
## What I expected
[这个 slice 的预期]
## Steps to reproduce
1. [仅这个 issue 的步骤]
## Blocked by
- #<issue-number>(如果非得 issue A 修完才能验本条)
或 "None — can start immediately"
## Additional context
[这个 slice 相关的额外观察]
拆分纪律
- 多薄 issue 优于少厚 issue — 每条独立可修可验
- 诚实标 blocking 关系 — A 真挡 B 才写「Blocked by #A」;独立的两条都标「None — can start immediately」
- 按依赖序创建 — 先建被依赖的,引用真实 issue 号
- 最大化并行 — 多人 / 多 agent 抓不同 issue 同时干
Issue body 通用规则
- 不写文件路径 / 行号 — 这些会过时
- 用项目领域语言(看
UBIQUITOUS_LANGUAGE.md) - 描述行为不描述代码 —「sync service fails to apply the patch」不是「
applyPatch()throws on line 42」 - 重现步骤强制 — 推不出来就问用户
- 简洁 — 30 秒读完
收尾
建完打印所有 issue URL(含 blocking 关系汇总),问:「下一条,还是结束?」每条 issue 独立 — 绝不批处理。
适合谁
- 在用户访谈 / QA 会议里实时把问题转 issue 的产品 / 开发
- 想把含糊报告变成可分配开干的 ticket 的项目
- 多人 / 多 agent 协作希望并行修 bug 的团队
何时不该用
- 项目不在 GitHub / Linear / 兼容 issue 系统——本模板假设有 issue tracker
- 单 bug 简单到立刻自己修就完——开 issue 反而成开销
配套
qa(gstack 的自动化 QA 主门)、qa-only(仅 QA 不修)、diagnose(拿到 issue 后调根因)、grill-with-docs(领域语言锚定)。
QA Session
Run an interactive QA session. The user describes problems they're encountering. You clarify, explore the codebase for context, and file GitHub issues that are durable, user-focused, and use the project's domain language.
For each issue the user raises
1. Listen and lightly clarify
Let the user describe the problem in their own words. Ask at most 2-3 short clarifying questions focused on:
- What they expected vs what actually happened
- Steps to reproduce (if not obvious)
- Whether it's consistent or intermittent
Do NOT over-interview. If the description is clear enough to file, move on.
2. Explore the codebase in the background
While talking to the user, kick off an Agent (subagent_type=Explore) in the background to understand the relevant area. The goal is NOT to find a fix — it's to:
- Learn the domain language used in that area (check UBIQUITOUS_LANGUAGE.md)
- Understand what the feature is supposed to do
- Identify the user-facing behavior boundary
This context helps you write a better issue — but the issue itself should NOT reference specific files, line numbers, or internal implementation details.
3. Assess scope: single issue or breakdown?
Before filing, decide whether this is a single issue or needs to be broken down into multiple issues.
Break down when:
- The fix spans multiple independent areas (e.g. "the form validation is wrong AND the success message is missing AND the redirect is broken")
- There are clearly separable concerns that different people could work on in parallel
- The user describes something that has multiple distinct failure modes or symptoms
Keep as a single issue when:
- It's one behavior that's wrong in one place
- The symptoms are all caused by the same root behavior
4. File the GitHub issue(s)
Create issues with gh issue create. Do NOT ask the user to review first — just file and share URLs.
Issues must be durable — they should still make sense after major refactors. Write from the user's perspective.
For a single issue
Use this template:
## What happened
[Describe the actual behavior the user experienced, in plain language]
## What I expected
[Describe the expected behavior]
## Steps to reproduce
1. [Concrete, numbered steps a developer can follow]
2. [Use domain terms from the codebase, not internal module names]
3. [Include relevant inputs, flags, or configuration]
## Additional context
[Any extra observations from the user or from codebase exploration that help frame the issue — e.g. "this only happens when using the Docker layer, not the filesystem layer" — use domain language but don't cite files]
For a breakdown (multiple issues)
Create issues in dependency order (blockers first) so you can reference real issue numbers.
Use this template for each sub-issue:
## Parent issue
#<parent-issue-number> (if you created a tracking issue) or "Reported during QA session"
## What's wrong
[Describe this specific behavior problem — just this slice, not the whole report]
## What I expected
[Expected behavior for this specific slice]
## Steps to reproduce
1. [Steps specific to THIS issue]
## Blocked by
- #<issue-number> (if this issue can't be fixed until another is resolved)
Or "None — can start immediately" if no blockers.
## Additional context
[Any extra observations relevant to this slice]
When creating a breakdown:
- Prefer many thin issues over few thick ones — each should be independently fixable and verifiable
- Mark blocking relationships honestly — if issue B genuinely can't be tested until issue A is fixed, say so. If they're independent, mark both as "None — can start immediately"
- Create issues in dependency order so you can reference real issue numbers in "Blocked by"
- Maximize parallelism — the goal is that multiple people (or agents) can grab different issues simultaneously
Rules for all issue bodies
- No file paths or line numbers — these go stale
- Use the project's domain language (check UBIQUITOUS_LANGUAGE.md if it exists)
- Describe behaviors, not code — "the sync service fails to apply the patch" not "applyPatch() throws on line 42"
- Reproduction steps are mandatory — if you can't determine them, ask the user
- Keep it concise — a developer should be able to read the issue in 30 seconds
After filing, print all issue URLs (with blocking relationships summarized) and ask: "Next issue, or are we done?"
5. Continue the session
Keep going until the user says they're done. Each issue is independent — don't batch them.