> Adapted from thedotmack/claude-mem plugin/skills/handoff/SKILL.md by thedotmack (Apache-2.0 License). 方法论等价,全文重写并本地化,记忆指针一节改为通用记忆层适配。
交接简报 · 让下一个会话无缝接手
写一份 HANDOFF.md,把"这个会话发生过什么、为什么走到这一步、下一步该干嘛"完整交给一个从没见过这段对话的新会话。目的:不把已经劣化的上下文拖进新会话,只带走结论和事实。
何时使用
- 会话很长,Agent 已经开始糊涂或反复重复
- Agent 在同一个失败方案上反复重试
- 用户想离开,稍后换个新会话继续
- 压缩(compact)之后,Agent 仍然方向不清
- 用户说:"交接"、"写个 handoff"、"生成交接文档"、"换个新会话继续"
交接的七段结构
写之前,先完整回顾本次对话的全过程。简报是写给新 Agent 的,不是写给用户的——用户知道发生过什么,新 Agent 一无所知。
1. 目标(Goal)
一段话。用户真正想达成什么?写终态,不写当前的子任务。要具体到新 Agent 读完就能定位方向。
- 差:「修复登录问题」
- 好:「让 OAuth 登录在 Vercel 部署环境下不再报 redirect_uri mismatch,验收标准是浏览器完整走通登录→回跳→拿到用户信息」
2. 当前状态(Current State)
现在什么是好的?什么是坏的?坏的具体症状是什么?关键错误信息原样贴上(含报错码、堆栈要点、复现步骤)。新 Agent 靠这一节判断自己是接着修,还是先验证现状。
3. 涉及文件(Files in Play)
列出本次会话读过、改过、建过的所有相关文件,用绝对路径或仓库相对路径。每个文件后面跟一行说明它为什么重要(改了什么/有什么坑/角色是什么)。
4. 已试败路(What Has Been Tried, and Why It Failed)
全篇最重要的一节。 列出每一条尝试过但没走通的路线,并写清为什么失败——不是"失败了",而是失败机理。跳过这一节的新 Agent,几乎必然重蹈覆辙。
- 差:「方案 A 失败了」
- 好:「方案 A(加延迟重试)失败:竞态根源是两个进程同时写 positions.csv,加延迟只是降低概率,4 次重试中仍出现 2 次行交错」
5. 当前最优假设(Current Best Theory)
还没验证、但你目前最相信的路线是什么?附上支持它的证据或推理。这一节让新 Agent 从"假设"起步而不是从零摸索。
6. 下一步行动(Next Steps)
具体、有序、可直接开干的动作清单。精确到文件路径、函数名、要跑的命令。新 Agent 看完第 1 步就应该能立刻动手。
- 差:「继续修鉴权」
- 好:「① 打开 src/auth/middleware.ts:47,token 过期检查用的是 Date.now(),应改为 req.timestamp;② 同文件 52 行的比较运算符写反了(> 应为 <);③ 改完跑 npm test -- auth」
7. 关键约束与上下文(Key Constraints)
一切不写下来就会丢的非显性约束:环境细节(操作系统/运行时版本)、用户在本次会话表达过的偏好、用户明确说不要做的事、外部依赖、性能要求、合规边界。
补充:记忆指针(可选)
如果当前环境有持久记忆层(项目记忆文件、历史会话检索、云档案),列出与本次任务最相关的 1~3 条具体指针:关键词、文件路径、值得重跑的检索词。新 Agent 可据此深挖。没有可用记忆层就整节约掉。
写作纪律
- 写给新 Agent,不是写给用户。 它是一份进场简报,不是工作汇报。
- 每句话承重。 删掉所有铺垫、客套、感想。模糊的下一步等于没有下一步。
- 败路必须带机理。 「为什么失败」比「失败了」值钱一百倍。
- 错误信息原样保留。 转述会丢关键细节(错误码、行号、参数值)。
- 不要写成流水账。 按"新 Agent 需要知道什么"组织,不按"事情发生的顺序"组织。
输出
写入当前工作目录的 HANDOFF.md(项目根目录),结构:
# 交接简报(HANDOFF)
> 生成时间:YYYY-MM-DD HH:MM
> 项目:<项目名或目录>
## 1. 目标
## 2. 当前状态
## 3. 涉及文件
## 4. 已试败路(含失败原因)
## 5. 当前最优假设
## 6. 下一步行动
## 7. 关键约束与上下文
## 8. 记忆指针(可选)
写完后用一句话向用户交付:「交接简报已写入 HANDOFF.md,新会话开场白:请读取项目根目录的 HANDOFF.md 并从下一步行动第 1 条继续。」