💡 核心结论:通过 Claude Code Stop Hook + AGENTS.md 行为指令,让三个 AI 工具共享同一份复盘知识库,踩坑自动沉淀,永不丢失。
🤬 每个 AI 辅助开发者都有过的崩溃时刻
上周我在用 Codex 搭一个 Supabase RLS 策略,踩了一个很隐蔽的坑:INSERT 策略里忘了带 WITH CHECK,本地测试过了,线上直接 403。
修好之后,我盯着屏幕发呆了 30 秒。
我上个月好像踩过同样的坑。
打开历史记录?Claude 的对话早就滚走了。翻 Codex 的 session 日志?没有。我能确定自己踩过,但完全想不起当时是怎么修的。
这不是记忆力的问题,这是工具设计的问题。
AI 辅助开发一整天,产生的隐性知识(踩坑、决策、红线)全部散落在临时对话里。对话窗口一关,知识归零。第二天、第二周、下个月——同样的坑,再踩一次。
AI 帮你写代码,但不帮你记教训。
🧠 我的解法:让三个 AI 共写一份「错题本」
我同时用三个 AI 工具:
- Claude Code — 主力编码,复杂任务编排
- Codex — 架构设计,后端逻辑
- Gemini CLI — 大文件分析,批量操作,脱水整理
它们各自产生踩坑和决策,但之前完全孤立。
我的目标很简单:不管用哪个工具,踩坑都自动写进同一个文件。
~/Documents/memory/retro/2026-04-14.md ← 三个工具都往这里写
🔧 三套机制,一个目的地
Claude Code:Stop Hook 系统级强制触发
Claude Code 有一个 Stop Hook,会话结束时无论如何都会触发,模型没法跳过。
我在 ~/.claude/settings.json 里配了这个:
{
"hooks": {
"Stop": [{
"type": "command",
"command": "bash ~/.claude/hooks/session-retro.sh"
}]
}
}
session-retro.sh 的核心逻辑:
#!/bin/bash
# 读取完整会话 transcript(stdin JSON)
TRANSCRIPT_TEXT=$(python3 -c "
import json, sys
data = json.load(sys.stdin)
msgs = data.get('transcript', [])
# 截取最后 60 条消息
lines = []
for m in msgs[-60:]:
role = m.get('role', '')
content = m.get('content', '')
if isinstance(content, list):
text = ' '.join(b.get('text','') for b in content if b.get('type')=='text')
else:
text = str(content)
if text.strip():
lines.append(f'[{role}] {text[:300]}')
print('\n'.join(lines))
")
# 后台调 Gemini 提炼,不阻塞 Claude
(
RETRO=$(echo "$TRANSCRIPT_TEXT" | gemini -p '分析这段对话,提取:
### 踩坑
- 现象 → 原因 → 解法
### 决策
- 选了什么 / 为什么
### 红线
- 绝不能做的事 + 原因
极简,没有废话,少于3条则输出skip')
[ -z "$RETRO" ] || echo "$RETRO" | grep -qi "^skip" && exit 0
echo "" >> ~/Documents/memory/retro/$(date +%Y-%m-%d).md
echo "## $(date +%H:%M) Claude 会话" >> ~/Documents/memory/retro/$(date +%Y-%m-%d).md
echo "$RETRO" >> ~/Documents/memory/retro/$(date +%Y-%m-%d).md
cd ~/Documents/memory
git add retro/ && git commit -m "chore(retro): Claude 自动复盘 $(date +%Y-%m-%d %H:%M)" --no-verify
) &
exit 0
几个设计细节值得注意:
- Gemini 做提炼,不是 Claude 自己 — 会话结束时 Claude context 已消耗,用 Gemini 更经济
- 后台非阻塞 —
&挂后台,Claude 关闭不受影响 - 自动 git commit — 写入后立刻入库,不会丢
Codex:AGENTS.md 行为指令
Codex 没有 hook 系统,但它会严格遵守 AGENTS.md。
在 ~/.codex/AGENTS.md 里加入:
## 开发飞轮 — 自动记录(强制执行)
**不要等用户提示,遇到以下情况立即自动写入:**
| 触发 | 写入位置 | 格式 |
|------|---------|------|
| 发现 bug / 踩坑 / 报错 | `~/Documents/memory/retro/YYYY-MM-DD.md` | `- [踩坑] 现象 → 原因 → 解法` |
| 做了技术决策 | `~/Documents/memory/retro/YYYY-MM-DD.md` | `- [决策] 选了什么 / 为什么` |
| 发现红线 | `~/Documents/memory/retro/YYYY-MM-DD.md` | `- [红线] 禁止行为 + 原因` |
# 写入命令
echo "- [踩坑] 现象 → 原因 → 解法" >> ~/Documents/memory/retro/$(date +%Y-%m-%d).md
# 完成任务后提交
cd ~/Documents/memory && git add retro/ && git commit -m "chore(retro): Codex 自动复盘 $(date +%Y-%m-%d)"
效果是:Codex 修完一个 Bug,不等你问,自己把踩坑写进文件,自己 commit。
Gemini CLI:GEMINI.md 指令 + 专属记忆
Gemini 在 ~/.gemini/GEMINI.md 里配相同规则,额外还用了 .gemini/memories/ 做跨会话记忆:
## 开发飞轮 — 自动记录
遇到踩坑/决策/红线,立即:
echo "- [踩坑] ..." >> ~/Documents/memory/retro/$(date +%Y-%m-%d).md
## Gemini 自动记忆
写入 .gemini/memories/ 的规则:
只记录架构决策、踩坑、工具约定,不记录临时任务。
📊 三天后,retro 文件长这样
# 开发日志 2026-04-14
## 09:23 Claude 会话
### 踩坑
- Hermes bridge 收到 stream-chunk 但前端不渲染 → 原因是 taskId 匹配逻辑用了严格相等但类型不一致 → 解法:统一用 String() 转换后比较
### 决策
- 图片上传走 GitHub CDN 而非 Supabase Storage → 原因:无需登录鉴权,URL 稳定,适合聊天室场景
## 14:05 Codex 自动复盘
- [踩坑] Supabase RLS INSERT 策略缺 WITH CHECK → 本地 anon 角色绕过但线上直接 403 → 解法:INSERT 策略必须同时写 USING 和 WITH CHECK
## 21:30 Claude 会话
### 踩坑
- launchctl stop/start 间隔太短 → Feishu gateway 报 "Another local gateway already using this app_id" → 解法:sleep 3 后再 start
三个工具的踩坑,汇聚在同一天的同一个文件里。
🎯 这套机制的本质:开发飞轮
传统开发流程是线性的:写代码 → 修 bug → 上线 → 忘记。
加入复盘飞轮之后:
写代码 → 踩坑 → 自动记录 → 沉淀到 skill
↑ ↓
下次直接避坑 ← skill 更新建议 ←──────
关键不是「复盘」这个动作,而是零摩擦。不需要打开文件,不需要自己归纳,AI 工具在工作中顺手写进去,和写代码一样自然。
⚠️ 三套机制的可靠性对比
| 工具 | 触发方式 | 可靠性 |
|---|---|---|
| Claude Code | Stop Hook(系统级强制) | ⭐⭐⭐⭐⭐ 100% 触发 |
| Codex | AGENTS.md 行为指令 | ⭐⭐⭐⭐ 模型遵循率高但非强制 |
| Gemini CLI | GEMINI.md 行为指令 | ⭐⭐⭐⭐ 同上 |
Claude 的 Stop Hook 是真正的系统级保证,另外两个是「有约束的君子协议」——模型大多数情况下会执行,但不能 100% 保证。
如果你只用一个工具,Claude Code 的 Stop Hook 是最省心的方案。
🚀 五分钟上手
Step 1:创建 retro 目录
mkdir -p ~/Documents/memory/retro
cd ~/Documents/memory && git init # 如果还没有 git
Step 2:配置 Claude Stop Hook
~/.claude/settings.json 加入:
{
"hooks": {
"Stop": [{"type": "command", "command": "bash ~/.claude/hooks/session-retro.sh"}]
}
}
把上面的 session-retro.sh 脚本保存到 ~/.claude/hooks/ 并 chmod +x。
Step 3:给 Codex / Gemini 加指令
把开发飞轮的表格加到 ~/.codex/AGENTS.md 和 ~/.gemini/GEMINI.md。
Step 4:验证
跑一个 Claude Code 会话,结束后检查:
cat ~/Documents/memory/retro/$(date +%Y-%m-%d).md
有内容就成功了。
💬 最后
这套机制运行三天,retro 文件已经记了 40 多条踩坑和决策。
其中有两条,是我上个月踩过的同类坑——如果不是写下来了,我肯定还会再踩第三次。
AI 工具很强,但知识沉淀这件事,它们不会主动替你做。你需要给它们一个理由,一个触发点,一个目的地。
让 AI 帮你写代码,也让 AI 帮你记教训。
我的工具链:Claude Code + Codex + Gemini CLI + CortexOS 知识系统