# 会话衔接协议（主动交接）执行细则

> a02 memory-pm 的「会话衔接」节的下沉细则。全局纪律见 `CONVENTIONS.md §9`，编排器阶段交接见 light-orchestrator `SKILL.md §5`。本协议是**主动交接**（事前留种），与 orchestrator §0 的**被动断点恢复**（事后救火）互补，不互相替代。

## 为什么要主动交接

真实事故（2026-06-11）：用户在一个长审计对话里上下文耗尽，对话彻底无法继续，只能人肉重述才接上。Light 原有的只是**被动断点恢复**（orchestrator §0 六探针，等用户说"继续"才事后救火）。缺的是**主动交接**——在上下文将尽或一段任务收尾时，主动给用户一段"新对话启动提示词"，让下一个对话零成本无缝接上，并能沿衔接链追到任意上级对话。

## 四类触发条件（宁早勿晚，阶段边界默认触发）

agent 无法精确读 token 量，按行为性信号判断：

| 触发 | 判据 |
|---|---|
| T1 上下文水位 | 对话已很长 / 已读大量文件 / 感知到压缩摘要出现 / 用户说"快不行了" |
| T2 任务完成 | 本段任务收尾时，主动给"下一步"的启动提示词（哪怕用户没要） |
| T3 阶段切换 | orchestrator 检查点通过、进入新阶段前（与 §5 阶段交接合流） |
| T4 用户索要 | "给我衔接提示词 / 开新对话继续 / 这个对话快满了" |

边界：与"继续写这段 discussion / 继续润色上一段"这类**单技能续写**不同——后者不触发交接，直接走 m07/m08。区分点：是否需要跨会话保住"做到哪、下一步"的状态。

## 两件套产出（触发时必须同时交付）

1. **衔接卡（handoff card）落盘**：自包含的状态快照文件，给下一个 agent 读；模板见 `templates/handoff_card.md`。
2. **启动提示词打印**：直接打印在聊天里的一段中文提示词，用户复制→新开对话→粘贴即续；模板见 `templates/handoff_prompt.md`。agent 须按模板**填好具体值**再打印，不是把模板原样丢给用户。

## 落盘规则

- 路径：项目内 `.light/handoff/S<NN>-<slug>.md`（与 `.light/passport.yaml` 同级；`<NN>` 两位序号递增，`<slug>` 取本段目标短横线英文）。
- **无项目目录的轻对话**：只打印启动提示词，不落盘卡（这是本协议已知局限，如实声明——没有 `.light/` 时衔接卡无处安放，靠提示词单件传递状态）。
- 落卡前先看 `.light/handoff/` 已有最大序号，新卡序号 = 最大 + 1；`parent_session` 填上一张卡的序号（首卡写 `none`）。

## 自包含原则（无缝衔接到上级任意对话的实现方式）

每张卡必须**独立可读**：下一个 agent 只读最新一张卡就能续上，不需要翻任何历史对话。要衔接更上级的对话，沿卡里的 `parent_session` 字段一路读对应旧卡即可（S04→S03→S02…）。这就是"无缝衔接到上级任何一个对话"的落地方式——衔接链是文件链，不是聊天记忆链。

## 自传播条款（协议不许用一次就断）

启动提示词模板末行写死"自传播"要求：每个接手会话收尾时**必须**再生成下一张卡 + 下一段启动提示词。少了这一步，协议用一次就断链，下下个对话又得人肉重述。

## 与既有机制的关系（写清避免概念打架）

- **主动交接（本协议）**：事前留种，恢复成本趋零。
- **被动恢复（orchestrator §0 六探针）**：没有衔接卡时的兜底，保留不动。
- **衔接卡 ≠ 当前事实**：下一个 agent 拿到卡只是入口，仍须按 orchestrator §5 既有纪律刷新 `git status` / passport / db09 / CI 等当前证据，不能把卡当成现实直接续跑。
- **第一行是对话命名建议**：客户端没有改名 API，只能请用户手动设置；编号（S03/S04…）让对话列表天然有序，正是用户的原始诉求。
