对齐主线Goal条件中断语义
Project CI / Repository checks (pull_request) Successful in 1m13s
Project CI / Frontend tests (pull_request) Successful in 3m23s
Project CI / Backend tests (pull_request) Successful in 4m10s
Project CI / Native shell tests (pull_request) Successful in 14m47s

恢复普通runtime.steer仅入队语义,避免Goal编辑提前中断Provider。

移除与最新主线不一致的Goal立即中断说明。
This commit is contained in:
2026-08-11 11:50:54 +08:00
parent 08a96e251c
commit d6abd2a1fc
4 changed files with 2 additions and 9 deletions
@@ -1638,8 +1638,6 @@ V1.52 保留 V1.51 一次性 `codex_cli` 和原 HTTP `provider`,新增 `codex_
V1.53 把根 Project Supervisor 的 same-run steer 从“收到消息立即中断”改为“先回复并判断、按需中断”。用户消息仍先进入原 run 的 durable steer ledger 与 conversation;公开确认明确说明正在判断且当前任务继续运行。随后由独立 LLM turn 调用严格 `runtime_steer_decision`,一次返回自然语言 `reply``interruptCurrentProvider` 与安全原因。该回复按 steer 身份持久幂等,是制作过程中的非终态对话,不调用 `respond_to_user`,也不关闭 task、Goal、Run 或 finalization。
- V1.53 的 LLM 条件中断只适用于无父级的根 Project Supervisor。普通专业 Agent / 静态委派 Agent 的 `runtime.steer` 继续只做 durable 入队,由运行循环在安全边界丢弃旧回复并重规划;持久 Goal 编辑作为控制面变更继续沿用 V1.13,在 durable steer 入队后立即中断当前旧 planning/final-reply Provider。不得把根 Supervisor 的判定链或 Goal 编辑的强制中断扩散到所有 `runtime.steer` 调用方。
- 命令层在 durable 入队后不得先通知或唤醒 External Runner,避免 Runner 抢先消费 steer 后让判定快照漂移。判定为 `false` 或判定失败时,才发送只校验 ledger 并唤醒任务的 `runtime.steer`;该 RPC 必须固定返回 `providerInterrupted=false`。判定为 `true` 时直接发送 `runtime.interrupt_for_steer_decision`,由该 RPC 完成条件中断并唤醒同一 run。本地进程内路径遵循同一顺序。
- 状态询问、解释、鼓励、确认和不冲突补充默认不中断;只有明确停止、改向,或继续当前方案会产生明显过期结果时才允许 `true`。判定使用当前有效 `provider / codex_cli / codex_app_server` 模式;app-server 以独立 synthetic 节点运行,不能等待主节点的 turn gate。
- 条件中断必须先读取已持久化 decision,并只允许中断注册时 `appliedSteerCursor < steer.sequence` 的旧 planning/final-reply Provider。若旧请求已自然结束,或新 Provider 已消费该 steer 后启动,则返回 `providerInterrupted=false`,不得误杀新规划。工具、外部副作用、确认、process session、Git、receipt 和 finalization 始终不强杀,在下一安全边界消费 steer。
@@ -107,7 +107,7 @@
### 2026-08-10 Supervisor 边做边聊与条件中断
- 根 Project Supervisor 的运行中消息继续进入当前 `taskId / sessionId / runId`,先持久显示“正在判断、当前任务继续”,再由独立 LLM 生成非终态语义回复并给出 `interruptCurrentProvider`。过程回复不能调用终态 `respond_to_user`,不能把制作 Run、Goal 或 task 提前完成。
- 根 Project Supervisor 的 steer 入队后不得先通知 Runner。判定为无需中断或判定失败时,`runtime.steer` 只校验 durable ledger、唤醒同一 Run 并固定保持 `providerInterrupted=false`;判定为需要改向时,只有 `runtime.interrupt_for_steer_decision` 可以读取持久 decision 后条件中断旧 Provider。已经消费该 steer 的新 Provider、工具和外部动作不得被中断。普通专业 Agent / 静态委派 Agent 的 steer 只做 durable 入队并在安全边界重规划;持久 Goal 编辑属于控制面变更,入队后立即中断当前旧 planning/final-reply Provider。
- steer 入队后不得先通知 Runner。判定为无需中断或判定失败时,`runtime.steer` 只校验 durable ledger、唤醒同一 Run 并固定保持 `providerInterrupted=false`;判定为需要改向时,只有 `runtime.interrupt_for_steer_decision` 可以读取持久 decision 后条件中断旧 Provider。已经消费该 steer 的新 Provider、工具和外部动作不得被中断。
- 状态询问、解释和不冲突补充默认继续当前 Provider;明确停止、改向或会让在途方案过期时才允许请求中断。判定失败时继续任务,并在下一安全边界消费消息,不得把失败等同于需要中断。
- UI 通过持久 conversation 展示关联回复,刷新后仍可见;返回的 `assistantReply / interruptDecision / decisionReason` 只用于本次命令结果与诊断,不形成第二个会话或第二个 Run。