# 进度与证据 ## 2026-10-05 Runtime 生命周期审查修复 A01(远程启动阻塞控制队列)和 A02(本机 OpenCode 提交失败后等待静默 SSE)已修复。 远程启动等待释放 backend 控制队列及协议接收分派,取消、watchdog、关闭和其他 binding 可以继续处理;Session owner 合并相同启动、拒绝冲突,并关闭取消后迟到的 原生 Session。本机提交错误立即唤醒所属 SSE 消费,保留原错误和既有 Session 取消。 两条实现均未增加整个 Prompt 的默认总时限;共享进程、终态提交和写帧顺序规则见 [Runtime 进程复用设计](../assistant-workbar/runtime-process-reuse-technical-design.md)。 ### 确定性复现 持久回归中,本机拒绝、错误响应、10 ms 提交超时三种情况在旧代码经过 100 ms 假时钟后仍未结算;远程共享进程中的第二个 Session 启动被挂起时,旧代码经过 200 ms 后,取消/截止时间和同进程另一 binding 的查询均未结算。上述五项先运行旧 实现,全部按这些断言失败。真实 Host 首轮还定位到协议 dispatcher 串行等待启动 响应,新增帧级回归在修复前只分派 `start`,没有分派后续 `cancel` 和 `peer`。 修复后的九项新增回归通过,另覆盖启动 watchdog、默认关闭时限、相同启动重放及 冲突。共享 peer 保持 running;迟到 Session 收到自身的 `session/close`,取消的 启动不发送 Prompt。原始审查探针曾在 131 秒假时钟后观察到启动、取消、peer 查询 仍等待,默认 10 秒 dispose 报超时且 stop 次数为 0,现有关闭与 watchdog 回归不再 等待原生初始化响应。各假时钟值是确定性边界,不是系统性能测量。 ### 当前源码实机验证 复用已有 lifecycle harness,用 esbuild 重建当前 Desktop driver、Agent daemon、 CLI/helper;凭据从 GoodBuddy 已有加密配置的临时副本加载,SSH 校验已固定 Host identity。共享 Linux x64 经 `192.168.0.23` 连接,只使用 `/root/tmp/gb-lifecycle-*` 专用目录和所属进程,未替换原 Host 安装或修改无关数据。 | 场景 | 实际结果 | 真实文本提供商调用 | | --- | --- | ---: | | 首轮 Host 启动挂起 | backend 修复后,协议 dispatcher 仍阻塞;测试退出后所属进程为 0 | 0 | | OpenCode 启动取消及工具、detach、controller 恢复、测试 Agent 提升、重放 | 启动响应被挂起时控制查询 48 ms、取消 216 ms;工具与恢复完成;两个提供商响应均 HTTP 200 | 2 | | Continue 同场景 | 控制查询 60 ms、取消 258 ms;工具与恢复完成;两个提供商响应均 HTTP 200 | 2 | | Windows 当前源码 OpenCode 普通文本 | 真实原生二进制经有界 loopback 转发访问已配置模型,返回 `LOCAL_RUNTIME_OK`,0 工具调用;总耗时 4,727 ms | 1 | 本轮合计 **5 次真实文本提供商调用、0 次图片生成调用**。两次本机脚本准备失败发生在 SDK 动态加载阶段,均为 0 次模型调用,随后修正测试 bundle 并通过。所有成功场景均 使用最终相关生产源码。Host 启动取消阶段各为 0 次模型调用,最终所属残留进程均为 0, 专用目录由 harness 清理;本机 Runtime 和凭据临时副本也已清理。 真实数据检查使用本轮原生工具和模型产生的事件:OpenCode 45 条写入、23 个 checkpoint, Continue 16 条写入、8 个 checkpoint,经生产 `AssistantDatabase` 和 `RemoteEventBatcher` 写入隔离 SQLite,再重放确认全部去重。未迁移、改写用户生产 历史库,也未以构造事件代替本轮 Host transcript。 原始脚本和日志位于 `C:/Users/jiang/AppData/Local/Temp/opencode`: `a01-runtime-host-build.cjs`、`a01-runtime-host-run.cjs`、`a01-runtime-host/`,以及 `a02-local-model.ts`、`a02-local-model-run.cjs` 和 `a02-local-model-1791142126078.log`。 Host 成功日志为 `opencode-1791141713375.log`、`continue-1791141785721.log`。 延迟为各场景一次实测,不宣称吞吐、p95 或完整桌面性能提升。 ### 检查命令与边界 ```text npx vitest run src/agent-daemon --testTimeout=30000 --hookTimeout=60000 npx vitest run src/main/remote-agent src/main/agent/acp-remote-runtime.test.ts src/main/agent/runtime-controller.test.ts src/main/agent/local-runtime-registry.test.ts --testTimeout=30000 npx vitest run src/main/agent/opencode-runtime.test.ts npx vitest run src/main/agent/opencode-runtime-lifecycle.test.ts --testTimeout=30000 --hookTimeout=60000 npm run typecheck npm run lint ``` 四组测试分别为 323 通过/33 跳过、393 通过、156 通过、4 通过,共 876 项通过; typecheck、全仓 lint 和修改范围 `git diff --check` 通过。初次合并运行中,既有 OpenCode `cleanup-timeout` 用例失败一次;该用例独立复跑及随后完整 OpenCode 文件 复跑通过,未改动该用例或相关产品清理逻辑。较早 Main 类型检查的并发监督者 fixture 错误在最终全仓检查时已消失。 验证覆盖当前源码、真实 Windows OpenCode 二进制和共享 Linux x64 Host,不含签名包 安装验收、完整 UI 点击、macOS/Linux arm64 或用户生产大库性能测试。首轮定向验证 未运行全仓 `npm test`,后续完整检查见下节;远程更新仍须部署包含本次源码的 Agent, 未提交或发布。 ### SDK cleanup-timeout 复查 后续全仓验证为 6,130 通过、1 失败、87 跳过,唯一失败是 OpenCode SDK `cleanup-timeout` 用例。复查通过独立 Node 子进程的十轮显式 GC 和受控取消复现: 旧 fetch 替身只保存 `request.signal`,返回永不结算的 Promise,没有在途 Request 所有者或 abort 处理。Request 及 Undici 内部 AbortController 被回收后,外层超时 signal 已中止,保存的 Request signal 仍未中止。真实 loopback fetch 在同样 GC 条件下保留 Request,取消后 SDK 返回错误,未观察到产品清理提前完成。 修正仅涉及测试:挂起的 fetch 替身在 abort 时以 `request.signal.reason` 拒绝, 闭包保持 Request 存活至取消。原有 `signals.every(signal => signal.aborted)`、调用 顺序、错误脱敏及超时均保留。新增 GC 回归在旧替身上稳定失败,修正后通过;九项 SDK 定向用例、Main 类型检查及该文件 ESLint 通过。本次跟进新增外部模型调用 0 次, 生产代码与远程 Agent 路径均未改动,无需重新执行 Host 模型验证。 修正后的完整 `npm test` 于 04:00:22 开始,852.63 秒完成,退出码 0:518 文件通过、 15 文件跳过;6,136 项通过、0 失败、87 跳过。计数包含并发工作树中的其他修复。 原始记录为 `C:/Users/jiang/AppData/Local/Temp/opencode/a02-cleanup-final-20261005.log` 及同名 `.json`;GC/真实 loopback 对照脚本为该目录的 `a02-cleanup-gc-probe.mjs`。 ## 2026-10-04 调研与设计 调研阶段,用户确认彻底移除 Ask / Execute,包括界面、原生工具与 MCP 限制,并允许升级清理历史模式字段。该阶段先交付文档,随后用户确认删除安全设置并授权实施;实现结果见下文。 已完成只读源码调研:共享合同、Renderer、Main IPC、Model/OpenCode/Continue/Harness、原生客户端、Agent/桥接/辅助程序、图片工具、子代理、通道、队列、日程和数据库迁移入口。具体路径见[源码调研](./source-audit.md)与[数据迁移](./data-migration.md)。历史检索未返回相关存储决策,设计依据为当前会话要求与源码。 调研基于有未提交改动的工作树,不对应冻结的发布提交。记录到 Desktop 版本 0.15.10、数据库 schema 59、Agent wire 2.0 和 runtime/acp capability 5;实施前须重新检查并发变更。 ## 已知工作树改动 本会话较早阶段按“Ask 仅提供只读工具”的旧方向修改了浏览器权限、网关分类、IPC 发放及相关测试。该方向已被完全移除模式的需求替代,后续源码改造已清理这些模式条件。 旧方向的聚焦测试曾报告 280 通过、1 跳过,类型检查与 lint 通过;这不构成本功能的验收证据。当时发现的 Model/Continue 上层授权分支和图片服务模式检查已在本次实现中移除。 工作树另有并发的任务统计、监督者、界面和文档改动,均不属于本次移除实现。未对其回退或覆盖。 ## 2026-10-04 当前实现与定向验证 主要源码改造已落地,最终类型检查、lint 与生产构建通过。全量测试和后续定向复跑结果见“最终集成检查”;当前不声称全仓测试全绿。 | 技术设计阶段 | 状态 | 剩余工作 | | --- | --- | --- | | P1 合同与迁移 | schema 60、Runtime 设置 22 及无模式合同已实现;合成回归 44 个文件、538 项通过,见[迁移记录](./data-migration.md#8-本地存储验证) | 真实旧库与未声明历史形状取证 | | P2 本地执行 | Model、OpenCode、Continue、Harness 模式分支及一般工具审批已移除;内部无工具构造保留 | 全量测试及各平台最终验收汇总 | | P3 各入口与原生客户端 | 队列、日程、通道、委派、子任务及原生配置已改为无模式 | 外部委派服务、原生客户端发布包矩阵 | | P4 远程协议 | runtime/acp 6 与当前源码真实 Linux Host 定向验证通过 | 配套签名包重建、升级与发布矩阵 | | P5 界面与文档落地 | 模式与安全分类已删除;清除数据搬迁后的 Electron 定向验证通过 | 中英文、主题、键盘完整矩阵及最终文档汇总 | ### 真实 Host 原始证据:`C:/Users/jiang/AppData/Local/Temp/opencode/unified-execution-host/validation.md`。基于并发工作树,用 esbuild 重建 Desktop driver、Agent daemon 与 CLI/helper,连接共享 Linux x64 Host,在专用目录测试;上游 OpenCode/Continue 工件使用 Host 已安装版本。这是源码开发验证,不是签名包或发布验证。 | 场景 | 真实模型调用 | 实际结果 | | --- | ---: | --- | | OpenCode 无模式请求及进程重建后的原生历史 | 2 | 通过 | | Continue 无模式请求及进程重建后的历史 | 2 | helper 原生模式修正前通过 | | OpenCode 原生工具、detach、controller 恢复、测试 Agent 提升及重放 | 2 | 通过 | | Continue 取消及新请求 | 2 | helper 原生模式修正前通过 | | Continue 原生工具/detach 首次尝试 | 1 | 失败:没有 running tool 事件,helper 选择了原生 chat/`--readonly` | | Continue 原生工具、detach、controller 恢复、测试 Agent 提升及重放 | 2 | helper 改为原生 agent 后通过 | | Continue 取消及新请求 | 2 | helper 改为原生 agent 后通过 | 共 13 次真实模型调用,每次运行关闭后所属残留进程均为 0。真实图片提供商调用为 0;图片绑定、生成与保存仅由受控提供商测试覆盖。结构化提问由远程测试及既有原生二进制探针覆盖,没有真实 Host 提供商提问场景的结论。 最终远程回归命令: ```text npx vitest run src/agent-daemon src/main/remote-agent src/main/agent/acp-remote-runtime.test.ts src/shared/remote-agent-contracts.test.ts src/shared/remote-runtime-launch-contracts.test.ts src/shared/agent-protocol --testTimeout=30000 --hookTimeout=60000 ``` 66 个文件通过、2 个跳过;723 项通过、33 项跳过。helper 最终修改后的局部 ESLint 通过。原始记录当时报告全仓 lint 通过,但 typecheck 仍被并发调用方和夹具阻塞,Agent-only 检查剩余 `DirectModelSubagentParent.workMode` 错误;这保留为当时结果,不作为最终聚合检查结论。 ### 真实 Electron 实施方提供的通过结果与 [unified-execution-main.ts](../../../tests/support/unified-execution-main.ts) 对应:生产 App、preload、IPC、设置和 SQLite,隔离无关启动服务。种子消息证明首次点击不删除、取消保留、确认经生产 IPC 删除且重载后仍删除;同时检查输入区及项目表单无模式控件、安全分类消失、入口属于 General / Platform Features,模型请求为 0。该证据不等于完整启动服务或全部 UI 场景验收。 ### 现行文档 根 README、双语 FEATURES、BUILD、UI-DESIGN、运行时约定与受影响功能 Markdown 已同步无模式规则。规划功能仍保持规划状态;历史发布、原型及日期明确的验证段保留当时结果。站点中英文页面、内置工具描述与联网诊断请求也已清理旧模式说明和字段。 ### 专家执行空间与远程图片保存 审查发现智能路由删除 Ask 条件后,原先全局缓存的专家模型可能把项目写操作落到全局目录。现已按当前项目创建专家实例,传递父请求的能力上下文,并在子任务结束时释放其自身资源。两份不同本地根目录的回归验证写入位置和上下文继承;内部综合仍使用独立无工具实例。 SSH 专家保留父请求已解析的 OpenCode 或 Continue 选择,通过现有 managed remote runtime 使用专家模型配置。图片保存因此沿用 Host 的 image MCP,不调用 Desktop 的本地保存函数,也没有新增文件传输协议。复核未再发现上述执行空间或保存目标问题。 真实 Host 记录:`C:/Users/jiang/AppData/Local/Temp/opencode/expert-image-validation.md`。两个 Runtime 均完成无覆盖保存、重复保存冲突、显式覆盖测试,SFTP 读取结果与替换 PNG 的 68 字节完全一致;每个成功场景 3 次图片读取、0 次桌面保存,退出后所属进程为 0。此处图片是测试夹具,不是提供商生成。 该轮共 12 次真实文本提供商请求,包括初始验证脚本预算不足的两次尝试各 2 次请求,以及最终成功的两组各 4 次请求。加上前述无模式链路的 13 次,本功能开发验证累计 25 次真实文本请求、0 次图片生成请求。SSH 专家修复后五个聚焦文件 260 项通过、1 项既有跳过。 ### 最终集成检查 - `npm run typecheck`:Main、Agent、Web 通过。 - `npm run lint`:通过。 - `npm run build`:最终专家修复后通过,包含上述类型检查和 control-plane installer 检查;保留一条共享工作区模块静态/动态导入的构建提示。 - `npm test`:完整运行 523 个文件,497 通过、12 失败、14 跳过;6,062 项中 5,956 通过、20 失败、86 跳过,并出现 1 个未处理错误。该运行期间工作树有并发修改。 - 失败定位与修正后,最后针对六个文件复跑为 360 通过、1 失败;其中 App 348 项、真实存储 Worker 3 项、工作栏布局 2 项、OpenCode 生命周期 4 项和远程路径访问 3 项通过。 - 本功能遗漏的存储 Worker 旧夹具已修复,并增加直接通过历史迁移链构造 schema 59 的真实 Worker 升级验证;相关三个文件共 145 项通过。 最后复跑仍失败的是 `tests/supervisor-layout.electron.test.ts`:驱动等待 `.supervisor-workspace__inline-error`,并发监督者改造已改用通知。该问题不属于本次工作模式移除,没有回退或改写对应业务变更。它阻止当前工作树被描述为测试全绿。 完整及复跑报告分别位于临时目录的 `ask-execute-full-20261004.json`、`ask-execute-focused-20261004.json` 和 `ask-execute-final-followup-20261004.json`。这些数字属于各次运行,不相加作为去重测试总数。 尚未进行用户生产旧库副本迁移、签名安装包发布或全部跨平台验收。远程使用需配套支持 runtime/acp 6 的 Agent;现有已发布锁文件未被伪造为兼容新协议。 ## 调研阶段验证边界 早期只读调研没有执行迁移、读取真实用户数据库或调用模型,调用次数为 0。后续实施验证单列在上文,不能将两个阶段的证据范围混为一谈。 仍需实际取证:旧 `runs` JSON 形状、Agent 不透明事件中的应用自有字段、旧远程操作跨升级恢复,以及外部委派服务兼容性。不得用递归删字段或清空日志回避这些问题。 ## 调研阶段文档检查记录 已对九份文档进行交叉审查,核对范围、需求与故事映射、源码引用、相对链接和当前状态表述。审查发现的独立授权验收缺项、原生设置范围歧义和起草阶段备注已修正。 `deai-writing` 扫描九份文档,阻断项为 0。复核项主要为未验证状态、数据保留条件和字段枚举;结合技术文档语境保留这些限定,不将迁移计划改写为已完成事实。 `git diff --check -- docs/features/unified-execution docs/features/assistant-workbar/README.md` 通过已跟踪改动的空白检查。新建文档另经内容与链接核对;该命令不会把未跟踪文件当作已验证差异。文档检查不替代运行时验收,后者按用户故事与技术设计执行。