# R221-3 QA Evidence ## 结论 - 任务 ID:`R221-3` - Review Gate ID:`R221-2-GATE-20260703.0335` - QA 结论:`PASS` - 时间:`2026-07-03 05:10:25 +0800` - 范围:验证恢复后的当前源码与 `2.2.2 build 20260703.0335` 候选构建路径。 - 不做范围:不修改源码、不创建 tag、不生成正式发布包、不把本地 QA evidence 当作发布候选。 QA 允许 PMO 解锁 `R221-4` 发布冻结流程。该结论不等于 Windows 正式版通过、不等于 Windows 真机 QA 通过、不等于 Monterey 兼容通过、不等于 notarized 官网正式发布通过。 ## 环境 - 项目根:`/Users/ar/Projects/PrivateVoice` - Git 根:`/Users/ar/Projects/PrivateVoice/03-O` - 源码根:`/Users/ar/Projects/PrivateVoice/03-O/C1.source/privatevoice.src` - 分支:`codex/x-asr-experiment-2.1.29` - HEAD:`abb469859662c285fac758c042812e0da943728f` - macOS:`26.1 (25B78)` - Go:`go version go1.26.4 darwin/arm64` - Node:`v23.11.1` - npm:`10.9.2` ## 工作区核对 - `git status --short --branch`:当前分支 ahead 1,存在 R221 待审源码 / 文档 diff。 - `git diff --cached --name-status`:无输出,当前无 staged diff。 - `git diff --stat`:43 files changed,包含 R221 恢复源码、版本元数据、前端生命周期清理、Windows preview 脚本、CODEGRAPH / 管理文档等。 - 新增源码文件已在 diff 范围:`cmd/benchmark-recognition/main.go`、`scripts/benchmark-recognition.sh`、`services/diagnostics_service.go`。 ## 标准源码门禁 | 项 | 命令 | 结果 | 备注 | | --- | --- | --- | --- | | 空白检查 | `git diff --check` | PASS | 无输出 | | gofmt 状态 | `git diff --name-only -- C1.source/privatevoice.src | grep -E '\.go$' | xargs gofmt -l` | PASS | 无输出,表示当前变更 Go 文件格式干净 | | Go 测试 | `go test ./...` | PASS with warning | 复现 macOS 链接 warning,未导致测试失败 | | 前端构建 | `npm --prefix frontend run build` | PASS with warning | 复现既有 Svelte a11y warning:`UpdateDialog.svelte`、`ToggleSwitch.svelte` | ## 核心路径核对 | 路径 | Evidence | 结论 | | --- | --- | --- | | 核心语音输入 / 录音 / 识别流水线 | `go test ./...`;`go test ./internal/model ./internal/modelselection ./internal/language ./internal/engine ./internal/audio ./services`;`go test . -run 'TestSlowRecognitionReason|TestRecognize|TestHotkey|TestLiveCaption|TestWaitForHotkeyRelease|TestReload|TestOverlay|TestVersion'` | 自动化层 PASS;未在本机做真实麦克风、全局热键、粘贴上屏手动测试 | | 设置 / 热键配置 | 前端 build PASS;diff 核对 `GeneralPage.svelte`、`HotkeysPage.svelte` 增加 `onDestroy` 和 `clearHotkeyCapture()` | 代码级生命周期清理路径通过;未做真实窗口交互测试 | | 语言 / 模型选择 | `go test ./internal/model ./internal/modelselection ./internal/language ./internal/engine ./internal/audio ./services` PASS;`go test ./internal/model -run 'Test.*Yue|Test.*Cantonese|Test.*Language'` PASS | 自动化层覆盖语言 / 模型解析 | | 粤语 `yue-HK` | `rg` 核对 `CantoneseLanguageID = "yue-HK"`、`SenseVoiceYueModelID = "sensevoice-yue-2025-09-09"`、`LanguageParam: "yue"`;`internal/engine` 测试 PASS | 粤语注册与 SenseVoice `yue` 参数路径通过 | | 前端生命周期风险 | diff 核对 `App.svelte` 释放 Wails event off hooks 和 `hashchange`;`LanguagePage.svelte` 释放模型下载事件;`PermissionsPage.svelte` 释放 interval / timeout;`SettingsWindow.svelte` 释放 store subscription | 生命周期清理路径通过构建与代码核对;未做长时间打开 / 反复开关窗口的视觉 smoke | ## Windows Preview 适配回归 | 项 | 命令 / 证据 | 结果 | | --- | --- | --- | | Windows cross smoke | `GOOS=windows GOARCH=amd64 CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ go test -exec=/usr/bin/true ./...` | NOT COVERED:本机缺 `x86_64-w64-mingw32-gcc`,命令失败于工具链,不是源码测试失败 | | 编译器检查 | `command -v x86_64-w64-mingw32-gcc` | 未找到 | | Windows build 脚本语法 | `bash -n scripts/build-windows-preview.sh` | PASS | | Windows evidence verifier 语法 | `bash -n scripts/verify-windows-qa-evidence.sh` | PASS | | 版本 / build | `scripts/build-windows-preview.sh` 内 `APP_VERSION="2.2.2"`、`APP_BUILD="20260703.0335"` | PASS | | preview 口径 | `README-WINDOWS-PREVIEW.txt` 模板声明 unsigned preview、不是安装器、需 Windows 10/11 QA | PASS | | evidence 要求 | `verify-windows-qa-evidence.sh` 要求 `qa-results.tsv`、`app.log`、`qa-target-dictation-text.txt`、`system-info.txt`,成功时输出 `WINDOWS_QA_EVIDENCE_PASS` | PASS | QA 判断:Windows preview 构建路径与 evidence 规则可进入 `R221-4` 发布冻结环节,但发布 / 环境窗口必须补齐 MinGW 工具链并实际生成 / 验证 Windows preview ZIP。不能把 Windows preview 说成正式 Windows 版。 ## 版本与构建路径 - `app.go`:`appVersion = "2.2.2"`,`appBuild = "20260703.0335"`。 - `build/config.yml`:`version: "2.2.2"`。 - `build/darwin/Info.plist`:`CFBundleShortVersionString = 2.2.2`,`CFBundleVersion = 20260703.0335`,`LSMinimumSystemVersion = 14.0`。 - `frontend/package.json` / `package-lock.json`:`2.2.2`。 - `scripts/build-windows-preview.sh`:`2.2.2 / 20260703.0335`。 - `CHANGELOG.md`:已有 `v2.2.2 (2026-07-03)`,明确恢复 `2.2.1` 内容但正式候选升为 `2.2.2`。 - `bash -n scripts/build-local-macos.sh`、`bash -n scripts/build-local-macos-universal.sh`、`bash -n scripts/build-release-macos.sh`:PASS。 ## macOS Warning / Monterey 判断 `go test ./...` 输出 macOS 链接 warning: - Go / CLT 临时 object 标记为 macOS 26.0,高于链接目标 macOS 11.0。 - `@rpath/libonnxruntime.1.24.4.dylib` 最低 macOS 14.0。 QA 判断: - 不阻塞当前主线 `2.2.2`,因为当前 mainline macOS 包口径为 `LSMinimumSystemVersion = 14.0`,且 Go 测试已通过。 - 不得据此声称 Monterey 兼容。若 Owner 需要覆盖 macOS 12 / Monterey,必须单独升级 Monterey QA / 构建任务,至少验证 `build-local-macos-monterey.sh`、对应依赖最低系统和真机安装启动。 ## 未覆盖风险 - 未做真实麦克风录音、全局热键、Notepad / 输入框粘贴、overlay 视觉稳定性、菜单栏 / Dock 图标策略的手动 smoke。 - 未做 Windows 10/11 真机 QA,未收回 `WINDOWS_QA_EVIDENCE_PASS` evidence zip。 - 未跑 Windows cross smoke,原因是本机缺 `x86_64-w64-mingw32-gcc`。 - 未做 Monterey 验证。 - 未做 notarization、Developer ID 官网发布链路、下载页 / 授权 / 更新 / 回滚链路验证。 这些风险不阻塞 `R221-4` 进入发布冻结流程,但必须在对应发布 / 平台任务中继续关闭;其中 Windows ZIP 生成必须先补齐 MinGW 工具链。