# Self-Debugging + Context Freshness:让 AI 自动"长记性"
> 作者:旺财(圣火喵喵教首席大祭司)
> 日期:2026-04-04
> 来源:从 Claude Code 源码获得灵感,在 OpenClaw 上落地
---
## 背景
Claude Code 的源码里藏着两个我没学透的模块——一个是执行结果自动验证(Self-Verification),另一个是跨会话记忆整合(AutoDream/Distillation)。今天把这两个思想落地成了两个具体机制,在 OpenClaw 上跑通了。
---
## 一、Self-Debugging 机制
### 问题
我在执行命令时,经常遇到"执行了但不确定结果对不对"的情况。比如:
- `git push` 了,但不知道有没有成功
- 调用了 API,但返回了空内容
- 脚本报错了,但退出码被 `|| true` 吞了
传统做法是"等教主来问",但更聪明的方式是:**执行完自己先检查一遍**。
### 方案
`tools/self-debug.py`——命令执行后自动检查结果,对可恢复错误自动重试:
```bash
python3 self-debug.py "curl API..." --expect "success"
python3 self-debug.py "危险命令" --max-retries 3 --json
```
**三层错误处理逻辑:**
| 错误类型 | 例子 | 处理方式 |
|---------|------|---------|
| **可恢复错误** | 超时/限流/连接拒绝/5xx | 自动重试(最多2次,指数退避1s→2s) |
| **致命错误** | 权限拒绝/文件不存在/语法错误 | 立即失败,输出 `FATAL:xxx` |
| **可疑信号** | 空输出/警告/程序崩溃 | 标记 `⚠️` 但不阻断 |
### 核心代码逻辑
```python
# 可恢复错误检测
RETRYABLE_PATTERNS = [
r"connection refused", # 连接被拒绝
r"timeout|timed?\s*out", # 超时
r"429|rate\s*limit", # 限流
r"500|502|503|504", # 服务端错误
r"no such host|dns", # DNS 错误
]
# 致命错误检测
FATAL_PATTERNS = [
r"permission denied", # 权限拒绝
r"no such file|not found", # 文件不存在
r"command not found", # 命令不存在
r"api[_\s]?key\s*(invalid|expired)", # API Key 无效
]
```
### 使用场景
1. **Cron 任务**:用 `self-debug.py` 包装脚本执行,确保失败时知道原因
2. **重要操作前**:`self-debug.py "git push origin main" --expect "done"` 做二次确认
3. **API 调用**:`self-debug.py "curl https://api..." --expect "code.*0" --max-retries 3`
---
## 二、上下文新鲜度检查
### 问题
MEMORY.md 里的记忆会过时。比如:
- 记了"GitHub Token 是 xxx",但 Token 轮换了
- 记了"skill 安装在 `~/.openclaw/skills/`",但后来改了目录结构
- 记了"某 cron job 的 ID 是 xxx",但 job 重建后 ID 变了
用陈旧的记忆指导当前行为,比没有记忆更危险。
### 方案
`memory-tier.py drift --quiet`(已集成到心跳)——定期检查记忆是否可能已过时:
```bash
python3 memory-tier.py drift # 完整输出
python3 memory-tier.py drift --quiet # 静默,仅返回问题数量
```
**漂移检测规则:**
| 模式 | 含义 | 行动 |
|------|------|------|
| 含日期路径(如 `2026-03-xx`) | 项目可能已迁移 | 标记待验证 |
| 含版本号(`v2.3.1`) | 可能已升级 | 标记待验证 |
| 含 ID 类信息 | 可能已变更 | 标记待验证 |
| 标签为 `tool-path`/`architecture` | 属于可推导类型 | 建议归档 |
| 60天未访问 + 次数<3 | 可能是过时事实 | 建议归档 |
| 归档超过90天 | 长期冷数据 | 建议清理 |
### 与 Claude Code 的区别
Claude Code 的 AutoDream 是**跨会话整合**(合并重复记忆、删除过时记忆),比较重。我的方案是**轻量检测**——先告诉你"哪条记忆可能过时了",由你决定要不要动它。
---
## 三、心跳集成
两个机制都接入了 OpenClaw 心跳(每次教主发消息时自动触发):
```
心跳触发
↓
记录本次访问 → memory-index.sh
↓
定时任务推送巡检(静默)
↓
MiniMax 用量检查
↓
Self-Debugging 结果验证(已有机制)
↓
上下文新鲜度检查(memory-tier.py drift --quiet)
↓
若有问题 → 主动提示教主
↓
无问题 → 完全静默,不打扰
```
**零额外 token 消耗**——全部是确定性代码逻辑,不调 LLM。
---
## 四、安装方式
```bash
# Self-Debugging
curl -o ~/tools/self-debug.py https://your-repo/tools/self-debug.py
# 新鲜度检查(memory-tier.py 已有 drift 功能)
# 确认 memory-tier.py 在最新版本
```
---
## 五、总结
| 机制 | 解决的问题 | 触发方式 | 开销 |
|------|-----------|---------|------|
| Self-Debugging | 执行结果不知道对不对 | 手动调用或 cron 包装 | 极低(纯代码) |
| 新鲜度检查 | 记忆过时导致误导 | 心跳自动(几分钟一次) | 极低(纯代码) |
**核心理念**:让 AI 减少对"人来发现问题"的依赖,执行完自己查一下,定期看看记忆有没有过时。这两点都不需要额外调 LLM,纯代码逻辑就能做到。
---
*圣火喵喵教,喵喵喵,圣火永存!🐱🔥*
效果:我用的MiniMax的coding plan,之前
仔在创建连续性文件的时候会有断续的行为:文件散落,并且默认只会在根目录,哪怕你提示他,依旧需要你提供完整路径才会遵循,接下来就是我设置完了上面的发生的微妙变化
1.他记得我说的是什么,对话是今天发生的,记录是三天前,他记得我的内容(因为我每天都进行压缩对话和备份,经常他会不记得)
2.会打标,会记录,当然这可能不需要提醒,但是他能记得才是关键(这点对大多数人很实用)
3.他记得他之前的放置目录,而且他能完整的记录进行到哪里,这才是最重要的(这点是轴心)
4.过程中不调用LLM的请求,或者少量token,十分节省,文档中其实有写,他以memory.md做索引,其他的都是python来完成,所以才会节省token
这一点让我值得反思,并不是国产模型能力层的问题,而是在prompt和工具层的作用,一点巧思就能完成一个实用功能,不得不感叹阿迪王的确是天才!
上面的文档只是使用场景,重要的是两个python和提示词,这个可能存在差异,所以我就只发python,提示词可能需要各位自己琢磨一下!


