SuperAPI AI 工具集

session-handoff

智能体与模型

查看项目

更新于 10-16 06:26

技能介绍

Session Handoff 是一项面向智能体会话的技能,用于把一个完整的 agent 会话压缩成一份交接文档,让新的会话能够从上一个会话停止的地方准确继续,如同其上下文窗口被延长了一样。

核心理念

交接不是对上下文的摘要,而是上下文的移植。继任者不是在阅读别人的工作简报,它本身就是这个会话,只是换了一个新的窗口。继任者行动所需的一切都必须在磁盘上、可寻址,并且在它读取时仍然为真。该技能本身很小是刻意的设计,真正重量级的产物是它生成的 markdown 文档,其完整契约定义在 .agents/skills/session-handoff/references/capture-contract.md 中。

与相似机制的区别

资料中明确区分了几种容易混淆的场景:把限定范围的任务交给另一个会话并监督它,属于编排(orchestration:Task、Dispatch、mailbox,工作会返回),使用 /orca-orchestration;把工作交出去且不再关心,是任务所有权的单向转移,无返回,使用该二进制自带的 orca-cli 指南;为下个月记住一个决策,属于跨会话的持久化事实、项目范围,使用 Engram(mem_save);缩小窗口并继续,是 harness 的压缩(compaction),有损、不可寻址、也不由你塑造,无需任何操作;而把整个会话交给它自己的继任者,才是本技能。关键区别在于:压缩保留的是摘要器判断为重要的内容,而交接保留的是下一个行动者需要的内容,这是两套不同的集合,且只能由唯一知道差异的一方来撰写。

何时撰写交接

手动是主要触发方式,这是有意为之:人类注意到窗口正在填满并说出来,然后该技能运行,没有轮询、没有唠叨、不花费 token 去猜测。是否有任何 harness 能自动触发这一点,在 .agents/skills/session-handoff/references/auto-trigger.md 中有带引用的解答,在向所有者承诺自动模式之前应先阅读该文件。

满足以下任一条件时应撰写:上下文窗口超过所有者设定的阈值(约 500k tokens,除非所有者指定其他值;这是关于该模型在何处开始退化的、按所有者判断的标准,不是项目配置,因此保留在对话中而非 yaml 键里);会话即将结束但仍有工作进行中;会话即将执行本身会消耗大量窗口的操作(如大规模采集、超长文件读取),而剩余预算不足以覆盖其后的工作;所有者提出要求。

当剩余工作能舒适地放入窗口时,不要撰写。撰写交接本身要消耗一块真实的上下文,过早启动的继任者只会白白支付启动成本。

三个步骤

第一步捕获:逐节走查 .agents/skills/session-handoff/references/capture-contract.md,每个段落都是必填的,空段落写作明确的 none 行,绝不省略——省略与遗忘无法区分,继任者也无法判断究竟发生了什么。

第二步撰写:将 .agents/skills/session-handoff/templates/handoff.md 填写到 <<PRIMARY_ROOT>>/.session/handoffs/<session-name>-handoff-NN.md。

第三步启动继任者:遵循 .agents/skills/session-handoff/references/successor-launch.md。有运行时的情况下由本会话启动它;没有运行时的情况下,本会话打印该命令行,由人类粘贴执行。

命名与位置契约

文件位于 <<PRIMARY_ROOT>>/.session/handoffs/<predecessor-session-name>-handoff-NN.md。.session/ 被 gitignore,交接按设计是一次性的:它描述单个会话的状态,不是项目记录,提交它等于把一个正在衰减的快照纳入版本控制。

即使会话在链接的工作树(worktree)中运行,文件也存放在主检出目录 PRIMARY_ROOT(见 .agents/README.md §"Checkout roots")中。写在 worktree 里的交接会随 worktree 一起消亡,且同一谱系的两个 worktree 会各自从自己的空目录计算 NN。继任者仍在与前任相同的 worktree 中启动,只有文件位于主目录。

NN 是两位零填充,从 01 开始,在整条谱系中递增。选择之前先列出 <<PRIMARY_ROOT>>/.session/handoffs/,绝不要假设,也绝不要从 worktree 自己的 .session/ 计数。继任者的会话名就是交接文件去掉扩展名后的 basename,这就是全部命名规则,它让谱系仅从文件列表即可读懂:<base>、<base>-handoff-01、<base>-handoff-01-handoff-02。长名字正是要点,读不懂的谱系就是无法审计的谱系。比会话更长寿的持久事实不属于交接,它属于 Engram、仓库或跟踪器,交接只引用它。

硬性规则

给每条结论标注 measured、read 或 predicted。前任对继任者将发现什么的猜测有用,但也是最容易过时的东西;把预测的分支当成事实陈述,会让继任者走上一条已不存在的路径。measured 指本会话运行过并读取了输出;read 指它来自某份文档且被采信。

把易失状态标记为 PERISHABLE,并附上测量时的挂钟时间。运行中的 worker、打开的 mailbox、进行中的 PR、活跃运行都会在撰写与读取之间衰减。对任何标记为 perishable 的内容,继任者的指令是先重新验证再行动,而不是行动后才发现。

易失优先于优先级。如果某个易失项需要在优先列表之前处理,就在同一行说明。继任者若在活跃 worker 等待时仍遵循过时的优先级顺序,那恰恰是交接本应防止的事。

ID 一律复制,绝不描述。run id、dispatch id、终端句柄、session id、PR 编号、跟踪器键、commit SHA:逐字放在反引号中,以可粘贴的形式呈现。“之前那个 worker”不是 ID。

每个路径都必须是绝对路径,继任者可能从不同目录启动。

写明什么没有完成以及为什么。一份读起来像从未间断的成功记录的交接,就是一份隐藏了东西的交接,而隐藏的东西总是会咬人。

在启动继任者之前先写好文件。两者不可分割,顺序不可颠倒:先启动的继任者会去读一个尚不存在的文件。

Harness 对等。继任者在与前任相同的 harness 上运行。为某个 agent 约定塑造的交接交给另一个 agent,是没人要求的翻译问题。

任何地方都不要出现 AI 归属(关键规则 #3)。交接是仓库产物,用英文书写,即使对话本身不是英文。

不要删除前任的交接。谱系就是审计轨迹,写 -handoff-02 永远不会移除 -handoff-01。

参考资料:.agents/skills/session-handoff/references/capture-contract.md 载有十个必填段落、各自的用途以及支撑它的失败模式;successor-launch.md 说明在有运行时和无运行时、按 harness 启动继任者的方式,以及为什么这不是编排;auto-trigger.md 说明是否有 harness 向 hook 暴露上下文大小,附引用与结论;templates/handoff.md 是要填写的骨架。相关准则:agentic-qa-core/references/session-footer-contract.md(会话关闭时报告什么)与 briefing-template.md(7 个组成部分,交接刻意不是它:briefing 界定任务范围,handoff 移植整个会话)。