name: qa description: "开展互动 QA 会话:用户通过对话报告 bug 或问题,Agent 创建 GitHub issue;后台探索代码库以掌握背景和领域语言。用户希望报告 bug、做 QA、通过对话建 issue 或提到 QA 会话时使用。"
历史对照:把口述问题变成可处理工单
这份历史技能让用户连续描述问题,Agent 少量澄清并建立面向行为的缺陷记录。
本课使用下方注明的历史提交原文,帮助理解旧文章和旧提示词。请勿据此认定当前版本仍能直接调用该名称。
还不清楚 Skill、Agent、安装和调用?先读 从零开始的6节入门课。
先把必要的概念讲清楚
这项历史技能把你在使用中发现的问题整理成可追踪工单。它与深入诊断不同:这里先让问题描述清楚、可复现、可接手。
下面是老师补充的入门说明;原作者的要求保留在中英对照正文中。所有例子均为帮助理解而构造的教学情境。
issue / ticket|问题或任务工单
跟踪一项需求、缺陷、调查或实施任务的记录,通常有标题、正文、状态和引用。issue 和 ticket 在这些文档里经常都指工单,具体含义由上下文决定。工单写着“已完成”只是状态声明,还需要相应证据支持。
acceptance criteria|验收条件
明确规定结果满足什么才算完成,应尽量可观察、可检验。例如“收藏后刷新页面仍可见,重复点击只保留一条”。“体验很好”“代码完善”没有明确边界,难以判断。验收条件关注结果,不是把实现步骤换个标题列出来。
domain glossary|业务领域术语表
规定项目的重要概念叫什么、指什么。domain 在这里是业务领域,不是互联网域名。课程是一组课时,课时是一份学习内容;混用会把“收藏课程”实现成“收藏某一课时”。统一语言不仅统一拼写,还统一概念边界。
regression|原来正常,修改后退化
已有能力在后续修改中变坏,可以是功能错误或性能变慢。回归测试把曾经的故障场景固定为检查,帮助以后发现同类问题。但测试只覆盖写明的输入和边界,单条回归测试不是绝对不会再出错的保证。
读原文,理解每一步为什么这样做
左右内容按小节对应;窄屏先中文、后英文。两种语言均完整展示,对应讲解紧接在小节之后。译文传达原文要求;老师讲解补充概念、原因、例子与适用边界。
name: qa description: Interactive QA session where user reports bugs or issues conversationally, and the agent files GitHub issues. Explores the codebase in the background for context and domain language. Use when user wants to report bugs, do QA, file issues conversationally, or mentions "QA session".
通过对话记录质量问题
开展交互式质量检查会话。用户描述遇到的问题,你适度澄清,并探索代码背景,然后创建能够长期理解、从用户角度描述、采用项目业务词汇的 GitHub issue。
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. 先听,再做少量澄清
让用户用自己的话描述。最多问 2—3 个简短问题,重点是预期与实际的区别、复现步骤,以及每次出现还是偶发。
不要过度访谈。信息已经足够记录,就继续下一步。
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.
轻量澄清要补足复现,不要把报告变成审讯
用户先用自己的话描述,AI 最多问少量关键问题:预期是什么、实际发生什么、怎样触发、是否每次发生。描述够清楚就记录,不应要求用户先诊断原因。
例子:“我在手机第 10 课读完中文,英文栏超出屏幕,无法横向查看。”这提供了设备、位置和现象。可以再问具体宽度或截图,而不必一开始索取全部服务器日志。
复现步骤与猜测原因分开。用户认为是缓存,并不意味着工单标题就应断言缓存错误。
质量反馈先说清看到了什么,不必一开始就猜代码原因
你报告“点收藏后刷新又没了”,可以补充是否登录、具体操作顺序、是否每次发生。工单就能写成“登录后收藏某课,刷新,按钮恢复未收藏;预期仍保留”。
如果直接写“saveFavorite 有问题”,它依赖内部名称,也可能猜错原因。代码重构后这句更难理解。用户行为和可操作复现步骤则更耐久。
QA 在这里主要把反馈形成可追踪任务;diagnosing-bugs 才进一步建立验证并查明原因。创建工单不等于已复现,更不等于已修好。
原文直接创建 GitHub issue 是该技能的流程。实际写入外部平台仍需要用户对当前任务的授权,以及工具和账号权限;只有读到这份教材不会触发发布。
2. 在后台了解相关代码
交流同时启动 Explore 类型后台子 Agent。目标不是找修复方案,而是了解该区域业务语言、功能原本应做什么,以及用户能够观察的行为范围。存在 UBIQUITOUS_LANGUAGE.md 时读取它。
调查帮助写清工单,但工单本身不要引用具体文件、行号或内部实现细节。
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. 判断写一张还是拆多张
多个独立区域、不同人可以并行处理的事项,或者明显不同的失败模式,可以拆分。例如表单校验不对、成功消息缺失、跳转失败,可能是三个问题。
如果只是一个位置的一种行为错误,或症状都来自同一个根本行为,保留为一张。
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. 创建 GitHub 工单
使用 gh issue create。按原文流程,不另请用户先审稿,创建后分享网址。
内容应在大规模重构后仍能读懂,因此从用户行为描述。
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.
记录成功只是让问题进入管理流程
正文包括实际行为、预期、复现、补充背景。拆分时按依赖顺序创建,以引用真实编号,并汇报 URL 和关系。原文的直接创建要求依赖用户已授权该 QA 流程,不能把阅读文章当成授权外部写入。
例如写明“横向滚动仍看不到完整表格”,比“优化响应式”更具体。没有复现步骤时继续问清,而不是生成一个想象的操作路径。
每个问题及时记录,避免等会话末尾凭记忆补齐。工单已登记、已修复、已验证是三个不同状态。
单个问题的模板
## 实际发生了什么
[用清楚语言描述用户看到的行为]
## 原本期待什么
[预期行为]
## 怎样复现
1. [具体可执行步骤]
2. [使用业务词汇,不用内部模块名]
3. [相关输入、参数或配置]
## 补充背景
[帮助理解的观察,例如只在 Docker 层出现,而文件系统层不出现;不引用代码路径]
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]
多个问题的模板
按依赖顺序先创建前置工单,后续才有真实编号可以引用。
## 父工单
#<编号>,或“在 QA 会话中报告”。
## 具体错误
[只描述当前这一项行为]
## 预期结果
[这一项应该怎样表现]
## 复现步骤
1. [针对当前问题的步骤]
## 前置依赖
- #<必须先解决的编号>
没有则写“无,可以立即开始”。
## 补充背景
[只保留与本项有关的观察]
拆分时宁可多张小工单,也不要少数过大工单;每张应独立修复和验证。诚实记录依赖:B 确实要等 A 才能测试,就写明;互不依赖则都可以立即开始。目标是让多人或 Agent 能同时领取不同任务。
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
所有工单都遵循的规则
不写容易过时的路径或行号;使用项目业务术语;描述行为而不是内部代码。例如“同步服务未应用补丁”,而不是“某函数第 42 行抛错”。
复现步骤必须提供,无法确定就询问用户。正文保持便于开发者快速读懂,作者建议约 30 秒可读完。
创建后列出所有网址和依赖概括,询问“继续下一个问题,还是本次结束?”
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. 继续会话
持续处理直到用户表示完成。每个问题独立处理,不攒一大批再统一创建。
5. Continue the session
Keep going until the user says they're done. Each issue is independent — don't batch them.
先作答,再看参考思路
用自己的话说明:它解决什么问题,完成后会留下什么?
请各用一句话回答。若它只做规划或解释,不要把“已开发”“已部署”写成产物。
QA 把问题登记好了,下一步一定是 implement 吗?
我已思考,查看参考思路
不一定。还可能需要 triage 确认范围、补复现信息或诊断原因。登记完整性与可直接实施是不同状态。
原文中哪条要求在你的环境下可能不成立?
说出具体一句及其前提,例如工具不可用、资料缺失、已有项目约定冲突,或它只是作者偏好。把你的答案带回课堂,我们据此继续讨论。
把方法放进一个具体情境
教学案例:你说“下一课按钮没反应,手机目录也挡住正文”。两种可以独立验证的行为可以分单;不能直接推断它们有同一根因。
边界与容易误读的地方
标题叫 QA 不代表覆盖全部质量保证。它不验证根因、不运行修复回归,也不应把每句抱怨拆成大量重复任务。
讨论后再实践:先判断上述情境是否适用,再选择真实任务。现在无需安装、运行命令或修改现有项目。