You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
7.9 KiB
7.9 KiB
根因分析:为什么反复修复同一问题却仍然失败
版本: 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
- 没有搜索所有使用农历计算的地方
- 假设"修复一处=全部修复"
正确做法:
# 应该先全面搜索
grep -r "农历\|lunar\|正月初" /root/.openclaw/workspace/skills/
# 结果会发现:
# - skills/system-date/date.js (已修复)
# - skills/chinese-almanac/almanac.js (未修复) ← 遗漏!
原因 2: 没有验证最终用户场景
问题:
测试了 system-date skill ✅
但没有测试张大师实际推送 ❌
为什么发生:
- 在命令行测试 skill
- 没有在真实 Gateway 中测试
- 没有等待实际推送时间验证
正确做法:
# 应该在真实环境测试
# 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 都自己实现农历计算
- 导致多处代码需要维护
正确做法:
// ❌ 错误:重复实现
// 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 就够了
正确做法:
# 应该先理解架构
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 搜索所有相关文件
- 理解代码调用链
- 列出所有需要修改的文件
- 评估影响范围
命令模板:
# 搜索相关代码
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: 自己实现了一遍 ❌
改进方案:
// ✅ 复用
const { getLunarDate } = require('../system-date/date.js');
// 或者提取到共享库
// skills/shared/lunar.js
// 两个 skill 都引用这个
教训 4: 架构理解优先于代码修改
不知道调用链,就不应该修改代码
修改前必须知道:
- 哪个 Agent 使用这个功能?
- 使用哪个 skill?
- skill 的调用链是什么?
- 修改后会影响谁?
当前案例:
问题:农历日期错误
应该先问:
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 - Cron 任务部署最佳实践
- AGENT_DEPLOYMENT_BEST_PRACTICES.md - Agent 部署最佳实践
💡 核心教训
反复修复同一问题的根本原因,不是技术能力不足,而是方法论错误。
正确的修复方法论:
- 全面搜索 > 立即修复
- 理解架构 > 修改代码
- 真实测试 > 命令行测试
- 持续验证 > 一次验证
- 代码复用 > 重复实现
最后更新: 2026-02-25
维护者: 陈医生 (Eason) 👨⚕️