跳转至

Electron 同步 shell 边界验证 — 2026-10-16

修复 #4393 复用了 Nitin13-git 的现有 PR #4562。该边界拥有一张固定的方法/返回值表:现有的异步块仍然被拒绝,而 showItemInFolder 返回 undefined,writeShortcutLink 返回 false。两个新块都使用现有的仅形状事件记录器,该记录器由 CLI/MCP 共享。未添加任何工具、schema、捕获权限、分析缓存或启动行为。

来源与受控回归

全新的 main 基线为 f26973a52918a938631e90fdc9116f7b85a62a52;实现集成为 0386b60fb,冻结的验证器源码为 3f231735c3fbc28918590ddc61461871c8a2aa4d。相邻的 JSON 记录了冻结的最终脚本/运行时/输入哈希以及所有尝试;未固定的探索性辅助修订版被明确标识。原始贡献者的署名保留在 Git 祖先历史中。

使用基线边界运行候选测试会产生 73 通过 / 1 失败:伪原生快捷方式实现会执行并返回 true。使用候选边界时,87 个用例通过(74 个暂存钩子、5 个投影、8 个 MCP)。这些用例测试了原生调度抑制、同步结果、仅形状保留以及共享事件 schema。伪 Electron 用例和受控 MCP 提供方并不能证明真实 Windows shell 实现已被实际执行。npm run check:fast 通过两个未缓存任务。构建缓存差异和不同的用例数量使得红/绿计时不适合作为速度比较。

真实 Joplin 工作流与限制

输入:未修改的 Joplin Desktop 3.7.21 ASAR(233,575,014 字节),以及明确的通用 Electron 44.7.0 运行时。获取/校验和引用位于 javascript-native-handoff-identity-2026-10-15.json 和 electron-cancellation-2026-10-16.json;这不是供应商可执行兼容性。未更改任何可执行 fuse。大型可下载输入和生成的配置文件不会被提交或保留为实验包。

验证器打开 Joplin 自带的 1. Welcome to Joplin! 笔记和真实 PNG 附件。它选择 Joplin 实际的编辑器布局和资源上下文菜单回调;Joplin 现有的桥接调用真实打过补丁的 shell 方法。原生弹窗呈现被捕获用于自动化;其应用回调不被替换。在任何应用操作之前,验证器要求活动钩子已就绪。它要求零个早期 reveal 事件、一个新被阻止的仅形状 reveal 事件、一个仍然渲染的附件,以及共享保留捕获中一个相同的事件。

标准启动仍然不成功。 较早的标准探针报告 Joplin 启动标志解析器中的 Unknown flag: -r;冻结的标准验证器在等待应用搜索输入时超时。这与 #2974 相关,在此处未修复。一个被放弃的 NODE_OPTIONS 实验无效:Playwright 会移除该变量,因此没有安装钩子。那些尝试从不用作拦截或性能证据。

显式的 --argv-shim-transport 测试适配器加载提供方的暂存规范钩子,并在 Joplin 启动前仅从其 app argv 中移除自己的精确 -r/shim 对。它不修改 ASAR 或生产提供方。其成功的操作阶段不是成功的标准公共 CLI/MCP 工作流。提供方清理仍然失败(#4282);验证器以非零状态退出,保持这一区别。外部自有作用域拆除并不能确立提供方清理。

第一个有效的 shim 探针到达一个被阻止的 reveal,可见 1075×666 PNG,无页面错误,并保留捕获证据。最终的冻结重跑额外检查事件因果性和精确捕获相等性。详细的测量结果和完整家族观察状态在 JSON 中。最终受控管道耗时 16.989s 墙钟 / 16.055812 家族 CPU 秒 / 1,376,382,976 峰值 cgroup 字节,并带有已验证的 payload 退出观察;整体工作流仍然在清理阶段失败。每次最终试验都有一个新的私有 config 挂载;较早的探索性共享 config 试验不是独立的冷运行。文件系统/运行时/构建缓存是热的;不声称任何冷系统或热重复加速。Agent/计费 token 未测量;没有 token 收益声明。

复现

使用固定的 Node/npm 工具链。通过 npm ci 和 npm run build:cached 安装依赖并构建。创建一个自有可写的数据包目录,包含 tmp、profiles 和 config/joplin-desktop。在 Linux 上,在一次性 bwrap 挂载命名空间中将该私有 config 绑定覆盖实际的用户 config 目录(不要更改 HOME),保持应用资源只读,并在 Xvfb 下运行。将 TMPDIR 设置为自有可写数据包的 tmp 目录。运行:

node experiments/analysis-efficiency/joplin-shell-boundary.mjs \
  --runtime-root /absolute/rea-checkout \
  --executable /absolute/generic-electron \
  --application /absolute/Joplin/resources/app.asar \
  --profile-root /absolute/owned-packet/profiles \
  --argv-shim-transport

省略最后一个标志即为失败的标准启动。在 resource-run.py --memory-gib 8 --observe-payload-exit 下串行运行重负载工作:一个 CPU、无 swap、6 GiB 提前停止余量和 192 任务上限。CPU/峰值内存记录在 payload 退出时以观察器存活状态给出;内存包括文件缓存,而不仅仅是 RSS。未验证的完整家族观察被明确标记。此处未执行 Windows 主机、macOS 主机、供应商打包运行时或完整的 check:pr。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea