跳转至

调试 skill

本页最后更新于 ,内容可能过时

用一个子 agent 真实跑一遍待调试的 skill
把它的歧义与绕弯收集起来, 据此改 skill

适用前提: 待调试的 skill 已经写完, 需要找的是它在真实任务里暴露的问题

给子 agent 的约束

启动前把这些写进提示词, 缺一条结果就不可用

  • 只跑指定的任务, 不读仓库里已有的成品作参考
  • 不用 git log, git show, git checkout 取历史里的旧产物
  • 不改 .claude/skills/ 下的文件, 发现问题只上报
  • 输出目录另建, 不写进正式目录
  • 中间产物放 %TEMP% 下
  • 外部服务的写操作 (例如图床上传) 允许真做, 便于验证

再给一份参考范例
范例是同类的已完成产物, 不是本次的输出
范例让子 agent 在 skill 没覆盖的地方有参考, 也让它的选择有可比的对象

流程

  1. 起一个子 agent, 把任务与上面的约束写进提示词
  2. 子 agent 报告它遇到的歧义与错误
  3. 主线程核对它报的问题
  4. 汇总成记录, 写进仓库根的 skill-bug.md
  5. 抽子 agent 的思考过程, 也写进 skill-bug.md
  6. 按记录逐条修 skill
  7. 复查全部 skill 的文风与做法
  8. 清理测试产物

第 3 步不能省
子 agent 报的问题里有相当一部分是它自己的操作失误, 例如路径拼错, 变量拼错
先自己复现一次, 复现得到的才写进记录
误判写进记录, 后面的修改会照着错的改

抽取思考过程

子 agent 的记录落在会话目录里

C:\Users\16770\.claude\projects\<仓库路径键>\<会话 id>\subagents\agent-<id>.jsonl

<仓库路径键> 由仓库绝对路径生成, 本仓库是 C--Users-16770-Desktop-Mind-City
<会话 id> 取时间最新的一个, 就是当前这次会话的目录

两处容易出错的细节

  • 文件很大, 因为渲染过的图片按 base64 内联在里面, 可达数十 MB
  • %TEMP%\claude\<会话>\tasks\*.output 是 0 字节的占位文件, 不是记录, 不要去那里找

抽取做法

  • 先打印一两条记录看结构, 字段名随版本会变
  • 再写脚本按结构抽, 每条 thinking 与说明取开头约 120 到 150 字
  • 工具调用只记工具名与参数开头, 带图片的结果整条跳过, 否则会把 base64 写进上下文
  • 结果写进 %TEMP%\subagent-<分段>.txt, 再 Read 这个文件
  • 不要直接把 jsonl 读进上下文, 也不要指望控制台能打印中文

按条目区间分段, 一次抽一段, 分多次抽完

覆盖情况要写进记录
哪部分抽了, 哪部分没抽, 结论的可信度取决于这个

记录文件的格式

固定写在仓库根 skill-bug.md, 收尾时删

  • 测试环境: 输入的源文件, 输出目录, 参考范例, 临时目录, 给子 agent 的约束
  • 覆盖说明: 思考过程抽了多少, 有多少工具结果与图片没看
  • 过程重建: 产物的时间线, 以及子 agent 自述的关键决策点
  • 绕弯清单: 逐环节对照 照 skill 就能做的 与 它自己想的
  • 问题清单: 按严重程度分组, 每条写清涉及哪个文件的哪一行
  • 主线程的误判: 核对后被推翻的判断, 单独记一节, 不要留在问题清单里
  • 已修: 编号, 改在哪, 做法
  • 清理清单: 收尾要删的东西

修 bug 的取舍

改之前先分类

  • 不同 agent 会给出不同答案, 且答案本身无优劣的: 写死一个
  • 有客观判据的: 写判据, 参数留给 agent 自己选
  • skill 的默认做法本身是错的: 优先改, 这类影响最大, 子 agent 要先失败再推翻

收尾

复查全部 skill, 两项一起过

  • 文风: 全角标点, 术语是否统一, 口语化用词, 行尾终止符
  • 做法: 各处写的方法是否互相矛盾, 有没有与本次结论冲突的旧描述

清理这些

  • 测试用的输出目录
  • %TEMP% 下的中间产物与抽取文件
  • 图床上传过的对象
  • skill-bug.md 本身

注意事项

  • 核对环节要假定子 agent 会犯错, 它的自述可信, 它得出的结论不一定可信
  • 抽取是分段的, 一次抽完上下文会超限
  • 涉及的路径含 [ ] ( ) 和中文时加引号