# 子 agent 结束与 session 收口（导演 + 工具执行）

## 问题

多轮 **subagent**（阶段 4 各角色、事实检索、阶段 6 按 plan 执行）若只「说完就停」，没有**显式结束**，会导致：不知道本子任务是否完成、导演是否该开下一轮、会话是否已可归档。

## A. 单次 subagent 结束（每一跳必须收口）

每次调用 subagent（或等价独立补全）时，**在任务提示中要求**其输出末尾带固定小节（或导演在写入 `transcript.md` 前**代为补写**同一结构）：

```markdown
### 本子 agent 结束说明
- **本段产出摘要**：〈1～3 条 bullet〉
- **子目标完成度**：`完成` / `部分完成` / `阻塞`（阻塞须写原因一行）
- **对导演的提示**：`无，本子 agent 可结束` / `需要下一角色：〈谁〉` / `需要用户确认：〈问句〉`
```

**导演责任**：若模型未输出该块，导演须在摘要进 `state.md` 或 `transcript.md` 时**补全**，不得留空。

## B. 阶段 4（多角色）额外约定

- **每一角色**观点轮 / 互评轮各算一次「单次结束」；上一角色 **结束说明**里若写「需要下一角色」，导演**只**在启动下一角色前核对，避免并行抢话。
- 阶段 4 **全部轮次结束后**：在 `state.md` 写一行 **「阶段 4 已收口」** + 日期（可选）。

## C. Session 级结束（全工作坊收尾）

当 `plan.md` 执行清单**全部勾选**或用户**叫停**时，导演**必须**在 `state.md` 更新（见 `templates/state.example.md`「结束与归档」）：

1. **Session 状态**：`completed`（正常完成）/ `stopped`（用户中止）/ `cancelled`（作废）
2. **结束时间**（ISO 或本地可读时间）
3. **最终交付物路径**（`deliverables/` 下列文件）
4. **当前阶段 phase key**：保持 `phase_6_execution`，与 Session 状态**同时**存在；**不要**在未写 Session 状态时口头说「结束了」

可选：在对话中向用户发 **一句话结案**：交付物位置 + Session 状态。

## D. 与 Orchestrator 的关系

`orchestrator.py` 管理阶段跳转与门禁，但**不**自动检测「是否结束」；收口以导演执行 `orchestrator.py set <sid> session_status completed` + `sync <sid>` 为准。
