From a188fdfe9d56f7b88519d13fc11bb1c48b796caa Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Wed, 03 Jun 2026 15:31:19 +0800
Subject: [PATCH] Record Round 4 QA progress

---
 02-P-NBL/round-4/qa-handoff.md                                             |   17 +++
 02-P-NBL/round-4/qa-report.md                                              |   78 +++++++++++++++
 02-P-NBL/round-4/logs/local-build-install-20260603-round4-after-qa-fix.log |  154 ++++++++++++++++++++++++++++++
 02-P-NBL/round-4/todo-list.md                                              |   18 +-
 4 files changed, 257 insertions(+), 10 deletions(-)

diff --git a/02-P-NBL/round-4/logs/local-build-install-20260603-round4-after-qa-fix.log b/02-P-NBL/round-4/logs/local-build-install-20260603-round4-after-qa-fix.log
new file mode 100644
index 0000000..92f9dd8
--- /dev/null
+++ b/02-P-NBL/round-4/logs/local-build-install-20260603-round4-after-qa-fix.log
@@ -0,0 +1,154 @@
+
+==> Preflight checks
+Using existing local signing identity: PrivateVoice Local Code Signing
+
+==> Cleaning old local build
+
+==> Building frontend
+
+> privatevoice-input-frontend@2.1.21 build
+> vite build
+
+vite v6.4.1 building for production...
+transforming...
+3:01:28 PM [vite-plugin-svelte] src/components/update/UpdateDialog.svelte:28:0 Elements with the 'dialog' interactive role must have a tabindex value
+https://svelte.dev/e/a11y_interactive_supports_focus
+26: 
+27: <!-- svelte-ignore a11y_click_events_have_key_events -->
+28: <div class="overlay" onclick={onclose} role="dialog">
+          ^
+29:   <!-- svelte-ignore a11y_click_events_have_key_events -->
+30:   <div class="dialog" onclick={(e) => e.stopPropagation()} role="document">
+3:01:28 PM [vite-plugin-svelte] src/components/update/UpdateDialog.svelte:30:2 Non-interactive element `<div>` should not be assigned mouse or keyboard event listeners
+https://svelte.dev/e/a11y_no_noninteractive_element_interactions
+28: <div class="overlay" onclick={onclose} role="dialog">
+29:   <!-- svelte-ignore a11y_click_events_have_key_events -->
+30:   <div class="dialog" onclick={(e) => e.stopPropagation()} role="document">
+            ^
+31:     <h2 class="title">{t('update.title')}</h2>
+32:     <p class="version">{t('update.version', { version: info.version })}</p>
+3:01:28 PM [vite-plugin-svelte] src/components/shared/ToggleSwitch.svelte:17:0 Buttons and links should either contain text or have an `aria-label`, `aria-labelledby` or `title` attribute
+https://svelte.dev/e/a11y_consider_explicit_label
+15: </script>
+16: 
+17: <button
+           ^
+18:   class="toggle"
+19:   class:active={checked}
+✓ 163 modules transformed.
+rendering chunks...
+computing gzip size...
+dist/index.html                      0.41 kB │ gzip:  0.28 kB
+dist/assets/app-icon-Bs-pS5hx.png  400.98 kB
+dist/assets/index-Bm3gykhy.css      35.00 kB │ gzip:  5.92 kB
+dist/assets/index-QkfSvZCU.js      142.09 kB │ gzip: 47.42 kB
+✓ built in 423ms
+
+==> Building Go binary (arm64)
+# voicesnap
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/go.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000000.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000001.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000002.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000003.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000004.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000005.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000006.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000007.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000028.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000029.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000030.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000031.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000032.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000033.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000034.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000035.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000036.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000037.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000038.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000039.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000040.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000041.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000042.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000043.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000044.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000045.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000046.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000047.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000048.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000049.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000050.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000051.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000052.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000053.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000054.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2443319701/000055.o) was built for newer 'macOS' version (26.0) than being linked (11.0)
+ld: warning: building for macOS-11.0, but linking with dylib '@rpath/libonnxruntime.1.23.2.dylib' which was built for newer version 13.4
+
+==> Assembling PrivateVoice Input.app
+
+==> Fixing rpaths
+/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool: warning: changes being made to the file will invalidate the code signature in: /Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+
+==> Code signing with stable local identity
+/Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib: replacing existing signature
+/Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib: replacing existing signature
+/Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input: replacing existing signature
+/Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input.app: replacing existing signature
+
+==> Verifying app signature
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+/Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input.app: valid on disk
+/Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input.app: satisfies its Designated Requirement
+Executable=/Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input
+Identifier=com.privatevoice.input
+Format=app bundle with Mach-O thin (arm64)
+CodeDirectory v=20500 size=28343 flags=0x10000(runtime) hashes=875+7 location=embedded
+Signature size=1830
+Authority=PrivateVoice Local Code Signing
+Signed Time=Jun 3, 2026 at 15:01:30
+Info.plist entries=12
+TeamIdentifier=not set
+Runtime Version=26.2.0
+Sealed Resources version=2 rules=13 files=3
+Internal requirements count=1 size=100
+
+==> Creating DMG
+created: /Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.21-build20260603.1327-arm64-local.dmg
+
+==> Signing DMG
+正在检查“Protective Master Boot Record(MBR:0)”的校验和…
+Protective Master Boot Record(MBR:0):已验证CRC32 $A8E7551D
+正在检查“GPT Header(Primary GPT Header:1)”的校验和…
+    GPT Header(Primary GPT Header:1):已验证CRC32 $3DD4B017
+正在检查“GPT Partition Data(Primary GPT Table:2)”的校验和…
+GPT Partition Data(Primary GPT Table:已验证CRC32 $0D75002A
+正在检查“(Apple_Free:3)”的校验和…
+                      (Apple_Free:3):已验证CRC32 $00000000
+正在检查“disk image(Apple_APFS:4)”的校验和…
+            disk image(Apple_APFS:4):已验证CRC32 $DC4DD60B
+正在检查“(Apple_Free:5)”的校验和…
+                      (Apple_Free:5):已验证CRC32 $00000000
+正在检查“GPT Partition Data(Backup GPT Table:6)”的校验和…
+GPT Partition Data(Backup GPT Table::已验证CRC32 $0D75002A
+正在检查“GPT Header(Backup GPT Header:7)”的校验和…
+     GPT Header(Backup GPT Header:7):已验证CRC32 $13C09357
+已验证CRC32 $F5A9B167
+hdiutil: verify: checksum of "/Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.21-build20260603.1327-arm64-local.dmg" is VALID
+
+==> Installing to /Applications
+--prepared:/Applications/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--validated:/Applications/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--prepared:/Applications/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+--validated:/Applications/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+/Applications/PrivateVoice Input.app: valid on disk
+/Applications/PrivateVoice Input.app: satisfies its Designated Requirement
+
+==> Local build complete
+  App: /Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input.app
+  DMG: /Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.21-build20260603.1327-arm64-local.dmg
+  Compatibility DMG: /Users/ar/Projects/VoiceSnap-2.1.1-Round4/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.21-arm64-local.dmg
+  Signing identity: PrivateVoice Local Code Signing
diff --git a/02-P-NBL/round-4/qa-handoff.md b/02-P-NBL/round-4/qa-handoff.md
index 8e06777..6de5227 100644
--- a/02-P-NBL/round-4/qa-handoff.md
+++ b/02-P-NBL/round-4/qa-handoff.md
@@ -1,6 +1,6 @@
 # Round 4 QA Handoff:Parakeet English 高级模型
 
-状态:待 QA 真机验证
+状态:真机 QA 部分通过,待断网验证
 日期:2026-06-03
 
 ## 1. QA 目标
@@ -71,3 +71,18 @@
 - 失败下载不会破坏原模型。
 - 用户历史、词库、权限、热键配置不丢失。
 
+## 7. 当前 QA 进度
+
+截至 2026-06-03 15:30,已通过:
+
+- Parakeet 真实下载、解压、安装。
+- Parakeet 加载到 `Parakeet English · CPU`。
+- Parakeet 英文识别并写入历史。
+- 切回 Moonshine 并完成英文识别。
+- 切回中文 SenseVoice 并完成中文识别。
+- 下载中断/退出后的 partial 清理补丁验证。
+
+待完成:
+
+- Parakeet 断网英文识别。
+- 断网后重启持久化验证。
diff --git a/02-P-NBL/round-4/qa-report.md b/02-P-NBL/round-4/qa-report.md
new file mode 100644
index 0000000..1d53bd4
--- /dev/null
+++ b/02-P-NBL/round-4/qa-report.md
@@ -0,0 +1,78 @@
+# Round 4 QA 报告:Parakeet English 高级模型
+
+状态:部分通过,待断网英文识别
+日期:2026-06-03
+测试分支:`codex/round4-parakeet-english`
+当前实现 commit:`ce96a0e`
+
+## 1. 自动化与构建
+
+已通过:
+
+- `go test ./... -count=1`
+- `npm run build`
+- `git diff --check`
+- 本地 macOS arm64 App 构建、安装、签名验证
+- 本地 DMG `hdiutil verify`
+
+相关日志:
+
+- `logs/go-test-all-20260603-round4-after-qa-fix.log`
+- `logs/npm-run-build-20260603-round4-after-qa-fix.log`
+- `logs/git-diff-check-20260603-round4-after-qa-fix.log`
+- `logs/local-build-install-20260603-round4-after-qa-fix.log`
+
+## 2. 真机 QA 结果
+
+| 项 | 结果 | 证据 |
+|---|---|---|
+| English 默认模型 | PASS | English 状态默认 Moonshine,Parakeet 作为 Advanced/可选模型显示 |
+| Parakeet 下载 | PASS | 下载官方 `sherpa-onnx-nemo-parakeet-unified-en-0.6b-int8-non-streaming` 包,落盘到 `models/parakeet-en` |
+| Parakeet 必需文件 | PASS | `encoder.int8.onnx`、`decoder.int8.onnx`、`joiner.int8.onnx`、`tokens.txt` 均存在 |
+| Parakeet 加载 | PASS | 15:07:39 日志显示 `ASR engine ready: Parakeet English · CPU` |
+| Parakeet 英文识别 | PASS | 15:11:04 识别 `Do you understand me?`,并写入历史 |
+| Moonshine 回退 | PASS | 15:13:04 日志显示 `ASR engine ready: Moonshine English · CPU` |
+| Moonshine 英文识别 | PASS | 15:18:27 识别 `This is a most shy fullback test.`,并写入历史 |
+| 中文 SenseVoice 回归 | PASS | 15:19:24 日志显示 `ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)` |
+| SenseVoice 中文识别 | PASS | 15:29:18 识别 `这是中文 since voice 回归测试。`,并写入历史 |
+| 下载失败保护 | PASS | 中途 App 退出后 Moonshine 仍可用;补丁后下一次下载会清理旧 partial |
+| 用户数据保护 | PASS | `history.json`、`userdict.json`、`config.json` 未丢失,历史持续写入 |
+
+## 3. QA 预检发现的问题和修复
+
+### 3.1 下载中 Engine UI 状态误导
+
+现象:
+
+- Parakeet 下载过程中,旧 Moonshine 引擎仍可用,但 UI 曾显示 Engine Loading。
+
+处理:
+
+- 前端只在已安装模型切换或下载完成后设置 Engine Loading;下载过程中保留当前引擎状态。
+
+结果:
+
+- 补丁后下载期间 Engine 显示 `Moonshine English · CPU`,符合真实状态。
+
+### 3.2 中途退出留下大体积 partial
+
+现象:
+
+- Parakeet 下载中途 App 退出后,`.downloads/parakeet-en` 留下约 439 MiB partial。
+
+处理:
+
+- `DownloadProfile` 在同模型新下载开始前清理旧 `.downloads/<model>` partial。
+
+结果:
+
+- 补丁后重新下载时旧 partial 被清理,新 run 从 0 开始,最终成功安装。
+
+## 4. 待完成项
+
+- Parakeet 断网英文识别。
+- 断网后重启 App,确认 Parakeet 仍可加载并识别。
+
+## 5. QA 观察项
+
+- 中文回归测试后日志出现短时间多次模型初始化记录:`sensevoice-zh`、`moonshine-en`、`sensevoice-zh`。最终状态回到 `SenseVoice · CoreML (Apple Neural Engine)`,功能结果通过。建议后续继续观察是否存在设置页快速切换或异步 reload 触发的初始化交叉。
diff --git a/02-P-NBL/round-4/todo-list.md b/02-P-NBL/round-4/todo-list.md
index 9d796e4..60ebf20 100644
--- a/02-P-NBL/round-4/todo-list.md
+++ b/02-P-NBL/round-4/todo-list.md
@@ -1,6 +1,6 @@
 # Round 4 Todo List:Parakeet English 高级模型
 
-状态:研发自测通过,待 QA 真机验证
+状态:真机 QA 部分通过,待断网验证
 所属子项目:`02-P-NBL`
 Round:Round 4
 日期:2026-06-03
@@ -39,15 +39,15 @@
 
 ## 4. QA
 
-- [ ] 自动化/半自动 QA
-- [ ] Parakeet 真实下载和加载
-- [ ] Parakeet 英文识别
+- [x] 自动化/半自动 QA
+- [x] Parakeet 真实下载和加载
+- [x] Parakeet 英文识别
 - [ ] Parakeet 断网英文识别
-- [ ] Moonshine 回退
-- [ ] 中文 SenseVoice 回归
-- [ ] 下载失败保护
-- [ ] 用户数据保护
-- [ ] QA 报告
+- [x] Moonshine 回退
+- [x] 中文 SenseVoice 回归
+- [x] 下载失败保护
+- [x] 用户数据保护
+- [x] QA 报告
 
 ## 5. 交付
 

--
Gitblit v1.9.3