Skip to content

[Bug] long_todo_chain replan 在合法 vision-patch 写回后 4 分钟即重新武装,且投影指令无法清除该义务 #4667

Description

@huangruiteng

现象

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_ackrecorded: true
15:46 记账 1 slot;归档已完成 todo
15:49 guard 再次要求 replan, obligation replan-ca90e6ddfe013b35,同一 trigger,frontier_revision 变为 todo_frontier_revision_v0:7ba751eda7da58a9f6601e2arearmed_after_obligation_id: replan-3363450b0714266d(一个更早的 id,不是刚刚交付的 c471ccc…

机制

  1. 抑制触发需要 ACK 携带该 trigger 的 frontier 检查点loopx/control_plane/todos/frontier_revision.ts::classifyAck 要求 delta.trigger_checkpoints[] 中存在 frontier_revision 等于当前 revision,或 frontier_owned_identity 等于当前 owned identity。
  2. 产生这种语义 delta 的路径是创建一个 typed runnable successorloopx/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)。
  3. 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 在本次会话的另一条记录里已被用户提醒过该模式。

建议

三者取其一即可,且都属小改动:

  1. 让投影的 todo_actions 直接给出可执行的 typed successor(带 action_kindtarget_keytask_repository),使照做即可清除义务;
  2. 或在 todo_actions/cli_channel 中明确写出"需要落一个带 action_kind+target_key 的 successor todo"这一前提;
  3. 若 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,使链条不增长。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions