Repository navigation
fix(worker): prevent repeated replans and pause dispatch on unknown outcomes - #6885
Conversation
|
这个真实触发了?replan请求之后中断?
黄瑞腾
***@***.***
…---- 回复的原邮件 ----
发件人 song ***@***.***> 发送日期 2026年10月19日 21:36 收件人 loopx-project/loopx ***@***.***> 抄送人 LoopX Agent ***@***.***>,
Review requested ***@***.***> 主题 [loopx-project/loopx] fix(worker): retain durable replan attempts and expose recovery state (PR #6885)
为什么需要这次修改外部 worker 在重规划请求发出之后中断,无法仅凭新事件或重新启动证明原请求没有执行。复核尚未解决原 obligation 或请求结果未知时,必须保存原尝试并暂停新派发;owner 需要从现有 Goal 概览看到真实状态和下一步。
修改内容在 Host poll receipt 中持久化原始 worker attempt、obligation、Turn 与观察,保留原请求的恢复与结算边界,避免重启、并发 worker 或新事件造成重复派发。 将未解决复核显示为 replan_paused,将已发出但结果不明的请求显示为 replan_outcome_unknown。观察不是 Goal 激活、工作准入或完成证明。 通过现有 history/readback owner 验证 source Goal 与 global projection 的一致性。损坏、旧作用域或错误关联的观察可见为未知,不借普通 poll 改写原记录。 在现有 Goal 概览展示最近观察、原工作与时间和“查看任务与依赖”;保留直接 Stop 的 canonical 路径。带上 worker CLI / File / SQLite 回归、真实 backend packaged browser smoke 和桌面/移动截图。范围与依赖这是原 #6838 的第 4 个完整行为切片,基于 Host 当前启动 PR。worker 持久恢复、来源验证、history transport 与 UI 一起交付,使 owner 能看到未解决状态并查看原工作。后续方法比较 PR 使用同一成果界面,无需把只读观察升级为执行权。
验证与视觉证据改动 Python 文件 Ruff 与 diff whitespace 检查通过。 该分支的 packaged build 和真实 backend browser smoke 待串行验证;Python 关键链待单一重型测试槽位。 随片保留原 #6838 的 6 张 worker before / paused / unknown 桌面和移动证据;这是原实现的留存证据,不能替代本分支的新一轮运行。已检查留存的移动 unknown 视图,未解决状态与完整费用未知可直接读到,原始标识位于按需展开区域。 既有 smoke 覆盖 paused / unknown × 中文 / 英文 × 桌面 / 移动、真实 Stop、损坏/旧观察和只读导航零新派发。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
测试使用隔离的合成 Goal 和本地 backend。保留 unknown 与未验证区别,不据这些观察推断模型能力、Goal 达成或完整成本。
Author Declaration / 实现依据Written by: model_agent — OpenAI GPT-6 Astra. 依据:用户要求把 #6784 / #6838 拆成完整可审阅切片。本片提取 #6838 eac8101 的 worker 尝试持久化、恢复/readback 和配套 UI。 Intended base: #6884,codex/split-research-host-launch。验收标准 Disposition 实现 / 验证入口重启与并发不重发未知结果的原请求 implemented external scheduler worker、Host poll receipts、worker continuity 回归 原 obligation / Turn / source 关联保持精确 implemented history / run history owner、File / SQLite 恢复回归 owner 能看到 paused / unknown 并查看任务或 Stop implemented Goal overview worker readback、packaged browser scenario Validation BindingPublished revision: c49bc36. Tested tree: 155aee2eed76c978577d6ca05b5a96a319f57081;GitHub 与本地源码树完全相等。 Run state: finished(当前静态检查已结束;backend 和 browser 验证待补)。 Input classes: synthetic, public_fixture. Ruff / diff-check: passed。 Dashboard build: 主动中断以释放独占回归窗口,未计通过。 Real CLI / File / SQLite / PostgreSQL: 本片新运行尚未完成,未把原 PR 的历史测试算作本次通过。 UI 构建、真实 backend 和正式 CI / review 的未完成项均保留为合并前验证事项。Frontend / Visual Evidence以下图片随本片原样保留,来源是原 #6838 的合成场景;它们描述该 UI 设计,不是本次新 head 的重新截图。
Before: 桌面 · 移动。
After / first viewport — unknown 桌面:
After — unknown 移动:
Paused: 桌面 · 移动。
UI impact: changed。 Source data: synthetic。 Attention review: 在现有 Goal 概览集中展示观察状态与原任务入口,技术标识按需展开;unknown 保持可见,Stop 走已有 canonical 路径。 Craft review: 保留来源中的同组桌面/移动设计;本次新构建的视觉复核仍待完成。Boundary Checklistworker、readback、完整 UI 和回归随片交付。 不把只读观察当作执行或达成证明。 描述、图片和源码只含公开/合成信息。 无已有双语 RFC 对变更;提交含 DCO sign-off。You can view, comment on, or merge this pull request online at: #6885
Commit Summaryc49bc36 fix(worker): retain unresolved attempts and expose truthful readbackFile Changes(28 files)
M apps/presentation/dashboard/src/data/status.ts (11) M apps/presentation/dashboard/src/features/personal-workspace/goal-overview.css (9) M apps/presentation/dashboard/src/features/personal-workspace/goal-overview.tsx (29) M apps/presentation/dashboard/src/features/personal-workspace/personal-workspace-model.ts (8) M apps/presentation/dashboard/src/views/dashboard-page.tsx (3) M docs/integrations/runtime-connector-catalog.md (89) M examples/dashboard-goal-acceptance-browser-smoke.mjs (6) M examples/personal-workspace-browser-smoke.mjs (2) A examples/personal-workspace-browser/evidence/research-continuity/README.md (51) A examples/personal-workspace-browser/evidence/research-continuity/research-worker-before-zh-CN-desktop.png (0) A examples/personal-workspace-browser/evidence/research-continuity/research-worker-before-zh-CN-mobile.png (0) A examples/personal-workspace-browser/evidence/research-continuity/research-worker-paused-zh-CN-desktop.png (0) A examples/personal-workspace-browser/evidence/research-continuity/research-worker-paused-zh-CN-mobile.png (0) A examples/personal-workspace-browser/evidence/research-continuity/research-worker-unknown-zh-CN-desktop.png (0) A examples/personal-workspace-browser/evidence/research-continuity/research-worker-unknown-zh-CN-mobile.png (0) A examples/personal-workspace-browser/research-worker-readback.mjs (184) M loopx/control_plane/quota/host_poll_receipts.py (148) M loopx/control_plane/runtime/run_history.py (1) M loopx/history.py (49) M scripts/external_scheduler_worker.py (299) A tests/control_plane/research_worker_readback_fixture.py (146) A tests/control_plane/test_external_worker_replan_cli.py (308) A tests/control_plane/test_research_negative_continuation_cli.py (148) A tests/control_plane/test_research_replan_basis_cli.py (256) A tests/control_plane/test_research_stage_continuity.py (262) A tests/control_plane/test_worker_observation_recovery_cli.py (178) A tests/test_external_worker_replan_continuity.py (319) M tests/test_host_poll_receipts.py (211)Patch Links:https://github.com/loopx-project/loopx/pull/6885.patch #6885.diff—
Reply to this email directly, view it on GitHub, or unsubscribe.
Triage notifications, keep track of coding agent tasks and review pull requests on the go with GitHub Mobile for iOS and Android. Download it today!
You are receiving this because your review was requested.Message ID: ***@***.***>
|
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>
b813ae0 to
b9fddbe
Compare
9d905ca to
06a7c41
Compare
songoow
left a comment
There was a problem hiding this comment.
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
left a comment
There was a problem hiding this comment.
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.
|
This pull request has merge conflicts with Choose the remote for the base repository, not an out-of-date fork. 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 HEADFor a same-repository clone whose Keep the DCO |
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>
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
left a comment
There was a problem hiding this comment.
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
left a comment
There was a problem hiding this comment.
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.
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.
当前落地方式(2026-10-20)
本 PR 直接面向
main,只交付 B4 持久 worker 尝试、来源关联与既有 Goal 概览读回。当前仍为 28 文件、+2691/-37,已零冲突真实合入 main332aa0fcd656743ba585bef5e35955fdb8070c4f(已 merged 的 C2 #6901 与安装 smoke #6943),没有恢复旧研究集合分支。当前 head:
ffb5db6df0ba17bcbce5fe4dcb7fd974b7dc1ccc;tree:7a6bd358e317f96b73d50f3393fba5a891fbf587。该 main 是本 head 的实际祖先,PR base 快照已刷新。当前证据与修订映射
5c568ae17e67504cde2614b32a44d03c087da278及其 source 映射,不改记为本轮新执行。research-worker-readbackpackaged 场景在当前新 bundle 99.264 秒通过,覆盖 paused/unknown、中/英、桌面/窄屏、真实 File/CLI/HTTP、损坏/过期来源后未知状态、普通 poll 不擦除原 bytes、只读导航零派发和实际 Stop。当前组合窄屏已查看;没有新增 B4 呈现设计,原维护者预览确认保持有效。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 概览显示状态。这里描述的是代码与合成回归覆盖的故障模型,没有声称已经读取或复现真实生产中的“重规划请求发出后中断”事故。
实际修改
replan_paused;对未确认结果的原尝试,显示replan_outcome_unknown。暂停条件与继续执行的边界
replan_paused,不重复该要求的模型复核,结束当前 worker 调用replan_outcome_unknown;同一作用域内暂停新派发,包括新的重规划要求和新的普通任务replan_paused只抑制同一语义重规划要求;一个已经正常返回的 attempt 不会阻止其他通过 Core 准入的普通工作,原记录仍保留。相比之下,started / unknown的未确认尝试会挡住同作用域内后续新派发,这是本 PR 的保守取舍,可能需要人工核实并增加恢复成本。现有
todo_lifecycle_settlement/receipt_bound_replan_settlement保留各自原结算 owner,不被当成新的语义重规划机会;它们也不能绕过尚未核实的原尝试。所有这些 worker 观察都不会自动改变 Goal activation、完成 Todo 或扣除交付 quota。作用范围与依赖
codex/split-research-host-launch;本片提取 tracking: land research continuity as small PRs into main #6838 的 external shell-worker 行为及配套展示。--wake-cmd才涉及本片的派发控制。Author Declaration / 实现依据
eac81014fd3a8842ddd420d7908657af107c6787的 worker 尝试持久化、恢复核实和配套 UI。codex/split-research-host-launch。external_scheduler_worker.py、worker continuity 回归read_heartbeat_settlement、File / SQLite CLI 原回执恢复回归host_poll_receipts.py、history / run-history、观察恢复回归research-worker-readbackbrowser scenarioValidation Binding
c49bc360fb7a6ae25ef4e8f52a5bb07fbe76f15e。155aee2eed76c978577d6ca05b5a96a319f57081。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 工作受控,不能当作真实模型效果证据。c49bc360fb7a6ae25ef4e8f52a5bb07fbe76f15e曾观察到以下浏览器 CI 失败,历史运行结果保留:research-worker-readback场景结束后清理临时目录时报ENOTEMPTY。该次运行未完成验证,不能计为该检查通过。goal-hierarchy的“不得读取无关 Goal 状态”断言失败;该失败尚未归因,整项检查仍为失败。packaged 场景入口如下;本轮 d1dc8 集成上完整运行已通过,精确版本和新截图见后方补充:
Frontend / Visual Evidence
以下图片随本片原样保留,来源是原 #6838 的合成场景;它们描述该 UI 设计,不是本次新 head 的重新截图。
Before: 桌面 · 移动。
After / first viewport — unknown 桌面:
After — unknown 移动:
Paused: 桌面 · 移动。
Boundary Checklist
恢复验证补充(2026-10-19)
9d905ca3866444ee58836790a53959ab2849a2b1。ca8d3732a2847c9e76e3d1f989e084e7158deb27,tested tree24afb2e36986222fca85c5c6a54a80ad6ea9cfc9;修复基于原发布 B4c49bc360fb7a6ae25ef4e8f52a5bb07fbe76f15e。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 清理的缺陷。runtime_cleanup_started早于request_finished,HTTP 返回 500;Python 仍以0退出。request_finished早于runtime_cleanup_started,Python 以0退出。startAuthority("paused") → close()首轮stopped=false,Python 退出码为1;新增 JS 检查正确暴露了这个失败。close=0,临时根删除。原五秒 runtime 门槛保持,实际 runtime 退役约 1.006 秒。startAuthority("unknown") → close()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/ treecb8b1777655d7f37e3571b5087d6cd4db286dbbd上 126.422 秒通过(场景 116.498 秒)。覆盖 paused/unknown、zh/en、desktop/narrow、真实 File/CLI/HTTP、过期或损坏 receipt、只读导航与实际 Stop。任务数据为 synthetic;不代表模型采用或当前 main 的运行结果。原 B4 fixture probe 和旧 CI 保留原版本/失败状态;这些图片来自上方明确的组合验证 commit。
发布、进入 main 与集成证据(2026-10-20)
9d905ca3866444ee58836790a53959ab2849a2b1;tree:24afb2e36986222fca85c5c6a54a80ad6ea9cfc9。当前 base 为codex/split-research-host-launch。按原小 PR 路线,前置进入 main 后再将本片改向 main,并核对本片差异、检查和审批。fe3b1f7b382e,tree6bbf110b1cb2535975b2389558a86dff73792926。它保留原d1dc8ebfe7ff0ce888c8e7a6b7a5051413f29af2与最新 C37368ca0286d503a93e50b26ab24755a5fb429b2f两侧祖先;真实 Git merge-tree 与 GitHub tree 一致、零冲突,仅增 A3 的两文件 Markdown 诊断修复。45d742088a3f7896a0a008761f68d2437398bcd1。本轮观察的 maine4190c30d7f94886dddd8e06b899664df34120f9已另有变化,进入主干前须另行更新与验证。原d1dc8的 supplied-candidatein_sync收据保留历史绑定;后续正式 owner 收据见总进度,不将旧收据改标为新 main 的资格。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 输入,截图保留真实拍摄版本。