From 678bd460610d80d0a11ce8910a73fe95d00073f5 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Wed, 03 Jun 2026 13:29:34 +0800
Subject: [PATCH] Prepare 2.1.21 Round 3 QA package

---
 privatevoice.src/frontend/package.json                   |    2 
 privatevoice.src/app.go                                  |    4 +-
 privatevoice.src/frontend/package-lock.json              |    4 +-
 02-P-NBL/round-3/logs/go-test-all-20260603-2.1.21.log    |   23 +++++++++++
 02-P-NBL/round-3/logs/git-diff-check-20260603-2.1.21.log |    0 
 CHANGELOG.md                                             |   19 +++++++++
 02-P-NBL/round-3/logs/npm-run-build-20260603-2.1.21.log  |   38 +++++++++++++++++++
 privatevoice.src/build/darwin/Info.plist                 |    4 +-
 8 files changed, 87 insertions(+), 7 deletions(-)

diff --git a/02-P-NBL/round-3/logs/git-diff-check-20260603-2.1.21.log b/02-P-NBL/round-3/logs/git-diff-check-20260603-2.1.21.log
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/02-P-NBL/round-3/logs/git-diff-check-20260603-2.1.21.log
diff --git a/02-P-NBL/round-3/logs/go-test-all-20260603-2.1.21.log b/02-P-NBL/round-3/logs/go-test-all-20260603-2.1.21.log
new file mode 100644
index 0000000..abf9e58
--- /dev/null
+++ b/02-P-NBL/round-3/logs/go-test-all-20260603-2.1.21.log
@@ -0,0 +1,23 @@
+?   	voicesnap	[no test files]
+?   	voicesnap/internal/audio	[no test files]
+ok  	voicesnap/internal/config	1.213s
+ok  	voicesnap/internal/correctioncsv	1.642s
+?   	voicesnap/internal/dock	[no test files]
+?   	voicesnap/internal/engine	[no test files]
+ok  	voicesnap/internal/history	2.289s
+?   	voicesnap/internal/hotkey	[no test files]
+?   	voicesnap/internal/input	[no test files]
+ok  	voicesnap/internal/language	2.945s
+?   	voicesnap/internal/logger	[no test files]
+ok  	voicesnap/internal/model	4.630s
+ok  	voicesnap/internal/modelselection	4.183s
+?   	voicesnap/internal/overlay	[no test files]
+?   	voicesnap/internal/paths	[no test files]
+?   	voicesnap/internal/permissions	[no test files]
+?   	voicesnap/internal/singleinstance	[no test files]
+?   	voicesnap/internal/sound	[no test files]
+?   	voicesnap/internal/startup	[no test files]
+?   	voicesnap/internal/textproc	[no test files]
+?   	voicesnap/internal/updater	[no test files]
+ok  	voicesnap/internal/userdict	3.522s
+?   	voicesnap/services	[no test files]
diff --git a/02-P-NBL/round-3/logs/npm-run-build-20260603-2.1.21.log b/02-P-NBL/round-3/logs/npm-run-build-20260603-2.1.21.log
new file mode 100644
index 0000000..d6927b5
--- /dev/null
+++ b/02-P-NBL/round-3/logs/npm-run-build-20260603-2.1.21.log
@@ -0,0 +1,38 @@
+
+> privatevoice-input-frontend@2.1.21 build
+> vite build
+
+vite v6.4.1 building for production...
+transforming...
+1:29:05 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">
+1:29:05 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>
+1:29:06 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-p3GQqwqB.css      33.39 kB │ gzip:  5.73 kB
+dist/assets/index-CWMyDHKt.js      137.34 kB │ gzip: 45.94 kB
+✓ built in 2.27s
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8f791c4..202bde4 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,24 @@
 # Changelog
 
+## v2.1.21 (2026-06-03)
+
+### QA 候选包
+
+- **Round 3 Moonshine English 默认模型**:English 语言版本默认 current model 改为 `moonshine-en`,中文语言版本继续默认 `sensevoice-zh`。
+- **Moonshine backend**:macOS sherpa-onnx 接入 Moonshine v1 四文件配置:`preprocess.onnx`、`encode.int8.onnx`、`uncached_decode.int8.onnx`、`cached_decode.int8.onnx`、`tokens.txt`。
+- **模型选择解析**:新增 `ModelSelectionMode=auto|manual`,旧配置缺字段时按 `auto` 处理,避免 Round 2 的 `SelectedModelID=sensevoice-zh` 锁死 English 默认模型。
+- **按当前模型下载**:Onboarding 改为调用 `DownloadCurrentModel()`,由后端根据 effective language 和 profile 选择下载 SenseVoice 或 Moonshine。
+- **语言切换同步模型**:设置页切换中文/English 后会刷新 current model;缺模型时进入 onboarding,已安装时重载引擎。
+- **安全回归保护**:Moonshine 初始化失败会清空旧引擎,避免用户实际继续使用旧模型;SenseVoice 中文路径和用户数据保持兼容。
+- **QA 资料**:新增 `02-P-NBL/round-3` 下 PRD、研发拆解、QA 计划、自查、复审、QA handoff 和 QA 预检记录。
+
+### 构建
+
+- build: `20260603.1327`
+- 说明: 本版本为 Round 3 QA 测试包候选,已完成源码级自查和 QA 预检,仍需真机验证 Moonshine 下载、加载、英文断网识别、history 写入、语言切换和中文 SenseVoice 回归。
+
+---
+
 ## v2.1.20 (2026-06-03)
 
 ### QA 候选包
diff --git a/privatevoice.src/app.go b/privatevoice.src/app.go
index e642b13..1bff5ab 100755
--- a/privatevoice.src/app.go
+++ b/privatevoice.src/app.go
@@ -27,8 +27,8 @@
 )
 
 const (
-	appVersion        = "2.1.20"
-	appBuild          = "20260603.1145"
+	appVersion        = "2.1.21"
+	appBuild          = "20260603.1327"
 	appDisplayVersion = appVersion + " (build " + appBuild + ")"
 	appName           = "PrivateVoice Input"
 
diff --git a/privatevoice.src/build/darwin/Info.plist b/privatevoice.src/build/darwin/Info.plist
index ad2819a..1b2ca44 100755
--- a/privatevoice.src/build/darwin/Info.plist
+++ b/privatevoice.src/build/darwin/Info.plist
@@ -15,9 +15,9 @@
     <key>CFBundlePackageType</key>
     <string>APPL</string>
     <key>CFBundleShortVersionString</key>
-    <string>2.1.20</string>
+    <string>2.1.21</string>
     <key>CFBundleVersion</key>
-    <string>20260603.1145</string>
+    <string>20260603.1327</string>
     <key>LSMinimumSystemVersion</key>
     <string>11.0</string>
     <key>NSMicrophoneUsageDescription</key>
diff --git a/privatevoice.src/frontend/package-lock.json b/privatevoice.src/frontend/package-lock.json
index 706ec09..0495032 100755
--- a/privatevoice.src/frontend/package-lock.json
+++ b/privatevoice.src/frontend/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "privatevoice-input-frontend",
-  "version": "2.1.20",
+  "version": "2.1.21",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "privatevoice-input-frontend",
-      "version": "2.1.20",
+      "version": "2.1.21",
       "dependencies": {
         "@wailsio/runtime": "latest"
       },
diff --git a/privatevoice.src/frontend/package.json b/privatevoice.src/frontend/package.json
index 8812421..f3b9a71 100755
--- a/privatevoice.src/frontend/package.json
+++ b/privatevoice.src/frontend/package.json
@@ -1,7 +1,7 @@
 {
   "name": "privatevoice-input-frontend",
   "private": true,
-  "version": "2.1.20",
+  "version": "2.1.21",
   "type": "module",
   "scripts": {
     "dev": "vite dev",

--
Gitblit v1.9.3