用 Codex Hooks + Obsidian 搭复利工作台:会话自动沉淀与经验切片

大纲 · 7 节
  1. 问题:三个复利断点
  2. 三个项目级 hooks(官方 schema)
  3. 经验切片:人审闭环
  4. 日报 / 周报 / 技能统计
  5. 隐私边界
  6. 过程中的坑
  7. 来源

每天和 Codex 聊 5-20 个会话,但大部分经验随对话结束蒸发:没有自动沉淀、上下文每次重建、技能真实使用率不可见。这篇笔记记录我用「项目级 hooks + 经验切片 + 分析器」搭的复利工作台(本站 /workbench 是它的公开看板)。

问题:三个复利断点

  1. 会话结束即蒸发:只有少数会话被人工记进时间流 → Stop hook 自动写一行会话日志
  2. 上下文每次重建:每会话开头重复发现「今日焦点/活跃项目」→ SessionStart 自动注入
  3. 经验不可检索:踩过的坑和做成的模式散在 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 下,取最大值即可

来源