Skip to content

fix(worker): prevent repeated replans and pause dispatch on unknown outcomes - #6885

Merged
songoow merged 5 commits into
mainfrom
codex/split-research-worker-readback
Oct 20, 2026
Merged

songoow merged 5 commits into
mainfrom
codex/split-research-worker-readback

Conversation

@songoow

@songoow songoow commented Oct 19, 2026 •

Copy link
Copy Markdown
Collaborator

当前落地方式(2026-10-20)

本 PR 直接面向 main,只交付 B4 持久 worker 尝试、来源关联与既有 Goal 概览读回。当前仍为 28 文件、+2691/-37,已零冲突真实合入 main 332aa0fcd656743ba585bef5e35955fdb8070c4f(已 merged 的 C2 #6901 与安装 smoke #6943),没有恢复旧研究集合分支。

当前 head:ffb5db6df0ba17bcbce5fe4dcb7fd974b7dc1ccc;tree:7a6bd358e317f96b73d50f3393fba5a891fbf587。该 main 是本 head 的实际祖先,PR base 快照已刷新。

当前证据与修订映射

  • 原 foundation fixture /整链执行的 P2 缺口已消除。上一轮完整七模块 117 passed /1742.10s 绑定评审 head 5c568ae17e67504cde2614b32a44d03c087da278 及其 source 映射,不改记为本轮新执行。
  • B4 的 17 个生产/pytest 路径逐 blob 未变;本轮变化的是 main 的 C2 context/material-result owner,因此重新执行完整 basis/hold、后继和负实验持续工作模块:18 passed /432.49s,无失败、无跳过。覆盖 File/SQLite、stable/pre_stable/pre_stable_unwritten、原 ACK 保留、真实后继、一次结算和负结果被后续工作采用。
  • 当前 head 的 control-plane TypeScript、Dashboard + Chat 完整构建、RFC/diff/公开边界和 diff-scoped semantic advisory 通过。advisory 无发现不代表所有动态语义都已自动证明;有限状态、原结算、来源与消费者已重新读审。
  • 原完整 research-worker-readback packaged 场景在当前新 bundle 99.264 秒通过,覆盖 paused/unknown、中/英、桌面/窄屏、真实 File/CLI/HTTP、损坏/过期来源后未知状态、普通 poll 不擦除原 bytes、只读导航零派发和实际 Stop。当前组合窄屏已查看;没有新增 B4 呈现设计,原维护者预览确认保持有效。
  • 原相同 harness 的 12 组真实 base/head 对照、双 provider scope 反例,以及 acceptance smoke 窄屏导航修复/完整通过,继续保留原 source,不因新 merge 变成新执行结果。
  • 采用 AGENTS 允许的等价 risk-based validation set:当前 18 项真实组合、完整新 packaged、typed/build/static/RFC/public,加上明确源码有效性检查后保留的原 117 与对照证据。此前原生 canary 的 6 direct、16 selected 通过及 3 个固定 120 秒 broad 超时保留原来源;semantic、monitor-poll-writeback、PR-lifecycle 未被改绿,也没有虚构根因。本轮不重跑全 canary,不宣称其已全绿。具体 call graph 与覆盖选择见精确 head review。
  • 按维护者本批指示使用隔离 Goal 的 wait_for_ci=false,不查询或久等远端 CI。本地证据、旧 review/threads 核实与 exact-head merge readiness 仍分别执行。

C2 的 workResultUse 继续复用 material delivery outcome owner:普通整理/未知结果不能消费旧材料,合法负结果保持可用;B4 不从退出码、poll 或 execution observation 制造接受、执行、扣额权。只有原确切结算证明可恢复未知尝试,不透明 Host 仍须使用原恢复路径。

这是一片可独立回滚的防重复派发与真实读回交付。真实生产事故、付费模型采用、完整费用收益、分布式 exactly-once 和所有安装平台不因合成工程回归获得资格。B5 #6889 单独资格化自己的增量。

历史实现说明与原版本验证(原拆分链路线已由上述当前方式取代)

为什么需要这次修改

外部 worker 执行一次自动重规划后,命令正常返回不代表原重规划要求已经解决;命令中断、失败或超时,也不能证明原请求没有执行。若重启 worker、改变轮询 token 或收到新事件就直接再发请求,可能重复调用模型或重复产生效果。

本 PR 持久保留原重规划尝试:同一要求仍未解决时停止重复复核;原请求结果未知时暂停该执行通道的新派发,并在现有 Goal 概览显示状态。这里描述的是代码与合成回归覆盖的故障模型,没有声称已经读取或复现真实生产中的“重规划请求发出后中断”事故。

实际修改

  • 在外部 worker 自己的持久状态文件中,启动前原子保存 attempt、原 obligation(本次重规划要求)、registry / runtime / Goal / Agent 作用域,以及准入实际提供的原始结算身份;返回后保存 transport 结果。重启、轮询节奏变化和新观察不会清除原尝试。
  • 同一个配置的状态文件路径使用单消费者锁,避免本地 worker 并发重复派发;损坏或不可写的持久状态会拒绝新 wake。
  • 对已正常返回但仍未解决的原要求,显示 replan_paused;对未确认结果的原尝试,显示 replan_outcome_unknown。
  • Host poll receipt 保存的是 worker 观察,用于展示;它不是完整 attempt 的权威存储,也不授予执行权。 普通存活轮询不能抹掉未知或损坏记录。
  • history / run-history 通过现有 source-to-global projection owner 核实来源、配置和 runtime 关联。损坏、过期或关联不匹配的记录显示未知,不把旧操作展示成当前操作。
  • 在现有 Goal 概览显示暂停/未知原因、原工作与观察时间,提供“查看任务与依赖”,保留既有 Stop 路径。查看页面和导航不派发新工作,不证明 Goal 完成或 provider 停止计费。

暂停条件与继续执行的边界

情况 worker 行为 继续执行所需条件
命令正常返回(或合法的配置 stop exit code),但 fresh Core 决策仍要求同一作用域内的原语义重规划 replan_paused,不重复该要求的模型复核,结束当前 worker 调用 检查原工作,补充具体任务或相关证据,再运行 worker 并重新检查 Core 准入;单纯重启或改变轮询 token 不释放同一要求
原重规划失败、超时、输出超限,或启动记录保留但结果未确认 replan_outcome_unknown;同一作用域内暂停新派发,包括新的重规划要求和新的普通任务 先核实原请求及其结算;新任务、新事件或新 obligation ID 不能证明旧请求未执行
原准入提供了确切 settlement identity,且 Host 保留了它 读取原 Turn / obligation 的结算;pending 或身份不匹配时保持未知 只有原身份精确匹配且 settlement 已完整完成,才将该未知尝试标记为已核实返回;后续工作仍须通过当前 Core 准入
普通不透明 shell 命令没有绑定原始结算身份 无法自动证明原操作已完成,保持未知 通过原 Host 的恢复/核实路径处理并保留状态;本 PR 没有通用自动解锁或“一键恢复”能力,删除状态文件不是恢复方法
持久 worker 状态损坏、身份非法或写入失败 拒绝新 wake 恢复原始状态及其来源;普通 poll 或清空展示记录不能替代执行证据
Core 已给出 terminal / Stop 决定 Stop 优先,不再派发;保留未解决记录 后续生命周期由既有 Goal owner 决定,Stop 本身不证明旧请求已结算

replan_paused 只抑制同一语义重规划要求;一个已经正常返回的 attempt 不会阻止其他通过 Core 准入的普通工作,原记录仍保留。相比之下,started / unknown 的未确认尝试会挡住同作用域内后续新派发,这是本 PR 的保守取舍,可能需要人工核实并增加恢复成本。

现有 todo_lifecycle_settlement / receipt_bound_replan_settlement 保留各自原结算 owner,不被当成新的语义重规划机会;它们也不能绕过尚未核实的原尝试。所有这些 worker 观察都不会自动改变 Goal activation、完成 Todo 或扣除交付 quota。

作用范围与依赖

  • Base: fix(host): recheck Goal admission before process launch and turn dispatch #6884,codex/split-research-host-launch;本片提取 tracking: land research continuity as small PRs into main #6838 的 external shell-worker 行为及配套展示。
  • observe-only 模式不消费重规划尝试;配置了 --wake-cmd 才涉及本片的派发控制。
  • 本地锁只约束同一配置状态路径。不同状态路径或分布式 Host 仍依赖已有共享执行 / lease 权威;这不是分布式 exactly-once 保证。
  • 精确 GoalRef 仅在真实提供时保留;legacy 可执行 Goal 仍按其真实别名作用域处理,不承诺重建同名 Goal 后的精确隔离。
  • provider 重试、token 上限、请求取消和完整费用仍由原 Host / provider owner 管理;本片不提供通用自动恢复策略。
  • 预期价值是减少重复派发并提高故障可见性。没有用同条件长程实验确认完成率、研究质量、总成本或人工介入净收益;“暂停了重复调用”不等于“任务已经推进”。

Author Declaration / 实现依据

验收标准 实现 / 验证入口
同状态路径重启/并发不重复派发未确认的重规划 external_scheduler_worker.py、worker continuity 回归
只有确切原始结算能解除未知尝试,后续工作重新准入 read_heartbeat_settlement、File / SQLite CLI 原回执恢复回归
worker 观察保持来源关联,普通 poll 不擦除损坏记录 host_poll_receipts.py、history / run-history、观察恢复回归
owner 能看到 paused / unknown、查看任务并使用已有 Stop Goal overview、packaged research-worker-readback browser scenario

Validation Binding

  • Published revision: c49bc360fb7a6ae25ef4e8f52a5bb07fbe76f15e。
  • Tested tree: 155aee2eed76c978577d6ca05b5a96a319f57081。
  • Input classes: synthetic, public_fixture;使用隔离 Goal / backend,受控或模拟 Host 边界,不调用付费模型。
  • 原作者记录:改动 Python Ruff / diff-check passed;本地 Dashboard build 曾主动中断,未计通过。
  • 当前 head 的补充针对性复核:
    • uv run --extra test python -m pytest tests/test_external_worker_replan_continuity.py tests/test_host_poll_receipts.py -q:71 passed。
    • uv run --extra test python -m pytest tests/control_plane/test_external_worker_replan_cli.py -k 'real_unresolved_replan_dispatches_once or real_original_receipt_recovery' -q:6 passed, 14 deselected;覆盖 File / SQLite 真实 CLI、返回后防重发、原结算核实后恢复下一任务。Host 工作受控,不能当作真实模型效果证据。
    • 首轮 CLI 复核的 File 用例通过,3 个 SQLite 用例被本机 Node 25.2.1 内置的未合格 SQLite runtime 拒绝;切换到合格 Node 22.22.3 后,同一选择集合 6 项全部通过。环境拒绝与后续通过分别保留。
  • 原 B4 head c49bc360fb7a6ae25ef4e8f52a5bb07fbe76f15e 曾观察到以下浏览器 CI 失败,历史运行结果保留:
    • chat-bundle-browser (1):新增 research-worker-readback 场景结束后清理临时目录时报 ENOTEMPTY。该次运行未完成验证,不能计为该检查通过。
    • dashboard-browser (1):worker-readback 场景已输出行为检查结果,随后 goal-hierarchy 的“不得读取无关 Goal 状态”断言失败;该失败尚未归因,整项检查仍为失败。
  • Run state: 上述针对性复核 finished;完整 CLI / backend / packaged browser 集合及当前 CI 失败尚未全部完成或解决,不将部分通过计为整片验收完成。
  • PostgreSQL、付费模型、线上/长程对照实验及完整成本比较:not_run。正式 review / merge readiness 另行判定。

packaged 场景入口如下;本轮 d1dc8 集成上完整运行已通过,精确版本和新截图见后方补充:

npm --prefix apps/presentation/dashboard run build
LOOPX_PERSONAL_WORKSPACE_SCENARIO=research-worker-readback LOOPX_PERSONAL_WORKSPACE_PACKAGED=1 node examples/personal-workspace-browser-smoke.mjs

Frontend / Visual Evidence

以下图片随本片原样保留,来源是原 #6838 的合成场景;它们描述该 UI 设计,不是本次新 head 的重新截图。

Before: 桌面 · 移动。

After / first viewport — unknown 桌面:

Worker unknown desktop

After — unknown 移动:

Worker unknown mobile

Paused: 桌面 · 移动。

  • UI impact: changed。
  • Source data: synthetic。
  • Attention review: 在现有 Goal 概览集中展示观察状态与原任务入口,技术标识按需展开;unknown 保持可见,Stop 走已有 canonical 路径。
  • Craft review: 历史图保留原来源;本轮 d1dc8 集成的新桌面/移动视图已另行实际查看,见后方当前证据。

Boundary Checklist

  • worker、readback、完整 UI 和回归随片交付。
  • 不把只读观察当作执行或达成证明。
  • 描述、图片和源码只含公开/合成信息。
  • 无已有双语 RFC 对变更;提交含 DCO sign-off。

恢复验证补充(2026-10-19)

  • Current validation head: 9d905ca3866444ee58836790a53959ab2849a2b1。
  • 本段的实际测试源码绑定:B4 fixture 修复提交 ca8d3732a2847c9e76e3d1f989e084e7158deb27,tested tree 24afb2e36986222fca85c5c6a54a80ad6ea9cfc9;修复基于原发布 B4 c49bc360fb7a6ae25ef4e8f52a5bb07fbe76f15e。
  • Before 使用 tree 155aee2eed76c978577d6ca05b5a96a319f57081,与原发布 B4 完全一致。上文的 71 项单测、6 项 CLI、旧截图和旧 CI 结论继续保留各自原版本绑定,不因这个 head 更新自动变成新 head 的全量通过。

修复限定在 tests/control_plane/research_worker_readback_fixture.py 和 examples/personal-workspace-browser/research-worker-readback.mjs:fixture 等待已接受的 HTTP 请求结束后再退役其 Effect runtime;JS 等待 Python child 的 close 事件并确认零退出码,然后才删除临时根。下面的因果 probe 实证了 HTTP 请求尚未结束就开始 runtime 清理的缺陷。

恢复检查 结果与边界
Before:原 B4 tree 上保留一个处理中真实 HTTP read,再触发退出 缺陷复现:runtime_cleanup_started 早于 request_finished,HTTP 返回 500;Python 仍以 0 退出。
After:修复 tree 上执行相同因果 probe passed:HTTP 返回 200,request_finished 早于 runtime_cleanup_started,Python 以 0 退出。
startAuthority("paused") → close() 首轮 failed,保留:原 runtime 退出检查在五秒门槛内返回 stopped=false,Python 退出码为 1;新增 JS 检查正确暴露了这个失败。
Paused 详细诊断重跑 passed,34.771 秒:通过仅观察原返回值和时序的 Python/Node wrapper 记录退役过程;child close=0,临时根删除。原五秒 runtime 门槛保持,实际 runtime 退役约 1.006 秒。
startAuthority("unknown") → close() passed,27.888 秒:未加载诊断 observer,实际 child close=0,临时根删除。

Paused 诊断重跑中,shutdown 应答约 0.824 ms,listener 关闭,compile-cache flush 约 545 ms,随后 locator 删除并退出;Python 的各次进程组观察约 15–38 ms,最后正确接受已无法继续写入的 zombie 进程组。这些是这一次通过运行的观察;首轮 stopped=false 的根因仍未确定,后续通过不抹掉该失败。 本次修复没有修改共享 runtime owner,也没有增加五秒退出门槛、六十秒启动门槛或目录删除重试。

本批使用 Node v24.19.0,输入仍为 synthetic, public_fixture,Host 调用受控。Python 语法、node --check 和 git diff --check 通过。两边复用同一份已存在的 bundle,仅提供真实 JSON HTTP fixture 的启动资源;本批没有重新构建或渲染当前 head 的前端,不构成完整 packaged browser / UI 资格,也不是模型效果或成本证据。

Run state: 本段限定恢复检查已完成,含上表明确保留的一次 runtime 清理失败;后续 d1dc8 集成上原完整 packaged 场景已通过 126.422 秒,且新截图已实际查看;这不把前面的限定恢复 probe 改写为浏览器运行。上文两项浏览器 CI 失败仍是对应原运行的失败,本段不能把它们改记为通过。合并资格另行按当前 head 的完整检查判定。

本轮 packaged Worker 证据

原完整 research-worker-readback.mjs 在 d1dc8ebfe7ff0ce888c8e7a6b7a5051413f29af2 / tree cb8b1777655d7f37e3571b5087d6cd4db286dbbd 上 126.422 秒通过(场景 116.498 秒)。覆盖 paused/unknown、zh/en、desktop/narrow、真实 File/CLI/HTTP、过期或损坏 receipt、只读导航与实际 Stop。任务数据为 synthetic;不代表模型采用或当前 main 的运行结果。

Packaged worker paused, desktop

Packaged worker unknown, narrow

原 B4 fixture probe 和旧 CI 保留原版本/失败状态;这些图片来自上方明确的组合验证 commit。

发布、进入 main 与集成证据(2026-10-20)

  • 本片 source head:9d905ca3866444ee58836790a53959ab2849a2b1;tree:24afb2e36986222fca85c5c6a54a80ad6ea9cfc9。当前 base 为 codex/split-research-host-launch。按原小 PR 路线,前置进入 main 后再将本片改向 main,并核对本片差异、检查和审批。
  • 新版 #6784 与 B1/A1–A3 存在组合重叠;它们的承载路线会影响后继重定基线,详见总进度。 完整顺序、评审阻塞和操作步骤。
  • 原小 PR 路线按依赖逐片进入 main;本仓库允许 merge commit,保留原提交身份通常便于后继继续比较。若采用 squash/rebase,需按旧父提交边界整理后继自身增量后再复核;改 base 本身不完成这一步。
  • 14 PR 的检查/评审快照为 2026-10-20 00:14–00:15 UTC。本片当时为 存在失败/取消;尚无正式批准。后续合并资格以对应当前 head 与 main 基线的检查和审批为准。
  • 集成分支 已快进到 fe3b1f7b382e,tree 6bbf110b1cb2535975b2389558a86dff73792926。它保留原 d1dc8ebfe7ff0ce888c8e7a6b7a5051413f29af2 与最新 C3 7368ca0286d503a93e50b26ab24755a5fb429b2f 两侧祖先;真实 Git merge-tree 与 GitHub tree 一致、零冲突,仅增 A3 的两文件 Markdown 诊断修复。
  • 此集成继续使用已验证的冻结 main 45d742088a3f7896a0a008761f68d2437398bcd1。本轮观察的 main e4190c30d7f94886dddd8e06b899664df34120f9 已另有变化,进入主干前须另行更新与验证。原 d1dc8 的 supplied-candidate in_sync 收据保留历史绑定;后续正式 owner 收据见总进度,不将旧收据改标为新 main 的资格。
  • 构建及 UI 的实际运行版本仍为 d1dc8/cb8:control-plane TypeScript 50.754 秒通过,标准 Chat build 131.930 秒通过,Outcome 恢复 97.616 秒通过,独立正常首屏 41.605 秒通过,Worker readback 126.422 秒通过,research-history 功能场景 116.004 秒通过。该版本的 8 张可读截图与验证摘要 已发布;后继两文件修复不改变这些 UI 输入,截图保留真实拍摄版本。
  • 保留限制:首次 Outcome fixture 的 90 秒启动失败未抹去,后续通过使用正常缓存预热;research-history 新中文图仍需补全 CJK 字形;完整新 head Python/native/File/重放/并发矩阵、installed App 与模型/benchmark 收益未取得全面资格。摘要记录实际运行范围,原临时 raw logs 已随执行环境回收,未重建成伪收据。
  • 本轮最终对象核对确认 12 个 source heads 被保留、两文件补丁逐字节一致、UI/build 的 tracked 输入一致,以及源链 18/18 作者签署匹配。未修改的 integration owner 对已发布候选给出 preview_ready(execute=false);恢复的新 plan 仍是 never_synced,完整 CLI bootstrap 未执行,未重新签发 in_sync。

@loopx-agent

loopx-agent commented Oct 19, 2026 via email

Copy link
Copy Markdown
Collaborator

@songoow songoow changed the title fix(worker): retain durable replan attempts and expose recovery state fix(worker): prevent repeated replans and pause dispatch on unknown outcomes Oct 19, 2026
Rebuild PR #6885 from only its B4 worker/readback changes and fixture
teardown repair on main 5853e15. Keep inherited launch changes out of
this delta, retain the existing functionality and all regression tests,
and preserve historical browser captures as historical evidence.

Foundation #6784 is a merge prerequisite for the acceptance-contract
fixtures and full ACK behavior. File/SQLite stable owner-hold ACK both
pass in the foundation+B2+B4+B5 qualification tree.

Original sources: c49bc36
                  9d905ca
Original author: song <liusongstep@gmail.com>
Validated local source: 28acc72aaa8bf542609c982388b29f4a18775968
Validated tree: f5641eb
Original history: codex/research-split-archive-20261020

Signed-off-by: song <liusongstep@gmail.com>
Signed-off-by: Codex <codex@openai.com>
@songoow
songoow force-pushed the codex/split-research-host-launch branch from b813ae0 to b9fddbe Compare October 20, 2026 06:22
@songoow
songoow force-pushed the codex/split-research-worker-readback branch from 9d905ca to 06a7c41 Compare October 20, 2026 06:22
@songoow
songoow changed the base branch from codex/split-research-host-launch to main October 20, 2026 06:23

@songoow songoow left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent; OpenAI GPT-6 Astra; provider OpenAI; self_reported.

代码评审范围:5853e151d97d9129bda9dce45a92a0944dcb9565 → 06a7c41cb42335b3ed514f728ed9a53f3ace8cf3,全部 28 个变更路径。按本轮要求主要基于源码发表 review,不等待 CI。发表前已补审直接面向 main 的新提交:逐文件比对原切片和新提交的实际增删行,生产代码与测试补丁一致;文档的范围及历史证据说明已核对。

动机

外部 worker 发起 replan 后,如果进程返回失败或响应丢失,下一轮调度无法仅凭退出码判断原操作是否已经落地。这个变更保留原发起身份及恢复依据,避免后续 wake 把未知结果当成“没有执行过”,并让界面显示当前 driver 为什么暂停。PR 描述已经将触发依据限定为合成故障场景;这份评审也不把它表述为已经发生的生产事故。

改动思路

实现复用现有 worker 的本地状态、文件锁和原 Turn settlement 读回;没有让 UI 观察记录成为新的调度或 Goal 完成依据。真正控制再次启动的是持久化 attempt 与精确 scope,Host poll observation 只解释状态。这个分工合理:需要跨进程保留的启动意图不能仅放在内存,正常 poll receipt 又不应覆盖未知提交的恢复信息。当前 PR 的边界是 worker 连续性与只读展示,研究效果、模型采用和完整成本仍属于后续资格工作。

具体改动

  • external_scheduler_worker.py 的 _load_state、_replan_attempt 和 _pending_replan_attempt 检查 registry、runtime、Goal、Agent、obligation 与原 settlement 身份。started 在启动前持久化;不确定退出保留为 unknown,同 scope 后续工作不能绕过这一状态。明确属于其他 Goal lifetime 的记录才不再阻止新 lifetime。
  • _read_resolved_replan_attempts 只用原 settlement 身份读回并核对返回绑定;读回成功不能顺便迁移到新 obligation。正常 Stop 的处理仍在等待恢复之前。相同配置状态文件上的单消费者锁,与已有原子文件写入共同约束重入。
  • host_poll_receipts.py 将 worker observation 与普通 poll 分开保留;损坏记录不会被正常刷新静默清空。history.py 核对 source Goal 摘要及 runtime,界面对 stale/unreadable 保持可见,unknown/replan_paused 也没有变成 Goal 已完成。
  • 本轮此前在 9d905ca3866444ee58836790a53959ab2849a2b1 独立运行 tests/test_external_worker_replan_continuity.py 与 tests/test_host_poll_receipts.py,授权本地运行时后 71 passed。该结果属于旧基线;新提交的产品/测试补丁一致,但未在新的 main 基线重新执行,不声称完整运行环境等价。第一次受限环境运行的 4 个运行时权限失败已保留,不算产品失败,也没有叠加到通过数中。

对主干的风险

主要风险是长期未知状态下的恢复可用性:它有意停止再次启动,需要原绑定的明确读回,不能用新 Todo 或新 obligation 证明旧提交没有发生。这个保守行为在代码和展示中一致。仍需留意部署时所有同一 worker 实例使用同一配置状态路径;文件锁不是跨不同状态文件的全局租约。本轮没有重新运行真实模型、已安装客户端、完整浏览器流程或所有 CLI 集成,作者所列历史证据不作为本轮新通过结果。未发现已确认的阻塞代码缺陷。

我的整体评价

核心恢复不变量和现有 authority owner 的关系清楚,新增持久状态服务于实际的重复启动风险,观察数据保持只读,测试覆盖了损坏状态、重启及原 settlement 恢复。源码评审结论为未发现阻塞问题;这份 COMMENT 记录当前代码判断与验证边界,不代表完成当前 main 基线的完整集成资格。

English verdict: COMMENT — source review completed; no confirmed blocking finding at 06a7c41cb42335b3ed514f728ed9a53f3ace8cf3; CI was not a prerequisite.

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent; gpt-6.1-sol; provider OpenAI; runtime_reported; reasoning_effort=max.

[P2] 当前完整恢复测试集合尚不能收集。 tests/control_plane/test_research_replan_basis_cli.py:16 导入的 legacy_acceptance_checkpoint_fixture 不在当前 tree 内。干净检出后运行七个改动 pytest 模块,实际退出码为 2。作者已经披露 #6784 前置;我确认这项限制仍存在。下面的 worker/UI 正例支持实现方向,但不足以把依赖组合改记为当前 head 的完整通过。

动机

使用外部 worker 持续执行任务、需要确认中断后是否重复调用的使用者。 同一重规划请求返回或中断后,旧 worker 重启会再次派发;新 worker 保留原尝试,在未确认结果时暂停并显示原因。 相同受控输入下,File/SQLite 两次 worker 调用的派发从两次变为一次;UI 能区分暂停、未知和不可读,并保留原 Stop。 当前独立 head 的新增 replan-basis 模块缺少 #6784 提供的 fixture,完整改动测试集合不能收集;依赖组合中的通过不能记为这个 head 的通过。 不证明真实生产事故、付费模型采用、分布式 exactly-once、完整成本净收益或全部安装平台。

评审绑定 6885@06a7c41cb42335b3ed514f728ed9a53f3ace8cf3,实际 merge-base 为 5853e151d97d9129bda9dce45a92a0944dcb9565。重复派发可能增加模型费用或重复效果;正常返回也不代表原请求已结算。这里使用合成故障模型验证代码,没有声称读到或重现某次真实生产中断事故。现有来源与授权足够,新增确认轮次为零。

改动思路

传输尝试复用现有 worker 状态;执行资格、原结算与展示各有既有 owner,展示不能解除未知或制造完成。 本片可独立验证防重复派发与现有 UI 读回;缺失前置 fixture 的完整恢复集合仍是当前批准限制。 这是传输侧防重和可见性修复,不把所有重规划都改成永久停止。原请求正常返回但语义仍未解决时,只抑制同一要求;结果未知时,同作用域的新要求和普通工作也不能覆盖旧未知。已有 Stop、原结算与新的 Core 准入继续负责释放条件。

下表是当前源码控制流说明,不是额外执行凭证:

输入 当前行为
原命令返回,同一语义要求仍未解决 显示暂停,防止再次派发同一要求
原效果未知,包括新 Todo 或新 obligation 保留原记录,暂停同作用域的新派发
原准入真实交付 exact settlement identity 且结算完整 核实原结果;下一工作仍重新准入
没有原身份或来源损坏 保持未知,由原 Host 恢复;普通 poll 不能擦除
当前 Core Stop Stop 优先,不把未知误写为完成

具体改动

全量 28 路径 +2689/-36 包含 worker、receipt/history、五个 UI 消费路径、协议、严格回归、fixture teardown 和六张历史图片。读过完整生产/文档/测试增量及未改调用方,并在 actual base/head 搜索了原状态、锁、receipt、source/global 与 UI owner;没有只看新文件名。

  • _run_worker_locked 在外部效果之前原子持久化意图,复用独立 sibling kernel lock;atomic replace 不替换锁 inode。同一状态路径只允许一个消费者,不能延伸成分布式 exactly-once。
  • _read_resolved_replan_attempts 只读取真实交付的原始结算身份;不从新观察、新 Todo、退出码或同名 Goal 推造完成。
  • read_host_worker_observations 与 history/run-history 验证来源、配置和 runtime 关联。UI 接收派生投影,显示 unknown/unreadable/stale,而非创建另一份权威状态。

独立 spec_ref:docs/reference/protocols/goal-vision-replan-contract-v0.md;spec_revision:5853e151d97d9129bda9dce45a92a0944dcb9565,取改动前文本。criterion_id History-trigger ownership and retry semantics:原身份、neutral accounting 与原结算边界已由真实 CLI 验证;Acceptance:只有 accepted typed delta 可解除语义义务,worker 观察不清除;Ownership Boundary:显示和轮询不授执行、扣额或 Goal 完成权;Replan ACK freshness:前置相关的完整正式 basis 集合仍 deferred,当前批准受下述收集失败限制。

对主干的风险

最重要的取舍是:无法证明原请求结果时,后续有用工作也可能暂停。这个保守成本必须由原 Host/原回执核实来恢复,删除状态文件、换 token 或普通 poll 都不是恢复证据。legacy 缺少 exact GoalRef 时不能保证重建同名 Goal 的精确隔离;独立状态路径也不在本地锁保证内。没有把展示时间当作 freshness、取消或零费用证明。

独立相同输入 actual base/head 对照共 12 个 worker arm:File/SQLite 下 returned 与 unknown 的两次调用均从 2 次派发变成 1 次,observe-only 两边均为 0;原 canonical history 不变,没有 ACK 或扣额。当前 head 的 worker/receipt 71 passed,四个真实 CLI 模块 34 passed,涵盖原回执核实后下一任务、真正负反馈后后继工作、阶段连续性与损坏观察。Host 是受控真实 Python 子进程,不能作为真实模型采用证据。

当前 head 正常构建的 Dashboard/Chat,在真实 File/CLI/HTTP 后端上实际查看了 1512×982 与 390×844 的暂停/未知首屏、原身份展开、任务导航与 reload。canonical 状态/dispatch count 未变;写入合成损坏 receipt 后普通 native poll 保留字节,页面显示不可读并在恢复原记录后恢复;实际 Stop 将合成 Goal 停止,旧未知仍未被伪装为完成。Paused fixture 观察到 child exit=0;unknown fixture 的 supervisor 退出状态未观察到,但已核实自有进程退出,不能称全部原 browser-smoke 自动化场景通过。

类型检查、Ruff、当前 native premerge 6 direct + 19 selected 全通过,预算未提高。没有查询或等待 GitHub CI。仍保留关键红项:完整七模块集合在上述 import 处 collection error;#6784 公共 head 7024bc7020cf0b97a86a24311fb69b9ebdbd390a、B2 b8a837d19d650e307b56baad1f2a3778b648cabf 加本片/B5 的严格 runtime/test 补丁组合中,十二个 basis 加四个 comparison 用例 16 passed。全 UI 严格组合有冲突,未修源码、未计完整集成通过;作者声称的组合 commit 取回失败,因此不冒称执行过该 commit。这些组合结果支持路线,不能消除当前 tree 的测试收集缺口。

我的整体评价

REQUEST_CHANGES,限定为当前 exact-head 的前置与验证收口。 防重复派发和真实可读回的有用增量已经成立,未确认另一个生产代码缺陷;不是要求完成整个长程研究或付费实验。将已声明的 #6784 前置落实到可检出的实际评审 head 或明确的 PR base,保留严格断言,再运行完整七个改动 pytest 模块。无需复制无关整条分支或补 dummy fixture。 当前失败与正确的分片方向可以同时成立:先保留正常 PR 与既有依赖,待 actual dependency-qualified head 重跑后再批准。

传输尝试复用现有 worker 状态;执行资格、原结算与展示各有既有 owner,展示不能解除未知或制造完成。 本片可独立验证防重复派发与现有 UI 读回;缺失前置 fixture 的完整恢复集合仍是当前批准限制。 long_horizon:improved,限定为已测的恢复/后继链;user_experience:improved,既有界面 truthful readback 与 Stop、零新增确认。完整成本、真实模型收益、安装与所有平台仍未验。局部复用锁/原子写与既有 UI 已足够,没有要求额外框架或无关语言迁移。此次 review 不授合并、安装或升级权。

English verdict: REQUEST_CHANGES at 06a7c41cb42335b3ed514f728ed9a53f3ace8cf3 for the concrete current-head validation hold: the changed replan-basis test module cannot collect without the declared foundation fixture. Independent worker, File/SQLite CLI and packaged UI evidence support the useful safety increment. Integrate the declared dependency into an inspectable review head/base and rerun the unchanged full matrix; runtime/test composition passes are not passes for this published tree.

Comment thread tests/control_plane/test_research_replan_basis_cli.py
@mergify

mergify Bot commented Oct 20, 2026

Copy link
Copy Markdown

This pull request has merge conflicts with main and cannot be merged
until they are resolved. Please rebase or merge the base branch, @songoow.

Choose the remote for the base repository, not an out-of-date fork.
For a fork clone, first inspect git remote -v; upstream must point
to https://github.com/loopx-project/loopx.git. If it is absent, add it
with git remote add upstream https://github.com/loopx-project/loopx.git.
Then run:

git fetch upstream
git rebase upstream/main
# Resolve each conflict, git add the resolved files, then git rebase --continue.
git push --force-with-lease origin HEAD

For a same-repository clone whose origin points to
https://github.com/loopx-project/loopx.git, use origin instead of
upstream for fetch/rebase. If you prefer merging the base, use
git merge <base-remote>/main and push normally.

Keep the DCO Signed-off-by trailer on every commit when you rebase.
https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork

@mergify mergify Bot added the needs-rebase Mergify: the pull request has merge conflicts with its base branch label Oct 20, 2026
Resolve the Goal overview overlap by preserving the main Outcome styles and local-source authority prop alongside the worker observation section. Include the merged foundation fixtures in the reviewable head so the unchanged strict recovery matrix can collect. The B4 proposal remains the original worker/readback delta against main.

Signed-off-by: song <liusongstep@gmail.com>
@songoow
songoow requested a review from steven-kid as a code owner October 20, 2026 11:09
@mergify mergify Bot removed the needs-rebase Mergify: the pull request has merge conflicts with its base branch label Oct 20, 2026
The packaged acceptance smoke sampled navigation before React restored the narrow sidebar, then timed out on a hidden Goal link. Use the same visible-control wait for the initial visit as for reload recovery. The unchanged packaged scenario now completes its desktop and narrow readback checks.

Signed-off-by: song <liusongstep@gmail.com>
Integrate the reviewed research citation-focus correction from main without changing the B4 worker, observation, UI or strict test modules. Keep the original proposal delta isolated against current main.

Signed-off-by: song <liusongstep@gmail.com>

@songoow songoow left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent; GPT-6; provider OpenAI; self_reported.

Approval conclusion (author-owned PR; GitHub blocks formal self-approval)

动机

使用外部执行器持续推进任务、需要确认中断后是否重复调用的使用者。 同一个重规划请求正常返回或结果丢失后,旧执行器重启会再派发;当前版本保存原尝试,在要求未解决或原效果未知时暂停重复调用。 相同合成输入下,File/SQLite 两次调用从两次派发减少到一次;原回执完成结算后,后续真实任务仍可继续,页面能读回暂停或未知原因并使用原 Stop。 本片不证明真实生产事故、付费模型采用、完整费用收益、分布式 exactly-once 或所有安装平台。 不透明 Host 未交付原结算身份时仍须由原 Host 核实;研究方法比较和整条研究目标由各自后续 PR 验收。

当前评审绑定 5c568ae17e67504cde2614b32a44d03c087da278,当前真实 main merge-base 为 82b1a8c72159dedcbca3a3b69fac2c7eaad3192d;独立前后对照及规范文本绑定 4a6a43cccd34a9eadc2c6e465c26e60bf0df2e8e(worker/规范 blob 与后续 main 的关系已核对)。上次独立评审的 P2 是完整测试缺少 foundation fixture;本次已把主干上的 foundation 纳入实际可检出的 head,成功收集 117 项严格用例,不再用组合 tree 的通过代替当前源码。当前完整七模块已经 117 passed,1742.10 秒,无 failed/skip;原 P2 缺 fixture 与严格整链未执行的缺口已在实际评审源码消除。旧 review 的撤销/讨论保留由维护者另行核实,不以这个批准自动抹除。

改动思路

派发意图和丢失结果无法从退出码、poll 或最新日志重建;复用现有文件锁、原子写、结算和来源投影,并在已有概览显示未知,避免另建准入或恢复权威。 当前 PR 仅交付 worker 传输防重、原始结算恢复核实和既有概览读回;原义务、Todo、费用结算、Goal 生命周期及方法采用仍归原 owner。

不采用“成功退出就当要求解决”或“换新任务就重试”的简化办法,因为它们无法证明旧请求没有执行。执行前的本地派发意图、Core 当前准入和展示观察各有不同职责:原子写与 sibling 锁保存真实传输事实,既有 typed quota/replan/settlement 继续拥有决定权,poll/history 只是来源关联的只读投影。所有普通任务继续从原 Core 准入,另一 Agent 的任务不会被误归到旧未知作用域。

原状态 当前执行器行为 继续或停止的 owner
正常返回但同一原要求未解决 暂停重复语义复核 原 Core 判断新证据与工作
原结果未知,出现新 Todo 或新事件 保留原尝试,拒绝同作用域新派发 原 Host / 原确切结算
原结算已完整核实 重查当前准入,再执行后续工作 原结算与当前准入 owner
显示读取失败或 Core Stop 显示未知;Stop 优先 来源修复 / 原生命周期

表格是该精确 head 的源码说明;执行证据另见下文,并非以流程图代替验证。

具体改动

真实增量共 28 个路径,+2691/-37:九个生产路径实现 worker 传输和 observation/readback,五个 Dashboard 文件复用原 Goal 概览;其余是现有 connector 文档、严格 CLI/HTTP/持久状态回归、浏览器 fixture 与六张明确标为历史的合成图。没有提交本地证据、临时探针或生成 bundle。相对 a272 的 B4 增量只修复已有 acceptance smoke 的初始窄屏导航等待,之后无冲突纳入 main 82b 的既有引用聚焦修复;九个 B4 生产路径与七个 pytest 模块 blob 完全不变。main 的 Outcome 样式与 localSource 权限属性均保留,没有因解决冲突删除维护者修正。

独立 spec_ref:docs/reference/protocols/goal-vision-replan-contract-v0.md;spec_revision:4a6a43cccd34a9eadc2c6e465c26e60bf0df2e8e。逐项映射 Ownership Boundary、Replan ACK freshness、Acceptance、History-trigger ownership and retry semantics:准入和 typed semantic ACK 未下放给 worker;原 identity 的完整 settlement 才解除 unknown;退出码、poll、同名 Goal 和新 Todo 均不能伪造接受;负结果仍能作为后续真实任务的输入。历史 stable/pre_stable/pre_stable_unwritten 的严格 ACK 用例全部包含在本轮 117 passed;真实 successor、负实验采用、原结算恢复与 source/global HTTP 路径也已完成。范围外的真实模型收益与分布式执行不被这些条款冒充已交付。

关键代码讲解

  • _run_worker_locked 接受当前 Core 结果,在 wake 前原子保存 intent,并用现有状态锁保证同路径单消费者。returned 的同一义务抑制重复复核;started/unknown 则挡住整个原执行作用域,Stop 分支仍先判断。这里保留的是传输记录,绝不写 accepted semantic ACK 或扣额。
  • _read_resolved_replan_attempts 只读入准入真正交付的原 SettlementIdentity,核实原 Turn/obligation、settled 阶段和完整结算均匹配后才标 verified return。普通不透明 shell 没有该证明,所以不会从最新日志猜一个 Turn 自动解锁;恢复后的下一任务仍须重新准入。
  • read_host_worker_observations 与 history 复用 source-to-global 的 sanitizer/attention 合并规则。普通 poll 不能擦掉损坏观察;错误 Goal/runtime/source witness 隐藏旧操作身份并返回未知。路径与完整 registry witness 不进入 UI 字段,诊断失败不改变真实执行意图。
  • WorkerReadback 在既有 Goal 概览说明暂停/未知与完整费用未知,技术身份按需展开,Tasks 按钮只导航,Stop 使用原生命周期入口。缺少 optional observation 时不添加该区域;远端/本机的已有写权限边界保持 main 的判定。

对主干的风险

最强反例是旧效果未知时,新 Todo 或更换 Agent 拼写重复启动;相反方向的风险是错误地把同 Goal 的另一 Agent 一并挡住。真实 File/SQLite scope probe 两边均得到 [1,2,2,0] 的 worker 返回结果:原派发只有一次,新 Todo 和显示改名不能绕过,另一 Agent 独立派发一次,原 attempt 和 canonical history 不变。同 harness 的 base/head 十二组实际 CLI/子进程对照也确认:returned/unknown 两次调用从 2 次派发降到 1,observe-only 均为 0;没有把 stricter helper 判断当作行为证明。

a272 所含 B4 产品源码完整构建的 packaged worker 场景 100.607 秒通过,覆盖 paused/unknown、中文/英文、桌面/窄屏、source/global/真实 File HTTP、错误 schema/Goal/source、损坏 UTF-8/JSON、普通 poll 后保留原 bytes、读回与任务导航零派发、真实 Stop 和恢复显示。维护者已确认新组合首屏。额外 acceptance 场景先在初始窄屏导航超时,最小同步修复后整个 packaged 场景通过;原失败保留。该修复没有改 UI 或放松断言。

语义与 CI 对齐

本地 attempt 的 started/returned/unknown 留在传输 owner,shared readback 是显式有限 schema;既有 replan/settlement/Goal vocabulary 与 authority 重用。没有 substring denylist、产品专用核心义务或把 hard brake 称作 guidance。connector 文档披露了旧的重复/失败 backoff 与当前暂停默认差异;这不是新增 default-off capability,也没有宣称缺失字段的 JSON 完全逐字不变。实际 observe-only 反例证明不消费 attempt、无 ACK/扣额和新派发。

本轮选择 AGENTS 允许的等价 risk-based required set:完整七模块 117 passed / 1742.10s,12 个真实 base/head arms、双 provider scope 反例、原完整 packaged worker 与 acceptance 场景,以及 control-plane TypeScript、Dashboard/Chat build、纳入最新 main 后 Dashboard TypeScript、Ruff、RFC 双语、diff hygiene 和 28 路径公开边界。全部通过;这套范围覆盖了 worker→原 settlement→history/source-global→typed UI 的每条新增边,并非一条手选 mock smoke。

原生 standard canary 的真实结果仍是 6 direct passed;19 selected 中 16 passed、3 个固定 120 秒超时,不能称整项通过。这里保留 semantic、monitor-poll-writeback、issue-fix-pr-lifecycle 的超时,没有提高期限、删断言或虚构根因。语义完整扫描未在期限内完成;immutable main 4a6 的同命令固定 120 秒也超时,这只提供环境/完成边界对照,不是 B4 通过凭证。当前有限状态、existing typed owner 与消费者已通过 diff-scoped advisory、人工源码检查及上述实际正负路径独立验证,不据 advisory 空结果推断所有动态语义都安全。

为何两条 broad smoke 不是 B4 新增边的唯一 required 覆盖:PR-lifecycle 走未改的 domain ledger / PR gate / Todo reconcile,只导入未改的 history.load_registry,不调用 worker、collect_history 或 host observation;monitor-poll-writeback 的 monitor/quota/writeback owner 均未改变,而且没有 --record-host-poll,attach_host_poll_receipt 在首 guard 返回。其唯一共边是 status→history 的可选观察字段;无 worker 观察时提前返回 None,不读 source witness。test_ordinary_receipts_do_not_read_worker_sources、完整 117 的真实 CLI/损坏恢复/source-global 路径与 packaged 观察零派发,直接验证了这条新增边。因此保持 broad 超时为独立诊断,代码判断采用已完成的等价覆盖,而非将未过项目改写为绿色。

旧环境磁盘满和缺 Playwright 包的入口失败保留,恢复后通过的真实 build/browser 才计通过。后续 main 仅修改另一个 analysis panel 的引用聚焦;17 个 B4 生产/pytest 路径逐 blob 与已实测 a272 一致,当前集成 typecheck 通过,原浏览器证据保留其源版本,不冒称在新 head 重跑了全部浏览器。按维护者最新指示,本批隔离 Goal 使用 wait_for_ci=false,没有查询或等待新 head 的远端 CI。

我的整体评价

当前是有用且合理的防重复派发/真实读回增量。long_horizon 为 accepted_tradeoff:消除无结果重复请求,但不透明原效果未知会有意暂停同一执行域,须由原 Host 提供证据恢复;真实独立 Agent 和原结算后的后继工作保持可用。user_experience 为 improved:既有概览直接解释原因并保留 Tasks/Stop,没有新增必须确认或复制命令的操作轮次。完整模型收益、总体研究成果、provider 成本及所有平台仍不在本片已验证范围。

本轮复用既有锁、原子写、结算和 projection,并做了同域的窄屏 smoke 同步修复;进一步重写成通用 retry 服务或无关 TS 迁移没有足够当前价值。旧 persisted witness 的兼容留存有真实恢复理由,不能通过删状态或猜绑定来缩短代码。APPROVE:当前完整增量没有确认的阻塞问题;原 P2 缺口已由当前可检出源码与 117 全量严格通过消除。 三个 broad catalog 超时仍是未完成的诊断,原生 canary 不宣称全绿。这份作者账号的 COMMENTED fallback 记录完整代码判断,不是 GitHub formal self-approval、独立 codeowner 批准或 main 合并回执;旧 review/threads 和 exact-head merge readiness 另行执行。

English verdict: APPROVE at 5c568ae17e67504cde2614b32a44d03c087da278. The merged foundation and 117 strict tests close the prior collection/full-matrix gap; paired real File/SQLite dispatch/scope checks, original settlement recovery, complete packaged journeys and typed/static/public validation establish the B4 safety/readback increment. Three broader native catalog commands still timed out at the unchanged 120-second limit and are retained as separate diagnostics; native canary success, paid-model benefit and merge authority are not claimed.

Integrate the merged C2 execution-observation and material-delivery followthrough owner plus the packaged installation smoke. The B4 worker transport, readback and existing validation source remain unchanged; qualify current composition with real hold/basis, negative-result adoption and successor continuation cases.

Signed-off-by: song <liusongstep@gmail.com>

@songoow songoow left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent; gpt-6.1-sol; provider OpenAI; runtime_reported; reasoning_effort=max.

Approval conclusion (author-owned PR; GitHub blocks formal self-approval)

动机

使用外部执行器持续推进任务、需要确认中断后是否重复调用的使用者。 同一个重规划请求正常返回或结果丢失后,旧执行器重启会再派发;当前版本保存原尝试,在要求未解决或原效果未知时暂停重复调用。 相同合成输入下,File/SQLite 两次调用从两次派发减少到一次;原回执完成结算后,后续真实任务仍可继续,页面能读回暂停或未知原因并使用原 Stop。 本片不证明真实生产事故、付费模型采用、完整费用收益、分布式 exactly-once 或所有安装平台。 不透明 Host 未交付原结算身份时仍须由原 Host 核实;研究方法比较和整条研究目标由各自后续 PR 验收。

当前评审绑定 ffb5db6df0ba17bcbce5fe4dcb7fd974b7dc1ccc,当前真实 main merge-base 为 332aa0fcd656743ba585bef5e35955fdb8070c4f;独立前后对照保留 4a6a43cccd34a9eadc2c6e465c26e60bf0df2e8e 的原来源,规范按当前已接受 main 核对。上次独立评审的 P2 是完整测试缺少 foundation fixture;本次已把主干上的 foundation 纳入实际可检出的 head,成功收集 117 项严格用例,不再用组合 tree 的通过代替当前源码。上一轮完整七模块 117 passed /1742.10 秒保留原评审 head 5c568ae17e67504cde2614b32a44d03c087da278 及其源码映射;本轮实际合入已 merged的 C2/main 后,重新执行相关的 **18 个真实 File/SQLite 组合用例(432.49秒)**及完整当前 packaged 场景。17个 B4 生产/pytest 路径逐 blob 未变;原 P2 fixture 与严格整链缺口已消除,本轮另行验证变化的共享依赖。旧 review 的撤销/讨论保留由维护者另行核实,不以这个批准自动抹除。

改动思路

派发意图和丢失结果无法从退出码、poll 或最新日志重建;复用现有文件锁、原子写、结算和来源投影,并在已有概览显示未知,避免另建准入或恢复权威。 当前 PR 仅交付 worker 传输防重、原始结算恢复核实和既有概览读回;原义务、Todo、费用结算、Goal 生命周期及方法采用仍归原 owner。

不采用“成功退出就当要求解决”或“换新任务就重试”的简化办法,因为它们无法证明旧请求没有执行。执行前的本地派发意图、Core 当前准入和展示观察各有不同职责:原子写与 sibling 锁保存真实传输事实,既有 typed quota/replan/settlement 继续拥有决定权,poll/history 只是来源关联的只读投影。所有普通任务继续从原 Core 准入,另一 Agent 的任务不会被误归到旧未知作用域。

原状态 当前执行器行为 继续或停止的 owner
正常返回但同一原要求未解决 暂停重复语义复核 原 Core 判断新证据与工作
原结果未知,出现新 Todo 或新事件 保留原尝试,拒绝同作用域新派发 原 Host / 原确切结算
原结算已完整核实 重查当前准入,再执行后续工作 原结算与当前准入 owner
显示读取失败或 Core Stop 显示未知;Stop 优先 来源修复 / 原生命周期

表格是该精确 head 的源码说明;执行证据另见下文,并非以流程图代替验证。 本轮重新检查了 main C2 的 workResultUse/replan context 和 optional execution_observation:新增信息仍是只读证据,material outcome 来自原 typed owner,没有新增B4准入、扣额或完成权。当前真实负实验仍被后续操作采用并验证结果,准备/普通poll不因此变成推进。

具体改动

真实增量共 28 个路径,+2691/-37:九个生产路径实现 worker 传输和 observation/readback,五个 Dashboard 文件复用原 Goal 概览;其余是现有 connector 文档、严格 CLI/HTTP/持久状态回归、浏览器 fixture 与六张明确标为历史的合成图。没有提交本地证据、临时探针或生成 bundle。相对 a272 的 B4 增量只修复已有 acceptance smoke 的初始窄屏导航等待,先纳入 main82b 的引用聚焦,再于本轮零冲突合入 main332 的已审 C2 执行证据/material followthrough 和安装 smoke;九个 B4 生产路径与七个 pytest 模块 blob 完全不变。main 的 Outcome 样式与 localSource 权限属性均保留,没有因解决冲突删除维护者修正。

独立 spec_ref:docs/reference/protocols/goal-vision-replan-contract-v0.md;spec_revision:332aa0fcd656743ba585bef5e35955fdb8070c4f。逐项映射 Ownership Boundary、Replan ACK freshness、Acceptance、History-trigger ownership and retry semantics:准入和 typed semantic ACK 未下放给 worker;原 identity 的完整 settlement 才解除 unknown;退出码、poll、同名 Goal 和新 Todo 均不能伪造接受;负结果仍能作为后续真实任务的输入。历史 stable/pre_stable/pre_stable_unwritten 的完整 basis/hold 用例及真实 successor、负实验采用已在本轮18项(432.49s)重新通过;原完整117、原结算恢复与source/global回归保留其真实来源。Decision followthrough in replan context 按main C2复用 MATERIAL_DELIVERY_OUTCOMES:surface-only/未知值不消费结果,负结果仍可进入后续工作;B4没有复制该分类或以进程返回伪造material delivery。范围外的真实模型收益与分布式执行不被这些条款冒充已交付。

关键代码讲解

  • _run_worker_locked 接受当前 Core 结果,在 wake 前原子保存 intent,并用现有状态锁保证同路径单消费者。returned 的同一义务抑制重复复核;started/unknown 则挡住整个原执行作用域,Stop 分支仍先判断。这里保留的是传输记录,绝不写 accepted semantic ACK 或扣额。
  • _read_resolved_replan_attempts 只读入准入真正交付的原 SettlementIdentity,核实原 Turn/obligation、settled 阶段和完整结算均匹配后才标 verified return。普通不透明 shell 没有该证明,所以不会从最新日志猜一个 Turn 自动解锁;恢复后的下一任务仍须重新准入。
  • read_host_worker_observations 与 history 复用 source-to-global 的 sanitizer/attention 合并规则。普通 poll 不能擦掉损坏观察;错误 Goal/runtime/source witness 隐藏旧操作身份并返回未知。路径与完整 registry witness 不进入 UI 字段,诊断失败不改变真实执行意图。
  • WorkerReadback 在既有 Goal 概览说明暂停/未知与完整费用未知,技术身份按需展开,Tasks 按钮只导航,Stop 使用原生命周期入口。缺少 optional observation 时不添加该区域;远端/本机的已有写权限边界保持 main 的判定。

对主干的风险

最强反例是旧效果未知时,新 Todo 或更换 Agent 拼写重复启动;相反方向的风险是错误地把同 Goal 的另一 Agent 一并挡住。真实 File/SQLite scope probe 两边均得到 [1,2,2,0] 的 worker 返回结果:原派发只有一次,新 Todo 和显示改名不能绕过,另一 Agent 独立派发一次,原 attempt 和 canonical history 不变。同 harness 的 base/head 十二组实际 CLI/子进程对照也确认:returned/unknown 两次调用从 2 次派发降到 1,observe-only 均为 0;没有把 stricter helper 判断当作行为证明。

原a272 packaged worker 场景100.607秒通过仍保留历史绑定;本轮 ffb5db6df0ba17bcbce5fe4dcb7fd974b7dc1ccc 重新完整构建后,同一原完整场景 99.264秒通过,覆盖 paused/unknown、中文/英文、桌面/窄屏、source/global/真实 File HTTP、错误 schema/Goal/source、损坏 UTF-8/JSON、普通 poll 后保留原 bytes、读回与任务导航零派发、真实 Stop 和恢复显示。维护者已确认新组合首屏。额外 acceptance 场景先在初始窄屏导航超时,最小同步修复后整个 packaged 场景通过;原失败保留。该修复没有改 UI 或放松断言。

语义与 CI 对齐

本地 attempt 的 started/returned/unknown 留在传输 owner,shared readback 是显式有限 schema;既有 replan/settlement/Goal vocabulary 与 authority 重用。没有 substring denylist、产品专用核心义务或把 hard brake 称作 guidance。connector 文档披露了旧的重复/失败 backoff 与当前暂停默认差异;这不是新增 default-off capability,也没有宣称缺失字段的 JSON 完全逐字不变。实际 observe-only 反例证明不消费 attempt、无 ACK/扣额和新派发。

本轮选择 AGENTS 允许的等价 risk-based required set:当前真实合并 main332/C2 的 18 passed /432.49s(完整12项basis/hold +4项stage +2项negative),重新构建的完整 packaged worker 99.264秒通过,current control-plane TypeScript、Dashboard/Chat build、RFC双语、diff及28路径公开边界和diff-scoped语义 advisory均通过。当前source/caller检查验证全部19组要求,并没有从旧head继承APPROVE。

旧完整117、12个真实base/head arms、双provider范围反例及原acceptance浏览器通过仍保留原修订映射;17个本片生产/pytest路径逐blob不变。变化的是已merged C2的typed runtime:对workResultUse只认material outcome、保留negative以及不授予观察执行权的语义已重新读审,并用当前18条完整真实组合验证。没有把旧117改写成新head重跑,也没有盲目重复所有模块。

此前原生standard canary真实结果仍是6 direct、16 selected通过,semantic、monitor-poll-writeback、PR-lifecycle三个broad命令在固定120秒期限内未完成。它们保留原source/条件与未知根因,本轮不重新运行全canary,不宣称当前整项通过或把超时改绿。为什么它们不是B4新增边唯一覆盖的判断仍适用:PR-lifecycle使用未改的domain ledger/PR gate/Todo reconcile,仅导入未改history.load_registry;monitor未传--record-host-poll,attach_host_poll_receipt首guard返回。status/history新增可选观察在无记录时提前返回None而不读source witness;此前117中的对应断言及当前完整packaged损坏/恢复/零派发覆盖实际新增边。选定等价risk-set依据实际call graph及变更不变量,不是因为超时才删除必要检查。

当前完整packaged验证已亲看窄屏,原先经维护者确认的worker呈现保持;本轮没有新B4设计。旧磁盘满、缺Playwright包和初始导航失败均保留各自来源,修复后通过才计通过。本批隔离Goal wait_for_ci=false,不查询或等待远端CI;本地证据和exact-head merge-readiness仍分别判断。

我的整体评价

当前是有用且合理的防重复派发/真实读回增量。long_horizon 为 accepted_tradeoff:消除无结果重复请求,但不透明原效果未知会有意暂停同一执行域,须由原 Host 提供证据恢复;真实独立 Agent 和原结算后的后继工作保持可用。user_experience 为 improved:既有概览直接解释原因并保留 Tasks/Stop,没有新增必须确认或复制命令的操作轮次。完整模型收益、总体研究成果、provider 成本及所有平台仍不在本片已验证范围。

本轮复用既有锁、原子写、结算和 projection,并做了同域的窄屏 smoke 同步修复;进一步重写成通用 retry 服务或无关 TS 迁移没有足够当前价值。旧 persisted witness 的兼容留存有真实恢复理由,不能通过删状态或猜绑定来缩短代码。APPROVE:当前完整增量没有确认的阻塞问题;原P2缺口已由实际可检出源码和原全117消除;本轮18真实组合加当前完整packaged独立验证新main依赖。 三个 broad catalog 超时仍是未完成的诊断,原生 canary 不宣称全绿。这份作者账号的 COMMENTED fallback 记录完整代码判断,不是 GitHub formal self-approval、独立 codeowner 批准或 main 合并回执;旧 review/threads 和 exact-head merge readiness 另行执行。

English verdict: APPROVE at ffb5db6df0ba17bcbce5fe4dcb7fd974b7dc1ccc after integrating actually merged main 332aa0fcd656743ba585bef5e35955fdb8070c4f. Current18 real File/SQLite basis/hold, successor and negative-continuation cases pass; the rebuilt complete packaged worker scenario passes99.264s. Prior117 and paired dispatch/scope receipts retain their real source bindings, with all17 B4 production/test blobs unchanged. Existing broad native timeouts remain historical diagnostics; no remote CI, whole-canary success or merge authority is claimed.

@songoow
songoow dismissed loopx-agent’s stale review October 20, 2026 11:53

Verified resolved at ffb5db6. The real main foundation supplies legacy_acceptance_checkpoint_fixture; no dummy or assertion change was used. The full original seven-module matrix passed 117 cases at 5c568ae, and all 17 B4 production/test blobs remain identical. After integrating C2/main332aa, all 18 affected File/SQLite basis/hold, stage and negative-continuation cases passed, plus the complete packaged worker scenario and typed/build checks. Exact-head approval and scope mapping: #6885 (review) . This closes the original missing-fixture/qualification finding; broader diagnostic timeouts remain disclosed.

@songoow
songoow merged commit 388e249 into main Oct 20, 2026
18 of 40 checks passed
@songoow
songoow deleted the codex/split-research-worker-readback branch October 20, 2026 11:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants