用 Codex Hooks + Obsidian 搭复利工作台:会话自动沉淀与经验切片
每天和 Codex 聊 5-20 个会话,但大部分经验随对话结束蒸发:没有自动沉淀、上下文每次重建、技能真实使用率不可见。这篇笔记记录我用「项目级 hooks + 经验切片 + 分析器」搭的复利工作台(本站 /workbench 是它的公开看板)。
问题:三个复利断点
- 会话结束即蒸发:只有少数会话被人工记进时间流 → Stop hook 自动写一行会话日志
- 上下文每次重建:每会话开头重复发现「今日焦点/活跃项目」→ SessionStart 自动注入
- 经验不可检索:踩过的坑和做成的模式散在 jsonl 里 → 经验切片 + 人审闭环 + 周报
三个项目级 hooks(官方 schema)
在仓库 .codex/hooks.json 定义,只对本仓库生效;需在 Codex /hooks 审查信任后运行(信任按定义 hash 记录,改动后需重新信任)。
| Hook | 触发 | 做什么 |
|---|---|---|
| SessionStart | startup / clear / compact | 把 working.md + 复利指标 + 最近时间流注入 hookSpecificOutput.additionalContext——这是唯一能注入上下文的输出通道 |
| Stop | 每次回合结束(turn 级) | 按会话去重在 memory/session-log.md upsert 一行:日期 / 项目 / 会话 / 技能 / token / 摘要;技能按 registry 白名单过滤,只写元数据不写正文 |
| PreCompact | manual / auto | 压缩前把 working.md + session-log 快照到 .codex/snapshots/(gitignored),防上下文丢失 |
要点与坑:
- Stop 只能通过
systemMessage输出、不能注入 → 用「每会话一行」的日志表,而不是注入 additionalContextLimit设 4000:超出会被 spill 成「存盘 + 预览」,模型就看不到全文- Windows 下 command 用带引号的绝对路径(
"C:\...\node.exe" "F:\...\hook.mjs") - hook 输出
exit 0 + 无输出= 成功且不打扰模型;PreCompact 同理
经验切片:人审闭环
会话日志的「摘要」列由模型补写;运行 pnpm analyze,脚本为每个「已补摘要」的会话生成一张候选卡(memory/slices/):
candidate(AI 提案)→ approved(留用)/ discarded(弃用)/ promoted(沉淀成笔记,填 promoted_to)
对齐 stars 终审模式:AI 提案、人终审、留痕、可废弃。公开站只显示各状态数量,候选内容留在本地。
日报 / 周报 / 技能统计
analyze-sessions.mjs只读解析~/.codex/sessions/**/*.jsonl,输出:会话数、项目分布、技能调用($name与[name](url)两种写法、白名单过滤)、近 14 天技能真实使用- 日报草稿 + 周报草稿自动生成到
drafts/log/(不存在才创建、绝不覆盖),人工补「过程与坑/下一步」后发布 - 技能使用统计直接上 /workbench,替代人工维护 skillUsage 计数
隐私边界
hooks 与分析器只写:日期 / 项目名 / 会话数 / token 总量 / 技能名 / 人工摘要;不读会话正文;候选切片在 memory/(本地),网站只显示数量。
过程中的坑
- Windows PowerShell 5.1 写 UTF-8 会带 BOM,破坏 frontmatter/JSON 解析 → 用 .NET
UTF8Encoding(false)写文件 - session-log 表头从 5 列改 6 列时,脚本要自动迁移旧行;按会话尾号 upsert 并保留人工已补写的摘要
/workbench用 GSAP reveal,折叠区初始visibility: hidden,浏览器 QA 要先滚动再断言 innerText- 解析 jsonl 时
total_token_usage在event_msg的payload.info下,取最大值即可
来源
- Codex Hooks 官方文档:https://learn.chatgpt.com/docs/hooks(镜像:github.com/mehmetbaykar/codex-docs-skill)
- 参考实现:volcengine/OpenViking codex-memory-plugin | obsidian-mind | maxtechera/memory | ozankasikci/global-agent-memory