质量与测试
五个证明工作正确的技能:simplify、浏览器测试、iOS 模拟器、dogfood QA、线上 UX polish。
ce-simplify-code
目的:简化代码以提升复用、质量、效率,并剪除不带来价值的测试与注释 — 行为保持不变。5 个审查者并行。
5 步流程
- 范围:用户指定 > 与 base 的 git diff > 指定文件;用户指定的范围可以是整个仓库、一个区域或一个路径。跳过 若无实质代码(仅文档/生成/外部依赖/依赖项)。
- 5 个审查者并行:
code-reuse-reviewer、code-quality-reviewer、efficiency-reviewer、comment-reviewer、test-value-reviewer。人格 prompt 放在references/personas/;逐字 传入,不要改写。 - 直接应用有价值的发现;低价值发现记为 skipped,不再询问。只 编辑已解决的范围 + import/export 行。
- 验证行为保持:typecheck、lint、定向测试、若无法衡量范围则跑全量套件。修复或回退 由简化引发的失败。
- 总结 按 复用 / 质量 / 效率 / 注释 / 测试价值 分别列出已应用项;不要用“净减少行数”作为成功指标。
调用令牌
mode:pipeline 与每个 proof-test:<path> 都在把其余输入读成范围之前剥掉。proof-test 路径是第 3 步的上下文、永远不是范围——它点名"这个测试证明了本次改动",简化要绕开它;调用方可以给多个。
硬规则
- 行为保持优先于行数更少。不要为压行而压行。
- 保留:信任边界校验、数据丢失保护、安全检查、a11y 可达性。跳过 任何会削弱或移除这些的发现。
- 尊重调用方传入的结构性约束:以 structure-pin 约束传入的计划路径是上下文而非范围。保留
session-settled:KTD。 - 接口删除:仅当已解决范围之外不存在外部 / 持久 / 公开 / 外部 / 依赖分支 / 仓库内调用者时。
- 模型:均衡中档(Sonnet 类);除非宿主暴露覆盖,否则继承父级。
- 权限模式:分派时不带
mode— 沿用用户配置的权限。
References(5 个人格 + 2 份流程参考)
references/personas/code-reuse-reviewer.md(7)references/personas/code-quality-reviewer.md(17)references/personas/efficiency-reviewer.md(11)references/personas/comment-reviewer.md— 判断注释是否带来价值references/personas/test-value-reviewer.md— 判断测试是否带来价值references/reviewer-dispatch.md— 评审者派发约定references/standalone-report.md— 独立调用时的报告形态
ce-test-browser
目的:对当前 diff/PR 影响到的页面跑浏览器测试。优先用宿主原生浏览器;用 agent-browser 兜底;绝不引入第三种浏览器栈。
驱动策略(3 层,只选一种)
- 宿主原生集成浏览器 — Claude Code 的 Chrome 集成、Cursor 的集成等。遵循宿主自身指令。
agent-browserCLI 兜底 —references/agent-browser-driver.md。- 绝不 独立的 Play / Puppeteer / 第三方浏览器 MCP。
模式
| 模式 | 行为 |
|---|---|
| 手动(默认) | 由用户控制 dev server。在兜底路径下询问 headed/headless。 |
流水线(mode:pipeline) | 无头,永不在 human-verify 处暂停。记录 + 带原因 skip。在 server-start 块内执行 scripts/resolve-port.sh --free。 |
端口解析
scripts/resolve-port.sh 顺序:参数 --port → package.json dev 脚本中的 --port → .env* 中的 PORT= → 3000。每次 shell 调用独立执行。
路由映射
- PR 号 →
gh pr view [N] --json files -q '.files[].path' - current / 空 →
git diff --name-only main...HEAD - 分支名 →
git diff --name-only main...[branch]
流水线模式下的覆盖规则
- 不出现 headed/headless 询问。
- 不在 human-verify(OAuth、邮件、支付、SMS)处暂停 — 记 Skip 并附原因。
- 不出现“现在修还是跳过”的询问 — 记录 + 继续。
- resolve-port 使用
--port --free。
结果格式
每个被影响的路由一行:Pass / Fail / Skip(附原因)。末尾汇总。漏掉一条路由 = 失败。
References(3 文件,219 行)
references/agent-browser-driver.md(47)references/pipeline-orchestration.md(43)references/route-and-report.md(129)
ce-test-xcode
目的:通过 XcodeBuildMCP 在模拟器上测试 iOS 应用。disable-model-invocation: true — 仅手动调用。
2 个阶段
- 准备与启动(
references/setup-and-build.md):XcodeBuildMCP 可用性 → 项目 + scheme → 模拟器选择 → 构建 → 安装 → 启动 → 日志捕获。 - 演练与报告(
references/test-and-report.md):每屏证据 → 仅人工流程 → SwiftUI 内联链接限制 → 失败处理 → 清理 → 固定汇总。
结果枚举
按表面:PASS / FAIL / SKIP。整体:只要有 FAIL 即 FAIL;无 FAIL 但存在范围性跳过时为 PARTIAL;其余为 PASS。
边界
若需要修复,以收窄的权限调用 ce-debug — 收窄到不进行 commit/push/PR。
ce-dogfood
目的:无人值守的浏览器 QA。Diff 范围(非全应用)。驱动真实浏览器,用回归测试修小问题,按产品人格评判体验,写出一份耐久报告。
disable-model-invocation: true — 手动调用。
7 个阶段(顺序不可变)
- Scope
- Analyze the diff
- Map the flows
- Derive the matrix
- Serve
- Execute
- Fix loop → report
硬规则
- 浏览器驱动:整轮只驱动一个浏览器,优先用宿主内置浏览器,它覆盖得了矩阵就不用
agent-browserCLI;真需要 CLI 而它没装时才停下请用户装。绝不引入第三种浏览器栈:不要独立 Playwright / Puppeteer、不要另配的扩展或 MCP(如mcp__claude-in-chrome__*)、不要npx agent-browser。 - Diff 范围:测试本分支相对主干引入的内容。分支名或空目标绝不去 dogfood 主干(没有 diff);PR 目标总有 base,即使它的 head 分支叫
main也一定可 diff。 - 数字目标 = PR 号,隔离与 checkout 一路都保持 PR 身份,绝不要塌缩成它的 head ref(其名可能是
main)。 - 仅自动修复 小 / 理解充分 / 低风险 的问题。更大 = 上报到报告的 Decisions for a human。
- 测试套件必须能跑通。UI 全绿 + 套件红 = 未就绪。去追套件变绿不是本技能的事。
- Compound Packs 提供 personas(描述用户)和 criteria(描述产品行为)。与 pack 规则冲突 = fix-loop 失败。有意为之的冲突 = 交由人决策。
- 永不切换主 checkout。非平凡目标请用
ce-worktree(不必询问,它自己报结论)。 - 截图等临时产物进 OS 临时目录,不进仓库根;只有要嵌进报告时才拷一份进来。
报告
<root>/dogfood-reports/YYYY-MM-DD-<branch-slug>-dogfood.md,基于 references/dogfood-report-template.md。矩阵一成立就建(全 Pending),每个场景判完与每次修复提交后更新——磁盘上的报告是后续运行或同事续接的依据,中断的运行必须留下模板形状的检查点,而不是一张裸矩阵。
要不要叫人
只有两种情况停下来问:跑不下去而缺口只在用户手里(例如应用启动需要的密钥);下一步会改动用户自己的工作(例如切他的 checkout)。其余需要人做的事一律记录下来,收尾时一次性交回。两种记录态:
- Blocked (needs human verify) — 本分支改动了某个外部服务环节且没有本地替身可覆盖。
- Blocked (human decision) — 修复太大,不能自主做出。
每种都只结束该场景、不结束运行:矩阵继续跑,绝不在本轮或续接时静默重排一个已 blocked 的场景。
References(4 文件)
references/phases.md(167)— 全部 7 个阶段,含浏览器查找与选择references/test-matrix-taxonomy.md(62)references/dogfood-report-template.md(97)references/agent-browser-driver.md— 用agent-browserCLI 时的驱动说明
ce-polish
目的:通过实时用户反馈打磨 UX。disable-model-invocation: true — 仅手动。
循环
用户在浏览器里看线上功能 → 用户说改哪里 → 仅在必要时检视 → 编辑 → 热重载 → 再看。用户主导;没有自主清单。
Live 模式
任何 server 启动之前问一次:live 还是 traditional。live 模式需要环境里有 OpenAI key——页面里运行一个语音访谈者,听得见用户说话、被告知用户的点击与圈画、在用户指点或要求时查看屏幕;会话流式送到本技能在本地运行的端点。riffrec 尚未接入应用时,会在当前分支上留一个 setup commit(新增 riffrec 依赖与 provider 挂载),会话结束后保留;这一切在提问时一并披露。live 会话由 references/live-start.md(前置条件、安装、端点、URL 交接)接管,再路由到 references/live-loop.md(会话与收尾);传统流程的步骤 2–5 在 live 会话中不运行。riffrec 的浏览器不在本机时(LAN / tailnet 对端),references/live-remote.md 规定两个 origin 的可达与 HTTPS 规则——浏览器只向安全上下文授予麦克风与屏幕捕获。
riffrec 从 riffrec@^2.2.1 起在 npm 包里即含「能看的访谈者」能力(点击播报、look_at_screen、端点确认后不再产出 zip),因此安装走 registry 而非 git pin;实际安装的版本写进 setup commit 消息与报告。live 会话的收尾除常规报告外,还给出未应用单元的残留清单与会话日志路径。
边界
- 不在默认分支上工作。
- 不推送,不开 PR(live 模式的 riffrec setup commit 是唯一例外,且已在提问时披露)。
- 不扩张成通用 QA。
收尾
用户说完成时,调用 ce-commit 提交 polish 改动。汇报 commit、仍在运行的 server URL、残留阻塞。
References(16 文件,1,248 行)
polish 技能拥有最深的框架专属 dev-server 配置库 — 每个支持的框架一份(Astro、Next、Nuxt、Rails、Remix、SvelteKit、Vite、Procfile)。另有 references/launch-json-schema.md 描述 .claude/launch.json。
跨技能边界
| From | To | 何时 |
|---|---|---|
| ce-simplify-code | (输出:对工作树的编辑) | lfg step 3 |
| ce-test-browser | (输出:报告) | lfg step 8 |
| ce-test-xcode | ce-debug(收窄) | 需要修复时;以收窄的权限 |
| ce-dogfood | ce-worktree, ce-debug, ce-commit, ce-compound | 按需委托 |
| ce-polish | ce-commit | 收尾时 |