|
|
|
|
@ -0,0 +1,383 @@ |
|
|
|
|
# 根因分析:为什么反复修复同一问题却仍然失败 |
|
|
|
|
|
|
|
|
|
**版本:** 1.0 |
|
|
|
|
**创建日期:** 2026-02-25 |
|
|
|
|
**作者:** 陈医生 (Eason) 👨⚕️ |
|
|
|
|
**案例:** 张大师农历日期计算错误(反复修复 3 次才彻底解决) |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
## 📋 问题回顾 |
|
|
|
|
|
|
|
|
|
### 时间线 |
|
|
|
|
|
|
|
|
|
| 时间 | 修复动作 | 声称状态 | 实际结果 | |
|
|
|
|
|------|---------|---------|---------| |
|
|
|
|
| **Day 1** | 修复 system-date skill | ✅ 已修复 | ❌ 张大师仍显示错误 | |
|
|
|
|
| **Day 2 上午** | 再次修复 system-date | ✅ 已修复 | ❌ 张大师仍显示错误 | |
|
|
|
|
| **Day 2 下午** | 修复 chinese-almanac skill | ✅ 已修复 | ✅ 真正解决 | |
|
|
|
|
|
|
|
|
|
### 问题现象 |
|
|
|
|
|
|
|
|
|
``` |
|
|
|
|
用户报告:2 月 26 日应该是农历初十 |
|
|
|
|
张大师显示:农历初九 ❌ |
|
|
|
|
实际修复:使用了 lunar-javascript 库后显示初十 ✅ |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
## 🔍 根本原因分析 |
|
|
|
|
|
|
|
|
|
### 原因 1: 局部修复,未全面排查 |
|
|
|
|
|
|
|
|
|
**问题:** |
|
|
|
|
``` |
|
|
|
|
修复了 system-date skill ✅ |
|
|
|
|
但忘记了 chinese-almanac skill ❌ |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
**为什么发生:** |
|
|
|
|
- 只修复了"最近使用"的 skill |
|
|
|
|
- 没有搜索所有使用农历计算的地方 |
|
|
|
|
- 假设"修复一处=全部修复" |
|
|
|
|
|
|
|
|
|
**正确做法:** |
|
|
|
|
```bash |
|
|
|
|
# 应该先全面搜索 |
|
|
|
|
grep -r "农历\|lunar\|正月初" /root/.openclaw/workspace/skills/ |
|
|
|
|
|
|
|
|
|
# 结果会发现: |
|
|
|
|
# - skills/system-date/date.js (已修复) |
|
|
|
|
# - skills/chinese-almanac/almanac.js (未修复) ← 遗漏! |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
### 原因 2: 没有验证最终用户场景 |
|
|
|
|
|
|
|
|
|
**问题:** |
|
|
|
|
``` |
|
|
|
|
测试了 system-date skill ✅ |
|
|
|
|
但没有测试张大师实际推送 ❌ |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
**为什么发生:** |
|
|
|
|
- 在命令行测试 skill |
|
|
|
|
- 没有在真实 Gateway 中测试 |
|
|
|
|
- 没有等待实际推送时间验证 |
|
|
|
|
|
|
|
|
|
**正确做法:** |
|
|
|
|
```bash |
|
|
|
|
# 应该在真实环境测试 |
|
|
|
|
# 1. 重启 Gateway |
|
|
|
|
systemctl --user restart openclaw-gateway-life.service |
|
|
|
|
|
|
|
|
|
# 2. 通过 Telegram 实际测试 |
|
|
|
|
# 发送:明天黄历 |
|
|
|
|
|
|
|
|
|
# 3. 等待 21:00 实际推送验证 |
|
|
|
|
# 检查推送内容是否正确 |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
### 原因 3: 过度自信,未二次验证 |
|
|
|
|
|
|
|
|
|
**问题:** |
|
|
|
|
``` |
|
|
|
|
第一次修复后说"已修复" ✅ |
|
|
|
|
第二天还说"已修复" ✅ |
|
|
|
|
但实际没有验证 ❌ |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
**为什么发生:** |
|
|
|
|
- 相信代码逻辑正确 |
|
|
|
|
- 没有在第二天继续验证 |
|
|
|
|
- 用户报告后才深入检查 |
|
|
|
|
|
|
|
|
|
**正确做法:** |
|
|
|
|
``` |
|
|
|
|
修复后验证流程: |
|
|
|
|
1. 立即测试(命令行)✅ |
|
|
|
|
2. 重启服务测试(Gateway)❌ 未做 |
|
|
|
|
3. 实际场景测试(Telegram)❌ 未做 |
|
|
|
|
4. 等待完整周期(24 小时)❌ 未做 |
|
|
|
|
5. 第二天再次验证 ❌ 未做 |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
### 原因 4: 代码复用意识不足 |
|
|
|
|
|
|
|
|
|
**问题:** |
|
|
|
|
``` |
|
|
|
|
system-date skill 已实现正确的农历计算 |
|
|
|
|
但 chinese-almanac skill 重新实现了一遍 |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
**为什么发生:** |
|
|
|
|
- 没有复用已有的 system-date skill |
|
|
|
|
- 每个 skill 都自己实现农历计算 |
|
|
|
|
- 导致多处代码需要维护 |
|
|
|
|
|
|
|
|
|
**正确做法:** |
|
|
|
|
```javascript |
|
|
|
|
// ❌ 错误:重复实现 |
|
|
|
|
// system-date/date.js 有 getLunarDate() |
|
|
|
|
// chinese-almanac/almanac.js 又有自己的实现 |
|
|
|
|
|
|
|
|
|
// ✅ 正确:复用已有代码 |
|
|
|
|
const { getLunarDate } = require('../system-date/date.js'); |
|
|
|
|
// 或者提取到共享库 |
|
|
|
|
const { getLunarDate } = require('@openclaw/lunar-utils'); |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
### 原因 5: 架构理解不清晰 |
|
|
|
|
|
|
|
|
|
**问题:** |
|
|
|
|
``` |
|
|
|
|
不知道张大师实际使用哪个 skill |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
**为什么发生:** |
|
|
|
|
- 没有追踪完整的调用链 |
|
|
|
|
- 不知道 chinese-almanac 是独立 skill |
|
|
|
|
- 假设修复 system-date 就够了 |
|
|
|
|
|
|
|
|
|
**正确做法:** |
|
|
|
|
```bash |
|
|
|
|
# 应该先理解架构 |
|
|
|
|
cat /root/.openclaw/workspace/agents/life-agent.json | python3 -m json.tool |
|
|
|
|
|
|
|
|
|
# 发现张大师使用的 skills: |
|
|
|
|
# - mem0-integration |
|
|
|
|
# - chinese-almanac ← 用这个查黄历! |
|
|
|
|
# - web-search |
|
|
|
|
# - google-calendar-node |
|
|
|
|
# - scheduler |
|
|
|
|
|
|
|
|
|
# 所以应该修复 chinese-almanac,而不是 system-date! |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
## 📊 修复流程对比 |
|
|
|
|
|
|
|
|
|
### ❌ 错误的修复流程 |
|
|
|
|
|
|
|
|
|
``` |
|
|
|
|
用户报告问题 |
|
|
|
|
↓ |
|
|
|
|
找到一处相关代码 |
|
|
|
|
↓ |
|
|
|
|
修复并测试(命令行) |
|
|
|
|
↓ |
|
|
|
|
声称"已修复" ← 过早下结论 |
|
|
|
|
↓ |
|
|
|
|
用户再次报告 |
|
|
|
|
↓ |
|
|
|
|
再次修复同一处 |
|
|
|
|
↓ |
|
|
|
|
再次声称"已修复" ← 重复错误 |
|
|
|
|
↓ |
|
|
|
|
用户第三次报告 |
|
|
|
|
↓ |
|
|
|
|
深入排查发现多处代码 |
|
|
|
|
↓ |
|
|
|
|
全部修复后真正解决 |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
### ✅ 正确的修复流程 |
|
|
|
|
|
|
|
|
|
``` |
|
|
|
|
用户报告问题 |
|
|
|
|
↓ |
|
|
|
|
1. 全面搜索所有相关代码 |
|
|
|
|
↓ |
|
|
|
|
2. 理解调用链和架构 |
|
|
|
|
↓ |
|
|
|
|
3. 列出所有需要修复的文件 |
|
|
|
|
↓ |
|
|
|
|
4. 逐一修复并标记 |
|
|
|
|
↓ |
|
|
|
|
5. 在真实环境测试 |
|
|
|
|
↓ |
|
|
|
|
6. 等待完整周期验证 |
|
|
|
|
↓ |
|
|
|
|
7. 第二天再次确认 |
|
|
|
|
↓ |
|
|
|
|
8. 更新文档和經驗 |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
## 🎯 经验教训 |
|
|
|
|
|
|
|
|
|
### 教训 1: 全面搜索优先于立即修复 |
|
|
|
|
|
|
|
|
|
> **在修复之前,先找到所有相关代码** |
|
|
|
|
|
|
|
|
|
**检查清单:** |
|
|
|
|
- [ ] grep 搜索所有相关文件 |
|
|
|
|
- [ ] 理解代码调用链 |
|
|
|
|
- [ ] 列出所有需要修改的文件 |
|
|
|
|
- [ ] 评估影响范围 |
|
|
|
|
|
|
|
|
|
**命令模板:** |
|
|
|
|
```bash |
|
|
|
|
# 搜索相关代码 |
|
|
|
|
grep -r "关键词" /path/to/code |
|
|
|
|
|
|
|
|
|
# 查看文件依赖 |
|
|
|
|
grep -r "require.*skill" /path/to/config |
|
|
|
|
|
|
|
|
|
# 理解调用链 |
|
|
|
|
cat /path/to/agent.json | python3 -m json.tool |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
### 教训 2: 真实环境测试优先于命令行测试 |
|
|
|
|
|
|
|
|
|
> **命令行测试通过≠真实环境工作** |
|
|
|
|
|
|
|
|
|
**测试层级:** |
|
|
|
|
``` |
|
|
|
|
Level 1: 命令行测试(最基本) |
|
|
|
|
↓ |
|
|
|
|
Level 2: 重启服务后测试 |
|
|
|
|
↓ |
|
|
|
|
Level 3: 真实用户场景测试 |
|
|
|
|
↓ |
|
|
|
|
Level 4: 完整周期验证(24 小时+) |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
**不要:** |
|
|
|
|
- ❌ 只测试 Level 1 就声称"已修复" |
|
|
|
|
- ❌ 假设"代码正确=工作正常" |
|
|
|
|
|
|
|
|
|
**要:** |
|
|
|
|
- ✅ 至少测试到 Level 3 |
|
|
|
|
- ✅ 等待完整周期验证 |
|
|
|
|
- ✅ 第二天再次确认 |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
### 教训 3: 代码复用优先于重复实现 |
|
|
|
|
|
|
|
|
|
> **一处实现,多处复用** |
|
|
|
|
|
|
|
|
|
**原则:** |
|
|
|
|
- 公共功能提取到共享库 |
|
|
|
|
- 避免重复实现相同逻辑 |
|
|
|
|
- 修改一处,多处受益 |
|
|
|
|
|
|
|
|
|
**当前问题:** |
|
|
|
|
``` |
|
|
|
|
system-date skill: 有 getLunarDate() ✅ |
|
|
|
|
chinese-almanac skill: 自己实现了一遍 ❌ |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
**改进方案:** |
|
|
|
|
```javascript |
|
|
|
|
// ✅ 复用 |
|
|
|
|
const { getLunarDate } = require('../system-date/date.js'); |
|
|
|
|
|
|
|
|
|
// 或者提取到共享库 |
|
|
|
|
// skills/shared/lunar.js |
|
|
|
|
// 两个 skill 都引用这个 |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
### 教训 4: 架构理解优先于代码修改 |
|
|
|
|
|
|
|
|
|
> **不知道调用链,就不应该修改代码** |
|
|
|
|
|
|
|
|
|
**修改前必须知道:** |
|
|
|
|
1. 哪个 Agent 使用这个功能? |
|
|
|
|
2. 使用哪个 skill? |
|
|
|
|
3. skill 的调用链是什么? |
|
|
|
|
4. 修改后会影响谁? |
|
|
|
|
|
|
|
|
|
**当前案例:** |
|
|
|
|
``` |
|
|
|
|
问题:农历日期错误 |
|
|
|
|
|
|
|
|
|
应该先问: |
|
|
|
|
1. 谁报告问题?→ 张大师的推送 |
|
|
|
|
2. 张大师用哪个 skill?→ chinese-almanac |
|
|
|
|
3. 我修复了哪个 skill?→ system-date ❌ |
|
|
|
|
4. 为什么修复错了?→ 没理解架构! |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
### 教训 5: 持续验证优先于一次验证 |
|
|
|
|
|
|
|
|
|
> **修复不是一次性事件,是持续过程** |
|
|
|
|
|
|
|
|
|
**验证时间线:** |
|
|
|
|
``` |
|
|
|
|
T+0: 修复后立即验证 ✅ |
|
|
|
|
T+1h: 重启服务后验证 ❌ 未做 |
|
|
|
|
T+1d: 第二天验证 ❌ 未做 |
|
|
|
|
T+7d: 一周后验证 ❌ 未做 |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
**正确做法:** |
|
|
|
|
- 修复后设置提醒 |
|
|
|
|
- 第二天主动检查 |
|
|
|
|
- 等待用户反馈前自己验证 |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
## 📝 行动清单 |
|
|
|
|
|
|
|
|
|
### 立即行动 |
|
|
|
|
|
|
|
|
|
- [ ] 搜索所有使用农历计算的代码 |
|
|
|
|
- [ ] 统一使用 lunar-javascript 库 |
|
|
|
|
- [ ] 提取公共逻辑到共享模块 |
|
|
|
|
- [ ] 更新所有相关 skill |
|
|
|
|
|
|
|
|
|
### 流程改进 |
|
|
|
|
|
|
|
|
|
- [ ] 修复前先搜索所有相关代码 |
|
|
|
|
- [ ] 理解完整调用链再修改 |
|
|
|
|
- [ ] 真实环境测试后再声称修复 |
|
|
|
|
- [ ] 设置第二天验证提醒 |
|
|
|
|
|
|
|
|
|
### 文档更新 |
|
|
|
|
|
|
|
|
|
- [ ] 更新技能依赖关系图 |
|
|
|
|
- [ ] 记录农历计算实现位置 |
|
|
|
|
- [ ] 添加架构调用链文档 |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
## 🔗 相关文档 |
|
|
|
|
|
|
|
|
|
- [AGENT_CRON_BEST_PRACTICES.md](./AGENT_CRON_BEST_PRACTICES.md) - Cron 任务部署最佳实践 |
|
|
|
|
- [AGENT_DEPLOYMENT_BEST_PRACTICES.md](./AGENT_DEPLOYMENT_BEST_PRACTICES.md) - Agent 部署最佳实践 |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
## 💡 核心教训 |
|
|
|
|
|
|
|
|
|
> **反复修复同一问题的根本原因,不是技术能力不足,而是方法论错误。** |
|
|
|
|
|
|
|
|
|
**正确的修复方法论:** |
|
|
|
|
1. 全面搜索 > 立即修复 |
|
|
|
|
2. 理解架构 > 修改代码 |
|
|
|
|
3. 真实测试 > 命令行测试 |
|
|
|
|
4. 持续验证 > 一次验证 |
|
|
|
|
5. 代码复用 > 重复实现 |
|
|
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
|
|
**最后更新:** 2026-02-25 |
|
|
|
|
**维护者:** 陈医生 (Eason) 👨⚕️ |