转录追赶可能比宿主拆除存活更久¶
宿主拆除会在排空进行中的交接之前停止 TUI 转录追赶。此前,追赶设置只在异步路径解析之后才注册其状态,并且只在异步订阅获取之后才存储其取消订阅函数。拆除可能漏掉其中任一资源。尚未进入准备阶段的交接也可能在 stopAll 之后启动监视器。实际宿主测试复现了宿主会话被移除后仍有存活的监视器。相反,在已获取的监视器产生首个快照之前停止它,会使准备阶段无限期地等待该快照。
所有权修复¶
追赶现在会在其第一个 await 之前注册状态,并在整个设置过程中拥有一个中止控制器。它会传递现有的解析器/订阅者取消信号,释放迟到的订阅,在停止时结算初始就绪等待,并保留同一会话中更新的获取。stopAll 会永久关闭此宿主的准入;普通的按会话 stop 仍允许替换。
准备阶段在内部返回其信号,以便交接在启动 TUI 之前和之后立即检查取消。一个专用的内部取消错误,在尚未提交任何 TUI 所有者或进程身份时,会通过现有的带围栏的 abandonStoredAgentSessionHandoffAttempt 转换释放未使用的预留。如果启动在取消之后带着所有者返回,则调用现有的已验证清理路径;如果清理不可用或失败,则保留所有权,并且仍需手动恢复。它会留下一个可恢复的原生租约,而不获取替换项。这一区别很重要:普通的准备失败会触发原生恢复,而延迟的替换获取可能在五秒拆除排空之后完成。普通的读取失败保留该恢复行为。对存活 TUI 的已取消恢复会停止,而不重试或重新标记其存活租约,并结算任何仍待处理的原始持久化操作。
这些是内部生命周期变更。它们不新增任何线路类型,也不推断远程进程死亡。在有限的拆除排空之后仍保持进行中的启动,以及取消之前已被准入的边界/导入 I/O,仍不属于此变更的取消保证范围。
复现¶
该脚本通过实际宿主、交接协调器、持久化记录存储、日志和转录监视器运行七项测试。真实文件解析、监视器安装和初始读取会在显式异步边界处暂停;提供程序进程使用现有的假适配器/传输。不会启动真实 shell 或应用窗口。
fix.patch 在临时 Vite 转换中被反转,用于基线。新的内部错误声明对相同断言仍然可用;它不改变基线控制流。源哈希和确切失败用例记录在 results.json 中。每个运行器使用 512 MiB 旧空间限制、90 秒截止时间以及仓库的跨平台 runProcess。该证明要求修复后的运行器成功退出,并且与其七通过/零失败报告相匹配。临时运行器/配置文件和已获取的监视器会被清理。
| 版本 | 通过 | 失败 |
|---|---|---|
| 修复前 | 1 | 6 |
| 修复后 | 7 | 0 |
五个准备用例覆盖解析、订阅返回、初始快照、拆除后的准入,以及一个已完成但调用方尚未恢复的准备。恢复用例保留存活 TUI 租约。对照用例在普通解析器错误之后延迟原生获取,并验证原始错误和恢复行为。另外六个所有权测试覆盖重叠的 prepare/recover 替换、按会话重启、重复关闭,以及在无可用受支持记录时返回的信号。现有追赶测试保留实时追加和重启间隙重放。
另外两个交接回归测试覆盖 TUI 启动在取消之后返回,以及在恢复待处理持久化操作期间发生取消。两者在原始 PR 头部上失败,并在评审修复后通过。迟到的所有者会通过现有的已验证清理契约停止,然后预留被放弃,而不获取替换的原生所有者。如果清理不可用或无法证明所有者已停止,则现有的手动恢复路径改为保留所有权。恢复取消会将原始操作标记为失败,而不重新标记存活 TUI 租约。
版本与归因¶
命名路径读取确认 v1.4.198 中存在相同的设置缺口、未防护的前向启动以及先停止后排空的顺序。在该标签中,拆除阶段内联在 structured-agent-session-host.ts:254;当前源码将它们提取到 structured-agent-session-host-teardown.ts。可执行证明比较此修复前后的当前源码。它确立了报告版本中存在的执行宿主监视器保留路径,但没有证明 #19831 或 #19768 触发了此拆除竞态,也没有解释任一报告的内存量级。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca