附录 A · 自检清单合集
每章结尾都给了一份检查清单,这里汇总在一起,方便随时翻。
harness 自检(第 1 章)
遇到 Agent 表现不好时,按以下顺序排查(先别想模型的事):
工具层面
- [ ] 工具描述是否足够清晰?有没有写"什么时候用、什么时候不用"?
- [ ] 工具描述里有没有具体的 usage example?
- [ ] 工具失败时,返回的错误信息够不够?是泛泛的"出错了",还是"原因 + 当前输入 + 建议修正"?
- [ ] 工具返回值是否包含模型下一步决策需要的信息?
上下文层面
- [ ] 模型每次决策时,能看到它需要的所有信息吗?
- [ ] 上下文里有没有冗余信息,挤占了有效空间?
- [ ] 过时的格式约束、冗余的 few-shot,还在 prompt 里吗?
循环层面
- [ ] Agent 的最大循环次数够不够?
- [ ] 循环耗尽时有没有兜底?
- [ ] 触发和响应有没有混在一起?
验证层面
- [ ] 你怎么知道这次输出是对的?
- [ ] 工具调用的副作用,有没有被验证过安全?
认知阶位自检(第 2 章)
阶 1 Prompt
- [ ] 你会不会在 system prompt 里加示例来控制输出格式?
- [ ] 你能不能区分"必须遵守的规则"和"参考信息"?
阶 2 Context
- [ ] 你有没有主动管理过模型的"视野"?
- [ ] 当 Agent "健忘"的时候,你会不会去查"它那个瞬间到底能看到什么"?
阶 3 Harness
- [ ] 你写工具描述的时候,是当成 API 文档写,还是当成 prompt 写?
- [ ] 工具失败时,返回的错误信息里有没有"下一步建议"?
阶 4 Loop
- [ ] 你的 Agent 执行循环,能用一句话描述吗?
- [ ] 你有没有在代码里用 if-else 替模型做了它本该自己做的决定?
项目失控自检(第 3 章)
颗粒度
- [ ] 我这次的交付单元是什么?能用一句话描述吗?
- [ ] 这个单元需要多久能做完?超过半天的话,能不能再拆?
- [ ] 我有没有写过"非目标"清单?
验证
- [ ] 每个交付单元,我怎么验证它做对了?
- [ ] 我的验证标准,是从"技术指标"写的,还是从"用户体验"写的?
- [ ] 我能不能一句话说出"这一步成了"长什么样?
可回滚
- [ ] 我有没有版本管理?
- [ ] 我有没有可回滚的部署机制?
- [ ] 我的提交粒度是大是小?
危险信号
- [ ] 计划文档越来越长,但完成进度几乎没动
- [ ] 在反复打补丁修同一个区域的问题,而不是退一步重新设计
- [ ] 代码改动牵一发动全身,改一个地方冒出来好几个新问题
- [ ] 错误日志在重复刷同一行,但你不知道,因为没有告警
工具设计检查(第 4 章)
描述
- [ ] 描述里有没有具体的用法示例?
- [ ] 描述里说清楚了"什么时候用"吗?有没有说"什么时候不用"?
- [ ] 参数级别的描述够不够精确?
返回值
- [ ] 返回值是给模型看的,还是给开发者看的?
- [ ] 返回值里有没有模型下一步决策需要的信息?
- [ ] 返回值会不会太长?太长的话有没有截断提示?
错误处理
- [ ] 错误信息是不是只有一句"出错了"或"参数错误"?
- [ ] 错误信息有没有"递出下一把钥匙"?
- [ ] 错误信息会不会被截断逻辑砍掉?
硬编码参数
- [ ] 截断阈值设了多少?为什么是这个值?
- [ ] 错误信息走不走截断?
- [ ] 有没有哪些值是"替模型做了决定"的?
循环设计检查(第 5 章)
循环本身
- [ ] 我的核心循环能用一句话描述吗?
- [ ] 我有没有在循环里塞多阶段编排?
- [ ] 我有没有用 if-else 替模型做了它本该自己做的决定?
触发与响应
- [ ] 触发和响应是不是绑死了?
- [ ] 有没有"关注但不回复"的中间态?
- [ ] 能不能通过消息格式或提示词,让模型自己区分场景?
护栏
- [ ] 循环有没有次数上限?到了上限怎么办?
- [ ] 有没有"回复保证"?
- [ ] 有没有"卡住检测"?
该用循环还是状态机?
- [ ] 这块功能的"下一步"是模型决定的,还是事先确定的?
- [ ] 如果是事先确定的,我有没有为了"统一"硬套循环?
eval 设计检查(第 6 章)
用例本身
- [ ] 预期行为写得足够具体吗?换一个人来看,能给出一致判断吗?
- [ ] 有没有写反例("不该怎样")?
- [ ] 用例来源标注了吗?(bug 驱动 / 场景驱动)
打分手段
- [ ] 能用代码量化的指标,是不是都用了代码断言?(别什么都扔给 LLM 裁判)
- [ ] 用了 LLM 裁判的地方,评判标准写得够清楚吗?
- [ ] 有没有定期人工抽查校准?
工程卫生
- [ ] 用例之间是隔离的吗?跑完一个用例,会不会污染下一个?
- [ ] reset 清干净了吗?把模块级可变状态(单例/缓存/字典/标志位)都扫一遍,别只想着数据库
- [ ] eval 结果可复现吗?(同一代码版本、同一用例,跑两次结果一致吗?)
eval-driven 实践
- [ ] 新功能开发前,先写了 eval 用例吗?
- [ ] eval 通过后,用例沉淀到回归基线了吗?
非确定性测试检查(第 7 章)
是不是真的不稳定?
- [ ] 同一用例、同一代码版本,连跑 3 次,结果一致吗?
- [ ] 如果不一致——是 Agent 行为变了,还是裁判判错了?(先排查裁判)
- [ ] eval 环境是干净的吗?上一个用例的残留有没有污染?(数据库、缓存、全局状态)
应对策略
- [ ] 你的 eval 是跑一次就判生死,还是跑多次看通过率?
- [ ] 通过率阈值设了多少?合理吗?(太严会假阳性,太松会假阴性)
- [ ] 不同维度有没有区分运行次数?(确定性维度少跑,概率性维度多跑)
- [ ] 概率维度里,处在"灰色地带"的用例(裁判容易纠结的)有没有多跑几次?
裁判可靠性
- [ ] 裁判和 Agent 是不是用了不同的模型?
- [ ] 裁判的 prompt 有没有明确的、具体的评判标准(锚点)?
- [ ] 裁判打分是单次判定,还是跑多次取通过率?
- [ ] 最近有没有人工抽查校准过裁判的判断?
- [ ] 你心里清楚"裁判也会判错"这件事吗?
全局
- [ ] 你的项目里,哪些部分是确定性的,哪些是概率性的?
- [ ] 确定性部分用传统测试,概率性部分用 eval——两边都覆盖了吗?
- [ ] 有没有"确定性部分测得很好,概率性部分完全没测"的盲区?
多 Agent 决策检查(第 8 章)
先问自己三个问题
- [ ] 我真的需要两种不同的专业能力吗?
- [ ] 这两种能力真的没法在一个 Agent 里组合吗?
- [ ] 任务的复杂度真的超过单 Agent 的上下文管理能力了吗?
如果决定拆,再问三个问题
- [ ] 两个 Agent 的能力是 genuinely 互补的吗?
- [ ] 任务主要是"读取"还是"写入"?
- [ ] 你准备好了协调成本吗?
最危险的信号
- [ ] 你想引入多 Agent 只是因为单 Agent"不稳定"
- [ ] 你想让多个 Agent"讨论"来解决问题
- [ ] 你觉得多 Agent"更先进"
双 Agent 协作检查(第 9 章)
异步与回调
- [ ] 子 Agent 执行的时候,主流程会不会卡住?
- [ ] 子 Agent 完成后,结果怎么传回主 Agent?
- [ ] 主 Agent 收到结果时,上下文还在吗?
上下文传递
- [ ] 你是把内容塞进 prompt,还是给文件路径让子 Agent 自己读?
- [ ] 子 Agent 有没有"上次的记忆"?
- [ ] 任务描述是结构化的,还是自然语言闲聊?
产出验证
- [ ] 子 Agent 的产出有没有自动验证?
- [ ] 验证是单层还是双层?
- [ ] 验证标准写清楚了吗?
失败处理
- [ ] 验证失败后会自动重试吗?
- [ ] 重试带不带反馈?
- [ ] 重试上限设了吗?
权限与安全
- [ ] 子 Agent 的操作权限是怎么管的?
- [ ] 什么操作自动批准,什么操作需要人审批?
- [ ] 审批的交互在哪里完成?
三层协作自查(第 10 章)
人的角色
- [ ] 人需要介入的节点定义清楚了吗?
- [ ] 人的介入频率合理吗?
- [ ] 人不在的时候,系统能安全运行吗?
PM Agent
- [ ] PM Agent 有"能力边界意识"吗?
- [ ] PM Agent 维护着项目的完整状态吗?
- [ ] PM Agent 的产出验证是否可靠?
开发 Agent
- [ ] 开发 Agent 是否对用户透明?
- [ ] 开发 Agent 的上下文是否解耦?
- [ ] 开发 Agent 的权限是否受控?
整体
- [ ] 你评估过延迟吗?
- [ ] 你算过可靠性吗?
- [ ] 你有退出策略吗?
鲁棒性检查(第 11 章)
超时与重试
- [ ] 所有的外部调用(LLM、HTTP、数据源)都配超时了吗?还是有些会无限阻塞?
- [ ] 瞬时错误有没有重试?重试次数和退避策略设了吗?
- [ ] 新代码会不会"绕过"已配好的默认值?(裸
new一个客户端,而不是走带默认值的工厂) - [ ] 如果有工厂——有没有检查机制拦住"不走工厂"的写法?
熔断与降级
- [ ] 连续失败时,有没有熔断?还是傻乎乎地一直重试到天亮?
- [ ] 熔断放在哪一层了?检测够准、保护够广、状态能持久吗?
- [ ] 熔断计数用的是单调时钟(monotonic)吗?还是会被系统时间跳变干扰?
- [ ] 上层认不认识"熔断中"异常?是优雅跳过,还是当成普通失败刷日志?
强制 vs 约定
- [ ] 你的鲁棒性默认值,哪些是"能强制的"(有明确禁用目标,工厂+检查能拦死)?
- [ ] 哪些是"只能约定的"(如"该方法该不该重试",检查判不了,靠纪律)?
- [ ] 对只能约定的部分,至少把正确做法做得足够省力了吗?
兜底
- [ ] 写数据的操作,有没有事务保证?中途断了会不会留下不一致状态?
- [ ] 工具执行失败时,副作用有没有回滚或兜底?
危险信号
- [ ] 有没有任何调用的地方没配超时 → 它就是下一个深夜空转的来源
- [ ] 连续失败只会无限重试,没有熔断 → 服务一挂就刷一夜日志
- [ ] 鲁棒性全靠"想起来才加",没有默认机制 → 新代码永远在制造新的裸调用
质量门禁检查(第 12 章)
CI(最基本)
- [ ] 提交代码时,有没有自动跑测试?
- [ ] 有没有自动跑 lint 和类型检查?
- [ ] 你是单人项目吗?如果是——pre-commit 配了吗?(它比云端流水线更改变你的习惯)
- [ ] 测试不通过时,能不能阻止提交?
测试覆盖
- [ ] 你的测试覆盖了哪些层?(算法层?HTTP 层?数据层?Agent 行为层?)
- [ ] 有没有"测了好测的部分,难测的 Agent 行为层完全没测"的失衡?
- [ ] eval 用例跑完的结果,接进 CI 自动比对了,还是靠肉眼判断?
闭环
- [ ] 有没有"代码写了但从没被调用"的功能?(告警、日志、审计……)
- [ ] 第一步:grep 每个功能的调用点,0 个的就是完全空壳
- [ ] 第二步:列举每个功能"语义上该出现的所有路径",逐一核实——抓部分接通
- [ ] 你的告警能真的推送到你手里吗?还是写完了但没接通?
危险信号
- [ ] 你做的所有项目都没有 CI → 你和上面那些坑之间只差一个提交
- [ ] 你的测试全集中在某个层 → 未覆盖的层就是下一个 bug 的来源
- [ ] 你有"写了但没接通"的功能 → 不接通等于没写
- [ ] 你的项目从没跑过 lint,但配置文件里声明着 → 你以为你有 lint,其实你没有
驾驭阶段自检(第 13 章)
指令文件
- [ ] 你给 Agent 的指令文件里,有没有"禁止做什么"?
- [ ] 它是"系统说明书"(描述系统是什么)还是"工作指南"(告诉 Agent 怎么做)?
权限
- [ ] 你给 Agent 的权限是"什么都允许"还是精确到具体命令?
- [ ] 你有没有回头收紧过权限?(从粗放到精细的过程就是升级的过程)
交付方式
- [ ] 你的需求是"一次大块"还是"分阶段、每阶段可验证"?
- [ ] 每个交付单元有没有明确的"成了长什么样"?
人的角色
- [ ] 你是在逐条指挥 Agent,还是在设计 Agent 运转的系统?
- [ ] 你有没有让一个 Agent 去调用/监督另一个 Agent?
判断标准
- 四个都答"没有/前者" → 第一阶段(许愿式)
- 有边界了但还在逐条指挥 → 第二阶段(划边界)
- 开始约束 Agent 行为方式、权限精确化 → 第三阶段(驾驭式)
- 让 Agent 驾驭 Agent,人退到审批和兜底 → 第四阶段(元驾驭式)