Install
openclaw skills install bug-pattern-diagnosis根据用户描述的 bug 现象(症状)匹配已沉淀的 bug 案例库,快速判断这是哪类问题、根因在哪、如何排查。每次成功诊断后会把新案例沉淀到案例库,持续积累经验。适用于用户报告"奇怪的报错 / 间歇性失败 / 某些环境才复现 / 日志很诡异"的场景。
openclaw skills install bug-pattern-diagnosis这个 Skill 的作用是像医生看病一样做 bug 诊断:
experience/ 目录下翻阅以前遇到过的类似 bug,作为经验记忆参考BUGxx.md 写进案例库,供下次参考核心价值:让过往踩坑的经验启发下次排查的方向,但不替代独立思考。相似症状不一定是同一个 bug,看起来一样的日志背后可能是完全不同的根因。
这是本 Skill 最核心的使用原则。
案例库里的 BUGxx.md 是老医生的病历本,不是处方模板。拿到新患者:
| 场景 | 错误做法 | 正确做法 |
|---|---|---|
| 症状匹配度高 | "这是 BUG01,改 invokeRemoteDeviceOpt 加 x-token-payload" | "你描述的现象让我想起 BUG01 的一个特征——副本间日志不对称。建议你先验证:跨副本日志是否真的有'一个有栈一个没栈'?如果是,再顺着这个方向查" |
| 部分特征命中 | "虽然不完全一样,但按 BUG01 的方案应该能修" | "BUG01 里有个排查技巧可能适用——连续请求 100 次看成功率是不是约 1/N。先用这个验证一下是不是副本间状态不一致的问题" |
| 案例里有具体代码 | 把 BUG01 的修复代码贴给用户让他照抄 | "BUG01 的修复思路是补齐 header 透传,但具体到你的项目,要先确认:(1) 你的接收端实际依赖哪些 header?(2) 序列化方式是否和入口一致?这些答完才能写代码" |
bug-pattern-diagnosis/
├── SKILL.md ← 本文件(职责、流程、匹配规则)
└── experience/ ← 案例库
├── BUG01.md ← 每个案例一个文档
├── BUG02.md
└── ...
每个 BUGxx.md 都按固定结构写,方便快速检索:
用户描述下列类型的问题时,优先启用本 Skill:
读取 experience/ 目录下所有 BUG*.md 文件的"症状 / 特征速查"章节(每个文件的前 30-50 行通常就够),不要一开始读完整文件。
从用户描述里提取关键特征,至少覆盖以下维度:
| 维度 | 例子 |
|---|---|
| 错误信号 | NPE / 500 / 403 / 超时 / 数据错 / 死锁 |
| 复现率 | 100% / 50% / 偶发 / 特定条件 |
| 环境差异 | 本地不复现?测试复现?生产复现? |
| 多实例特征 | 单副本 / 多副本?副本数是几? |
| 日志分布 | 集中在一个实例 / 分散在多个实例 / 一个有栈一个没栈 |
| 触发条件 | 特定用户 / 特定参数 / 特定时段 |
| 最近改动 | 发版?配置变更?扩容缩容?依赖升级? |
把结构化特征和案例库逐个比对相似度,但不要据此下结论。无论相似度多高,案例都只是**"值得参考的既往经验"**,不是"确定的答案"。
相似度处理原则:
不要以"这是 BUGxx"的口吻下定论。要以"过往有类似案例,以下是可能的方向和验证方法"的口吻交流。
推荐的响应结构:
❌ "根据你描述的症状,这是 BUG01(多副本间歇性 NPE)。
根因是 invokeRemoteDeviceOpt 漏传 x-token-payload。
按以下代码改动即可:[直接贴 BUG01 里的代码]"
✅ "你的描述有几个特征值得注意:
1) 间歇性失败,成功率似乎接近 50%
2) 日志似乎是 token 相关但客户端明明带了 token
这让我想起过去排查的 BUG01,那个案例里类似症状的背后是
'多副本内部调用漏传身份 header'。但你的项目未必是同一个
问题,**我建议先验证几个关键假设**:
Q1: 你的服务副本数是几?成功率是否约等于 1/N?
Q2: 能否同时 tail 所有副本日志,看失败请求是否同时在
多个副本留痕、且日志详尽程度不对称?
你先做这两个验证,结果告诉我之后,我们再决定排查路径。"
当出现以下情况时,主动询问用户是否把本次排查固化成新案例:
用户同意后,按"案例文档结构"(下方模板)创建 BUGxx.md(编号按当前最大编号 +1)。
按以下顺序排查陌生 bug:
1/N 或 (N-1)/N?.class 用 javap -c -p 反编译,和本地源码比对如果怀疑上下文传播问题:
getHeaderNames() 验证实际传递的 header# BUGxx: <一句话标题,突出最特征性症状>
## 案例摘要
<一段话,200 字内。点明:现象、复现条件、根因类型、影响范围>
## 症状 / 特征速查(用于匹配)
> 遇到下列特征同时满足 N 条以上时,高概率是本案例
- [ ] 特征 1(具体、可验证)
- [ ] 特征 2
- [ ] 特征 3
- [ ] ...
### 关键日志指纹
<贴出典型的错误日志片段,让后续可以直接 grep 匹配>
### 不会出现的反向特征(排除项)
- 如果出现 <xxx>,则不是本案例
## 详细说明 / 根因链路
<病理机制。用图/表格/代码引用说明数据流、控制流、状态变化>
## 排查方法论
### 使用到的技术
- <方法 1:例如"跨副本日志对照">
- <方法 2:例如"javap 字节码比对")>
- ...
### 诊断步骤(按顺序)
1. ...
2. ...
3. ...
## 修复方案
### 根治
<核心修复点、代码示例、影响面评估>
### 兜底 / 防御
<二线防御措施,防止根治漏掉时仍不崩>
### 加固 / 清理
<长期性改进,代码规约、同类代码扫描>
## 预防清单(Checklist)
开发阶段:
- [ ] ...
部署阶段:
- [ ] ...
Review 阶段:
- [ ] ...
## 同类间歇性 bug 的 Playbook
遇到类似现象时按此顺序走:
1. 定量复现(10 分钟)
2. 查拓扑(5 分钟)
3. 日志对照(30 分钟)
4. ...
## 参考资料
- 相关文件路径
- 相关 PR/commit
- 相关 wiki
BUGxx.md 里的代码片段当成"现成答案"贴给用户。案例代码只是"那个项目的修法",不一定适合当前项目。