现象
lane 的 long_todo_chain replan 义务在一次合法交付之后 4 分钟就重新武装并换了新的 obligation id,而该 lane 在此之前刚刚按 guard 投影的指令完成了 bounded replan 写回。结果是"每次唤醒都要求重规划"的循环。
时间线(同一 lane codex-side-bypass, goal loopx-meta)
| 时间 (UTC) |
事件 |
| 15:42 |
guard 要求 replan,obligation replan-c471cccdf3d0a276,trigger long_todo_chain(selectable 21 > 阈值 20),frontier_revision todo_frontier_revision_v0:506463d15b19380633011591 |
| 15:44 |
按投影指令更新了一条 lane todo 的证据(todo_4144c9deec0f) |
| 15:45 |
交付 refresh-state --classification bounded_replan_progress --autonomous-replan-recorded --repair-delta-kind goal_vision_patch --repair-delta-kind blocker --agent-vision-json <packet>:写入 vision patch(含 acceptance_summary 与 goal_path_delta_v0, outcome=replan)并记录 autonomous_replan_ack(recorded: true) |
| 15:46 |
记账 1 slot;归档已完成 todo |
| 15:49 |
guard 再次要求 replan,新 obligation replan-ca90e6ddfe013b35,同一 trigger,frontier_revision 变为 todo_frontier_revision_v0:7ba751eda7da58a9f6601e2a,rearmed_after_obligation_id: replan-3363450b0714266d(一个更早的 id,不是刚刚交付的 c471ccc…) |
机制
- 抑制触发需要 ACK 携带该 trigger 的 frontier 检查点:
loopx/control_plane/todos/frontier_revision.ts::classifyAck 要求 delta.trigger_checkpoints[] 中存在 frontier_revision 等于当前 revision,或 frontier_owned_identity 等于当前 owned identity。
- 产生这种语义 delta 的路径是创建一个 typed runnable successor:
loopx/control_plane/goals/goal_frontier/ack_policy.py 会为它写入 replan_semantic_delta_v0(outcomes new_runnable_successor、obligation id、successor todo id、trigger_checkpoints)。而 replan_successor_semantic_binding 要求 successor 同时具备 action_kind 和 target_key(或 explore refs)。
- guard 投影给出的补救指令并不包含这些要素:
todo_actions[0].text = "run a bounded long-chain vision replan: compare evidence with the active vision, group or prune the todo chain, and select the next high-value runnable slice" —— 直接 todo add 这段文字不会带上 action_kind/target_key,因此不能被认定为 typed successor;
cli_channel.next_cli_actions[0] 只给 refresh-state ... --autonomous-replan-recorded(外加 progress/vision 字段),照做会得到 recorded: true 但没有 trigger_checkpoints 的 ACK,于是 trigger 继续有效。
也就是说:按照 guard 投影的指令字面执行,无法清除 long_todo_chain 义务;只有额外知道"必须落一个带 action_kind+target_key 的 successor todo"才能清除。这一点目前只存在于实现里,没有出现在投影指令中。
影响
lane 每 3–4 分钟被要求重规划一次,真正的推进工作被挤出;同时每次重规划都会写入 run/vision 记录并占用一次 quota 结算。同一 lane 在本次会话的另一条记录里已被用户提醒过该模式。
建议
三者取其一即可,且都属小改动:
- 让投影的
todo_actions 直接给出可执行的 typed successor(带 action_kind、target_key、task_repository),使照做即可清除义务;
- 或在
todo_actions/cli_channel 中明确写出"需要落一个带 action_kind+target_key 的 successor todo"这一前提;
- 若 vision-patch 路径本应也能结算该义务,则让该路径的 ACK 也带上当前 trigger 的检查点(按
frontier_owned_identity 绑定,避免自己的写回改动 revision 后立刻自失效)。
复现
在一个 selectable open todo > 20 的 lane 上:执行 quota should-run 得到 obligation A → 仅按投影指令做 refresh-state --autonomous-replan-recorded(vision patch 或 blocker delta)→ 等待下一次 quota should-run:会出现新的 obligation id,且 rearmed_after_obligation_id 指向更早的 obligation。
本 lane 的绕行做法(已执行):用 todo add 建立带 action_kind=review_pull_requests + target_key=github-pr-review:huangruiteng/loopx:queue-round-<ts> 且 --replan-obligation-id replan-ca90e6ddfe013b35 的 successor,并 supersede 掉同内容的旧 successor,使链条不增长。
现象
lane 的
long_todo_chainreplan 义务在一次合法交付之后 4 分钟就重新武装并换了新的 obligation id,而该 lane 在此之前刚刚按 guard 投影的指令完成了 bounded replan 写回。结果是"每次唤醒都要求重规划"的循环。时间线(同一 lane
codex-side-bypass, goalloopx-meta)replan-c471cccdf3d0a276,triggerlong_todo_chain(selectable 21 > 阈值 20),frontier_revisiontodo_frontier_revision_v0:506463d15b19380633011591todo_4144c9deec0f)refresh-state --classification bounded_replan_progress --autonomous-replan-recorded --repair-delta-kind goal_vision_patch --repair-delta-kind blocker --agent-vision-json <packet>:写入 vision patch(含 acceptance_summary 与goal_path_delta_v0, outcome=replan)并记录autonomous_replan_ack(recorded: true)replan-ca90e6ddfe013b35,同一 trigger,frontier_revision 变为todo_frontier_revision_v0:7ba751eda7da58a9f6601e2a,rearmed_after_obligation_id: replan-3363450b0714266d(一个更早的 id,不是刚刚交付的c471ccc…)机制
loopx/control_plane/todos/frontier_revision.ts::classifyAck要求delta.trigger_checkpoints[]中存在frontier_revision等于当前 revision,或frontier_owned_identity等于当前 owned identity。loopx/control_plane/goals/goal_frontier/ack_policy.py会为它写入replan_semantic_delta_v0(outcomesnew_runnable_successor、obligation id、successor todo id、trigger_checkpoints)。而replan_successor_semantic_binding要求 successor 同时具备action_kind和target_key(或 explore refs)。todo_actions[0].text= "run a bounded long-chain vision replan: compare evidence with the active vision, group or prune the todo chain, and select the next high-value runnable slice" —— 直接todo add这段文字不会带上action_kind/target_key,因此不能被认定为 typed successor;cli_channel.next_cli_actions[0]只给refresh-state ... --autonomous-replan-recorded(外加 progress/vision 字段),照做会得到recorded: true但没有trigger_checkpoints的 ACK,于是 trigger 继续有效。也就是说:按照 guard 投影的指令字面执行,无法清除
long_todo_chain义务;只有额外知道"必须落一个带 action_kind+target_key 的 successor todo"才能清除。这一点目前只存在于实现里,没有出现在投影指令中。影响
lane 每 3–4 分钟被要求重规划一次,真正的推进工作被挤出;同时每次重规划都会写入 run/vision 记录并占用一次 quota 结算。同一 lane 在本次会话的另一条记录里已被用户提醒过该模式。
建议
三者取其一即可,且都属小改动:
todo_actions直接给出可执行的 typed successor(带action_kind、target_key、task_repository),使照做即可清除义务;todo_actions/cli_channel中明确写出"需要落一个带 action_kind+target_key 的 successor todo"这一前提;frontier_owned_identity绑定,避免自己的写回改动 revision 后立刻自失效)。复现
在一个 selectable open todo > 20 的 lane 上:执行
quota should-run得到 obligation A → 仅按投影指令做refresh-state --autonomous-replan-recorded(vision patch 或 blocker delta)→ 等待下一次quota should-run:会出现新的 obligation id,且rearmed_after_obligation_id指向更早的 obligation。本 lane 的绕行做法(已执行):用
todo add建立带action_kind=review_pull_requests+target_key=github-pr-review:huangruiteng/loopx:queue-round-<ts>且--replan-obligation-id replan-ca90e6ddfe013b35的 successor,并 supersede 掉同内容的旧 successor,使链条不增长。