# UtiliVera OCR 0.7.0 安装器独立审核（Round 2）

审核日期：2026-08-15  
审核角色：与 Round 1 相同的独立安装/发布审核员  
审核边界：当前冻结 `dist`、Inno 源码、安装器、payload manifest、构建/安装证据与持久日志；未修改产品或网站

## 结论

**内部安装工程：PASS（内部 P0=0、P1=0）。公开发布：BLOCKED（外部 P1=2）。剩余 P2=4。**

Round 1 的工程问题已实质关闭：.NET Framework 4.8 安装前门禁已加入；安装器覆盖与应用一致的 10 种语言并包含简/繁中文；产品 LICENSE 和第三方 notices 随安装保留；134 个冻结文件有逐项 bytes/SHA manifest；build/install/reinstall/uninstall 与 10 种语言日志持久化；构建连续 10/10 通过且得到同一 SHA；卸载会检查安装目录、uninstall registry 与开始菜单残留。

当前候选身份：

- 文件：`UtiliVeraOCR-Setup-0.7.0-Windows-x64.exe`
- 大小：**2,772,208 bytes**
- SHA-256：`FDA752CEB1770C85463B715D4D09FEC6E96FBB45A5B9A769EF4BB0994C6F72BB`
- Authenticode：`NotSigned`

因此它可作为内部安装工程候选通过，但仍不得公开下载或称为正式发行版。公开发布的两个 P1 是：安装器及主 EXE 未签名；`/ocr/` 与 `/ocr/releases/0.7.0/` 尚无已部署的发布页面。签名/URL 是外部门槛，不推翻内部安装工程 PASS。

## 1. 候选身份与冻结载荷：PASS

独立实测当前安装器 bytes/SHA 与预期值、`installer-build-evidence-0.7.0.json`、`installer-test-evidence-0.7.0.json` 和 `SHA256SUMS.txt` 完全一致。

冻结主程序仍为：

- Product：UtiliVera OCR
- ProductVersion：0.7.0.0
- SHA-256：`31E46DEC406F6FFF4A8CF68EB66E347234C2DB87EFAA32FAAC7A3EBF504C9784`

对 `installer-payload-manifest-0.7.0.json` 的 134 项进行独立只读复算：

- manifest entries：134；
- 当前 `dist` payload files：134；
- missing：0；
- extra：0；
- bytes mismatch：0；
- SHA-256 mismatch：0。

build evidence 还记录安装后逐文件嵌入验证通过、第一次验证即成功，未通过重试掩盖失败。Round 1 的“只有布尔值、没有逐文件证据”已关闭。

## 2. .NET Framework 4.8 门禁：工程 PASS

Inno `InitializeSetup` 同时查询 HKLM 64/32 位：

`SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\Release >= 528040`

不满足时在复制文件前退出，并针对 10 种安装语言提供本地化、UTF-8 可读的 .NET 4.8 指引。简体中文、繁体中文、Spanish、German、French、Japanese、Korean、Portuguese (Brazil)、Russian 文案均不再是乱码。

README 与安装器公开要求均为 .NET 4.8，故用户入口合同已安全闭合。EXE config 仍写 `.NETFramework,Version=v4.7.2`，这意味着程序本体编译目标低于安装器支持下限；在 .NET 4.8 上兼容运行，不会绕过门禁或导致缺运行时启动，因此降为 P2-1 的元数据一致性问题，而不是继续保留内部 P1。

## 3. 10 种安装语言：PASS

安装器语言与应用承诺现一致：

1. English
2. 简体中文
3. 繁体中文
4. Spanish
5. German
6. French
7. Japanese
8. Korean
9. Portuguese (Brazil)
10. Russian

简/繁中文 Inno `.isl` 来自官方 jrsoftware/issrc 路径，构建器使用固定 SHA-256 校验后才编译：

- ChineseSimplified：`E0B0B350E2245F3C5E65586DFE43D574F6E7F06F2261149ABA284954B3FC9A8D`
- ChineseTraditional：`031684FC769259291FD563338B5ABE20B7753C88AB5A2976B83A80788DEB8455`

test evidence 对 10 个 `/LANG=` 值逐个执行静默安装和卸载，20 个阶段全部 exit 0，并保存 10 份非空 language install logs。Round 1 的“9 种且中文系统回落英文”已关闭。

## 4. LICENSE 与 THIRD-PARTY：PASS

- `LicenseFile=LICENSE.txt` 在交互式安装显示产品许可；
- `[Files]` 另把产品 `LICENSE.txt` 安装到应用目录；
- test evidence 断言 `licenseInstalled=true`；
- `THIRD-PARTY-NOTICES.md` 随 134-file payload 安装；
- Fluent UI 的完整 MIT 文本和 Noto Sans 的完整 OFL 1.1 文本均在 payload manifest 中；
- Windows OCR/PDF 系统 API 被正确说明为不随产品再分发。

该项关闭 Round 1 的产品许可离线不可查缺口。sRGB profile 的来源/再分发法务留档仍是项目负责人的一般合规责任，本轮没有发现缺失许可文本的直接证据。

## 5. 构建稳定性与持久日志：PASS

`installer-build-stability-0.7.0.json`：

- requestedRuns：10；
- passedRuns：10；
- status：PASS；
- 10 次 installer SHA 的唯一值数量：1；
- 唯一值即当前 `FDA752...72BB`。

日志落盘情况：

- build payload install/uninstall：2 份，合计 98,673 bytes；
- smoke install/reinstall/uninstall：3 份；
- 10 种语言安装日志：10 份；
- test logs 共 13 份，合计 842,031 bytes。

build 验证支持最多 3 次有界重试，失败时会复制 attempt log；最终 evidence 记录 `validationFailuresBeforePass=0`，因此本候选不是依赖重试才偶然成功。Round 1 的“失败后唯一日志被删除、不可判因”已关闭。

## 6. 静默安装、同版覆盖、功能 smoke 与卸载：PASS

与当前候选 bytes/SHA 绑定的 evidence 记录：

- silent install exit 0；
- 安装后主 EXE SHA 与冻结主 EXE一致；
- 已安装应用 `--list-languages` exit 0，并找到 English OCR language；
- 同版 reinstall exit 0，主 EXE 哈希不变；
- silent uninstall exit 0；
- 安装目录已删除；
- HKCU/HKLM/WOW6432Node 中 `UtiliVera OCR*` uninstall registration 已删除；
- 当前用户开始菜单快捷方式已删除；
- 产品 LICENSE 已安装；
- 用户设置和可恢复审阅偏好在 `%LOCALAPPDATA%\UtiliVera\OCR` 有意保留，避免数据丢失。

`residueRemoved=true` 已被拆成可审计的具体检查，关闭 Round 1 的宽泛残留声明。默认未选择 desktop task，因此本候选的默认静默路径不创建桌面快捷方式；选择性桌面任务的卸载矩阵列在 P2-3。

## 7. 外部 P1：公开发布仍阻塞

### P1-1：安装器和主 EXE 均未签名

独立实测安装器与冻结主 EXE Authenticode 都为 `NotSigned`；build/test evidence 均诚实输出 `releaseGate=BLOCKED_NOT_SIGNED`。

**验收标准：**使用受信证书签署主 EXE 与最终 Inno 包并加 RFC 3161 时间戳；干净 Windows 10/11 VM 验证为 `Valid`；签名后重新冻结 bytes/SHA、134-file manifest、10/10 构建、10 语言和完整安装/卸载矩阵。网站只能引用签名后审核通过的最终字节。

### P1-2：产品与更新 URL 尚未部署

Inno 固定：

- `https://utilivera.com/ocr/`
- `https://utilivera.com/ocr/releases/0.7.0/`

当前最终网站静态快照中这两个路由均不存在；因此即使安装器内部链接语法正确，也还没有可部署/可验证的产品与版本目的地。本轮不把受限网络探测失败误写为确定 HTTP 404，而是以发布源中明确缺少路由为阻塞证据。

**验收标准：**在生产域名先部署 HTTPS 200 的产品页和 0.7.0 release status 页面；页面显示同一系统/.NET/OCR language-pack 要求、签名后最终 bytes/SHA 和公开下载状态；安装后的 Publisher/Support/Updates 链接 4/4 跳到正确页面。未签名期间允许先部署不含二进制的预发布页，但不得开放下载。

## 8. 剩余非阻断 P2

### P2-1：EXE config 的 target SKU 仍是 .NET 4.7.2

安装器与 README 已安全地强制 .NET 4.8，但 EXE config 仍标记 4.7.2。它不会让缺 4.8 的用户通过 Inno gate，也不会阻止 4.8 运行，因此不再阻断内部安装工程；但会造成诊断工具和维护者看到两个版本。

**验收：**下一次重编译将工程 target framework/config 统一到 4.8，并重跑程序回归和安装矩阵。

### P2-2：同版本 reinstall 仍不等于跨版本升级

当前证明 repair/overwrite、固定 AppId 与载荷稳定；没有 N-1 签名版本可做真实迁移。

**验收：**保留签名 0.7.0，下一版执行 0.7.0 -> N，验证旧文件删除、项目/词典/设置保留、卸载所有权与降级策略。

### P2-3：选择性桌面快捷方式路径未单独覆盖

默认 silent 测试没有选择 `desktopicon`，因此开始菜单与 registry 的默认路径已验证，但“勾选桌面图标后卸载清理桌面链接”尚无单独矩阵。

**验收：**用 `/TASKS=desktopicon` 安装，验证当前用户桌面链接创建；卸载后断言链接、安装目录和 registry 全部删除。

### P2-4：用户数据保留披露仍主要存在于内部 evidence

技术策略已经明确区分程序残留与用户数据保留，但最终用户需要在已安装 README、卸载页或支持页看到保留路径及安全清理方法。

**验收：**在用户可见文档说明 `%LOCALAPPDATA%\UtiliVera\OCR` 保留内容、原因和手动清理步骤，并自动断言该文档随安装存在。

## 9. 门禁摘要

| 门禁 | 结果 |
|---|---|
| 当前候选 bytes/SHA/版本 | PASS |
| 134-file manifest 与当前 dist | PASS（134/134，0 mismatch） |
| .NET 4.8 前置门禁 | PASS；config 元数据 P2 |
| 10 种安装语言 | PASS |
| LICENSE / THIRD-PARTY 安装 | PASS |
| 10/10 稳定构建 | PASS（唯一 SHA） |
| 持久 build/test/language logs | PASS |
| 静默安装/同版覆盖/卸载 | PASS |
| 安装目录/registry/开始菜单残留 | PASS |
| 产品与更新 URL | **外部 BLOCKED** |
| 安装器与主 EXE签名 | **外部 BLOCKED_NOT_SIGNED** |

最终判定：**OCR 0.7.0 内部安装工程 Round 2 PASS；公开发布仍因代码签名和产品/更新 URL 两个外部门槛 BLOCKED。** 只有签名后的最终字节完成重新审核、网站发布页与 manifest 同步后，才可开放下载并启动该产品独立的 30 天/1,000 有效下载计时。
