上下文快满的时候有一个小技巧:清空会话之前,先让 Agent 把方案、进度和 TODO 写进 docs/progress.md,新会话里读一下就能接着干。
文件才是长期记忆,会话不是。
这个技巧很好用,但有个问题:每次都得你记得去做。 忘了一次,上下文一压缩,进度就丢了。
ECC 用 Hook 把这件事自又往前走了一步:不光记住做到了哪,还要从会话里学到东西。
一、一个会话的生命周期

ECC 在会话的四个时间点上挂了 Hook:
SessionStart ─── 读:找到上一次同一个项目的会话摘要 + 学到的习惯 → 注入上下文
│
│ ……正常干活……
│
PreCompact ───── 抢救:压缩之前,让 Haiku 把最近的对话总结一遍,写进会话文件
│
Stop ─────────── 存:每轮回复结束,更新会话文件(做了什么、改了哪些文件)
│
SessionEnd ───── 收尾标记
会话文件默认存在 ~/.claude/session-data/ 下,文件名像 2026-10-10-a1b2c3d4-session.tmp。文件头部写着项目名和工作目录(Worktree),后面是任务、改过的文件、用过的工具等。
Stop 这一步就是自动版的「写 progress.md」。下面重点看读(SessionStart)和抢救(PreCompact)。
二、SessionStart
注入历史,但要标明「这是历史」,scripts/hooks/session-start.js 在新会话开始时做这几件事:
- 清理 30 天以前的会话文件
- 在最近 7 天的会话里,找工作目录和当前一致的那一份
- 加上「学到的习惯」(本节第五部分讲)和学到的 Skill 摘要
- 拼在一起注入上下文,总长度默认不超过 8000 个字符
第 2 步有个坑:同一台电脑上的所有项目共用一个 session-data 目录,按修改时间拿最新的那份,经常拿到隔壁项目的摘要。所以 ECC 在会话文件头部写上工作目录,启动时按当前目录去匹配。
第 4 步的上限也有讲究:注入的内容会占每一轮的上下文。8000 字符的上限可以通过 ECC_SESSION_START_MAX_CHARS 调整,设成 ECC_SESSION_START_CONTEXT=off 就完全不注入。
这一节最值得看的,是注入时包在摘要外面的这段话: