跳转至

原生交接字节身份验证

跟踪 #4027 下的 #3926。基线:9f8659e0536e4e50a438f5b9d5661f3c9624f6ac。 最终集成基础:62bf09809ef7bb224028916424f8f07652a20f4f。

分析者已经知道一个相对于 ASAR 的原生路径,并提供了先前的原生证据。问题是哪些证据可以链接到该组件的精确字节。发现(Discovery)和原生提供方执行不在此任务范围内。

观察到的行为与纠正

原生节点生产者区分“内容摘要”和“字节不可用的规范路径”。其不可用观察合法地引用了包含该组件的归档。交接消费者先前将该支撑工件摘要当作原生组件的摘要。

公共 CLI/stdio MCP 回归测试:缺少伴随组件的用例失败,而可用字节对照用例通过。真实 Joplin 复现了相同结果:缺失 keytar 字节生成了一个带有 ASAR 摘要和模拟容器观察的 evidence-linked 交接。CLI/MCP 在这个错误答案上保持一致。

消费者现在仅使用节点所有者的内容摘要身份。回退观察扫描已移除。不可用的原生节点保留其规范路径、可用性、容器支撑的来源出处以及内联图中的部分覆盖;它们不会产生错误的可操作交接或原生证据链接。空的交接列表描述的是资格,而非没有原生组件。每次查询的节点索引仅在存在符合条件的候选目标后才分配;不会添加持久化缓存、schema、工具或目标权威。

最终真实检查在两个用例上均通过,且 CLI/MCP 跟踪记录完全一致。可用对照保留了完整的父级/跟踪证据 ID、原生事实、链接、覆盖范围以及所有 token 投影。缺失对照保留了其父级、原生节点、来源出处和覆盖范围,同时移除了错误的交接和容器证据链接。

实际输入与范围

官方 Joplin v3.7.21 Linux AppImage,发布于 2026-09-25,201,462,481 字节,SHA-256 5d202dcaca31e14206826aa3f04125e7c218dbc3dc3d98479d811efbd6b856c1。

只读 7z 26.02 检查发现 6,324 个 ASAR 文件、46 个解包条目和三个 .node 组件。仅提取 ASAR 和这三个二进制文件:

input_root="$(mktemp -d -t rea-native-handoff-XXXXXX)"
curl --fail --location --output "$input_root/Joplin-3.7.21.AppImage" \
  https://github.com/laurent22/joplin/releases/download/v3.7.21/Joplin-3.7.21.AppImage
sha256sum "$input_root/Joplin-3.7.21.AppImage"
7z x -mmt=1 "-o$input_root/extracted" "$input_root/Joplin-3.7.21.AppImage" \
  resources/app.asar \
  resources/app.asar.unpacked/node_modules/keytar/build/Release/keytar.node \
  resources/app.asar.unpacked/node_modules/sqlite3/lib/binding/napi-v6-linux-glibc-x64/node_sqlite3.node \
  resources/app.asar.unpacked/node_modules/onnxruntime-node/bin/napi-v6/linux/x64/onnxruntime_binding.node
python3 - "$input_root" <<'PY'
import os, sys
from pathlib import Path
root = Path(sys.argv[1])
source = root / 'extracted/resources'
for mode in ('available', 'missing'):
    case = root / 'cases' / mode
    case.mkdir(parents=True)
    os.link(source / 'app.asar', case / 'app.asar')
    if mode == 'available':
        for native in (source / 'app.asar.unpacked').rglob('*.node'):
            target = case / native.relative_to(source)
            target.parent.mkdir(parents=True, exist_ok=True)
            os.link(native, target)
PY

提取前请验证上述资产摘要。ASAR 为 233,575,014 字节,SHA-256 767df409b18effe60421fbefcca873de237c7e813eac744ecdeebbc5e825a33a。Keytar 为 76,960 字节,SHA-256 0700016bcd761cbe02d275f2046c7cc42f39f730a50d66e3d3307aa9d413373a。所有提取组件的哈希均在 JSON 记录中。7z 报告了 AppImage 内嵌 SquashFS 的一条尾部数据警告,并以退出码 0 结束。

两个用例都只选择 package.json 进行静态源码分析,同时保留清单。可用用例暂存所有三个原生伴随组件;其余 43 个解包条目不暂存。缺失用例不暂存任何内容。因此,无论所选原生组件的字节身份已知或未知,两个用例的整个应用覆盖都是部分的。应用和原生分析提供方都不会被执行。原生证据被显式模拟,以测试精确的主体链接。真实 Electron、真实 Ghidra/Hopper/IDA 行为以及 Windows/macOS 验证均为 NOT_ENOUGH_INFO。

复现公共工作流

使用固定的 Node 24.18.0/npm 11.16.0,运行 npm ci,然后运行 npm run build:cached。验证器返回紧凑记录,并在自身清理后删除其私有导出的父对象和 CLI 输入。不会存档可下载的应用或大型证据。

for mode in available missing; do
  node scripts/verify/javascript/native-handoffs.mjs \
    --artifact "$input_root/cases/$mode/app.asar" \
    --addon-path node_modules/keytar/build/Release/keytar.node \
    --native-sha256 0700016bcd761cbe02d275f2046c7cc42f39f730a50d66e3d3307aa9d413373a \
    --source-path package.json --rounds 3 --cli-parity --require-safe
done

如需报告中的 BPE 投影,请添加 --tokenizer-python /absolute/path/to/python-with-tiktoken-0.12.0。npm 别名 verify:javascript:native-handoffs 会先构建;记录的成本使用上述构建后的直接 Node 调用。若要观察修复前行为,请在基线构建上运行保存的验证器且不带 --require-safe;safe_identity: false 是错误答案,而非通过的分析任务。路径会影响序列化请求和某些证据身份。

精确资源运行还使用了保留的 8 GiB 观察器及相邻的 resource_payload.py;两者的哈希均固定在 JSON 中。

已完成工作流的成本与限制

用例 修订版本 墙钟秒 CPU 秒 cgroup 峰值字节 身份 oracle
原生字节可用 之前 60.369 59.806670 2,662,629,376 pass
原生字节可用 之后 258.885 106.221003 2,678,456,320 pass,精确基线事实
原生字节缺失 之前 57.930 57.479109 2,719,457,280 身份/关联错误
原生字节缺失 之后 59.738 59.254776 2,571,235,328 pass,未知项保留

整体验证器资源包括输入哈希、分析、三条保留的跟踪查询、导出、CLI 对等性和分词处理。单 CPU、8 GiB 硬上限、6 GiB 提前停止、无交换分区;已核验清理过程且无 OOM。内存包含已计入的文件缓存,而非 RSS 总和。计数器在载荷退出时读取,此时观察进程仍然存活。

可用用例对照的最终墙钟和 CPU 时间明显高于基线。在原始基座上进行的早期修复后对照,可用/缺失用例分别耗时 61.657/74.956 秒墙钟和 61.135962/60.352428 秒 CPU;其完整计量记录已另行保存。最终缺失用例耗时 59.738 秒墙钟。这一波动尚未解决,不能归因于原生消费者变更。这些运行既不能证明加速,也不能证明性能等价。输入哈希会预热 ASAR 缓存;构建/操作系统缓存以及共享主机调度均不受控制。新建的 MCP 会话并不能建立操作系统冷启动条件。分析后的首次样本与重复热查询样本已分别保存;查询阶段的 CPU/内存未测量。

一个已定义任务由一份分析摘要和一条保留的跟踪记录组成,并已提供路径和先前 Evidence。静态 cl100k_base/tiktoken 0.12.0 计数同时包含请求、回复以及 name/description/inputSchema 契约:

可用字节任务(变更前后不变) BPE tokens
选定目录 + 结构化回复 12,340
选定目录 + 完整工具回复 18,906
完整目录投影 + 结构化回复 202,292
完整目录投影 + 完整工具回复 208,858

这些是备选的回复/目录投影。仅选定目录一项即为 5,570 BPE;完整投影为 195,522。输出 schema、注解、宿主渲染/重放、推理、最终答案以及模型计费均未测量。重复查询/导出/CLI/分词属于验证开销,不计入此单任务 token 数,但包含在资源计量记录中。通过移除无依据的声明,缺失用例的结构化任务计数从 11,372 → 11,103;错误的基线不获得任何效率认定。

回归与验证记录

最初的四个文件聚焦选择通过了 24 项测试。在添加具名摘要结果解析并修正一个可选的架构工厂输入后,两个公开用例被重新运行。与传入 null 相比,省略该字段在全部四个真实用例输入中产生了字节完全一致的规范化模拟 Evidence。最初的 CLI 选择器测试工具错误和首次类型检查失败被保留为测试工具/验证尝试,而非产品缺陷复现。

在同步经过审查的上游变更后,更新后的应用程序工作流 CLI 验收文件通过了 34 项测试,使聚焦选择在五个文件中达到 58 个不同用例。随后,两个 Joplin 对照用例都在最终集成基座上重复运行。规范字节身份也被相关版本匹配/内容比较消费者使用;在这些消费者中未发现等效的观察摘要回退机制。

最终的 npm run check && npm run docs:check 在集成基座上通过,包括五项文档一致性测试:128.732 秒墙钟、115.518920 秒 CPU、4,301,684,736 B cgroup 峰值内存、干净自主的退出、无 OOM。

最终公开和静态/文档结果记录在紧凑测量与源码固定中。

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