成功卸载后的插件日志¶
此前,成功卸载会移除插件及其 worker,同时在其键下保留最多 200 行日志。在不同键上重复此操作会保留所有旧环形日志。旧的 worker 回调也可能追加到同一键的重装中;迟到的 stdout 尾部可能在 worker 退出和卸载之后写入。
修复仅在 worker 停用和文件系统移除都成功后才清除该键。worker、面板和事件生产者会在异步工作之前捕获当前日志条目 token。清除条目会使这些回调失效,而不会保留旧行数组,也不会添加永久键墓碑。已安装停止/崩溃历史以及移除失败历史保持其现有策略。
移除权限¶
移除会加入现有刷新链,并在先前刷新完成后解析已安装对象。普通刷新会替换发现对象,因此在加入该队列之前捕获一个对象会错误地拒绝已授权的卸载。在移除拥有所选对象期间,针对该对象的新命令、面板和事件工作会被阻塞;失败会恢复准入。
服务在停用前会重新检查捆绑所有权。文件系统移除器会在现有按目录变更队列内独立重新检查它,然后才删除文件或锁所有权。这可以保护在旧 worker 停止期间发布的新捆绑修订。测试夹具发布的是真正不同的字节:重装相同字节会保留先前的不可变来源,并且不会建立捆绑后继。
成功移除会在后续刷新发布后继之前,使确切发现的对象退役。这不会更改任何线格式或执行主机策略。没有进程死亡推断、额外队列、宽泛历史上限或终止策略变更。
证据¶
四对照可移植比较使用实际服务、IPC 处理器、安装器、发现、worker 运行时、IPC 解析和 stdout 帧。worker fork/exit 传输、Store 设置访问和导入的插件代码是受控端口;真实临时文件用于执行安装和移除。不会创建原生 worker 进程或应用窗口。
| 对照 | 修复前 | 修复后 |
|---|---|---|
| 八个不同的成功卸载,每个 205 行 SDK | 8 个键 / 1,600 行 / 8 个采样行存活 | 0 / 0 / 0 |
| 相同键重装后仍持有旧回调 | 接受旧日志 | 后继日志保留 |
| worker 退出先于最终 stdout 结束 | 保留已退役尾部 | 无已退役键 |
| 已安装 SDK / 畸形原始 IPC 边界 | 8,192 代码单元 SDK 限制;200 行 | 相同 |
在收集对照期间,旧的假 worker 对象保持被根引用。WeakRefs 测量采样行对象的可达性,而不是 RSS 或字节节省。有界的合成回调顺序并不是声称原生 worker 在受影响事件中产生了该顺序。
全部 89 个测试通过,涵盖 17 个永久回归和 72 个现有兼容性测试。17 个永久回归对照还覆盖部分文件系统失败/重试、迟到的面板和事件诊断、移除前刷新、变更修订、两个捆绑检查、排队相同重装、准入恢复、服务处置和已安装崩溃历史。现有兼容性套件覆盖主机运行时、控制器、面板、安装器、完整性/对账和 IPC 行为。
源码范围与复现¶
source-versions.json 记录精确的源码哈希。原始八个变更产品基线与命名 main 291b4ddd6f1c1af480169885e0fda7f9c78ff053 和报告的 v1.4.198 e0826956fcfc532f5a1e55b5e081f2e57e553c43 匹配。比较使用明确围栏的当前依赖;它不是对任一完整历史检出的重放。小型 dependency-context.patch 在从已发布 main 运行时重建四个当前依赖差异。测试和夹具模块随此变更一起携带。新的第九个产品模块 plugin-installation-state.ts 包含提取的安装/日志状态和移除事务。它在两个命名基线中均不存在;服务仍然是唯一的刷新队列所有者。源码清单提供 249 个修复前 / 250 个修复后仓库路径(包括可选基线测试),并有六个包清单。实际比较评估加载 246 个修复前 / 247 个修复后仓库路径。
加载器会为 before 运行反转精确的零上下文修复,验证每个提供的仓库源码和包清单哈希,并拒绝未围栏的运行时仓库导入。加载器对照验证 CRLF 规范化、源码漂移拒绝和模拟发布检出。已安装的第三方运行时代码由记录的包清单表示,并不声称与历史包逐字节相同。
从仓库根目录:
ORCA_BACKGROUND_LAUNCH=1 ORCA_PLUGIN_LOG_VARIANT=before pnpm exec vitest run --config docs/audits/plugin-uninstall-log-retirement/phase.config.mjs
ORCA_BACKGROUND_LAUNCH=1 ORCA_PLUGIN_LOG_VARIANT=fixed pnpm exec vitest run --config docs/audits/plugin-uninstall-log-retirement/phase.config.mjs
ORCA_BACKGROUND_LAUNCH=1 node docs/audits/plugin-uninstall-log-retirement/loader-controls.cjs
对于 Electron 已安装的 Node 运行时,请使用已安装的 Electron 可执行文件,并配合 ELECTRON_RUN_AS_NODE=1 ORCA_BACKGROUND_LAUNCH=1 以及 node_modules/vitest/vitest.mjs,后跟相同的 run --config 参数。ORCA_PLUGIN_LOG_OUTPUT 和 ORCA_PLUGIN_LOG_LOADER_OUTPUT 选择替代报告路径。before.config.mjs 针对基线运行六个永久保留用例,并预期会失败这些保留断言。
审查更正,2026-09-17¶
首个发布的提交未通过子进程导入边界检查,因为模拟支持文件的文件名未将其标识为测试夹具。将其重命名为 __mocks__/plugin-uninstall-log-test-fixture.ts 后,即可利用守卫现有的测试夹具豁免规则。原生 fork 模拟与真实宿主/SDK IPC 生命周期保持不变;生产环境导入器、允许列表及计数限制均未更改。
重命名后,三个卸载测试套件、子进程边界测试套件以及 macOS 上的两个原生 worker 监督用例共计 23 项检查全部通过。Node 类型检查、常规 lint 和 anti-slop 检查均通过。全部 16 项修复前后对比对照组在 Node 与 Electron 的 Node 运行时中再次通过,加载器对照组也在重命名后的源码围栏下通过。上述 89 项测试批次仍是产品代码未变更的历史证据。
卸载成功后,现在会丢弃先前安装的 200 行内存历史记录。设置界面本就会移除已删除插件的日志行,但重新安装相同键名不再会恢复那些旧历史记录。这是一项明确的生命周期策略变更,而非声称每次卸载/重装序列都会产生完全相同的可观察输出。
审查更正,2026-09-18¶
激活会先等待旧版本停止,然后重新检查审批状态。因此,并发的成功卸载之后,过期的激活无法再捕获新的日志环或启动另一个 worker。控制器回归测试会暂缓执行旧 worker 的 disposal,完成停用和日志退役后再释放该 disposal,并验证之后既不会出现 worker,也不会出现日志捕获。管理器、控制器和三个卸载测试套件中的全部 35 项测试均通过;常规 lint 与 Node 类型检查通过。修复前后对比测试与加载器对照组均使用刷新后的源码哈希重新运行。加载器对照组现在接受两种文档记载的发布布局:已携带围栏上下文的依赖项,以及仍位于命名主源码入口的依赖项。
剩余限制¶
这说明了代码层面存在一个在成功卸载后仍然存活的主进程所有者。但这并不能确定插件使用情况、卸载率、字段分配大小,或 #19831 及任何其他事件的归因。已安装、已禁用、已崩溃、开发中以及被外部删除的插件历史记录,并不会因本次变更而被全面退役。顺序式文件系统删除并非回滚事务;失败时会保留发现结果/历史记录以便重试。进程内变更队列不会使外部或跨进程的锁文件编辑具备原子性。如果在关闭期间出现捆绑的后续版本,旧 worker 可能已在删除被拒绝之前停止;该后续版本仍保持已安装状态,并可在此后激活。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca