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

根因分析:为什么反复修复同一问题却仍然失败

版本: 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: 架构理解优先于代码修改

不知道调用链,就不应该修改代码

修改前必须知道:

  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

流程改进

  • 修复前先搜索所有相关代码
  • 理解完整调用链再修改
  • 真实环境测试后再声称修复
  • 设置第二天验证提醒

文档更新

  • 更新技能依赖关系图
  • 记录农历计算实现位置
  • 添加架构调用链文档

🔗 相关文档


💡 核心教训

反复修复同一问题的根本原因,不是技术能力不足,而是方法论错误。

正确的修复方法论:

  1. 全面搜索 > 立即修复
  2. 理解架构 > 修改代码
  3. 真实测试 > 命令行测试
  4. 持续验证 > 一次验证
  5. 代码复用 > 重复实现

最后更新: 2026-02-25
维护者: 陈医生 (Eason) 👨