THREAD LIFECYCLE
Threads 与 Turns
从首次发送到 resume、fork、interrupt 与 recover,分清连续工作容器和单次执行。
先说结论
一次对话保存在 Thread 中,每次执行则是一个 Turn。start、resume、fork、stop 和 recover 改变的是不同状态,不能当作同一组重试按钮。操作前先在桌面工作区选择可信项目目录。
怎么理解
| 对象 | 保存什么 | 生命周期重点 |
|---|---|---|
| Thread | 项目、Provider 身份、模型配置、Prompt snapshot 和历史绑定 | 可 start、resume、fork、stop、recover |
| Turn | 一轮输入、附件、技能引用、Provider turn ID 与状态 | 可 prepare、start、steer、interrupt、force complete |
| Provider session | 与 Codex app-server 或适配中的 Claude CLI 的在线连接 | 可断开并按各自持久绑定恢复;能力不对等 |
Thread 是连续工作容器,Turn 是容器中的一次执行。空白草稿首次发送必须先 thread/start,取得 Thread ID 后再 turn/start。Prompt 的静态规则和 start-only section 只在创建 Thread 时组装一次;每个 Turn 再加入动态上下文、附件与本轮输入。
Prompt snapshot 和 runtime config snapshot 分开保存。恢复时不能从当前默认值重算历史 Prompt,否则同一个 Thread 的执行语义会漂移。
怎么使用
新建
空白草稿 -> thread/start -> 持久化 Thread 与 Prompt snapshot
-> turn/start -> Provider 执行并发出事件
继续
thread/resume 读取持久 Thread、Provider binding、Prompt snapshot 与运行时身份,再调用对应 Provider 的 ResumeSession。恢复成功后,新的 Turn 仍通过 turn/start 发出。
继承
thread/fork 从当前 Provider 历史分出新 Thread,继承稳定 Prompt snapshot,先以 creating 状态落盘,再恢复新 Provider session。成功后只产生一个新的 kickoff Turn;它不是总结旧对话后重新执行 thread/start。
常见问题
- Thread 已创建但 Turn 未启动:保留 Thread,重新发送前先核对活动 Turn,避免重复提交。
- Provider binding、CWD 或身份不完整:resume/fork 直接失败,不猜默认 Provider 或路径。
- fork kickoff 在可诊断运行阶段失败:保留
failed状态;启动前半成品失败则清理 Thread、binding 与 snapshot。 - active Turn 正在执行:普通发送应转为 steer 或 interrupt,不能并发启动第二个 Turn。
- Provider 断线:recover 需要重建传输、执行
thread/resume,必要时重放 pending Turn;只重连 WebSocket 不算恢复完成。
适用范围
- UI 的“完成”只表示 Turn 进入终态,不等于仓库门禁通过。
force complete是生命周期修复入口,不是正常成功路径。- Thread 的 public ID 与 Provider 内部 ID 可以不同;界面只应暴露 public identity。
- 跨 Provider 无损迁移不在当前承诺范围内;Provider 身份和能力属于 Thread 配置的一部分。
- Codex 是完整 Driver 的默认集成路径;Claude 仍在适配且不支持子 Agent Orch,不能从共享 Thread/Turn 抽象推导出等价能力。
延伸阅读
阅读Harness Orch,理解 Codex 集成路径中的 Thread 如何成为子 Agent 协作载体。