研发协作
审查 Meticulous 视觉测试结果时,如何对照 PR…
当需要审查一次已完成的 Meticulous 测试运行、对照 PR 描述判断视觉差异是否为预期、并标记潜在回归时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
审查 Meticulous 视觉测试结果特定
解决思路
- 开始前先运行 `meticulous-cli-update` 技能,确保 Meticulous CLI 和技能是最新版;若本次对话中已运行过则跳过。
- 把自己定位为审查者而非实现者——即使改动是你自己写的,本技能的目标是发现回归,而不是迭代实现。
- Step 0 建立预期:在查看任何 diff 之前,先弄清这个 PR 本应产生什么视觉变化。若已有完整上下文(同一对话中实现了改动,或用户刚描述了任务)就直接使用;否则获取 PR 描述(GitHub 用 `gh pr view <number> --json title,body`,GitLab 用 `glab mr view <id> --output json --jq '{title,description}'`,Bitbucket 用 `GET /2.0/repositories/{workspace}/{repo_slug}/pullrequests/{id}?fields=title,description`),把其中提到的预期视觉变化提炼成简短要点列表。若 PR 描述未提及任何视觉变化,明确记录下来——之后每个 diff 都要额外审查,因为没有可对照的已知预期。
- Step 1 获取 replay diff 摘要:在本地检出目录运行,从当前 commit 的 git HEAD 解析测试运行;先确保 HEAD 与 CI 运行的远程 head 一致(如 `git pull`),否则可能审查到过期或不存在的运行。CLI 用 `meticulous agent test-run-diffs`(从本地 git HEAD 推断运行);MCP 用 `get_test_run_for_commit(commitSha="<sha>")` 再 `get_test_run_diffs(testRunId="<id>")`(MCP 从不推断 git 上下文)。返回的是 `replayDiffId`/`screenshotName` 行的 TSV,是真实视觉差异的代表性、按优先级排序的子集,从上到下逐条处理。要显式指定运行而非从 HEAD 解析,传 `--testRunId <id>` 或 `--commitSha <sha>`。CLI 默认阻塞直到运行完成(传 `--dontWaitForTestRunToComplete` 则报告进行中的运行并立即退出);MCP 从不阻塞,需持续轮询直到 `status` 为 `complete`/`failed`。每条返回的行在得出结论前都必须与 Step 0 匹配或标记。
- Step 2 获取截图图像:对每个代表性截图,CLI 用 `meticulous agent image-files --replayDiffId <replayDiffId> --screenshotName <screenshotName>`(下载图像到 `~/.meticulous/agent-images/` 并打印本地路径);MCP 用 `get_image_urls(replayDiffId="<replayDiffId>", screenshotName="<screenshotName>")`(无下载到磁盘的工具,返回签名 URL,需抓取查看)。打开(或抓取)`before`、`after` 和 `diffImage` 检查变化——`diffImage` 通常信息量最大,精确高亮哪些像素变了。即使 DOM diff 看起来很清楚,也务必检查图像。
- Step 3 检查 DOM diff 获取结构细节:CLI 用 `meticulous agent dom-diff --replayDiffId <replayDiffId> --screenshotName <screenshotName>`;MCP 用 `get_dom_diff(replayDiffId="<replayDiffId>", screenshotName="<screenshotName>")`。可选:CLI 的 `--context <N|full>` 控制每个 hunk 周围的上下文行数(默认 3)。输出是统一 diff(`+`/`-`,缩进被剥离),每个独立变化一个 `[diff N]` 开头的块。
- Step 4 获取 replay 时间线(可选,用于诊断意外 diff):若某个 diff 意外且图像/DOM 无法明显解释原因,CLI 用 `meticulous agent timeline-diff --replayDiffId <replayDiffId>`;MCP 用 `get_timeline_diff(replayDiffId="<replayDiffId>")`。TSV 列:`diff`(` ` 相同、`-` 移除、`+` 新增、`!` 变化)、`timeMs`、`event`(`user`/`screenshot`/`network`/`console` 等)、`description`。查找失败的网络请求、意外重定向或时序异常,这些可能解释视觉变化。
- Step 5 决策指南:对每个代表性截图,把 diff 图像和 DOM diff 与 Step 0 的预期对比。预期——匹配 Step 0 的某个预期变化(或有完整实现上下文时明显是期望结果);检查 diff 确实看起来就是那个变化且没有多余内容——一个 diff 可能在种类上符合预期,却仍夹带一个无关回归在同一截图里;无需标记。非预期——Step 0 未涵盖;用时间线排除失败请求、重定向或其他异常,然后标记:潜在回归(真实副作用,或明显错误)→ 拒绝;与本次审查的改动无关——通常是 flake,如亚像素渲染噪声或动画非确定性 → 忽略。无论哪种都要标记,不能静默丢弃——仍需人工查看。本技能只审查和标记,不修复——把被拒绝的 diff 交给 `meticulous-fix` 技能(或实现改动的人/技能),不要在此尝试改代码。
- Step 6 标记 diff:CLI 用 `meticulous agent reject-diff --replayDiffId=<id> --screenshotName=<name> --reason="<why>" --x=<0..1> --y=<0..1>`、`meticulous agent ignore-diff --replayDiffId=<id> --screenshotName=<name> --reason="<why>" --x=<0..1> --y=<0..1>`、`meticulous agent create-diff-comment --replayDiffId=<id> --screenshotName=<name> --text="<note>" --x=<0..1> --y=<0..1>`;MCP 用 `reject_diff(replayDiffId="<id>", screenshotName="<name>", reason="<why>", x=<0..1>, y=<0..1>)`、`ignore_diff(...)`、`create_diff_comment(...)`。对每个被归类为非预期的 diff 都要调用 `reject-diff` 或 `ignore-diff`,并在最终报告中包含它。`--reason` 是上面分类中的简洁解释;`--x`/`--y` 是从 diff 图像估计的变化区域近似归一化坐标。`create-diff-comment` 是中性选项,用于想留记录但不做裁决的内容。注意不对称:`reject-diff` 写入真实的阻塞性决定,等同于人工拒绝;`ignore-diff` 不做任何决定——只是评论,所以 diff 仍为 `unreviewed`,检查仍为 pending。只有人工能清除 diff,所以不要在最终报告中夸大 `ignore-diff` 调用已解决任何问题。
- Step 7 最终报告:覆盖所有重要视觉变化。1. 预期变化——每条一两句:改了什么、匹配 Step 0 的哪个预期。2. 被标记的 diff(如有)——这是审查的重点,给出最多细节:`replayDiffId`/`screenshotName`(链接:`https://app.meticulous.ai/test-runs/<testRunId>/replay-diff/<replayDiffId>?screenshot=<screenshotName>`)、你是拒绝还是忽略、标记时给出的原因(Step 6)、变化看起来如何、以及你对原因的最佳判断。只有当每个 diff 都被匹配或标记后,PR 才算好。若有任何 diff 被标记,PR 就还不算好:除了标记本身,还要清楚地向用户呈现。
- Step 8 向 Meticulous 报告反馈:始终作为最后一步执行——这是审查本身的一部分,不是用户要求才做的。提交一条简短说明:Meticulous 是否抓到了真实问题、有什么令人困惑、什么能让审查更容易。正面反馈也算——不只是报告摩擦。CLI 用 `meticulous agent submit-feedback --message="<one or two sentences>" --outcome=<helped|neutral|hindered> --testRunId=<id> --skill=meticulous-review`;MCP 用 `submit_feedback(message="<one or two sentences>", outcome="<helped|neutral|hindered>", testRunId="<id>", skill="meticulous-review")`。
适用边界 · 注意事项
- 需要 Meticulous 工具/服务(CLI 或 MCP)才能使用,无此工具时不适用。
- 本技能只审查和标记,不修复——若目标是迭代实现或修复被标记的 diff,应改用 `meticulous-iterative-dev`、`meticulous-zero-diff-task` 或 `meticulous-fix` 技能。
- 若处于实现过程中想循环对照 Meticulous 直到效果正确,不适用本技能。