# UtiliVera Scan 0.5.2 轻量候选独立增量审核（Round 1）

审核日期：2026-09-04  
审核角色：与 0.5.1 相同的独立软件/安装审核员；未参与本候选构建  
审核范围：0.5.1→0.5.2 功能边界、Tesseract 轻量化、最终发行目录、Inno 安装器、回归/安装/升级/确定性证据及公开发布边界  
审核方式：只读复核；未修改产品实现、安装器、网站源码或 `static-dist`

## 结论

**增量软件与安装工程：PASS。P0=0，P1=0，P2=6。既有 Top 5 产品结论继续成立：96/100、P0=0、P1=0。**

0.5.2 是对已审 0.5.1 的受控轻量化版本，而不是未经证明的功能改版。26 项产品源码/测试清单中 25 项与 0.5.1 字节级一致，唯一变化是 `src/AssemblyInfo.cs` 的版本号；202-file payload 的路径集合完全不变，只有主 EXE、README 和打包后的 `libtesseract-5.dll` 三项改变。新安装器比 0.5.1 减少 19,432,250 bytes（18.90%），同时原产品回归 51/51、最终发行目录运行时回归 51/51、5/5 公开工作流、202/202 payload、174/174 第三方映射、10 语言安装、10 语言 .NET 负向门禁、静默安装/repair/卸载、真实 0.5.1→0.5.2 升级和 10/10 安装器确定性重建全部通过。

主 EXE 和 installer 均为 `NotSigned`。依据当前仓库根 `AGENTS.md`，未签名**不再是发布阻断项**，因此不列 P1；但公开上线必须同时满足邻接未签名/Unknown publisher 披露、精确 SHA-256、官方校验指南、仅从 `utilivera.com` HTTPS 分发、公开审计可见和线上字节与本报告完全一致。该网站发布门禁不在本次只读安装器审核中自批。

## 1. 最终冻结身份：PASS

以下身份均由本审核员对当前文件重新计算，不只采信生成器 JSON：

| 对象 | Bytes | SHA-256 | 结论 |
|---|---:|---|---|
| 源 `assets/tesseract/libtesseract-5.dll` | 101,471,336 | `279488C41BD341EDAA03DCD097FAA33604BA330E6254AC97BCAF2229D8D7AC1A` | 与构建硬编码源身份一致 |
| `C:\msys64\ucrt64\bin\strip.exe` | 1,375,485 | `186149E1472B5EA768FDED2AA466AB1974399E0C104B4821AADA4A9A7F6CC8E4` | GNU Binutils `2.47.20260726`，与构建硬门禁一致 |
| `dist/assets/tesseract/libtesseract-5.dll` | 3,307,097 | `F68A9D8E46034BFE4AB586DCB2C2643B0B9DB05B61713E4010D175466C6D066F` | 最终轻量运行时 |
| `dist/UtiliVeraScan.exe` | 347,136 | `667A5188257ACEA54A56F66EAB46A96B47E4A3BABC0792758309E854B2816099` | FileVersion/ProductVersion `0.5.2.0`；`NotSigned` |
| `UtiliVeraScan-Setup-0.5.2-Windows-x64.exe` | 83,368,866 | `F283C43FD3BD38F475A56E4707591436D5DE5EFBE64AC97A360938710ECAB180` | `NotSigned`；本轮唯一获批候选 |
| N-1 `UtiliVeraScan-Setup-0.5.1-Windows-x64.exe` | 102,801,116 | `1B41E2AAEF33C226C21CF8F8742C234F78F69ACF67FFBCF8808DB4C2E2A1DDB9` | 真实升级测试基线 |

`dist/installer/SHA256SUMS.txt` 精确引用本轮 0.5.2 installer 文件名和 `F283…AB180`。任何其他大小、哈希、文件名或重新打包结果均不在本报告批准范围内。

## 2. 0.5.1→0.5.2 受控增量：PASS

### 产品源码/测试边界

对 0.5.1 与独占重跑后的 0.5.2 `product-test-results` source manifest 逐项比较：

- entries：26 对 26；
- 路径集合：完全一致；
- 25 项产品源码和 `tests/ScanTests.cs`：bytes/SHA-256 完全一致；
- 唯一改变：`src/AssemblyInfo.cs`，bytes 仍为 446，SHA 从 `4730C5…FC97` 变为 `216B010…32FC`，内容对应版本 `0.5.1.0`→`0.5.2.0`。

因此扫描、编辑、OCR、PDF/PDF-A、安全、原子输出、配置、CLI、可访问性和 UI 实现没有随轻量化发生未申明功能改动。

### 最终 payload 边界

本审核员比较两个 installer payload manifest，并重新枚举当前 `dist`（排除 `dist/installer`）：

- 0.5.1 与 0.5.2 都是 202 files；
- added：0；removed：0；路径变化：0；
- 当前实际 files：202；manifest 外 extra：0；
- 逐文件重新计算：missing=0、bytes mismatch=0、SHA mismatch=0；
- 仅三项发生变化：
  1. `UtiliVeraScan.exe`：只因版本资源变化，大小仍 347,136 bytes；
  2. `README.md`：增加轻量化来源/操作说明，3,302→3,568 bytes；
  3. `assets/tesseract/libtesseract-5.dll`：101,471,336→3,307,097 bytes。

安装器从 102,801,116 减至 83,368,866 bytes，减少 19,432,250 bytes（18.90%）。减小来自非运行时符号移除，没有删 OCR 模型、许可、来源文件或产品能力。

## 3. Tesseract 轻量化、工具固定与确定性：PASS

`build.ps1` 对轻量化链实施 fail-closed 门禁：

- 先核对源 DLL 精确 SHA `279488…AC1A`；
- 再核对 GNU strip 精确 SHA `186149…CC8E4`；
- 临时设置 `SOURCE_DATE_EPOCH=0`，执行唯一操作 `--strip-unneeded`，并在 finally 中恢复原环境；
- 记录源、工具版本/bytes/SHA、输出 bytes/SHA 和保留的 10 个 OCR 模型；
- 当前 `work/strip-c` 与 `work/strip-d` 两次输出均为 3,307,097 bytes / `F68A…066F`，与最终 `dist` DLL 一致。

轻量 DLL 并非仅通过“能启动”检查：`packaged-runtime-test-evidence-0.5.2.json` 将最终 EXE `667A…6099`、Tesseract `5.4.0.20240606` 和最终 DLL `F68A…066F` 绑定到完整 51/51 测试，包含 10 个 OCR 模型实际执行、100-page/500-file/并发事务、PDF/PDF-A/加密、300/600 DPI 性能和回滚安全；该运行的 600 DPI 组合滤镜为 6,241 ms，低于 10,000 ms 门槛。

一次与 Remotion 视频渲染并发的 600 DPI 测试曾达到 10,642 ms；资源竞争解除后已独占重跑通过。最终公共证据生成于 2026-09-04 11:34（本地时区），记录 51 个唯一测试名、51/51 PASS、0 failed，测试名集合与 0.5.1 完全一致。本报告不把受干扰的并发运行当成产品回归，也不以它替换最终独占通过证据。

## 4. Top 5 产品门禁继承：PASS

0.5.1 独立终审的固定参考集为 NAPS2、VueScan、PaperScan、Adobe Acrobat Scan & OCR 和 Windows Scan，结论为 96/100、P0=0、P1=0，且覆盖功能、UI/图标、易用性、可靠性、安全、性能、可访问性、本地化和专业工作流。

本轮可继承该结论的证据链是：

1. 产品/测试 source manifest 仅版本文件变化；
2. 51 个测试名与 0.5.1 一致且原产品构建 51/51 PASS；
3. 同一 51 项又针对最终轻量 Tesseract runtime 51/51 PASS；
4. 5/5 公开指南工作流重新由 0.5.2 冻结 EXE `667A…6099` 生成，13 个引用产物逐 bytes/SHA 复算无误；
5. 202-file 包没有删除模型、UI 资产、许可证、来源或工作流组件。

所以 0.5.2 不引入新的 P0/P1，既有 96/100 Top 5 结论继续成立。原终审的三项外部证据 P2（真实多厂商 WIA；多显示器/高对比度/读屏实机；十语言母语审校与 Top 5 同机盲测）仍保留，不能被本次打包优化虚假宣称为已关闭。

## 5. 第三方许可与发行内容：PASS

本审核员直接对最终 `dist` 运行只读第三方门禁，结果：

| 项目 | 结果 |
|---|---:|
| components | 28 |
| expanded third-party files | 174 |
| unmapped / multi-mapped | 0 / 0 |
| pinned full offline license texts | 15 |
| source archives | 3 |
| notice/license files | 22 |
| PE files scanned for JBIG | 32 |
| PE import rows | 135 |

轻量 `libtesseract-5.dll` 的 SBOM 展开行已更新为 3,307,097 bytes / `F68A…066F`，继续映射到 Tesseract 5.4.0.20240606、Apache-2.0 完整离线许可和固定 upstream revision。202-file 路径集合不变，因此 0.5.1 Round 2 已关闭的许可、libtiff `jbig=OFF`、来源归档和 no-JBIG 门禁没有因减包回归。

## 6. Inno、10 语言、.NET、静默生命周期：PASS

Inno 脚本保持稳定 AppId `{8A446267-5E62-4412-87A8-56D7E0F1EC74}`、`UsePreviousAppDir=yes`、x64-compatible、Windows 10 1809 minimum、current-user 默认权限、同版关闭应用/repair 和 0.5.2 product/update HTTPS URL。

最终 test evidence 与 83,368,866-byte / `F283…AB180` 候选绑定，记录：

- 主静默 install / same-version repair / uninstall：exit 0；
- 安装后 EXE SHA：`667A…6099`；
- OCR language enumeration：exit 0；
- install directory、HKCU/HKLM uninstall registration、开始菜单快捷方式：卸载后均无残留；
- product license、third-party notices/SBOM/15 完整许可/3 源码：实际安装后仍通过；
- 10/10 安装语言（英、简中、繁中、西、德、法、日、韩、巴葡、俄）静默 install/uninstall 均 exit 0，目录均移除；
- 10/10 `/SIMULATENODOTNET` 均 exit 1、`payloadCopied=false`；十份原始日志都出现 `InitializeSetup returned False; aborting`，且没有安装复制阶段信号；
- 23 份持久日志存在、非空，总计 1,265,264 bytes；主卸载日志以 `Uninstallation process succeeded`、`Removed all? Yes` 结束。

## 7. 真实 0.5.1→0.5.2 升级和用户数据：PASS

升级脚本实际执行冻结 N-1 installer `1B41…DDB9`，而不是模拟修改版本字段：

1. 静默安装 0.5.1，并读取已安装 EXE 为 `0.5.1.0`；
2. 在真实 `%LOCALAPPDATA%\UtiliVera\Scan` 写入随机用户数据标记；
3. 以相同安装目录静默运行 0.5.2；
4. 验证新 EXE 为 `0.5.2.0` 且 SHA `667A…6099`；
5. 验证升级后的轻量 DLL 与 `F68A…066F` 一致；
6. 验证用户标记跨升级存在；
7. 静默卸载 0.5.2，安装目录移除，而用户标记仍保留。

三份持久日志均非空：0.5.1 install 97,232 bytes、0.5.2 upgrade 120,428 bytes、0.5.2 uninstall 50,650 bytes；两次安装日志均以成功结束，卸载日志记录 `Removed all? Yes`。这关闭了 0.5.1 安装审核中“没有真实 N-1→N 证据”的主要 P2。

## 8. 10/10 确定性安装器重建：PASS

`installer-build-stability-0.5.2.json` 逐行记录：

- evidence generatedAt：2026-09-04 11:47:10（本地时区）；
- 内部完整诊断原件：24,702 bytes / SHA-256 `69C87095A52B8ECFF94C52C83E7746BF701A154C0085D49F4AD0A85E8241355D`；该版本保留每轮 `diagnosticTail` 和本机构建路径，只用于内部审计；
- 公开净化版：2,540 bytes / SHA-256 `A92DFF01FDC2DFF43E43953E259D7175ADEC2D8FFCADABEB377B618848590D22`；公开版去除诊断冗余及本机绝对路径，但保留 requested/passed、10 行 run/start/exit/installerExists/installerSha256、unique hash、deterministic 和 status；
- requested/passed：10/10；result rows：10；
- non-zero exit：0；installer missing：0；
- unique installer hashes：1；
- 十次均为 `F283C43FD3BD38F475A56E4707591436D5DE5EFBE64AC97A360938710ECAB180`，与复审时磁盘上的最终候选一致；
- 每轮构建均执行 SBOM 门禁、202-file manifest、真实静默安装、安装后逐文件 bytes/SHA、许可存在性和卸载目录清理；`validationFailuresBeforePass=0`。

该结论是“同一固定 Windows/Inno/发行目录环境中的确定性安装器重建”，不扩大解释为任意全新机器都已复现整个编译工具链。

## 9. P0 / P1 / P2

### P0

无。

### P1

无。当前 `AGENTS.md` 明确允许在受信证书申请期间公开未签名版本；因此 `NotSigned` 是必须诚实披露的发布状态，不是本轮软件/安装工程 P1。

### P2（非阻断）

1. **真实硬件覆盖仍有限。** 尚无多厂商 WIA 平板/ADF/双面扫描仪实机矩阵。验收：至少三家设备、平板/ADF/双面、取消/卡纸/断连、100-page 任务记录及输出哈希。
2. **辅助技术与显示矩阵仍有限。** 尚无混合 DPI、多显示器、高对比度和 NVDA/Narrator 实机矩阵。验收：Win10/11、100/150/200% DPI、键盘/读屏任务完成率与无裁切截图。
3. **语言/竞品外部盲测仍有限。** 尚无十语言母语审校和五款参考应用同机盲测。验收：母语问题清单 P0/P1=0，并保留固定输入、机器、版本、任务时间/错误率。
4. **轻量化 clean-host 可复现性。** 当前源 DLL、strip 工具 SHA、`SOURCE_DATE_EPOCH`、两次当前输出和最终 runtime 已闭环，但 strip 工具位于构建机外部固定路径，未保存独立 clean-host 原始构建日志。验收：在第二台干净构建机取得同 SHA 工具，对同一源重复生成 `F68A…066F`，保存完整命令、环境和日志。
5. **升级用户数据深度。** 本轮验证真实 LocalAppData 路径上的随机标记和 payload 覆盖，但未用包含实际 profiles/settings/history 的长期用户目录验证 schema 兼容、失败回滚或降级策略。验收：固定真实 profile corpus，验证 N-1→N、被中断升级恢复、N→N-1 明确拒绝或兼容，逐文件哈希/语义一致。
6. **企业/可选安装范围。** current-user 静默路径已通过；管理员 override、SYSTEM 部署和 `/TASKS=desktopicon` 创建/目标/卸载尚无完整自动化矩阵。验收：标准用户、管理员、SYSTEM 三上下文及桌面任务 on/off 均验证目录、注册表、ACL、快捷方式和零安装残留。

## 10. 未签名公开上线的强制条件

本轮批准的对象是安装器候选，不等于对未来网站部署自批。公开激活前必须由发布/网站门禁逐项证明：

1. stable 与 versioned 两条下载 URL 都只返回 83,368,866-byte / `F283…AB180`，不得混入 0.5.1、过渡候选或重新压包文件；
2. 仅使用官方 `https://utilivera.com/...` URL，不重定向至第三方下载站；
3. 每一个直接 EXE 下载动作的同一可见邻接区域明确写出“当前未签名”“Windows 可能显示 Unknown publisher 或信誉警告”；
4. 同一下载页显示完整 64 位 SHA-256，并链接官方 `Get-FileHash`/校验指南和 `SHA256SUMS.txt`；
5. 公开 0.5.2 产品审计、本报告、manifest 和 installer identity，不能描述为受信发布者已签名；
6. release registry、PAD/Scoop/WinGet/目录资料如同时更新，version、bytes、SHA、stable/versioned URL 必须逐字段一致并 fail closed；
7. 以明确、不可被重建重置的 official release timestamp 开始 Scan 自己的连续 30 天窗口，独立统计有效下载，排除明显 bot、探针及可识别重复自动请求；目标仍为至少 1,000 个有效下载；
8. 未来证书获批并替换二进制后，必须重新冻结 bytes/SHA，重跑安装、升级、包身份和独立发布审核，不能沿用本报告批准新字节。

## 11. 最终门禁表

| 门禁 | 判定 |
|---|---|
| 0.5.1→0.5.2 功能源码边界 | PASS（25/26 不变；仅版本文件改变） |
| 202-file payload 路径/逐哈希 | PASS（202/202；0 extra/mismatch） |
| 源 DLL / strip 工具 / 最终 DLL 身份 | PASS |
| 轻量 runtime 完整回归 | PASS（51/51） |
| 原产品独占回归 | PASS（51/51；同一测试名集合） |
| 公开工作流 | PASS（5/5；13 artifacts 哈希吻合） |
| Top 5 独立产品结论 | PASS（继承 0.5.1 的 96/100、P0=0、P1=0） |
| 第三方许可/SBOM/no-JBIG | PASS（174 mapped，0 gaps） |
| 10 语言 install/uninstall | PASS（10/10） |
| 10 语言 .NET 4.8 负向 | PASS（10/10，复制前阻断） |
| 静默 install/repair/uninstall/残留 | PASS |
| 真实 0.5.1→0.5.2 与用户数据保留 | PASS |
| 确定性 installer rebuild | PASS（10/10，同一 `F283…AB180`） |
| Authenticode | `NotSigned`，按当前政策非阻断、必须披露 |
| 公开网站/下载切换 | 本轮未自批；须满足第 10 节全部条件 |

## 最终判定

**UtiliVera Scan 0.5.2 轻量候选 `UtiliVeraScan-Setup-0.5.2-Windows-x64.exe`（83,368,866 bytes / `F283C43FD3BD38F475A56E4707591436D5DE5EFBE64AC97A360938710ECAB180`）通过独立增量软件与安装审核。P0=0、P1=0、P2=6；既有 Top 5 产品结论继续为 96/100 PASS。**

可以进入未签名公开发布的网站门禁；只有当官方 HTTPS 文件逐字节一致、所有直接下载邻接披露 Unknown publisher/未签名状态、完整 SHA 与官方校验指南可见且统计时钟/产品归因正确时，才可正式切换 0.5.2 下载。未满足这些条件时，不得把本报告解释为已批准任何线上 URL 或其他二进制。
