# UtiliVera Capture 0.6.0 安装器独立审核（Round 2）

审核日期：2026-08-15  
审核角色：与 Round 1 相同的独立安装/发布审核员  
审核范围：最新冻结候选及 Round 1 内部 P1 整改；只读核验，不修改产品或网站 `static-dist`

## 结论

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

Round 1 唯一内部 P1 已关闭：10 种安装语言均有对应的 `DotNet48Required` 文案；`/SIMULATENODOTNET` 负向矩阵 10/10 均以 exit 1 在 `InitializeSetup` 阶段中止，没有 payload 复制迹象；23 份日志持久化且非空。新安装器身份、258-file manifest 和 10/10 确定性构建相互一致。

内部 PASS 不等于正式发布批准。安装器与主 EXE 仍为 `NotSigned`；Capture 产品页与 release 页虽已出现在当前冻结静态产物中，但本轮没有生产 HTTPS 200 激活证据。签名与生产 URL 两个外部 P1 均继续阻断正式公开下载。

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

| 对象 | 大小 | SHA-256 | Authenticode |
|---|---:|---|---|
| `UtiliVeraCapture.exe` | 293,888 bytes | `3832C20012F30B07C2D61ACECCAFC9949B4738F065C53D23D2C781D6BCCF5DB7` | `NotSigned` |
| `UtiliVeraCapture-Setup-0.6.0-Windows-x64.exe` | 3,004,701 bytes | `58F8957FD8DEE4ECB8EFE7F7C27832F59FA75FBCD275445F365F0E0EEE598284` | `NotSigned` |

独立计算结果与 `installer-build-evidence-0.6.0.json`、`installer-test-evidence-0.6.0.json`、`installer-build-stability-0.6.0.json` 和 `SHA256SUMS.txt` 一致。候选产品身份仍为 UtiliVera Capture 0.6.0，主 EXE 为 0.6.0.0。构建/测试 evidence 诚实保留 `releaseGate=BLOCKED_NOT_SIGNED`。

## 2. Round 1 P1：10 种 .NET 4.8 阻断本地化——CLOSED

Inno `[Languages]` 与 `[CustomMessages]` 的绑定逐项核验：

| Inno language name | `DotNet48Required` 资源 | 判定 |
|---|---|---|
| `english` | 默认 `DotNet48Required` | PASS |
| `chinesesimplified` | `chinesesimplified.DotNet48Required` | PASS |
| `chinesetraditional` | `chinesetraditional.DotNet48Required` | PASS |
| `spanish` | `spanish.DotNet48Required` | PASS |
| `german` | `german.DotNet48Required` | PASS |
| `french` | `french.DotNet48Required` | PASS |
| `japanese` | `japanese.DotNet48Required` | PASS |
| `korean` | `korean.DotNet48Required` | PASS |
| `portuguesebrazil` | `portuguesebrazil.DotNet48Required` | PASS |
| `russian` | `russian.DotNet48Required` | PASS |

每个资源恰好出现一次，语言名称与 `[Languages]` 完全一致；简/繁中文、欧洲语言、日/韩/俄文文本均包含 .NET Framework 4.8、官方下载 URL 和重新运行安装器的明确动作。英文按 Inno 规则使用无前缀默认键，这是正确绑定；test evidence 中的 `english.DotNet48Required` 是语义标签，并非要求源码存在同名字面键。

`IsDotNet48Installed` 继续在真实路径检查 HKLM 64/32 位 `Release >= 528040`。`/SIMULATENODOTNET` 仅增加可重复的审核分支，使该函数在测试时返回 False；生产默认路径不带该参数，仍执行真实注册表门禁。

**Round 1 P1-1 判定：CLOSED。**

## 3. `/SIMULATENODOTNET` 负向矩阵：PASS

`installer-test-evidence-0.6.0.json` 对 10 个语言逐项记录：

- `blockedExitCode=1`（10/10）；
- `payloadCopied=false`（10/10）；
- 每项关联对应的本地化 message key。

本审核员又独立检查 10 份 `dotnet48-blocked-*.log`：全部出现 `InitializeSetup returned False; aborting` 和 `EAbort`，随后立即 deinitialize；全部日志均未出现目标文件名、安装文件、创建产品目录或安装成功等 payload-copy 指示。测试脚本还断言阻断目录中不存在 `UtiliVeraCapture.exe`。这组源代码断言与原始 Inno 日志共同支持“在 payload 复制前阻断”，而不是仅凭 JSON 布尔值自证。

## 4. 23 份持久日志：PASS

当前 `outputs/installer-test-logs-0.6.0` 恰有 23 个非空文件，总计 1,600,234 bytes：

- install / repair / uninstall：3 份；
- 10 种语言成功安装日志：10 份；
- 10 种语言 .NET 4.8 阻断日志：10 份。

文件数量、命名和 evidence 的 `persistentLogCount=23` 一致，没有用临时目录中的瞬态结果代替可审计日志。

## 5. 258-file payload：PASS，未回归

对最新 `installer-payload-manifest-0.6.0.json` 与当前冻结 `dist` 重新逐项计算：

- manifest entries：258
- 当前 payload files（排除 `dist/installer`）：258
- missing：0
- extra：0
- bytes mismatch：0
- SHA-256 mismatch：0
- manifest frozen EXE SHA：`3832C2...5DB7`

主 EXE 与全部 payload 未因门禁本地化整改发生身份漂移；变化只进入新的 Inno 候选字节。

## 6. 10/10 确定性构建：PASS

稳定性证据记录 requested=10、passed=10、result rows=10、unique hashes=1、deterministic=true。10 次 exit code 全为 0，唯一安装器 SHA 均为：

`58F8957FD8DEE4ECB8EFE7F7C27832F59FA75FBCD275445F365F0E0EEE598284`

最新 build evidence 同时记录安装后 258 项嵌入校验通过、`validationFailuresBeforePass=0`。因此候选不是依赖重试偶然成功，也没有混入 Round 1 的旧 `D055A3...4389` 身份。

## 7. Round 1 其他内部项目：继续 PASS

本轮整改没有改变以下已通过事实：

- .NET Framework 4.8 真实注册表门禁与 EXE target config 一致；
- 10 种语言成功路径 install/uninstall exit 0；
- silent install、同版 repair、installed CLI smoke 和 silent uninstall 通过；
- 安装目录、主要 HKCU/HKLM uninstall registration 和当前用户开始菜单清理通过；
- 产品 LICENSE、`THIRD-PARTY-NOTICES.md`、NAudio MIT、ZXing.Net Apache-2.0 和 Fluent UI Icons MIT 文本随安装可查；
- `%LOCALAPPDATA%\UtiliVera\Capture` 用户数据被有意保留，不误报为程序残留。

## 8. 外部 P1：继续阻断正式下载

### P1-1：安装器与主 EXE 未签名——OPEN

本轮独立实测两者 Authenticode 均为 `NotSigned`。

**验收标准：**使用受信证书签署主 EXE 和最终 Inno 包并加 RFC 3161 时间戳；在干净 Windows 10/11 验证均为 `Valid`；按签名后的最终字节重新冻结 bytes/SHA、258 manifest、10/10 build、10 语言成功/负向门禁及完整安装矩阵。网站只能开放最后一次独立审核通过的签名包。

### P1-2：生产产品/版本 URL 尚无激活证据——OPEN

Inno 固定 `https://utilivera.com/capture/` 和 `https://utilivera.com/capture/releases/0.6.0/`。本轮只读检查显示两个页面已存在于当前本地冻结 `static-dist`，这说明网站实现已准备，但不能替代生产 HTTPS 部署与响应验证。

**验收标准：**生产域名两个 URL 均返回 HTTPS 200，内容引用签名后最终 installer bytes/SHA、系统要求和准确发布状态；验证安装后的 Publisher/Support/Updates 链接；签名前可部署无二进制预发布页，但不得提供当前 58F895...8284 未签名包或把它标为可下载 Offer。

## 9. 非阻断 P2（沿用 Round 1）

1. 标准用户默认范围与管理员 override 的默认路径、registry、开始菜单及卸载所有权矩阵尚未分别覆盖。
2. `/TASKS=desktopicon` 可选桌面快捷方式的创建和卸载清理尚未自动验证。
3. 已证明同版 repair，尚无真实 N-1→N 跨版本升级/降级矩阵。
4. `%LOCALAPPDATA%\UtiliVera\Capture` 保留内容和手动清理方法主要存在于内部 evidence，应增加最终用户可见披露。

## 10. 门禁摘要

| 门禁 | Round 2 结果 |
|---|---|
| 新 installer bytes/SHA/版本 | PASS |
| 主 EXE 冻结身份 | PASS |
| 258/258 payload 独立复算 | PASS（0 mismatch） |
| 10 种 DotNet48Required 文案及绑定 | PASS |
| `/SIMULATENODOTNET` 10/10 非零退出 | PASS（均 exit 1） |
| 负向路径零 payload 复制 | PASS（原始日志 + 脚本断言） |
| 23 份持久日志 | PASS |
| 10/10 deterministic build | PASS（唯一新 SHA） |
| 既有安装/repair/卸载/许可 | PASS，未回归 |
| Capture 生产 URL | **外部 P1，待部署验证** |
| installer 与主 EXE 签名 | **外部 P1，BLOCKED_NOT_SIGNED** |

## 最终判定

**UtiliVera Capture 0.6.0 安装器 Round 2：内部安装工程 PASS；正式公开下载仍 BLOCKED。** Round 1 的本地化与负向门禁 P1 已按可测标准关闭。剩余两个 P1 均为外部门槛：受信代码签名和生产 URL 激活。当前 `58F895...8284` 未签名候选不得公开下载，不得称为正式发布版，也不得启动 Capture 独立的 30 天 1,000 有效下载计时。
