跳转至

被中断的应用处理:适用性与证据

跟踪 #3948,隶属于 #4027。实测基线: c7f6b8bad1a34d5efb30ff2a017672dea1fcdabb。

问题在于:在发生源中断后,哪些处理阶段仍不可用,同时保留原生清单和已收集的事实。原生身份和提供者关联必须独立于应用级的部分覆盖。这是静态工件分析;不会运行目标应用或原生提供者。

观察到的失败与修正

中断生产者之前将一种通用失败附加到所有剩余相关文件上。图投影将其解释为 JavaScript AST 工作。真实的 Joplin 在 keytar 的原生二进制文件以及未访问的 package、HTML 和 source-map 文件上复现了 analyze-javascript-source / ast-static-analysis 不可用范围。公开的 CLI/MCP 控制也复现了同样的适用性问题。在原生元数据之前进行确定性取消,还额外为二进制文件产生了一个幽灵 JavaScript 语义模块。

生产者现在会记录适用的操作/处理方以及该阶段是否已进入。analysis_status: interrupted 包含 worker 启动,并不表示解析已完成;not-started 标识未访问的阶段。原生插件在清单之后不需要源处理阶段,因此无论是被中断的还是被调用方排除的原生文件,都不会获得 AST 作用域或语义模块。实际的 JavaScript 失败、结构化文件未知项、调用方选择和字节身份仍然可用。图会消费这些已产生的事实。

仅限 AST 的不可用证据辅助工具被替换为显式类型化的静态辅助工具。常规的 package/JSON/map 缺口也保留其工件字节处理方。每文件的进度使用相同的适用性所有者:JavaScript 保留其源阶段,元数据使用 process_javascript_artifact_metadata。其余解析器在中断后不会运行。失败共享在一次中断期间限于五个适用阶段;不添加持久缓存。

第二次审查发现,备用的全分析语义构建器仍然会为每一种被排除的文件类型创建模块。修订版 323fae8cbf3e36677bcb7b22ba31fa1a7e3c5cd4 上的一个实际文件系统生产者回归,复现了幽灵原生/JSON/HTML/package/source-map 模块,而被选中和被排除的 JavaScript 是阳性对照。语义适用性现在归属于共享的 recordUnavailableFile 投影入口点,且在保留限制、节点、根或未知项之前。三个重复的调用方检查被移除。全量构建和增量构建都使用这一边界;实际被排除的 JavaScript 继续携带源绑定未知项和部分语义覆盖。

真实输入与复现

使用 官方 Joplin v3.7.21 获取与提取说明。AppImage 的 SHA-256 为 5d202dcaca31e14206826aa3f04125e7c218dbc3dc3d98479d811efbd6b856c1;ASAR 的 SHA-256 为 767df409b18effe60421fbefcca873de237c7e813eac744ecdeebbc5e825a33a。

这份包含 6,324 个文件的清单包括 46 个未解包条目。两个队列都安排了全部三个原生伴随文件;其余 43 个未解包条目仍不可用。

使用固定的 Node 24.18.0/npm 11.16.0 和锁定的依赖进行构建。扩展后的现有验证器也会针对基线运行时运行;在复现该失败时,请将验证器和 scripts/lib/javascript-file-scope-oracle.mjs 从已修复的修订版复制到已构建的基线检出中。

artifact_path="/absolute/path/to/cases/available/app.asar"
common=(
  --artifact "$artifact_path"
  --addon-path node_modules/keytar/build/Release/keytar.node
  --native-sha256 0700016bcd761cbe02d275f2046c7cc42f39f730a50d66e3d3307aa9d413373a
  --source-path ElectronAppWrapper.js
  --source-path ElectronAppWrapper.js.map
  --source-path index.html
  --source-path package.json
  --source-path node_modules/keytar/build/Release/keytar.node
  --structured-path ElectronAppWrapper.js.map
  --structured-path index.html
  --structured-path package.json
  --structured-expectations '{"ElectronAppWrapper.js.map":{"operation":"parse-local-source-map","analysis_status":"not-started"},"index.html":{"operation":"parse-html-script-references","analysis_status":"not-started"},"package.json":{"operation":"parse-package-json","analysis_status":"not-started"}}'
  --rounds 3 --cli-parity
  --tokenizer-python /absolute/path/to/python-with-tiktoken-0.12.0
)
node scripts/verify/javascript/native-handoffs.mjs "${common[@]}" \
  --analysis-timeout-ms 1 --expect-timeout --require-safe
node scripts/verify/javascript/native-handoffs.mjs "${common[@]}" \
  --validate-structured-from-export --require-safe

在基线超时运行中省略 --require-safe,以记录其不正确的适用性。其诊断性退出码 0 并不是通过的分析任务。受支持的 1 ms 截止时间包含 worker 启动;验证器要求该队列具有类型化超时和保留的部分参考。每个结构化路径都提供独立的预期操作和阶段进入状态;安全 oracle 会精确匹配所有缺口,包括不可用状态和未知置信度。缺失或冲突的预期不会通过。

原生路径被显式选中。先前的一次仅结构化运行将其排除,因此没有复现原生中断。输入选择项和该初步结果仍然被记录。两个最终队列都为未选中/不可用的作用域保留了部分覆盖。

所提供的原生证据仅用于模拟,以检查精确的主题关联。验证器检查物理伴随文件字节和导出父项的根摘要,验证公开的 CLI/MCP 原生跟踪一致性,并且仅在自有传输/命令/私有文件清理之后才报告。应用程序和大型证据是可重新生成的,不会被归档。

两个不同的任务投影

超时任务包括预期的类型化超时准备、一条内联原生追踪和三条内联结构化路径追踪。它检查原生阶段没有 AST 失败,并且每个未访问的结构化阶段保持不可用,具有相应的产物字节权限和 not-started 状态。

默认截止控制对摘要加一条内联原生追踪进行建模。其命名结构化路径还会根据已导出的完整父级进行额外验证,显式标记为 exported-parent-validation。这些检查属于诊断开销,位于所建模的原生任务令牌之外,但在验证器总资源之内。它们不会作为内联元数据答案呈现。

另一个还请求了完整传出 package.json 特性追踪的控制项两次触发 stdio 准入:至少 10,587,373 字节,而结果预算为 10,484,736 字节,且保留的父级/追踪身份相同。它不是已完成的等价任务,也不是效率基线。#4190 记录了单独的需求:需要精确的保留元数据/原生事实视图。完整导出仍然可用。不要跨这些不同任务比较成本。

测量

队列 修订 墙钟秒 CPU 秒 峰值 cgroup 字节 适用性
超时,四条内联追踪 baseline 60.738 60.289464 3,092,045,824 错误范围
超时,四条内联追踪 final 57.515 57.089883 2,763,276,288 通过
默认控制,原生内联 baseline 61.542 61.135522 2,808,336,384 通过
默认控制,原生内联 final 186.085 142.371100 2,959,585,280 通过
定义的任务 选定目录 + 解析/结构化回复 BPE 选定目录 + 完整工具回复 BPE
超时 21,136 → 20,161 36,468 → 34,471
原生控制 11,776 → 11,720 17,738 → 17,632

完整目录的替代方案和每次查询的样本均保存在 JSON 中。原生内容身份、观察到的字节来源、源选择和交接提供方 Evidence 保持一致。修正后的全局来源信息改变了派生的父级/追踪身份;为空的 partial-Evidence 主体仍为空。两次最终运行在 CLI/MCP 原生追踪上完全一致,并在所有记录的非计时字段上与先前修复后的控制项匹配。

整个验证器包括输入哈希、分析、三轮原生追踪、适用的结构化查询、导出、CLI 一致性和令牌化。每次重型运行都使用保留的 资源观察器:一个 CPU、8 GiB 硬上限、6 GiB 提前停止且无交换。cgroup 峰值包含计入的文件缓存,而不是汇总的 RSS。计数器在负载退出时由仍在运行的观察器观测,而非最终全范围计数器。已完成的运行验证了其所属清理,并且没有报告 OOM。

每个 MCP 进程都是全新的,但输入哈希会预热其文件缓存。构建/操作系统缓存和共享主机调度不受控制。首次与重复保留查询的墙钟样本保持分开;独立的查询 CPU/内存未被测量。较早的固定超时任务耗时 150.173 秒墙钟 / 119.468013 秒 CPU;其完全相同的未更改运行时重复耗时 58.827 秒 / 58.482996 秒,具有相同的非计时事实、Evidence 和 BPE。两份记录均被保留。最终默认控制项同样耗时 186.085 秒墙钟 / 142.371100 秒 CPU;其未更改运行时重复耗时 62.651 秒 / 62.240964 秒,非计时结果相同。较慢的最终行仍被报告。归因问题仍未解决;这些运行并未确立任何加速或性能等效界限。

更严格的复审后验证器重跑也未更改生产代码即通过:超时任务 162.645 秒墙钟 / 125.876114 秒 CPU / 峰值 2,809,643,008 B;默认控制项 61.367 秒 / 60.970077 秒 / 2,526,949,376 B。两者都精确保留了最初的最终分析字段、身份、覆盖率和 BPE;只有计时和新的显式 oracle-input 字段不同。这些额外记录并不取代上面较慢的行。

在集中化语义适用性之后,两个真实公共控制项再次通过:超时任务 60.443 秒墙钟 / 59.970344 秒 CPU / 峰值 3,078,295,552 B;默认控制项 63.574 秒 / 63.177884 秒 / 3,189,719,040 B。分析结果、身份、覆盖率、BPE 和精确的 CLI/MCP 一致性保持不变。JSON 标明了每个队列的运行时和验证器源清单,并保留了所有早期记录。

静态 cl100k_base/tiktoken 0.12.0 投影包括选定或完整的 name/description/inputSchema 目录、请求以及结构化 Evidence 或解析出的文本错误。完整工具回复的替代方案包括 MCP 文本/结构化重复。选定的两工具目录为 5,570 BPE;完整投影为 195,522。输出模式、主机渲染/重放、通知、模型推理、最终答案和计费均未测量。重复轮次、导出、CLI 一致性、令牌化和导出父级诊断属于验证开销,位于定义的任务令牌之外,但在资源记录之内。从错误的超时基线中移除不支持的主张不会获得任何效率信用。

验证与局限

最初的生产修复在八个文件中包含 49 个不同的通过用例。最初进行进度清理前的七文件选择以 44/44 通过。进度清理后,同一选择通过 43 个用例,并在一个原生身份用例中触及现有的 30 秒测试截止时间;未更改的两文件重跑通过了两个原生用例和五个公共 CLI 取消用例。原始截止时间没有增加。运行时验证器收集包含中断的作用域;单独的回归测试覆盖原生调用方排除和畸形结构化数据。源选择、畸形结构、实际工作进程资源约束、保留的大批量部分观测、取消/发布/清理、原生身份以及两个公共适配器均仍在覆盖范围内。

第一次评审发现,真实验证器此前会接受任何具有产物字节权限的非 JavaScript 操作,并忽略阶段进入状态。现在,场景独立于生产阶段映射提供精确的操作/状态预期。另外六个 oracle 用例使用实际保留的 Joplin 快照,并拒绝错误的元数据操作、已进入或缺失的状态,以及缺失或冲突的缺口。它们均通过,使独立覆盖达到九个文件中的 55 个用例。生产实现在本次评审修正期间未更改。

经过第二次评审中的共享语义边界修正,共 78 个独立用例跨十个文件通过:九个文件的选集通过 65/65,而原始根重建文件通过 13/13。这包括替代构建器所属测试文件的 23 个用例。新的生产者边界回归检查了两种构造路径、所有五个被排除的元数据/原生种类,以及选定/排除的 JavaScript 控件。真实 Joplin 控件演练了公共增量工作流;替代完整构建器路径具备文件系统边界验证,而非单独测量的真实应用工作流。

记录的尝试还包括验证器初始的非空主体假设,以及一个无效的顶层语义模块路径缺失检查。这两项都在其断言被用作证据之前得到修正。修正后的取消复现显示了基线上真实的原生 AST 作用域和幻影模块。最终源文件和执行驱动程序版本、源固定版本、输入摘要、先前的尝试以及资源收据均记录在紧凑 JSON 记录中。

在评审之前,npm run check && npm run docs:check 通过,包括五项一致性测试:165.553 秒 wall / 150.247257 秒 CPU / 4,232,491,008 B 峰值 cgroup 内存,干净退出状态且无 OOM。第一次完整检查在某个 172 行的测试回调超过 150 行规则时停止。现在,一个具名断言辅助函数在全部四个公共结果中共享作用域查找;在最终门禁之前,强化后的六用例文件再次通过。评审修正后,完整的静态/文档门禁再次通过,包括五项一致性测试:111.395 秒 wall / 110.979710 秒 CPU / 4,347,125,760 B 峰值,干净退出状态且无 OOM。集中语义适用性之后,最终的完整静态/文档门禁也通过,包括五项一致性测试:117.636 秒 wall / 117.194118 秒 CPU / 4,263,153,664 B 峰值,干净退出状态且无 OOM。

在初始 PR 修订时,36 个 CI 检查通过;macOS hdiutil create 在 REA 验证之前创建 DMG fixture 时失败,也导致聚合检查失败。没有任何 Apple fixture/工作流代码被更改。那次尝试未提供任何通过的 Apple 运行时证据。

实时 Electron/应用执行、真实原生提供方行为、其他平台运行时覆盖以及托管代理成本均属于 NOT_ENOUGH_INFO。验证并未声称覆盖这些方面。

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