# UtiliVera Image 0.8.1 独立审核报告（Round 1）

审核日期：2026-09-04  
审核角色：独立高级 Windows 桌面软件审核师（未参与 0.8.1 构建或整改）  
审核范围：0.8.1 精确 EXE、Inno 安装器、0.8.0 Top 5 基线、冻结功能/UI/压力证据、安装/升级证据、归档组成与许可材料  

## 1. 独立判定

**FAIL（受控增量门禁未通过）。**

- P0：0
- P1：1
- P2：3
- 暂定评分：**94.2 / 100**
- 0.8.0 Top 5 基线：97.1 / 100、P0=0、P1=0；本轮只允许在证明“没有功能/UI退步”后继承

0.8.1 的体积优化、AVIF、核心功能、UI、1,000 文件压力和安装升级主体均有很强证据，且审核员没有发现崩溃、数据破坏或 UI 退步。但是，归档优化过滤器把 `'.c'` 当作任意路径子串，而不是文件扩展名；因此除计划删除的测试/源码外，还从 0.8.0 归档中移除了 **78 个 GDAL 运行时 CSV**（GRIB2、S57、OZI、state-plane、datum/ellipsoid 等表）和 11 个 CMake 文件。现有 19/19 CAD/GIS 门禁只覆盖当前 DGN/Shapefile 样本，不能证明这 78 个运行时数据表对全部宣传输入、罕见 CRS 和专业 GIS 语义均无影响。

在该 P1 关闭前，本审核员不能确认“0.8.1 相对已审 0.8.0 无功能退步”，因此不能继承 97.1 分或批准这两个精确候选公开替换 0.8.0。

## 2. 本报告绑定的精确候选

| 对象 | 字节数 | SHA-256 | 版本资源 | Authenticode |
|---|---:|---|---|---|
| `dist-0.8.1-candidate/UtiliVeraImage.exe` | 106,214,948 | `7943B50921B1FCAD301DBC4639F07225602F7FAE3E84EEB4E35627E683A22BB3` | File/Product `0.8.1`，产品名 `UtiliVera Image` | `NotSigned` |
| `dist/installer/UtiliVeraImage-Setup-0.8.1-Windows-x64.exe` | 107,011,652 | `60A5D31F8C59E5359C5B41EE0EA91C34B8FDFDCC4152BF90F2028D5C6CCB96CC` | File `0.8.1.0` / Product `0.8.1` | `NotSigned` |

审核员独立重算两者字节数、SHA-256、版本资源和签名状态，均与委托身份一致。`SHA256SUMS.txt` 也精确记录上述安装器身份。

对照基线也独立复核：

- 0.8.0 EXE：122,945,819 bytes，`11C652A58904A5EDD470DA7DA7EB332011148826660C07D0674D592A90990D2C`
- 0.8.0 Inno：123,566,525 bytes，`95FD7A4EECFE64301F8E955D95E5A3D52F3180D6876387614AE51E1B5DD572A5`

0.8.1 EXE 减少 16,730,871 bytes（13.61%），安装器减少 16,554,873 bytes（13.40%）；新安装器只比内嵌 EXE 增加 796,704 bytes（0.75%）。这是对 30 天 1,000 有效下载目标有利的真实分发改善。

## 3. 证据链独立复核

### 3.1 清单完整性

`outputs/image-081-size-optimization-evidence-manifest.json`：7,541 bytes，SHA-256 `41EE4981C5C818BD5A10466D67BD36F68D9E1F0999077DD3C0B0344B33B05EF9`。

- 19 项证据：19/19 存在，字节数和 SHA-256 全匹配
- 12 项变更源码：12/12 存在，字节数和 SHA-256 全匹配
- 32 条 UI 记录对应的 32 个截图和 32 个 sidecar：64/64 哈希匹配
- 10 语言安装证据中的 20 份安装/卸载日志：20/20 存在、哈希匹配，并含 Inno 成功结束标记

### 3.2 独立源测试与冻结黑盒

审核员使用当前源码独立执行 pytest，并禁用 cache provider：

- **366 passed、15 skipped、3 warnings，33.05 秒**
- 15 个 skipped 中，14 个为未在普通 pytest 会话加载的可选 Office pack；精确冻结 EXE 的 Office pack 黑盒另有 14/14 PASS
- 另 1 个为需要授权外部 RAW 夹具的既有延后项，没有被误称为已测试

精确候选的冻结证据结果：

| 门禁 | 结果 |
|---|---|
| 能力清单 | 744 输入扩展、75 输出格式、81 个可重排动作、88 项设置、20 种应用语言（每种 302 个完整 catalog key） |
| 输出格式 | 75/75；损坏输入受控拒绝；AVIF 结构解码 PASS |
| 常规输入 | 18/18 |
| CAD/GIS | 19/19 |
| 专业 CAD 加载 | 17/17、8 个夹具；direct/recipe/watch 非默认设置输出哈希一致 |
| 专业 CAD pack | 6/6，进程前后无残留 |
| Office/Visio pack | 14/14，页数和 SSIM 门禁通过，进程前后无残留 |
| RECOIL | 150/150 官方样本 |
| JPEG 无损旋转 | 旋转/逆变换像素一致，EXIF 保留 |
| 多页与特殊格式 | GIF/APNG/WebP/TIFF/MPO/PDF 顺序与语义通过；TIFF 保存/拆分/原位 3/3；ICO 边界尺寸通过 |
| 1,000 文件压力 | 1,000/1,000，10 个 album 各 100，0 `.uvtmp`，样本可解码且尺寸正确，23.91 秒 |

审核员还直接调用精确 EXE，把 1000×520 PNG 转为 AVIF：退出码 0，得到 7,007-byte AVIF；独立 Pillow 解码为 `AVIF / RGB / 1000×520 / 1 frame`。这排除了“删掉旧 AVIF 插件后只剩声明、实际不可用”的风险。

### 3.3 UI 无退步

冻结 UI 矩阵绑定精确 EXE 哈希，包含 32 个真实截图记录：10 种代表语言、阿拉伯语 RTL、明/暗主题、3 个窗口尺寸、100%/125%/150%/200% 应用缩放，以及首页、工作区、设置、专业工具、CAD loading、TIFF、输出计划和帮助。

审核员独立查看中文首页、阿拉伯语工作区、200% 工作区、专业工具、CAD loading、设置和 TIFF 编辑器。未发现核心文字过小、原先“圆形拼凑图标”、错位 RTL、裁切、遮挡主操作或 0.8.1 版本身份错误。32 个截图和 sidecar 的 64 个文件哈希全部复核通过。因此 UI/本地化可以继续继承 0.8.0 的结论；原 0.8.0 P2（真实 144/192 DPI 系统会话）仍保留。

## 4. 归档组成审核

项目归档脚本对精确 EXE复跑为 PASS：1,847 个 CArchive 成员，Pillow 12 `_avif` 存在，旧 `pillow_avif`、根目录重复 `libredwg-0.dll` / `jpeg62.dll`、pydicom 测试夹具均按预期处理。

审核员没有只依赖该脚本，而是用 `pyi-archive_viewer -r -b` 递归进入 PYZ 比较精确 0.8.0 与 0.8.1：

- 0.8.0 非空递归条目：3,022
- 0.8.1 非空递归条目：2,636
- 移除：389；新增：3
- 计划内移除：pydicom 测试夹具 176、pyogrio/Shapely 测试或真实源码扩展 109、旧 pillow-avif 13、根重复 DLL 2
- 计划外/过滤过宽移除：**78 `.csv` + 11 `.cmake`**

递归检查确实确认旧 `pillow_avif` 代码、本地库和 dist-info 为 0；候选中唯一 AVIF 本地编码器为 `PIL\_avif.cp312-win_amd64.pyd`。因此 AVIF 优化本身正确，P1 来自 GIS 数据过滤的误伤，而不是 AVIF。

## 5. 安装、10 语言与真实升级

### 5.1 审核员独立安装生命周期

审核员没有直接接受构建者 JSON，而是对精确 Inno 候选另做一次新的 per-user 静默生命周期：

- `/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-` 安装退出 0
- 安装后 EXE 为 106,214,948 bytes，SHA-256 精确等于冻结候选
- `THIRD-PARTY-NOTICES.md` 存在
- 静默卸载退出 0
- 安装目录移除、载荷移除、HKCU 卸载项数量为 0

### 5.2 构建者证据的独立核验

- 同版 repair：安装、repair、实际转换、卸载均退出 0；安装/repair 后载荷哈希等于冻结 EXE
- 10 种安装语言：English、简中、西、德、法、日、韩、巴西葡语、俄、土；10/10 静默安装与 10/10 静默卸载 PASS，20 份日志哈希全匹配
- 真实 0.8.0→0.8.1：先装 `11C652…90D2C`，再由精确 0.8.1 Inno 覆盖；安装后为 `7943B5…22BB3`；用户数据 marker 内容保留；升级后 AVIF CLI 退出 0并产生 1 个文件；卸载退出 0且载荷移除
- ISS 使用稳定 AppId，`SourceExe` 由构建脚本绝对路径注入；构建后另行安装并核对内嵌载荷哈希，避免“验证 A、打包 B”

这足以关闭 0.8.0 安装审核中“没有真实 N-1→N”的核心缺口，但失败回滚、SYSTEM/全机部署和 Windows 11 矩阵仍列为 P2 增强项。

## 6. P0 / P1 / P2

### P0

无。

### P1-01：pyogrio 体积过滤误删 78 个 GDAL 运行时 CSV，无法证明无 GIS 功能退步 — OPEN

证据：`UtiliVeraImage.spec` 当前过滤条件为：

```python
not any(part in entry[0].replace('/', '\\').lower()
        for part in ('\\tests\\', '.c', '.pyx', '.pxd', '.pxi'))
```

`'.c'` 是不带扩展边界的子串，所以 `.csv` 和 `.cmake` 也命中。与精确 0.8.0 递归归档比较，0.8.1 除预期条目外丢失 78 个 GDAL CSV，包括 `grib2_*`、`s57*`、`ozi_*`、`stateplane.csv`、`gt_datum.csv` 和 `gt_ellips.csv`。这不是构建者整改记录所描述的“只排除 dev/test data”。

现有 19/19 CAD/GIS 黑盒主要覆盖 DGN/Shapefile 的当前样本，没有覆盖上述运行时表对应的稀有 CRS/驱动路径。因此即便当前常见 Shapefile 测试通过，也不能据此推断所有宣传的专业 GIS 输入/CRS语义均不受影响。

**可测验收标准：**

1. 把过滤改为按真实后缀精确判断（如 `Path(source).suffix.lower() in {'.c','.pyx','.pxd','.pxi'}`），或提供逐文件上游依赖证明说明每个被删 CSV 均不是运行时数据；不能继续用任意子串 `'.c'`。
2. 重建候选后递归比较，要求全部 78 个 GDAL CSV 恢复，或为每个被排除文件给出经过验证的 allowlist 理由；计划外移除数必须为 0。
3. 对新的精确 EXE复跑 366/15、75/75、18/18、CAD/GIS 19/19、CAD loading 17/17、Office 14/14、CAD pack 6/6、RECOIL 150/150、1,000/1,000、32 UI records、安装/10语言/真实升级。
4. 至少补充含非默认/罕见 CRS 的 Shapefile 黑盒；若产品实际暴露 GRIB/S57/OZI 路径，再各加入一个结构和语义可独立解析的冻结夹具。若不暴露这些路径，能力清单和归档门禁应明确范围，不能把未测 GDAL 资源删除等同于安全删除。

### P2-01：许可清单仍把已删除的 pillow-avif-plugin 写成“本版本包含” — OPEN

递归归档确认候选不含 `pillow_avif` 代码、本地库或 dist-info，但 `THIRD-PARTY-NOTICES.md`、`assets/licenses/INDEX.txt`、`collect_licenses.py` 和归档内 `pillow-avif-plugin-1.txt` 仍把 1.6.0 列为 bundled component。多披露许可本身不会造成合规缺失，但使“精确发布组成”清单不再精确，也浪费少量体积。

**可测验收标准：**从运行时组件清单、notices、license index 和收集脚本移除该组件（或明确标为“附带许可文本但不含代码”）；生成机器可读的组件/版本/许可/归档路径映射，并以递归归档成员做一致性门禁。

### P2-02：缺少冻结 EXE 与 Inno 的重复构建稳定性证据 — OPEN

现有证据只绑定一个最终 EXE 和一个最终 Inno，没有 3/3 或 10/10 重建的唯一哈希/差异解释。它不否定当前候选功能，但会增加临发布重建时错包或不可解释漂移的风险。

**可测验收标准：**锁定 Python/Inno/PyInstaller/依赖和关键构建环境；从同一干净输入至少连续 3 次构建，记录每次 EXE/Inno 字节数和 SHA-256。若工具本身含不可避免时间字段，应证明剥离该字段后的归档清单/载荷根哈希一致，并继续以最终公开字节重跑安装身份门禁。

### P2-03：安装矩阵和日志证据仍可加强 — OPEN

当前真实证据是 Windows 10 build 19045、x64、当前用户静默路径；10 语言均是 `/LANG=` 静默测试。它没有覆盖 Windows 11、管理员/SYSTEM `/ALLUSERS`、10 语言交互式页面视觉/自动系统语言选择、运行中升级、空间不足/中断回滚，以及开始菜单/桌面/任务/服务/文件关联/临时目录的完整白名单残留。普通安装与真实升级 JSON 也没有像语言 JSON 那样记录每份日志的 SHA-256。

**可测验收标准：**在干净 Windows 10/11 VM 加入 per-user 与 all-users/SYSTEM 的 install/repair/0.8.0→0.8.1/uninstall；检查唯一卸载项、所有快捷方式和系统对象白名单、失败恢复、用户数据策略；保存 10 语言交互页面关键截图并验证系统语言自动选择；把全部安装/升级/卸载日志的字节数和 SHA-256 纳入最终清单。

## 7. Top 5 增量结论

0.8.0 的独立最终审核已证明其在 Windows 批量图片转换任务域达到并总体超过 XnConvert/NConvert、reaConverter Pro、FastStone Photo Resizer、Caesium/CLT、IrfanView + Plugins，评分 97.1 / 100。0.8.1 的精确功能/UI证据没有显示核心能力下降，并新增了真实 Inno、10 语言静默安装、真正 0.8.0→0.8.1 升级和约 13.5% 的分发体积改善。

但 Top 5 结论的继承前提是“受控增量没有删除运行时能力”。P1-01 证明当前归档差异并非完全受控。因此本轮只能确认绝大多数任务达到原基线，不能签署完整 Top 5 继承。修复 P1 并用新精确候选复跑上述门禁后，预计可以恢复 97 分以上；该预期不是对未来二进制的预批准。

## 8. 未签名公开发布边界

按照当前根 `AGENTS.md`，`NotSigned` **不是软件候选的发布阻断项**，本报告也没有把它列为 P0/P1。公开上线前仍必须独立满足网站发布门槛：

1. 每个直接下载动作旁明确说明安装器未签名，Windows 可能显示 Unknown publisher 或信誉警告；
2. 同一下载上下文提供精确 SHA-256 和 utilivera.com 官方验证指南；
3. 只从 utilivera.com 的 HTTPS 稳定/版本化 URL 分发，线上字节必须与最终独立审核候选逐字节一致；
4. 公开应用审核和安装器审核，不得称其为“已由受信任发布者签名”；
5. 日后签名会改变内外层二进制身份，必须重新做哈希、安装、升级和独立发布复核。

由于本轮另有内部 P1-01，当前即使披露页面准备完毕也不能发布这两个精确候选。

## 9. 最终签署

**Round 1：FAIL；94.2 / 100；P0=0，P1=1，P2=3。**

本结论只绑定本报告第 2 节的精确 EXE 和 Inno 身份。构建者修复 P1 后会产生新哈希，必须由同一独立审核员做 Round 2；本报告不得被用于批准任何不同字节的二进制。
