你的 KMP 重构 Workflow 全自动跑通了:10 个单元 MERGED、编译绿。但你自己说过那句关键的话——编译通过 ≠ 功能没坏。点赞计数、评论面板参数、JustWatched 浮窗、分页 generation,这些运行时回归只有真机能验。于是整条 ⑤ 级流水线,唯一还卡在 ① 级纯手工的环节就是:你抱着那 1 台设备逐 Tab 点。
这一课把第四课埋的伏笔收回来:trace 是诊断工具——现在我们把它建起来,再接上"判定",组成完整的验证 harness。目标不是全自动,是把你从"逐 Tab 点"降级到"只审一份分析报告"。
PostToolUse 把每次工具调用写成一行 JSONL(stdin 本身就是结构化 JSON,直接落盘):
{ "hooks": { "PostToolUse": [{ "matcher": "*", "hooks": [
{ "type": "command", "command":
"jq -c '{ts:now, tool:.tool_name, input:.tool_input, session:.session_id, prompt:.prompt_id}' >> ~/.claude/trace.jsonl" }
]}]}}
官方语义保证:多个 hook 并行执行,日志 hook 和拦截 hook 可叠加——trace 和第四课的护栏不冲突。另外别忘了白嫖:会话本身就是全量 JSONL transcript(~/.claude/projects/<项目>/<session-id>.jsonl),每行带 timestamp/parentUuid/token 用量,一条 jq 就能抽出所有工具调用:
jq -c 'select(.type=="assistant") | .message.content[] | select(.type=="tool_use")' <session>.jsonl
步骤号 | 意图 | 动作 | 观察 | 判定;所有截图文件名带步骤号(step07-savior-digg.png),让图和 trace 能对上。journal 与 trace 是两条独立证据链——对照它们,才能发现"判定说成功、证据说失败"的那一步。读这份 run journal 和 trace(JSONL),找出第一个"判定与证据矛盾"的步骤: 判定写成功但观察/日志/截图不支持,或跳过了 VERIFY.md 里要求的断言。 输出:步骤号、矛盾内容、涉及的 Tab、建议复查动作。按严重度排序。一个额外的好消息:v2.1.199 修掉了"子 agent 把 API 错误当成功结果返回"的 bug——独立 verifier 模式过去最阴的坑已被官方填了。
个人 vs 团队的选型:官方还有 OpenTelemetry 导出(CLAUDE_CODE_ENABLE_TELEMETRY=1,metrics/logs/traces 三件套,成本可按 skill/子 agent 归因,beta 的分布式 tracing 连 agent 树都能还原)。但那是团队级基建——个人做 trace,hooks + transcript 这条轻路线就够。
2026 年中 best-practices 的新框架,按门禁强度递增——这张表值得贴在墙上:
| 层级 | 机制 | 一句话 | 适合 |
|---|---|---|---|
| 1. 单条 prompt | prompt 里写明"跑完测试再结束" | 零配置,靠自觉(会漂,见第四课) | 小改动 |
| 2. 会话级 | /goal(v2.1.139+) | 每轮结束由独立小模型评估条件是否达成,未达成自动续跑;条件要写成"可度量终态 + 检查方式",可加 or stop after 20 turns 限流 | 长任务收敛 |
| 3. 确定性门禁 | Stop hook 跑脚本 | 测试/lint 不过就 {"decision":"block"},回合无法结束。护栏:连续 block 8 次强制放行;脚本要查 stop_hook_active 防自锁 | 硬标准(编译/测试/lint) |
| 4. 第二意见 | 独立 verifier 子 agent / workflow | 干活的模型不给自己打分——fresh context 的 agent 只看 diff 和标准做审查(第六课的对抗验证就是它的舰队版) | 正确性无法脚本化时 |
官方 verifier prompt 模板(注意最后一句,防 reviewer 过度报问题):
Use a subagent to review the diff against PLAN.md. Check that every requirement is implemented. Report gaps that affect correctness, not style preferences.
还有两个新门禁值得知道:TaskCompleted hook(exit 2 可阻止任务被标记完成——给内置任务系统装验收钩);内置 /verify skill(v2.1.145+)——通过真实界面端到端驱动改动,官方原话:"If users click buttons, test by clicking buttons, not by curling the API underneath"。
你的场景比纯后端难:1 台设备 = 验证天然串行,UI 回归靠肉眼。但你手里的验证设施其实已经齐了,缺的只是把它们接进 agent 流水线:
adb logcat -s "Savior:*" 一条命令断言"点赞后计数++ 且无重复请求"。.a2k/ 截图测试体系是现成的 UI 回归网——让驱动 agent 在关键步骤触发它,diff 超阈值就在 journal 里记"判定=可疑",留给分析 agent 升级为复查项。PostToolUseFailure 工具失败、InstructionsLoaded 规则加载——第四课诊断"规则到底加载没"用的就是它)。/goal 会话级收敛;TaskCompleted 挡任务假完成。claude -p --output-format stream-json 拿 NDJSON 事件流;--json-schema 强制结构化输出后直接 jq '.structured_output' 机器断言;--bare 保证每台机器行为一致。codex exec --json 输出 NDJSON 事件流,实测事件链:thread.started → turn.started → item.started/completed → turn.completed;item.type 有 agent_message / command_execution(含 exit_code)/ file_change / reasoning / mcp_tool_call 等;turn.completed.usage 连 reasoning_output_tokens 都有(文档还没写,实测为准)。-o 把最终结论单独落盘给脚本消费。解析注意:warning 也走 item.type:"error",别一律当失败。{"decision":"block"} 或 exit 2 → 带你的反馈自动续跑;/goal 已 stable——目标持久化进 SQLite,每轮续行时重新注入。openai/codex-action@v1,官方模式:只读 job 跑 codex 产出 patch 工件 → 独立有写权限的 job 应用。--best-of(实际是 --attempts)、还"不确定 hooks 是否已支持"(它自己每一轮都在触发 hooks)。这正是本课主旨的镜像:对 agent 的能力和产出,--help、feature flags、trace、源码才是事实源;它的自我报告只能当线索。动作 → 预期日志(tag+关键字)→ 兜底截图点。例:「Savior Tab 点赞 → logcat 出现 Savior:Digg count=+1 且 60s 内无重复请求日志 → step 截图」。写不出断言的项,说明你自己也不知道"对"长什么样——先补规格(第二课)。步骤号|意图|动作|观察|判定,截图文件名带步骤号,任何断言失败继续跑完但判定记 FAIL」。1. agent 报告"重构完成、编译通过",此时正确的验收姿势是?
2. Stop hook 门禁和 /goal 的本质区别是什么?
3. 真机验证的断言,日志和截图的正确优先级是?
4. run journal 和 trace 的关系,正确的是?
Claude Code 官方 Best Practices — "Give Claude a way to verify its work" 章节(约 10 分钟)。四级验证梯度、verifier prompt 模板、"show evidence rather than asserting success" 的一手出处——2026 年官方把"验证"从社区经验升格成了产品方法论,这一章就是分水岭。
点卡片翻面。记的是能用的判断核心,不是定义。
/goal(小模型评估)③ Stop hook 确定性门禁(脚本不过不许停)④ 独立 verifier(fresh context 只看 diff 和标准)。硬标准用 ③,脚本化不了的正确性用 ④。能讲清楚,才是真懂——比能回忆高一层。
讲不顺的地方就是还没真懂的地方 —— 发给我,我帮你补上。