From aec585f81387038f9e6329b1fe852ea4a2d9d8d5 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Wed, 03 Jun 2026 21:23:27 +0800
Subject: [PATCH] Consolidate PrivateVoice project records

---
 02-P-NBL/freeze/20260603-directory-consolidation.md                                     |  135 ++
 Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/build-arm64.log               |  130 ++
 02-P-NBL/round-2/logs/qa-runtime/offline-voice-safety-20260603.014931.log               |    2 
 02-P-NBL/round-2/logs/qa-runtime/round2-local-run-20260603.014931.pid                   |    1 
 02-P-NBL/round-1/qa-report-20260602-2.1.19.md                                           |  458 ++++++++
 02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.restore.log       |   93 +
 02-P-NBL/round-2/logs/qa-runtime/offline-start-check-20260603.014931.log                |   38 
 Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/build-x86_64.log              |  136 ++
 Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/verify-dmgs.log               |   60 +
 02-P-NBL/round-2/logs/qa-runtime/new-user-run-20260603.014931.log                       |   23 
 Release/PrivateVoice-Input-2.1.19-build20260602.2022/logs/build-arm64.log               |  146 ++
 02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.223742.log               |    4 
 Release/PrivateVoice-Input-2.1.23-build20260603.1904/SHA256SUMS.txt                     |    2 
 02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.restore.log     |   72 +
 02-P-NBL/round-2/logs/qa-runtime/offline-voice-final-20260603.014931.log                |   62 +
 02-P-NBL/round-2/logs/qa-runtime/current-run-id.txt                                     |    1 
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english2.png             |    0 
 02-P-NBL/round-2/logs/qa-runtime/build-local-round2-20260603.014931.log                 |  144 ++
 02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.225709.pid               |    1 
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-new-user.png             |    0 
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-activated.png            |    0 
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1095-523.png      |    0 
 Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/build-arm64.log               |  144 ++
 Release/PrivateVoice-Input-2.1.20-build20260603.1145/RELEASE_MANIFEST.md                |  128 ++
 AGENTS.md                                                                               |   28 
 Release/X-旧版build成果/PrivateVoice-Input-2.1.16-build20260531.1131/SHA256SUMS.txt         |    2 
 02-P-NBL/round-2/logs/qa-runtime/round2-local-run-20260603.014931.log                   |   57 +
 02-P-NBL/round-1/logs/qa-runtime/app-log-tail-20260602.log                              |  260 ++++
 02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.recognition.log |   49 
 Release/PrivateVoice-Input-2.1.19-build20260602.2022/SHA256SUMS.txt                     |    2 
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english3.png             |    0 
 02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.launch.log        |   63 +
 02-P-NBL/round-1/logs/qa-runtime/network-sample-20260602.log                            |   31 
 Release/PrivateVoice-Input-2.1.18-build20260601.1905/SHA256SUMS.txt                     |    2 
 Release/X-旧版build成果/PrivateVoice-Input-2.1.14-build20260531.0120/SHA256SUMS.txt         |    2 
 Release/X-旧版build成果/PrivateVoice-Input-2.1.12-build20260530.1800/测试说明.md                |   40 
 Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/moonshine-download-load.log   |   14 
 02-P-NBL/round-2/logs/qa-runtime/offline-voice-safety-20260603.014931.pid               |    1 
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english4.png             |    0 
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english6.png             |    0 
 02-P-NBL/round-2/logs/qa-runtime/new-user-run-20260603.014931.pid                       |    1 
 Release/X-旧版build成果/PrivateVoice-Input-2.1.13-build20260530.1949/SHA256SUMS.txt         |    2 
 Release/PrivateVoice-Input-2.1.19-build20260602.2022/RELEASE_MANIFEST.md                |  110 ++
 02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.launch.log      |   55 +
 02-P-NBL/round-2/logs/qa-runtime/offline-voice-start-20260603.014931.log                |    1 
 Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/build-x86_64.log              |  145 ++
 Release/X-旧版build成果/PrivateVoice-Input-2.1.15-build20260531.1102/SHA256SUMS.txt         |    2 
 Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/verify-dmgs.log               |   34 
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english5.png             |    0 
 02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.setup.log       |    5 
 02-P-NBL/round-1/logs/qa-runtime/offline-restart-postcheck-20260602.log                 |   22 
 Release/X-旧版build成果/PrivateVoice-Input-2.1.10-build20260530.1640/测试说明.md                |   30 
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-693-310.png       |    0 
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-after-restart.png        |    0 
 Release/PrivateVoice-Input-2.1.20-build20260603.1145/SHA256SUMS.txt                     |    2 
 Release/X-旧版build成果/PrivateVoice-Input-2.1.17-build20260531.1359/SHA256SUMS.txt         |    2 
 02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.recognition.log   |  191 +++
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1260-565.png      |    0 
 02-P-NBL/round-1/logs/qa-runtime/offline-restart-app-log-20260602.log                   |   65 +
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-zh-manual.png            |    0 
 Release/PrivateVoice-Input-2.1.19-build20260602.2022/logs/build-x86_64.log              |  145 ++
 Release/PrivateVoice-Input-2.1.21-build20260603.1327/SHA256SUMS.txt                     |    2 
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-initial.png              |    0 
 Release/PrivateVoice-Input-2.1.21-build20260603.1327/RELEASE_MANIFEST.md                |   88 +
 02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.225709.log               |    4 
 02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.setup.log         |    5 
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-chinese.png              |    0 
 02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english.png              |    0 
 68 files changed, 3,241 insertions(+), 1 deletions(-)

diff --git a/02-P-NBL/freeze/20260603-directory-consolidation.md b/02-P-NBL/freeze/20260603-directory-consolidation.md
new file mode 100644
index 0000000..39ab458
--- /dev/null
+++ b/02-P-NBL/freeze/20260603-directory-consolidation.md
@@ -0,0 +1,135 @@
+# 目录收拢与冻结前审计记录
+
+日期:2026-06-03
+
+## 目标
+
+将此前分散在多个临时 worktree 中的项目资料与构建产物,收拢到正式项目目录:
+
+```text
+/Users/ar/Projects/PrivateVoice
+```
+
+本次只做无破坏收拢:
+
+- 不删除旧目录。
+- 不移动旧 worktree。
+- 不覆盖已有文件。
+- 不改变最新冻结源码 tag。
+
+## 正式目录
+
+| 项目 | 值 |
+|---|---|
+| 正式目录 | `/Users/ar/Projects/PrivateVoice` |
+| 分支 | `codex/privatevoice-freeze-2.1.25` |
+| 当前 HEAD | `5de2a0495c233e6f12ae1ebb6e71cb6c73fbbc72` |
+| 最新源码 tag | `v2.1.25-build20260603.2102` |
+| 最新源码 tag 指向 | `a149d7b7bbbcc330b12ef0aa6b3d07d8ddaa860e` |
+
+说明:`a149d7b` 是生成 `2.1.25 build 20260603.2102` 的源码 commit;`5de2a04` 是随后记录 release manifest 的资料 commit。
+
+## 已收拢目录
+
+### 项目资料
+
+Round 资料已统一放回:
+
+```text
+/Users/ar/Projects/PrivateVoice/02-P-NBL
+```
+
+当前包含:
+
+- `round-1`
+- `round-2`
+- `round-3`
+- `round-4`
+- `round-5`
+- 总体 `product-plan.md`
+- 总体 `engineering-plan.md`
+- 总体 `plan.md`
+
+补充收拢内容:
+
+- Round 1 最终 QA 报告:`02-P-NBL/round-1/qa-report-20260602-2.1.19.md`
+- Round 1 QA runtime 日志。
+- Round 2 QA runtime 日志。
+
+未收拢内容:
+
+- `QA-backups/` 用户环境备份目录未复制,避免把真实用户数据备份混入正式项目资料。
+
+### Release 产物
+
+构建产物已统一放回:
+
+```text
+/Users/ar/Projects/PrivateVoice/Release
+```
+
+当前 Release 目录包含:
+
+- 13 份 `SHA256SUMS.txt`
+- 27 份 `.dmg`
+- 当前主线候选包:`PrivateVoice-Dictation-2.1.25-build20260603.2102`
+- 历史主线包:`2.1.18` 到 `2.1.23`
+- 旧版归档:`Release/X-旧版build成果`
+
+没有收拢的原目录杂项:
+
+- `/Users/ar/Projects/VoiceSnap-2.1.1/Release/Github`
+- `/Users/ar/Projects/VoiceSnap-2.1.1/Release/PrivateVoice私语输入.md`
+
+原因:上述内容不是标准 build 目录,未纳入本次冻结前构建产物收拢。
+
+## 校验结果
+
+已执行:
+
+```bash
+find Release -name SHA256SUMS.txt -print0 | sort -z | while IFS= read -r -d '' f; do
+  d=$(dirname "$f")
+  (cd "$d" && shasum -a 256 -c SHA256SUMS.txt)
+done
+```
+
+结果:
+
+- `2.1.18` 到 `2.1.25` 已有 SHA256 记录的 DMG:全部 `OK`。
+- 旧版归档中已有 SHA256 记录的 DMG:全部 `OK`。
+
+修正项:
+
+- `Release/PrivateVoice-Input-2.1.23-build20260603.1904/SHA256SUMS.txt` 原本记录了带 `Release/...` 前缀的路径,已改为目录内文件名,便于统一执行 `shasum -c`。
+
+## 临时 worktree 处理策略
+
+以下旧目录暂不删除:
+
+```text
+/Users/ar/Projects/VoiceSnap-2.1.1
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2
+/Users/ar/Projects/VoiceSnap-2.1.1-Round3
+/Users/ar/Projects/VoiceSnap-2.1.1-Round4
+/Users/ar/Projects/VoiceSnap-2.1.1-Round5
+```
+
+原因:
+
+- 它们是 git worktree,不是普通临时目录。
+- 部分目录仍有未提交或未跟踪资料。
+- 今晚冻结和上架前,优先保证正式目录完整可用,不做删除类操作。
+
+后续建议:
+
+1. 先完成 `/Users/ar/Projects/PrivateVoice` 的版本冻结和上架资料准备。
+2. 冻结确认后,再按 `git worktree remove` 流程清理旧 worktree。
+3. 清理前再次确认旧目录内没有未收拢资料。
+
+## 当前结论
+
+`/Users/ar/Projects/PrivateVoice` 已成为后续工作的正式目录。
+
+今晚继续冻结、上架资料准备、正式包整理,都应在该目录进行。
diff --git a/02-P-NBL/round-1/logs/qa-runtime/app-log-tail-20260602.log b/02-P-NBL/round-1/logs/qa-runtime/app-log-tail-20260602.log
new file mode 100644
index 0000000..2bf78fe
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/app-log-tail-20260602.log
@@ -0,0 +1,260 @@
+[2026-06-02 21:57:00] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 21:57:00] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 21:57:00] INFO Hotkey released: key=R-Alt mode=hold duration=2942ms recording=true combination=false
+[2026-06-02 21:57:00] INFO Stopping audio device
+[2026-06-02 21:57:00] INFO Recording stopped, 44000 samples captured
+[2026-06-02 21:57:00] INFO Audio device stopped
+[2026-06-02 21:57:00] INFO Audio device uninitialized
+[2026-06-02 21:57:00] INFO Recognized: 比如人家 Kmy 现在要钱了。
+[2026-06-02 21:57:55] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=695 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.024s tapStarted=true
+[2026-06-02 21:57:55] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 21:57:55] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 21:57:55] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 21:57:55] INFO Hotkey action: start hold-to-talk after 207ms
+[2026-06-02 21:57:55] INFO Recording started
+[2026-06-02 21:57:55] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 21:57:58] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=696 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.025s tapStarted=true
+[2026-06-02 21:57:58] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 21:57:58] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 21:57:58] INFO Hotkey released: key=R-Alt mode=hold duration=2729ms recording=true combination=false
+[2026-06-02 21:57:58] INFO Stopping audio device
+[2026-06-02 21:57:58] INFO Recording stopped, 40000 samples captured
+[2026-06-02 21:57:58] INFO Audio device stopped
+[2026-06-02 21:57:58] INFO Audio device uninitialized
+[2026-06-02 21:57:58] INFO Recognized: 这玩意是破解解净了的。
+[2026-06-02 21:59:00] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=697 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.025s tapStarted=true
+[2026-06-02 21:59:00] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 21:59:00] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 21:59:00] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 21:59:01] INFO Hotkey action: start hold-to-talk after 207ms
+[2026-06-02 21:59:01] INFO Recording started
+[2026-06-02 21:59:01] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 21:59:05] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=698 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.010s tapStarted=true
+[2026-06-02 21:59:05] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 21:59:05] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 21:59:05] INFO Hotkey released: key=R-Alt mode=hold duration=4317ms recording=true combination=false
+[2026-06-02 21:59:05] INFO Stopping audio device
+[2026-06-02 21:59:05] INFO Recording stopped, 65600 samples captured
+[2026-06-02 21:59:05] INFO Audio device stopped
+[2026-06-02 21:59:05] INFO Audio device uninitialized
+[2026-06-02 21:59:05] INFO Recognized: 我想做一个终极个人知识管理神器。
+[2026-06-02 21:59:08] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=699 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.021s tapStarted=true
+[2026-06-02 21:59:08] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 21:59:08] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 21:59:08] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 21:59:08] INFO Hotkey action: start hold-to-talk after 181ms
+[2026-06-02 21:59:08] INFO Recording started
+[2026-06-02 21:59:08] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 21:59:11] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=700 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.029s tapStarted=true
+[2026-06-02 21:59:11] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 21:59:11] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 21:59:11] INFO Hotkey released: key=R-Alt mode=hold duration=3540ms recording=true combination=false
+[2026-06-02 21:59:11] INFO Stopping audio device
+[2026-06-02 21:59:11] INFO Recording stopped, 53600 samples captured
+[2026-06-02 21:59:11] INFO Audio device stopped
+[2026-06-02 21:59:11] INFO Audio device uninitialized
+[2026-06-02 21:59:11] INFO Recognized: 你觉得我起一个什么样的英文名字比较好?
+[2026-06-02 22:01:02] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=701 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.014s tapStarted=true
+[2026-06-02 22:01:02] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:01:02] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:01:02] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 22:01:02] INFO Hotkey action: start hold-to-talk after 203ms
+[2026-06-02 22:01:02] INFO Recording started
+[2026-06-02 22:01:03] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 22:01:10] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=702 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.028s tapStarted=true
+[2026-06-02 22:01:10] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:01:10] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:01:10] INFO Hotkey released: key=R-Alt mode=hold duration=7613ms recording=true combination=false
+[2026-06-02 22:01:10] INFO Stopping audio device
+[2026-06-02 22:01:10] INFO Recording stopped, 116800 samples captured
+[2026-06-02 22:01:10] INFO Audio device stopped
+[2026-06-02 22:01:10] INFO Audio device uninitialized
+[2026-06-02 22:01:11] INFO Recognized: 你有了这个你就知道,其实你很多常规的问题不用去在网上找 AI。
+[2026-06-02 22:01:12] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=703 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.027s tapStarted=true
+[2026-06-02 22:01:12] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:01:12] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:01:12] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 22:01:12] INFO Hotkey action: start hold-to-talk after 209ms
+[2026-06-02 22:01:12] INFO Recording started
+[2026-06-02 22:01:12] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 22:01:15] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=704 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.023s tapStarted=true
+[2026-06-02 22:01:15] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:01:15] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:01:15] INFO Hotkey released: key=R-Alt mode=hold duration=2549ms recording=true combination=false
+[2026-06-02 22:01:15] INFO Stopping audio device
+[2026-06-02 22:01:15] INFO Recording stopped, 36800 samples captured
+[2026-06-02 22:01:15] INFO Audio device stopped
+[2026-06-02 22:01:15] INFO Audio device uninitialized
+[2026-06-02 22:01:15] INFO Recognized: 现在慢慢的人家很多都收费了。
+[2026-06-02 22:01:22] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=705 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.008s tapStarted=true
+[2026-06-02 22:01:22] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:01:22] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:01:22] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 22:01:22] INFO Hotkey action: start hold-to-talk after 209ms
+[2026-06-02 22:01:22] INFO Recording started
+[2026-06-02 22:01:22] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 22:01:25] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=706 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.015s tapStarted=true
+[2026-06-02 22:01:25] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:01:25] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:01:25] INFO Hotkey released: key=R-Alt mode=hold duration=3570ms recording=true combination=false
+[2026-06-02 22:01:25] INFO Recording stopped, 52800 samples captured
+[2026-06-02 22:01:25] INFO Stopping audio device
+[2026-06-02 22:01:26] INFO Audio device stopped
+[2026-06-02 22:01:26] INFO Audio device uninitialized
+[2026-06-02 22:01:26] INFO Recognized: 让他给我起名字,他就给我各种思路。
+[2026-06-02 22:03:19] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=707 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.013s tapStarted=true
+[2026-06-02 22:03:19] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:03:19] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:03:19] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 22:03:19] INFO Hotkey action: start hold-to-talk after 202ms
+[2026-06-02 22:03:19] INFO Recording started
+[2026-06-02 22:03:19] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 22:03:20] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=708 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.004s tapStarted=true
+[2026-06-02 22:03:20] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:03:20] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:03:20] INFO Hotkey released: key=R-Alt mode=hold duration=1492ms recording=true combination=false
+[2026-06-02 22:03:20] INFO Recording stopped, 19200 samples captured
+[2026-06-02 22:03:20] INFO Stopping audio device
+[2026-06-02 22:03:20] INFO Audio device stopped
+[2026-06-02 22:03:20] INFO Audio device uninitialized
+[2026-06-02 22:03:21] INFO Recognized: 我可以配合你。
+[2026-06-02 22:03:22] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=709 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.014s tapStarted=true
+[2026-06-02 22:03:22] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:03:22] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:03:22] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 22:03:23] INFO Hotkey action: start hold-to-talk after 210ms
+[2026-06-02 22:03:23] INFO Recording started
+[2026-06-02 22:03:23] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 22:03:33] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=710 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.006s tapStarted=true
+[2026-06-02 22:03:33] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:03:33] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:03:33] INFO Hotkey released: key=R-Alt mode=hold duration=10445ms recording=true combination=false
+[2026-06-02 22:03:33] INFO Stopping audio device
+[2026-06-02 22:03:33] INFO Recording stopped, 163200 samples captured
+[2026-06-02 22:03:33] INFO Audio device stopped
+[2026-06-02 22:03:33] INFO Audio device uninitialized
+[2026-06-02 22:03:33] INFO Recognized: 需要第一步,我先把我本地已经安装好的旧版的 private voice 先删除掉吗?
+[2026-06-02 22:05:41] INFO Cleaning up...
+[2026-06-02 22:05:41] INFO Cleanup complete
+[2026-06-02 22:06:17] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Applications/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-02 22:06:17] INFO Accessibility permission granted
+[2026-06-02 22:06:17] INFO Keyboard event tap started; attempts=1 failures=0 disabled=0
+[2026-06-02 22:06:17] INFO Application initialized, starting Wails
+[2026-06-02 22:06:17] INFO Initializing ASR engine...
+[2026-06-02 22:06:17] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice
+[2026-06-02 22:06:17] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:06:17] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=false recording=false freetalk=false engineReady=false recordingHotkey=false
+[2026-06-02 22:06:20] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-02 22:06:20] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-02 22:08:35] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=1 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.008s tapStarted=true
+[2026-06-02 22:08:35] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:08:35] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:08:35] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 22:08:35] INFO Hotkey action: start hold-to-talk after 209ms
+[2026-06-02 22:08:35] INFO Recording started
+[2026-06-02 22:08:35] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 22:08:36] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=2 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.019s tapStarted=true
+[2026-06-02 22:08:36] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:08:36] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:08:36] INFO Hotkey released: key=R-Alt mode=hold duration=1139ms recording=true combination=false
+[2026-06-02 22:08:36] INFO Stopping audio device
+[2026-06-02 22:08:36] INFO Recording stopped, 14400 samples captured
+[2026-06-02 22:08:36] INFO Audio device stopped
+[2026-06-02 22:08:36] INFO Audio device uninitialized
+[2026-06-02 22:08:36] INFO Recognized: 说完了。
+[2026-06-02 22:09:57] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=3 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.021s tapStarted=true
+[2026-06-02 22:09:57] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:09:57] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:09:57] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 22:09:57] INFO Hotkey action: start hold-to-talk after 209ms
+[2026-06-02 22:09:57] INFO Recording started
+[2026-06-02 22:09:57] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 22:09:58] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=4 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.001s tapStarted=true
+[2026-06-02 22:09:58] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:09:58] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:09:58] INFO Hotkey released: key=R-Alt mode=hold duration=1408ms recording=true combination=false
+[2026-06-02 22:09:58] INFO Recording stopped, 19200 samples captured
+[2026-06-02 22:09:58] INFO Stopping audio device
+[2026-06-02 22:09:58] INFO Audio device stopped
+[2026-06-02 22:09:58] INFO Audio device uninitialized
+[2026-06-02 22:09:58] INFO Recognized: 说完了。
+[2026-06-02 22:11:54] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=5 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.017s tapStarted=true
+[2026-06-02 22:11:54] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:11:54] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:11:54] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 22:11:54] INFO Hotkey action: start hold-to-talk after 180ms
+[2026-06-02 22:11:54] INFO Recording started
+[2026-06-02 22:11:54] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 22:12:01] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=6 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.003s tapStarted=true
+[2026-06-02 22:12:01] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:12:01] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:12:01] INFO Hotkey released: key=R-Alt mode=hold duration=7410ms recording=true combination=false
+[2026-06-02 22:12:01] INFO Stopping audio device
+[2026-06-02 22:12:01] INFO Recording stopped, 115200 samples captured
+[2026-06-02 22:12:01] INFO Audio device stopped
+[2026-06-02 22:12:01] INFO Audio device uninitialized
+[2026-06-02 22:12:02] INFO Recognized: 你如果发现他有些个别词语识别错了,你就可以把这个表导出编辑一次。
+[2026-06-02 22:12:03] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=7 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.014s tapStarted=true
+[2026-06-02 22:12:03] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:12:03] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:12:03] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 22:12:03] INFO Hotkey action: start hold-to-talk after 180ms
+[2026-06-02 22:12:03] INFO Recording started
+[2026-06-02 22:12:03] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 22:12:07] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=8 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.007s tapStarted=true
+[2026-06-02 22:12:07] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:12:07] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:12:07] INFO Hotkey released: key=R-Alt mode=hold duration=3629ms recording=true combination=false
+[2026-06-02 22:12:07] INFO Stopping audio device
+[2026-06-02 22:12:07] INFO Recording stopped, 55200 samples captured
+[2026-06-02 22:12:07] INFO Audio device stopped
+[2026-06-02 22:12:07] INFO Audio device uninitialized
+[2026-06-02 22:12:07] INFO Recognized: 然后再导入回来以后就不会错了。
+[2026-06-02 22:12:09] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=9 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.028s tapStarted=true
+[2026-06-02 22:12:09] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:12:09] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:12:09] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 22:12:09] INFO Hotkey action: start hold-to-talk after 180ms
+[2026-06-02 22:12:09] INFO Recording started
+[2026-06-02 22:12:09] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 22:12:15] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=10 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.020s tapStarted=true
+[2026-06-02 22:12:15] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:12:15] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:12:15] INFO Hotkey released: key=R-Alt mode=hold duration=6120ms recording=true combination=false
+[2026-06-02 22:12:15] INFO Stopping audio device
+[2026-06-02 22:12:15] INFO Recording stopped, 94400 samples captured
+[2026-06-02 22:12:15] INFO Audio device stopped
+[2026-06-02 22:12:15] INFO Audio device uninitialized
+[2026-06-02 22:12:15] INFO Recognized: 这样持续个一周,这个输入法就非常非常好用了,就完全适应你。
+[2026-06-02 22:12:19] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=11 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.002s tapStarted=true
+[2026-06-02 22:12:19] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:12:19] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:12:19] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 22:12:19] INFO Hotkey action: start hold-to-talk after 180ms
+[2026-06-02 22:12:19] INFO Recording started
+[2026-06-02 22:12:19] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 22:12:21] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=12 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.026s tapStarted=true
+[2026-06-02 22:12:21] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:12:21] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:12:21] INFO Hotkey released: key=R-Alt mode=hold duration=2340ms recording=true combination=false
+[2026-06-02 22:12:21] INFO Stopping audio device
+[2026-06-02 22:12:21] INFO Recording stopped, 34400 samples captured
+[2026-06-02 22:12:21] INFO Audio device stopped
+[2026-06-02 22:12:21] INFO Audio device uninitialized
+[2026-06-02 22:12:21] INFO Recognized: 你可以一天来编辑一次。
+[2026-06-02 22:12:35] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=13 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.009s tapStarted=true
+[2026-06-02 22:12:35] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:12:35] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:12:35] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 22:12:35] INFO Hotkey action: start hold-to-talk after 209ms
+[2026-06-02 22:12:35] INFO Recording started
+[2026-06-02 22:12:35] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 22:12:37] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=14 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.017s tapStarted=true
+[2026-06-02 22:12:37] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:12:37] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:12:37] INFO Hotkey released: key=R-Alt mode=hold duration=2459ms recording=true combination=false
+[2026-06-02 22:12:37] INFO Stopping audio device
+[2026-06-02 22:12:37] INFO Recording stopped, 35200 samples captured
+[2026-06-02 22:12:37] INFO Audio device stopped
+[2026-06-02 22:12:37] INFO Audio device uninitialized
+[2026-06-02 22:12:38] INFO Recognized: 临时想改个词在这来改。
diff --git a/02-P-NBL/round-1/logs/qa-runtime/network-sample-20260602.log b/02-P-NBL/round-1/logs/qa-runtime/network-sample-20260602.log
new file mode 100644
index 0000000..47958b4
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/network-sample-20260602.log
@@ -0,0 +1,31 @@
+PID=24890
+--- sample 1 22:09:47
+--- sample 2 22:09:48
+--- sample 3 22:09:49
+--- sample 4 22:09:50
+--- sample 5 22:09:51
+--- sample 6 22:09:52
+--- sample 7 22:09:53
+--- sample 8 22:09:54
+--- sample 9 22:09:55
+--- sample 10 22:09:57
+--- sample 11 22:09:58
+--- sample 12 22:09:59
+--- sample 13 22:10:00
+--- sample 14 22:10:01
+--- sample 15 22:10:02
+--- sample 16 22:10:03
+--- sample 17 22:10:04
+--- sample 18 22:10:05
+--- sample 19 22:10:06
+--- sample 20 22:10:07
+--- sample 21 22:10:08
+--- sample 22 22:10:09
+--- sample 23 22:10:10
+--- sample 24 22:10:11
+--- sample 25 22:10:12
+--- sample 26 22:10:13
+--- sample 27 22:10:14
+--- sample 28 22:10:15
+--- sample 29 22:10:16
+--- sample 30 22:10:17
diff --git a/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.launch.log b/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.launch.log
new file mode 100644
index 0000000..dd70282
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.launch.log
@@ -0,0 +1,55 @@
+captured_at=2026-06-02 23:19:37 +0800
+pid=44234 
+app_data_exists=yes
+app_data_size=228M	/Users/ar/Library/Application Support/PrivateVoice Input
+file_tree
+app.log
+config.json
+models/sensevoice-zh/model.int8.onnx
+models/sensevoice-zh/tokens.txt
+models/state.json
+userdict.json
+config
+{
+  "HotkeyVK": 165,
+  "HotkeyMode": "hold",
+  "AutoHide": true,
+  "SoundFeedback": true,
+  "HideDockIcon": true,
+  "CopyToClipboard": true,
+  "SelectedModelID": "sensevoice-zh",
+  "ModelDownloadUrl": "http://www.maikami.com/voicesnap/sensevoice.zip",
+  "FallbackModelDownloadUrl": "https://modelscope.cn/models/sherpa-onnx/sherpa-onnx-sense-voice-zh-en-ja-ko-yue/resolve/master/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2024-07-17.tar.bz2"
+}
+userdict
+{
+  "version": null,
+  "replacementCount": 0,
+  "entries": null
+}
+history
+model_files
+models/sensevoice-zh/model.int8.onnx
+models/sensevoice-zh/tokens.txt
+models/state.json
+process
+44234 Tue Jun  2 23:19:19 2026     /Applications/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input
+network_sockets
+COMMAND     PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
+PrivateVo 44234   ar   12u  IPv4 0xad0ca3d0f8b91a07      0t0  TCP 198.18.0.1:52287->198.18.10.233:80 (ESTABLISHED)
+app_log_tail
+[2026-06-02 23:19:19] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Applications/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-02 23:19:19] INFO Accessibility permission granted
+[2026-06-02 23:19:19] INFO Keyboard event tap started; attempts=1 failures=0 disabled=0
+[2026-06-02 23:19:19] INFO Application initialized, starting Wails
+[2026-06-02 23:19:19] INFO Initializing ASR engine...
+[2026-06-02 23:19:19] ERROR Engine initialization failed: model sensevoice-zh is not usable: not_installed missing=[/Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice] problems=[]
+[2026-06-02 23:19:19] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 23:19:19] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=false recording=false freetalk=false engineReady=false recordingHotkey=false
+[2026-06-02 23:19:19] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip
+[2026-06-02 23:19:27] INFO Extracting model archive...
+[2026-06-02 23:19:27] INFO Model download and extraction complete
+[2026-06-02 23:19:27] INFO Initializing ASR engine...
+[2026-06-02 23:19:27] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice-zh
+[2026-06-02 23:19:30] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-02 23:19:30] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
diff --git a/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.recognition.log b/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.recognition.log
new file mode 100644
index 0000000..1ea3350
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.recognition.log
@@ -0,0 +1,49 @@
+recognition_poll_started=2026-06-02 23:20:16 +0800
+[2026-06-02 23:20:16 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:18 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:20 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:22 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:24 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:27 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:29 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:31 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:33 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:35 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:37 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:39 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:41 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:43 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:45 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:47 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:49 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:51 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:53 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:55 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:57 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:20:59 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:21:01 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:21:03 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:21:05 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:21:07 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:21:09 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:21:11 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:21:13 +0800] history=[no_history] last_recognized=[]
+[2026-06-02 23:21:15 +0800] history=[no_history] last_recognized=[]
+recognition_poll_finished=2026-06-02 23:21:17 +0800
+latest_history
+app_log_tail
+[2026-06-02 23:19:19] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Applications/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-02 23:19:19] INFO Accessibility permission granted
+[2026-06-02 23:19:19] INFO Keyboard event tap started; attempts=1 failures=0 disabled=0
+[2026-06-02 23:19:19] INFO Application initialized, starting Wails
+[2026-06-02 23:19:19] INFO Initializing ASR engine...
+[2026-06-02 23:19:19] ERROR Engine initialization failed: model sensevoice-zh is not usable: not_installed missing=[/Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice] problems=[]
+[2026-06-02 23:19:19] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 23:19:19] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=false recording=false freetalk=false engineReady=false recordingHotkey=false
+[2026-06-02 23:19:19] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip
+[2026-06-02 23:19:27] INFO Extracting model archive...
+[2026-06-02 23:19:27] INFO Model download and extraction complete
+[2026-06-02 23:19:27] INFO Initializing ASR engine...
+[2026-06-02 23:19:27] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice-zh
+[2026-06-02 23:19:30] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-02 23:19:30] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
diff --git a/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.restore.log b/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.restore.log
new file mode 100644
index 0000000..11e3daa
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.restore.log
@@ -0,0 +1,72 @@
+restore_started=2026-06-02 23:21:47 +0800
+current_pid=44234 
+new_user_size_before_restore=228M	/Users/ar/Library/Application Support/PrivateVoice Input
+restore_finished=2026-06-02 23:22:04 +0800
+restored_pid=44895 
+restored_size=235M	/Users/ar/Library/Application Support/PrivateVoice Input
+restored_history=1667 | 为什么他说能够支持 50 加的语言?我记得我们的 sense voice 只能支持好像四五种语言。
+restored_replacements=149
+restored_model_files
+models/sensevoice/model.int8.onnx
+models/sensevoice/tokens.txt
+restored_log_tail
+[2026-06-02 23:00:56] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=5 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.009s tapStarted=true
+[2026-06-02 23:00:56] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 23:00:56] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 23:00:56] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 23:00:56] INFO Hotkey action: start hold-to-talk after 209ms
+[2026-06-02 23:00:56] INFO Recording started
+[2026-06-02 23:00:56] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 23:00:59] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=6 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.019s tapStarted=true
+[2026-06-02 23:00:59] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 23:00:59] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 23:00:59] INFO Hotkey released: key=R-Alt mode=hold duration=3569ms recording=true combination=false
+[2026-06-02 23:00:59] INFO Recording stopped, 53600 samples captured
+[2026-06-02 23:00:59] INFO Stopping audio device
+[2026-06-02 23:00:59] INFO Audio device stopped
+[2026-06-02 23:00:59] INFO Audio device uninitialized
+[2026-06-02 23:00:59] INFO Recognized: 这篇文章所说的 s voice。
+[2026-06-02 23:01:08] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=7 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.007s tapStarted=true
+[2026-06-02 23:01:08] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 23:01:08] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 23:01:08] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 23:01:09] INFO Hotkey action: start hold-to-talk after 209ms
+[2026-06-02 23:01:09] INFO Recording started
+[2026-06-02 23:01:09] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 23:01:15] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=8 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.015s tapStarted=true
+[2026-06-02 23:01:15] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 23:01:15] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 23:01:15] INFO Hotkey released: key=R-Alt mode=hold duration=6599ms recording=true combination=false
+[2026-06-02 23:01:15] INFO Stopping audio device
+[2026-06-02 23:01:15] INFO Recording stopped, 101600 samples captured
+[2026-06-02 23:01:15] INFO Audio device stopped
+[2026-06-02 23:01:15] INFO Audio device uninitialized
+[2026-06-02 23:01:15] INFO Recognized: 这篇文章所说的放 R 和我们现在用的 s word 是什么关系?
+[2026-06-02 23:01:34] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=9 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.027s tapStarted=true
+[2026-06-02 23:01:34] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 23:01:34] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 23:01:34] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 23:01:34] INFO Hotkey action: start hold-to-talk after 209ms
+[2026-06-02 23:01:34] INFO Recording started
+[2026-06-02 23:01:34] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 23:01:46] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=10 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.023s tapStarted=true
+[2026-06-02 23:01:46] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 23:01:46] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 23:01:46] INFO Hotkey released: key=R-Alt mode=hold duration=12180ms recording=true combination=false
+[2026-06-02 23:01:46] INFO Stopping audio device
+[2026-06-02 23:01:46] INFO Recording stopped, 191200 samples captured
+[2026-06-02 23:01:46] INFO Audio device stopped
+[2026-06-02 23:01:46] INFO Audio device uninitialized
+[2026-06-02 23:01:46] INFO Recognized: 为什么他说能够支持 50 加的语言?我记得我们的 sense voice 只能支持好像四五种语言。
+[2026-06-02 23:18:52] INFO Cleaning up...
+[2026-06-02 23:18:52] INFO Cleanup complete
+[2026-06-02 23:21:52] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Applications/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-02 23:21:52] INFO Accessibility permission granted
+[2026-06-02 23:21:52] INFO Keyboard event tap started; attempts=1 failures=0 disabled=0
+[2026-06-02 23:21:52] INFO Application initialized, starting Wails
+[2026-06-02 23:21:52] INFO Initializing ASR engine...
+[2026-06-02 23:21:52] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice
+[2026-06-02 23:21:52] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 23:21:52] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=false recording=false freetalk=false engineReady=false recordingHotkey=false
+[2026-06-02 23:21:55] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-02 23:21:55] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
diff --git a/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.setup.log b/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.setup.log
new file mode 100644
index 0000000..6b990cb
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.setup.log
@@ -0,0 +1,5 @@
+run_id=20260602.231851
+backup_dir=/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/pre-new-user-clean-install-20260602.231851
+hold_dir=/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/original-userdata-held-for-new-user-20260602.231851
+app_data_exists_after_move=no
+held_size=235M	/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/original-userdata-held-for-new-user-20260602.231851/PrivateVoice Input
diff --git a/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.launch.log b/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.launch.log
new file mode 100644
index 0000000..70a67e3
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.launch.log
@@ -0,0 +1,63 @@
+launch_poll_started=2026-06-03 00:51:42 +0800
+[2026-06-03 00:51:42 +0800] pid=[55832 ] ready=[]
+[2026-06-03 00:51:44 +0800] pid=[55832 ] ready=[]
+[2026-06-03 00:51:42] ERROR Engine initialization failed: model sensevoice-zh is not usable: not_installed missing=[/Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice] problems=[]
+[2026-06-03 00:51:43] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip
+[2026-06-03 00:51:46 +0800] pid=[55832 ] ready=[]
+[2026-06-03 00:51:42] ERROR Engine initialization failed: model sensevoice-zh is not usable: not_installed missing=[/Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice] problems=[]
+[2026-06-03 00:51:43] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip
+[2026-06-03 00:51:48 +0800] pid=[55832 ] ready=[]
+[2026-06-03 00:51:42] ERROR Engine initialization failed: model sensevoice-zh is not usable: not_installed missing=[/Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice] problems=[]
+[2026-06-03 00:51:43] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip
+[2026-06-03 00:51:50 +0800] pid=[55832 ] ready=[]
+[2026-06-03 00:51:42] ERROR Engine initialization failed: model sensevoice-zh is not usable: not_installed missing=[/Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice] problems=[]
+[2026-06-03 00:51:43] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip
+[2026-06-03 00:51:50] INFO Extracting model archive...
+[2026-06-03 00:51:52 +0800] pid=[55832 ] ready=[]
+[2026-06-03 00:51:42] ERROR Engine initialization failed: model sensevoice-zh is not usable: not_installed missing=[/Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice] problems=[]
+[2026-06-03 00:51:43] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip
+[2026-06-03 00:51:50] INFO Extracting model archive...
+[2026-06-03 00:51:51] INFO Model download and extraction complete
+[2026-06-03 00:51:51] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice-zh
+[2026-06-03 00:51:54 +0800] pid=[55832 ] ready=[[2026-06-03 00:51:53] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)]
+[2026-06-03 00:51:42] ERROR Engine initialization failed: model sensevoice-zh is not usable: not_installed missing=[/Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice] problems=[]
+[2026-06-03 00:51:43] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip
+[2026-06-03 00:51:50] INFO Extracting model archive...
+[2026-06-03 00:51:51] INFO Model download and extraction complete
+[2026-06-03 00:51:51] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice-zh
+launch_poll_finished=2026-06-03 00:51:54 +0800
+new_user_tree
+app.log
+config.json
+models/sensevoice-zh/model.int8.onnx
+models/sensevoice-zh/tokens.txt
+models/state.json
+userdict.json
+new_user_config
+{
+  "HotkeyVK": 165,
+  "HotkeyMode": "hold",
+  "AutoHide": true,
+  "SoundFeedback": true,
+  "HideDockIcon": true,
+  "CopyToClipboard": true,
+  "SelectedModelID": "sensevoice-zh",
+  "ModelDownloadUrl": "http://www.maikami.com/voicesnap/sensevoice.zip",
+  "FallbackModelDownloadUrl": "https://modelscope.cn/models/sherpa-onnx/sherpa-onnx-sense-voice-zh-en-ja-ko-yue/resolve/master/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2024-07-17.tar.bz2"
+}
+app_log_tail
+[2026-06-03 00:51:42] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Applications/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-03 00:51:42] INFO Accessibility permission granted
+[2026-06-03 00:51:42] INFO Keyboard event tap started; attempts=1 failures=0 disabled=0
+[2026-06-03 00:51:42] INFO Application initialized, starting Wails
+[2026-06-03 00:51:42] INFO Initializing ASR engine...
+[2026-06-03 00:51:42] ERROR Engine initialization failed: model sensevoice-zh is not usable: not_installed missing=[/Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice] problems=[]
+[2026-06-03 00:51:42] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-03 00:51:42] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=false recording=false freetalk=false engineReady=false recordingHotkey=false
+[2026-06-03 00:51:43] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip
+[2026-06-03 00:51:50] INFO Extracting model archive...
+[2026-06-03 00:51:51] INFO Model download and extraction complete
+[2026-06-03 00:51:51] INFO Initializing ASR engine...
+[2026-06-03 00:51:51] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice-zh
+[2026-06-03 00:51:53] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 00:51:53] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
diff --git a/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.recognition.log b/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.recognition.log
new file mode 100644
index 0000000..1c6ef05
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.recognition.log
@@ -0,0 +1,191 @@
+recognition_poll_started=2026-06-03 00:52:08 +0800
+[2026-06-03 00:52:08 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:10 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:13 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:15 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:17 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:19 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:21 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:23 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:25 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:27 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:29 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:31 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:33 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:35 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:37 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:39 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:41 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:43 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:45 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:47 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:49 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:51 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:53 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:55 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:57 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:52:59 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:01 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:03 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:05 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:07 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:10 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:12 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:14 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:16 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:18 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:20 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:22 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:24 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:26 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:28 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:30 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:32 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:34 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:36 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:38 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:40 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:42 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:44 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:46 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:48 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:50 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:52 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:54 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:56 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:53:58 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:00 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:02 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:04 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:06 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:09 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:11 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:13 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:15 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:17 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:19 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:21 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:23 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:25 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:27 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:29 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:31 +0800] pid=[55832 ] history=[no_history] last_recognized=[]
+[2026-06-03 00:54:33 +0800] pid=[55832 ] history=[1 | 我上次在 getthub 上,然后把我的软件的 help 文档都上传到这里了。我现在需要更新一下。] last_recognized=[[2026-06-03 00:54:33] INFO Recognized: 我上次在 getthub 上,然后把我的软件的 help 文档都上传到这里了。我现在需要更新一下。]
+[2026-06-03 00:54:35 +0800] pid=[55832 ] history=[1 | 我上次在 getthub 上,然后把我的软件的 help 文档都上传到这里了。我现在需要更新一下。] last_recognized=[[2026-06-03 00:54:33] INFO Recognized: 我上次在 getthub 上,然后把我的软件的 help 文档都上传到这里了。我现在需要更新一下。]
+[2026-06-03 00:54:37 +0800] pid=[55832 ] history=[2 | 我应该怎么操作呢?] last_recognized=[[2026-06-03 00:54:36] INFO Recognized: 我应该怎么操作呢?]
+[2026-06-03 00:54:39 +0800] pid=[55832 ] history=[2 | 我应该怎么操作呢?] last_recognized=[[2026-06-03 00:54:36] INFO Recognized: 我应该怎么操作呢?]
+[2026-06-03 00:54:41 +0800] pid=[55832 ] history=[2 | 我应该怎么操作呢?] last_recognized=[[2026-06-03 00:54:36] INFO Recognized: 我应该怎么操作呢?]
+[2026-06-03 00:54:43 +0800] pid=[55832 ] history=[2 | 我应该怎么操作呢?] last_recognized=[[2026-06-03 00:54:36] INFO Recognized: 我应该怎么操作呢?]
+[2026-06-03 00:54:45 +0800] pid=[55832 ] history=[2 | 我应该怎么操作呢?] last_recognized=[[2026-06-03 00:54:36] INFO Recognized: 我应该怎么操作呢?]
+[2026-06-03 00:54:47 +0800] pid=[55832 ] history=[3 | 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。] last_recognized=[[2026-06-03 00:54:45] INFO Recognized: 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。]
+[2026-06-03 00:54:49 +0800] pid=[55832 ] history=[3 | 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。] last_recognized=[[2026-06-03 00:54:45] INFO Recognized: 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。]
+[2026-06-03 00:54:51 +0800] pid=[55832 ] history=[3 | 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。] last_recognized=[[2026-06-03 00:54:45] INFO Recognized: 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。]
+[2026-06-03 00:54:53 +0800] pid=[55832 ] history=[3 | 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。] last_recognized=[[2026-06-03 00:54:45] INFO Recognized: 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。]
+[2026-06-03 00:54:55 +0800] pid=[55832 ] history=[3 | 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。] last_recognized=[[2026-06-03 00:54:45] INFO Recognized: 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。]
+[2026-06-03 00:54:57 +0800] pid=[55832 ] history=[3 | 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。] last_recognized=[[2026-06-03 00:54:45] INFO Recognized: 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。]
+[2026-06-03 00:54:59 +0800] pid=[55832 ] history=[3 | 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。] last_recognized=[[2026-06-03 00:54:45] INFO Recognized: 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。]
+[2026-06-03 00:55:01 +0800] pid=[55832 ] history=[3 | 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。] last_recognized=[[2026-06-03 00:54:45] INFO Recognized: 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。]
+[2026-06-03 00:55:03 +0800] pid=[55832 ] history=[3 | 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。] last_recognized=[[2026-06-03 00:54:45] INFO Recognized: 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。]
+[2026-06-03 00:55:05 +0800] pid=[55832 ] history=[4 | 我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。] last_recognized=[[2026-06-03 00:55:04] INFO Recognized: 我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。]
+[2026-06-03 00:55:07 +0800] pid=[55832 ] history=[4 | 我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。] last_recognized=[[2026-06-03 00:55:04] INFO Recognized: 我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。]
+[2026-06-03 00:55:10 +0800] pid=[55832 ] history=[4 | 我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。] last_recognized=[[2026-06-03 00:55:04] INFO Recognized: 我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。]
+recognition_poll_finished=2026-06-03 00:55:12 +0800
+latest_history
+[
+  {
+    "text": "我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。",
+    "timestamp": 1780419304742
+  },
+  {
+    "text": "另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。",
+    "timestamp": 1780419285808
+  },
+  {
+    "text": "我应该怎么操作呢?",
+    "timestamp": 1780419276832
+  },
+  {
+    "text": "我上次在 getthub 上,然后把我的软件的 help 文档都上传到这里了。我现在需要更新一下。",
+    "timestamp": 1780419273275
+  }
+]
+app_log_tail
+[2026-06-03 00:51:42] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Applications/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-03 00:51:42] INFO Accessibility permission granted
+[2026-06-03 00:51:42] INFO Keyboard event tap started; attempts=1 failures=0 disabled=0
+[2026-06-03 00:51:42] INFO Application initialized, starting Wails
+[2026-06-03 00:51:42] INFO Initializing ASR engine...
+[2026-06-03 00:51:42] ERROR Engine initialization failed: model sensevoice-zh is not usable: not_installed missing=[/Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice] problems=[]
+[2026-06-03 00:51:42] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-03 00:51:42] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=false recording=false freetalk=false engineReady=false recordingHotkey=false
+[2026-06-03 00:51:43] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip
+[2026-06-03 00:51:50] INFO Extracting model archive...
+[2026-06-03 00:51:51] INFO Model download and extraction complete
+[2026-06-03 00:51:51] INFO Initializing ASR engine...
+[2026-06-03 00:51:51] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice-zh
+[2026-06-03 00:51:53] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 00:51:53] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 00:54:23] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=1 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.007s tapStarted=true
+[2026-06-03 00:54:23] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-03 00:54:23] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:54:23] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-03 00:54:23] INFO Hotkey action: start hold-to-talk after 207ms
+[2026-06-03 00:54:23] INFO Recording started
+[2026-06-03 00:54:23] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-03 00:54:33] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=2 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.016s tapStarted=true
+[2026-06-03 00:54:33] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-03 00:54:33] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:54:33] INFO Hotkey released: key=R-Alt mode=hold duration=9447ms recording=true combination=false
+[2026-06-03 00:54:33] INFO Stopping audio device
+[2026-06-03 00:54:33] INFO Recording stopped, 147200 samples captured
+[2026-06-03 00:54:33] INFO Audio device stopped
+[2026-06-03 00:54:33] INFO Audio device uninitialized
+[2026-06-03 00:54:33] INFO Recognized: 我上次在 getthub 上,然后把我的软件的 help 文档都上传到这里了。我现在需要更新一下。
+[2026-06-03 00:54:35] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=3 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.005s tapStarted=true
+[2026-06-03 00:54:35] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-03 00:54:35] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:54:35] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-03 00:54:35] INFO Hotkey action: start hold-to-talk after 180ms
+[2026-06-03 00:54:35] INFO Recording started
+[2026-06-03 00:54:35] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-03 00:54:36] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=4 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.016s tapStarted=true
+[2026-06-03 00:54:36] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-03 00:54:36] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:54:36] INFO Hotkey released: key=R-Alt mode=hold duration=1739ms recording=true combination=false
+[2026-06-03 00:54:36] INFO Stopping audio device
+[2026-06-03 00:54:36] INFO Recording stopped, 24800 samples captured
+[2026-06-03 00:54:36] INFO Audio device stopped
+[2026-06-03 00:54:36] INFO Audio device uninitialized
+[2026-06-03 00:54:36] INFO Recognized: 我应该怎么操作呢?
+[2026-06-03 00:54:38] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=5 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.004s tapStarted=true
+[2026-06-03 00:54:38] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-03 00:54:38] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:54:38] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-03 00:54:38] INFO Hotkey action: start hold-to-talk after 209ms
+[2026-06-03 00:54:38] INFO Recording started
+[2026-06-03 00:54:38] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-03 00:54:45] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=6 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.018s tapStarted=true
+[2026-06-03 00:54:45] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-03 00:54:45] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:54:45] INFO Hotkey released: key=R-Alt mode=hold duration=7529ms recording=true combination=false
+[2026-06-03 00:54:45] INFO Stopping audio device
+[2026-06-03 00:54:45] INFO Recording stopped, 116800 samples captured
+[2026-06-03 00:54:45] INFO Audio device stopped
+[2026-06-03 00:54:45] INFO Audio device uninitialized
+[2026-06-03 00:54:45] INFO Recognized: 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。
+[2026-06-03 00:54:58] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=7 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.014s tapStarted=true
+[2026-06-03 00:54:58] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-03 00:54:58] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:54:58] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-03 00:54:59] INFO Hotkey action: start hold-to-talk after 180ms
+[2026-06-03 00:54:59] INFO Recording started
+[2026-06-03 00:54:59] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-03 00:55:04] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=8 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.004s tapStarted=true
+[2026-06-03 00:55:04] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-03 00:55:04] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:55:04] INFO Hotkey released: key=R-Alt mode=hold duration=5700ms recording=true combination=false
+[2026-06-03 00:55:04] INFO Stopping audio device
+[2026-06-03 00:55:04] INFO Recording stopped, 88000 samples captured
+[2026-06-03 00:55:04] INFO Audio device stopped
+[2026-06-03 00:55:04] INFO Audio device uninitialized
+[2026-06-03 00:55:04] INFO Recognized: 我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。
diff --git a/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.restore.log b/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.restore.log
new file mode 100644
index 0000000..24fae9e
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.restore.log
@@ -0,0 +1,93 @@
+restore_started=2026-06-03 00:55:35 +0800
+current_pid=55832 
+new_user_size_before_restore=228M	/Users/ar/Library/Application Support/PrivateVoice Input
+new_user_history_before_restore=4 | 我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。
+restore_finished=2026-06-03 00:55:54 +0800
+restored_pid=59134 
+restored_size=235M	/Users/ar/Library/Application Support/PrivateVoice Input
+restored_history=1676 | 这是本地目录。
+restored_replacements=149
+restored_model_files
+models/sensevoice/model.int8.onnx
+models/sensevoice/tokens.txt
+restored_log_tail
+[2026-06-03 00:49:16] INFO Recording stopped, 69600 samples captured
+[2026-06-03 00:49:16] INFO Audio device stopped
+[2026-06-03 00:49:16] INFO Audio device uninitialized
+[2026-06-03 00:49:16] INFO Recognized: 你告诉我一下你大概要怎么搞,把你的思路跟我说一下。
+[2026-06-03 00:49:58] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=11 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.011s tapStarted=true
+[2026-06-03 00:49:58] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-03 00:49:58] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:49:58] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-03 00:49:58] INFO Hotkey action: start hold-to-talk after 208ms
+[2026-06-03 00:49:58] INFO Recording started
+[2026-06-03 00:49:59] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-03 00:50:00] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=12 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.024s tapStarted=true
+[2026-06-03 00:50:00] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-03 00:50:00] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:50:00] INFO Hotkey released: key=R-Alt mode=hold duration=2159ms recording=true combination=false
+[2026-06-03 00:50:00] INFO Stopping audio device
+[2026-06-03 00:50:00] INFO Recording stopped, 30400 samples captured
+[2026-06-03 00:50:00] INFO Audio device stopped
+[2026-06-03 00:50:00] INFO Audio device uninitialized
+[2026-06-03 00:50:01] INFO Recognized: 认可你的思路。
+[2026-06-03 00:50:02] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=13 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.002s tapStarted=true
+[2026-06-03 00:50:02] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-03 00:50:02] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:50:02] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-03 00:50:02] INFO Hotkey action: start hold-to-talk after 209ms
+[2026-06-03 00:50:02] INFO Recording started
+[2026-06-03 00:50:02] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-03 00:50:04] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=14 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.010s tapStarted=true
+[2026-06-03 00:50:04] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-03 00:50:04] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:50:04] INFO Hotkey released: key=R-Alt mode=hold duration=2399ms recording=true combination=false
+[2026-06-03 00:50:04] INFO Stopping audio device
+[2026-06-03 00:50:04] INFO Recording stopped, 34400 samples captured
+[2026-06-03 00:50:04] INFO Audio device stopped
+[2026-06-03 00:50:04] INFO Audio device uninitialized
+[2026-06-03 00:50:04] INFO Recognized: 就按你说的去做吧。
+[2026-06-03 00:50:33] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=15 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.017s tapStarted=true
+[2026-06-03 00:50:33] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-03 00:50:33] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:50:33] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-03 00:50:33] INFO Hotkey action: start hold-to-talk after 209ms
+[2026-06-03 00:50:33] INFO Recording started
+[2026-06-03 00:50:34] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-03 00:50:39] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=16 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.017s tapStarted=true
+[2026-06-03 00:50:39] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-03 00:50:39] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:50:39] INFO Hotkey released: key=R-Alt mode=hold duration=5879ms recording=true combination=false
+[2026-06-03 00:50:39] INFO Stopping audio device
+[2026-06-03 00:50:39] INFO Recording stopped, 90400 samples captured
+[2026-06-03 00:50:39] INFO Audio device stopped
+[2026-06-03 00:50:39] INFO Audio device uninitialized
+[2026-06-03 00:50:39] INFO Recognized: 我刚才没在电脑旁边,现在我回来了,我们可以重新跑一下这个吗?
+[2026-06-03 00:51:23] INFO Cleaning up...
+[2026-06-03 00:51:23] INFO Cleanup complete
+[2026-06-03 00:55:40] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Applications/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-03 00:55:40] INFO Accessibility permission granted
+[2026-06-03 00:55:40] INFO Keyboard event tap started; attempts=1 failures=0 disabled=0
+[2026-06-03 00:55:40] INFO Application initialized, starting Wails
+[2026-06-03 00:55:40] INFO Initializing ASR engine...
+[2026-06-03 00:55:40] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice
+[2026-06-03 00:55:40] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-03 00:55:40] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=false recording=false freetalk=false engineReady=false recordingHotkey=false
+[2026-06-03 00:55:42] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 00:55:42] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 00:55:48] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=1 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.007s tapStarted=true
+[2026-06-03 00:55:48] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-03 00:55:48] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:55:48] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-03 00:55:48] INFO Hotkey action: start hold-to-talk after 180ms
+[2026-06-03 00:55:48] INFO Recording started
+[2026-06-03 00:55:48] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-03 00:55:50] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=2 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.003s tapStarted=true
+[2026-06-03 00:55:50] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-03 00:55:50] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-03 00:55:50] INFO Hotkey released: key=R-Alt mode=hold duration=1739ms recording=true combination=false
+[2026-06-03 00:55:50] INFO Stopping audio device
+[2026-06-03 00:55:50] INFO Recording stopped, 24800 samples captured
+[2026-06-03 00:55:50] INFO Audio device stopped
+[2026-06-03 00:55:50] INFO Audio device uninitialized
+[2026-06-03 00:55:50] INFO Recognized: 这是本地目录。
diff --git a/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.setup.log b/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.setup.log
new file mode 100644
index 0000000..90e704d
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.setup.log
@@ -0,0 +1,5 @@
+run_id=20260603.005122
+backup_dir=/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/pre-new-user-recognition-20260603.005122
+hold_dir=/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/original-userdata-held-for-new-user-recognition-20260603.005122
+app_data_exists_after_move=no
+held_size=235M	/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/original-userdata-held-for-new-user-recognition-20260603.005122/PrivateVoice Input
diff --git a/02-P-NBL/round-1/logs/qa-runtime/offline-restart-app-log-20260602.log b/02-P-NBL/round-1/logs/qa-runtime/offline-restart-app-log-20260602.log
new file mode 100644
index 0000000..6866cab
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/offline-restart-app-log-20260602.log
@@ -0,0 +1,65 @@
+[2026-06-02 22:59:09] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Applications/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-02 22:59:10] INFO Accessibility permission granted
+[2026-06-02 22:59:10] INFO Keyboard event tap started; attempts=1 failures=0 disabled=0
+[2026-06-02 22:59:10] INFO Application initialized, starting Wails
+[2026-06-02 22:59:10] INFO Initializing ASR engine...
+[2026-06-02 22:59:10] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice
+[2026-06-02 22:59:10] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:59:10] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=false recording=false freetalk=false engineReady=false recordingHotkey=false
+[2026-06-02 22:59:14] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=1 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.009s tapStarted=true
+[2026-06-02 22:59:14] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:59:14] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=false recordingHotkey=false
+[2026-06-02 22:59:14] INFO Hotkey ignored: key=R-Alt engineReady=false recordingHotkey=false
+[2026-06-02 22:59:14] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=2 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.011s tapStarted=true
+[2026-06-02 22:59:14] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:59:14] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=false recording=false freetalk=false engineReady=false recordingHotkey=false
+[2026-06-02 22:59:16] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-02 22:59:16] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-02 22:59:19] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=3 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.022s tapStarted=true
+[2026-06-02 22:59:19] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 22:59:19] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:59:19] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 22:59:19] INFO Hotkey action: start hold-to-talk after 180ms
+[2026-06-02 22:59:19] INFO Recording started
+[2026-06-02 22:59:19] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 22:59:25] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=4 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.004s tapStarted=true
+[2026-06-02 22:59:25] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 22:59:25] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 22:59:25] INFO Hotkey released: key=R-Alt mode=hold duration=6570ms recording=true combination=false
+[2026-06-02 22:59:25] INFO Stopping audio device
+[2026-06-02 22:59:25] INFO Recording stopped, 100800 samples captured
+[2026-06-02 22:59:25] INFO Audio device stopped
+[2026-06-02 22:59:25] INFO Audio device uninitialized
+[2026-06-02 22:59:25] INFO Recognized: 这是 mac 电脑用 SenseVoice 做离线识别。
+[2026-06-02 23:00:56] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=5 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.009s tapStarted=true
+[2026-06-02 23:00:56] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 23:00:56] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 23:00:56] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 23:00:56] INFO Hotkey action: start hold-to-talk after 209ms
+[2026-06-02 23:00:56] INFO Recording started
+[2026-06-02 23:00:56] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 23:00:59] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=6 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.019s tapStarted=true
+[2026-06-02 23:00:59] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 23:00:59] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 23:00:59] INFO Hotkey released: key=R-Alt mode=hold duration=3569ms recording=true combination=false
+[2026-06-02 23:00:59] INFO Recording stopped, 53600 samples captured
+[2026-06-02 23:00:59] INFO Stopping audio device
+[2026-06-02 23:00:59] INFO Audio device stopped
+[2026-06-02 23:00:59] INFO Audio device uninitialized
+[2026-06-02 23:00:59] INFO Recognized: 这篇文章所说的 s voice。
+[2026-06-02 23:01:08] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=7 event=flagsChanged eventDown=true pollDown=true physicalDown=false trackedDown=true recentDown=true flags=0x80140 age=0.007s tapStarted=true
+[2026-06-02 23:01:08] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=true source=eventTap physicalDown=false trackedDown=true recentDown=true tapStarted=true
+[2026-06-02 23:01:08] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=true active=false recording=false freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 23:01:08] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-02 23:01:09] INFO Hotkey action: start hold-to-talk after 209ms
+[2026-06-02 23:01:09] INFO Recording started
+[2026-06-02 23:01:09] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-02 23:01:15] INFO Hotkey event tap: key=R-Alt vk=0xA5 keyCode=61 seq=8 event=flagsChanged eventDown=false pollDown=false physicalDown=false trackedDown=false recentDown=false flags=0x100 age=0.015s tapStarted=true
+[2026-06-02 23:01:15] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-02 23:01:15] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=true recording=true freetalk=false engineReady=true recordingHotkey=false
+[2026-06-02 23:01:15] INFO Hotkey released: key=R-Alt mode=hold duration=6599ms recording=true combination=false
+[2026-06-02 23:01:15] INFO Stopping audio device
+[2026-06-02 23:01:15] INFO Recording stopped, 101600 samples captured
+[2026-06-02 23:01:15] INFO Audio device stopped
+[2026-06-02 23:01:15] INFO Audio device uninitialized
+[2026-06-02 23:01:15] INFO Recognized: 这篇文章所说的放 R 和我们现在用的 s word 是什么关系?
diff --git a/02-P-NBL/round-1/logs/qa-runtime/offline-restart-postcheck-20260602.log b/02-P-NBL/round-1/logs/qa-runtime/offline-restart-postcheck-20260602.log
new file mode 100644
index 0000000..d1b3d15
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/offline-restart-postcheck-20260602.log
@@ -0,0 +1,22 @@
+captured_at=2026-06-02 23:01:20 +0800
+pid=38909 
+network_state_current:
+Wi-Fi Power (en0): On
+Network information
+
+IPv4 network interface information
+     en0 : flags      : 0x7 (IPv4,IPv6,DNS)
+           address    : 192.168.0.75
+           reach      : 0x00000002 (Reachable)
+
+   REACH : flags 0x00000002 (Reachable)
+
+IPv6 network interface information
+     en0 : flags      : 0x7 (IPv4,IPv6,DNS)
+           address    : 240e:47e:34e1:4cb6:4d1:d823:e133:af21
+           reach      : 0x00000002 (Reachable)
+
+   REACH : flags 0x00000002 (Reachable)
+
+Network interfaces: en0
+lsof_current:
diff --git a/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.223742.log b/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.223742.log
new file mode 100644
index 0000000..0b73c13
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.223742.log
@@ -0,0 +1,4 @@
+offline restart QA started at 2026-06-02 22:37:42 +0800
+log=/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.223742.log
+history_before=1657 | 开干吧,需要我配合什么?我在电脑旁边呢。
+waiting 20 seconds for manual network-off
diff --git a/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.225709.log b/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.225709.log
new file mode 100644
index 0000000..00f7a72
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.225709.log
@@ -0,0 +1,4 @@
+offline restart QA started at 2026-06-02 22:57:09 +0800
+log=/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.225709.log
+history_before=1663 | I.
+initial_network_state 2026-06-02 22:57:09 +0800
diff --git a/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.225709.pid b/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.225709.pid
new file mode 100644
index 0000000..c4c4422
--- /dev/null
+++ b/02-P-NBL/round-1/logs/qa-runtime/offline-restart-test-20260602.225709.pid
@@ -0,0 +1 @@
+38627
diff --git a/02-P-NBL/round-1/qa-report-20260602-2.1.19.md b/02-P-NBL/round-1/qa-report-20260602-2.1.19.md
new file mode 100644
index 0000000..6d3629a
--- /dev/null
+++ b/02-P-NBL/round-1/qa-report-20260602-2.1.19.md
@@ -0,0 +1,458 @@
+# Round 1 QA 报告 - 2.1.19
+
+状态:功能性 QA PASS,可进入用户验收;正式公开分发仍需 Developer ID 签名和 notarization
+日期:2026-06-02
+测试包:PrivateVoice Input 2.1.19 build 20260602.2022
+
+## 1. 测试对象
+
+| 项目 | 内容 |
+|---|---|
+| QA 包目录 | `/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/Release/PrivateVoice-Input-2.1.19-build20260602.2022` |
+| manifest | `/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/Release/PrivateVoice-Input-2.1.19-build20260602.2022/RELEASE_MANIFEST.md` |
+| 源码 commit | `f4194105fe06baa18f0145cc59e1914f96f2d4cb` |
+| tag | `v2.1.19-build20260602.2022` |
+| 安装架构 | arm64 |
+| 安装方式 | 覆盖安装到 `/Applications/PrivateVoice Input.app` |
+
+## 2. 安装前基线
+
+旧版 App:
+
+- version:`2.1.18`
+- build:`20260601.1905`
+- bundle id:`com.privatevoice.input`
+- 签名:`PrivateVoice Local Code Signing`
+- 旧版进程运行中,PID 后续已退出。
+
+用户数据:
+
+| 项目 | 结果 |
+|---|---|
+| 数据目录 | `/Users/ar/Library/Application Support/PrivateVoice Input` |
+| 数据目录大小 | 235 MB |
+| 旧模型目录 | `models/sensevoice` |
+| `config.json` | 存在 |
+| `userdict.json` | 存在,146 条 replacement |
+| `history.json` | 存在,安装前 1640 条历史 |
+
+备份:
+
+```text
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/pre-upgrade-20260602.2030
+```
+
+## 3. 覆盖安装结果
+
+结论:PASS。
+
+已执行:
+
+- 退出旧版 `PrivateVoice Input`。
+- 挂载 arm64 DMG。
+- 复制 `PrivateVoice Input.app` 到 `/Applications`。
+- 验证 `/Applications/PrivateVoice Input.app` 的 Info.plist 和 codesign。
+
+安装后 App 元数据:
+
+- `CFBundleShortVersionString = 2.1.19`
+- `CFBundleVersion = 20260602.2022`
+- `CFBundleIdentifier = com.privatevoice.input`
+- `LSUIElement = true`
+- `LSMinimumSystemVersion = 11.0`
+
+签名验证:
+
+```text
+/Applications/PrivateVoice Input.app: valid on disk
+/Applications/PrivateVoice Input.app: satisfies its Designated Requirement
+```
+
+## 4. 启动与旧模型 fallback
+
+结论:PASS。
+
+启动日志确认:
+
+```text
+PrivateVoice Input starting... version=2.1.19 build=20260602.2022
+Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice
+Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+```
+
+判断:
+
+- 新版 `sensevoice-zh` profile 成功 fallback 到旧目录 `models/sensevoice`。
+- 没有要求用户重新下载模型。
+- `models/state.json` 不存在时 fallback 路径正常。
+
+## 5. 用户数据保留
+
+结论:PASS。
+
+升级后关键哈希:
+
+| 文件 | 结果 |
+|---|---|
+| `config.json` | 与安装前一致 |
+| `userdict.json` | 与安装前一致 |
+| `models/sensevoice/model.int8.onnx` | 与安装前一致 |
+| `models/sensevoice/tokens.txt` | 与安装前一致 |
+| `history.json` | 发生变化,符合新增识别历史预期 |
+
+升级后统计:
+
+- replacement:146 条,保留。
+- 历史:从 1640 条增加到 1656 条。
+- replacement 补测阶段人工新增 3 条规则,当前 replacement 为 149 条;这属于 QA 补测操作,不属于安装过程改写用户数据。
+
+## 6. 权限与真实录音识别
+
+结论:PASS。
+
+日志确认:
+
+- Accessibility permission granted。
+- Keyboard event tap started。
+- R-Alt 热键触发录音。
+- Audio device started / stopped。
+- ASR engine ready 后完成真实识别。
+
+真实输入证据:
+
+```text
+Recognized: 说完了。
+```
+
+历史写入证据:
+
+- 历史条数从 1640 增加到 1641,再增加到 1642,后续继续增加到 1656。
+- `history.json` 最新记录包含真实识别文本。
+
+说明:
+
+- 麦克风权限未弹窗,但真实录音成功,说明当前本机权限可用。
+- 自动上屏路径由用户实际用 VoiceSnap 回复文本间接验证。
+
+## 7. 网络观察
+
+结论:PASS。
+
+观察方式:
+
+```bash
+lsof -nP -a -i -p <PrivateVoice Input PID>
+```
+
+采样时间:
+
+```text
+2026-06-02 22:09:47 - 22:10:17
+```
+
+结果:
+
+- 30 次采样均未发现 `PrivateVoice Input` 进程持有网络 socket。
+- 采样期间发生一次真实录音识别。
+
+日志文件:
+
+```text
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/network-sample-20260602.log
+```
+
+## 8. 物理断网启动识别
+
+结论:PASS。
+
+执行方式:
+
+- 用户在本机手动关闭网络。
+- QA 脚本触发 App 退出并重新启动。
+- App 重启后,用户使用 R-Alt 进行真实语音输入。
+- 用户恢复网络后,QA 复核 App 日志、进程启动时间、历史记录和当前网络 socket。
+
+App 重启证据:
+
+```text
+PrivateVoice Input 当前进程:
+PID 38909
+启动时间 Tue Jun 2 22:59:09 2026
+```
+
+启动日志证据:
+
+```text
+[2026-06-02 22:59:09] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022
+[2026-06-02 22:59:10] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice
+[2026-06-02 22:59:16] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-02 22:59:16] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+```
+
+真实识别证据:
+
+```text
+[2026-06-02 22:59:19] INFO Recording started
+[2026-06-02 22:59:25] INFO Recording stopped, 100800 samples captured
+[2026-06-02 22:59:25] INFO Recognized: 这是 mac 电脑用 SenseVoice 做离线识别。
+```
+
+历史写入证据:
+
+```text
+history.json 最新记录:
+这是 mac 电脑用 SenseVoice 做离线识别。
+```
+
+网络证据边界:
+
+- 本轮断网期间的监控脚本在初始网络状态后中断,没有留下连续 socket 采样。
+- 断网动作由用户手动执行,测试句在用户恢复网络后回传确认。
+- 之前已有 30 秒识别期间无网络 socket 的独立采样,本轮恢复网络后复核 `PrivateVoice Input` 当前进程也无网络 socket。
+
+日志文件:
+
+```text
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/offline-restart-app-log-20260602.log
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/offline-restart-postcheck-20260602.log
+```
+
+判断:
+
+- 断网后 App 可以重新启动。
+- 断网后旧模型 fallback 仍可加载 SenseVoice。
+- 断网后真实录音、识别、replacement 和历史写入链路可用。
+
+## 9. replacement 验证
+
+结论:PASS。
+
+已通过:
+
+- 覆盖安装后用户词库文件保留。
+- 覆盖安装后原有 146 条 replacement 规则保留。
+- 升级后未损坏 `userdict.json`。
+- 补充规则并重启 App 后,真实识别链路中出现 replacement 后文本。
+
+补测过程:
+
+- 备份补测前用户词库:`/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/userdict-before-replacement-rules-20260602.2216.json`
+- 人工新增 3 条规则:
+  - `麦 ac -> Mac`
+  - `ss voiceice -> SenseVoice`
+  - `sin voice -> SenseVoice`
+- 当前 replacement 数量:149 条。
+- 重启 App 后重新测试 SenseVoice 离线识别。
+
+真实输入证据:
+
+```text
+这是 mac 电脑用 SenseVoice 做离线识别。
+```
+
+历史写入证据:
+
+```text
+history.json 最新记录包含:
+好了。
+这是 mac 电脑用 SenseVoice 做离线识别。
+这是Mac 电脑用 sing voice 做离线识别。
+这是咩卖。
+```
+
+判断:
+
+- replacement 引擎在真实识别链路中可触发。
+- 原始失败更像是规则覆盖不足,不是 replacement 引擎失效。
+- `sing voice -> SenseVoice` 是后续可补充的词库覆盖项,不阻塞 Round 1 模型 profile QA。
+
+## 10. 新用户干净安装
+
+结论:PASS。
+
+执行方式:
+
+- 备份当前真实用户数据目录。
+- 退出 App。
+- 将 `/Users/ar/Library/Application Support/PrivateVoice Input` 临时移动到隔离目录。
+- 启动 `/Applications/PrivateVoice Input.app`,模拟完全没有历史、词库和模型的新用户。
+- 记录首启文件、模型下载、引擎初始化、网络 socket、App 日志。
+- 测试完成后恢复原用户数据目录并重启 App。
+
+备份与隔离:
+
+```text
+完整备份:
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/pre-new-user-clean-install-20260602.231851
+
+原数据临时隔离:
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/original-userdata-held-for-new-user-20260602.231851
+
+新用户测试生成的数据:
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/new-user-generated-data-20260602.231851
+```
+
+新用户首启结果:
+
+```text
+启动时间:2026-06-02 23:19:19
+新数据目录大小:228 MB
+生成文件:
+app.log
+config.json
+userdict.json
+models/state.json
+models/sensevoice-zh/model.int8.onnx
+models/sensevoice-zh/tokens.txt
+```
+
+首启日志证据:
+
+```text
+[2026-06-02 23:19:19] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022
+[2026-06-02 23:19:19] ERROR Engine initialization failed: model sensevoice-zh is not usable: not_installed missing=[/Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice] problems=[]
+[2026-06-02 23:19:19] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip
+[2026-06-02 23:19:27] INFO Extracting model archive...
+[2026-06-02 23:19:27] INFO Model download and extraction complete
+[2026-06-02 23:19:27] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice-zh
+[2026-06-02 23:19:30] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-02 23:19:30] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+```
+
+网络行为:
+
+```text
+PrivateVoice Input 打开到 http://www.maikami.com/voicesnap/sensevoice.zip 的 HTTP 连接。
+```
+
+判断:
+
+- 新用户无本地模型时,App 会自动下载默认 SenseVoice 模型。
+- 下载完成后模型落在新 profile 目录 `models/sensevoice-zh`。
+- 新用户首启后可以完成 SenseVoice 初始化。
+- 首次初始化失败日志中的 missing path 指向旧目录 `models/sensevoice`,但后续下载和 `sensevoice-zh` 初始化成功;这是日志可读性问题,不是本轮功能阻断。
+
+首轮遗留与补测结果:
+
+- 2026-06-02 首轮测试中,60 秒轮询期间没有采集到新用户状态下的真实语音输入。
+- 2026-06-03 重新执行补测,已采集到新用户状态下的真实语音输入和历史写入。
+
+2026-06-03 补测:
+
+```text
+备份:
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/pre-new-user-recognition-20260603.005122
+
+原数据临时隔离:
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/original-userdata-held-for-new-user-recognition-20260603.005122
+
+新用户测试生成的数据:
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/QA-backups/new-user-generated-data-20260603.005122
+```
+
+补测首启日志:
+
+```text
+[2026-06-03 00:51:42] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022
+[2026-06-03 00:51:43] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip
+[2026-06-03 00:51:50] INFO Extracting model archive...
+[2026-06-03 00:51:51] INFO Model download and extraction complete
+[2026-06-03 00:51:51] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice-zh
+[2026-06-03 00:51:53] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+```
+
+补测真实识别与历史写入证据:
+
+```text
+[2026-06-03 00:54:33] INFO Recognized: 我上次在 getthub 上,然后把我的软件的 help 文档都上传到这里了。我现在需要更新一下。
+[2026-06-03 00:54:36] INFO Recognized: 我应该怎么操作呢?
+[2026-06-03 00:54:45] INFO Recognized: 另外你建不建议我下一个 github 的 DMG 在本地安装一下,用客户端操作。
+[2026-06-03 00:55:04] INFO Recognized: 我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。
+
+新用户 history.json:
+4 条记录,最新记录为:
+我只是想覆盖一下已经上传的文件,然后文件名和下载地址都不要变。
+```
+
+恢复结果:
+
+```text
+2026-06-02 首轮恢复时间:2026-06-02 23:22:04
+2026-06-03 补测恢复时间:2026-06-03 00:55:54
+恢复后数据目录大小:235 MB
+恢复后历史:1676 条
+恢复后 replacement:149 条
+恢复后模型目录:models/sensevoice
+恢复后 App 重新加载 SenseVoice 成功。
+```
+
+日志文件:
+
+```text
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.setup.log
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.launch.log
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.recognition.log
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-clean-install-20260602.231851.restore.log
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.setup.log
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.launch.log
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.recognition.log
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/02-P-NBL/round-1/logs/qa-runtime/new-user-recognition-20260603.005122.restore.log
+```
+
+## 11. 窗口 / Dock smoke
+
+结论:PASS。
+
+检查结果:
+
+```text
+System Events process: PrivateVoice Input
+background only=false
+visible=true
+frontmost=false
+windows=2
+LSUIElement=true
+```
+
+判断:
+
+- App 进程存在。
+- Dock 隐藏配置存在。
+- 当前至少有窗口对象,未发现启动后无窗口/无进程问题。
+
+## 12. 验证矩阵
+
+| 项目 | 状态 | 原因 |
+|---|---|---|
+| replacement 真实触发 | PASS | 补充规则并重启后,真实识别链路出现 `SenseVoice` 替换结果 |
+| 完整断网启动识别 | PASS | 用户手动断网后 App 重启、SenseVoice 初始化、真实识别和历史写入均成功 |
+| 新用户干净安装 | PASS | 首启、下载、安装、初始化、第一次真实识别和历史写入均通过 |
+| Developer ID / notarization | NOT RUN | 当前包是本地签名 QA 包 |
+
+## 13. QA 结论
+
+当前结论:
+
+```text
+2.1.19 Round 1 QA 包功能性 QA PASS,可进入用户验收;正式公开分发仍需 Developer ID 签名和 notarization。
+```
+
+已通过的核心项:
+
+- 可回滚构建链路:commit + tag + manifest + SHA256。
+- 覆盖安装。
+- 旧用户数据保留。
+- 旧模型 fallback。
+- CoreML SenseVoice 初始化。
+- 真实录音识别。
+- 历史写入。
+- 识别期间无网络 socket。
+- 物理断网后启动和识别。
+- 新用户首启自动下载模型并初始化。
+- 新用户第一次真实识别和历史写入。
+- 基础窗口 / Dock smoke。
+
+不属于本地功能 QA、但正式分发前仍需完成的项目:
+
+- Developer ID 签名和 notarization。
diff --git a/02-P-NBL/round-2/logs/qa-runtime/build-local-round2-20260603.014931.log b/02-P-NBL/round-2/logs/qa-runtime/build-local-round2-20260603.014931.log
new file mode 100644
index 0000000..56671f0
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/build-local-round2-20260603.014931.log
@@ -0,0 +1,144 @@
+
+==> Preflight checks
+Using existing local signing identity: PrivateVoice Local Code Signing
+
+==> Cleaning old local build
+
+==> Building frontend
+
+> privatevoice-input-frontend@2.1.19 build
+> vite build
+
+vite v6.4.1 building for production...
+transforming...
+1:53:56 AM [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:53:56 AM [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:53:56 AM [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-yZ25Q-mY.js      137.08 kB │ gzip: 45.83 kB
+✓ built in 475ms
+
+==> Building Go binary (arm64)
+# voicesnap
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-1830242072/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-Round2/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-Round2/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-Round2/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-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input: replacing existing signature
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app: replacing existing signature
+
+==> Verifying app signature
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app: valid on disk
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app: satisfies its Designated Requirement
+Executable=/Users/ar/Projects/VoiceSnap-2.1.1-Round2/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=28279 flags=0x10000(runtime) hashes=873+7 location=embedded
+Signature size=1830
+Authority=PrivateVoice Local Code Signing
+Signed Time=Jun 3, 2026 at 01:54:01
+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-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.19-build20260602.2022-arm64-local.dmg
+
+==> Signing DMG
+正在检查“Protective Master Boot Record(MBR:0)”的校验和…
+Protective Master Boot Record(MBR:0):已验证CRC32 $1721BF9F
+正在检查“GPT Header(Primary GPT Header:1)”的校验和…
+    GPT Header(Primary GPT Header:1):已验证CRC32 $9676C45C
+正在检查“GPT Partition Data(Primary GPT Table:2)”的校验和…
+GPT Partition Data(Primary GPT Table:已验证CRC32 $5E129C96
+正在检查“(Apple_Free:3)”的校验和…
+                      (Apple_Free:3):已验证CRC32 $00000000
+正在检查“disk image(Apple_APFS:4)”的校验和…
+            disk image(Apple_APFS:4):已验证CRC32 $BC65881B
+正在检查“GPT Partition Data(Backup GPT Table:5)”的校验和…
+GPT Partition Data(Backup GPT Table::已验证CRC32 $5E129C96
+正在检查“GPT Header(Backup GPT Header:6)”的校验和…
+     GPT Header(Backup GPT Header:6):已验证CRC32 $5182E0D1
+已验证CRC32 $9494B0AD
+hdiutil: verify: checksum of "/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.19-build20260602.2022-arm64-local.dmg" is VALID
+
+==> Local build complete
+  App: /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app
+  DMG: /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.19-build20260602.2022-arm64-local.dmg
+  Compatibility DMG: /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.19-arm64-local.dmg
+  Signing identity: PrivateVoice Local Code Signing
diff --git a/02-P-NBL/round-2/logs/qa-runtime/current-run-id.txt b/02-P-NBL/round-2/logs/qa-runtime/current-run-id.txt
new file mode 100644
index 0000000..706428f
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/current-run-id.txt
@@ -0,0 +1 @@
+20260603.014931
diff --git a/02-P-NBL/round-2/logs/qa-runtime/new-user-run-20260603.014931.log b/02-P-NBL/round-2/logs/qa-runtime/new-user-run-20260603.014931.log
new file mode 100644
index 0000000..5d73c29
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/new-user-run-20260603.014931.log
@@ -0,0 +1,23 @@
+[2026-06-03 02:18:22] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Projects/VoiceSnap-2.1.1-Round2/02-P-NBL/round-2/logs/qa-runtime/new-user-home-20260603.014931/Library/Application Support/PrivateVoice Input
+[2026-06-03 02:18:22] INFO Accessibility permission granted
+[2026-06-03 02:18:22] INFO Keyboard event tap started; attempts=1 failures=0 disabled=0
+2:18AM INF Build Info: Wails=v3.0.0-alpha.71 Compiler=go1.26.3 CGO_CFLAGS="" CGO_CPPFLAGS="" GOOS=darwin GOARM64=v8.0 -buildmode=exe -compiler=gc -ldflags="-s -w" CGO_ENABLED=1 CGO_CXXFLAGS="" CGO_LDFLAGS="" GOARCH=arm64 -gcflags="all=-l" DefaultGODEBUG="cryptocustomrand=1,tlssecpmlkem=0,urlstrictcolons=0"
+2:18AM INF AssetServer Info: middleware=true handler=true
+2:18AM INF Platform Info: ID=25F71 Name=MacOS Version=26.5 Branding="MacOS 26.5"
+[2026-06-03 02:18:22] INFO Application initialized, starting Wails
+[2026-06-03 02:18:22] INFO Initializing ASR engine...
+[2026-06-03 02:18:22] ERROR Engine initialization failed: model sensevoice-zh is not usable: not_installed missing=[/Users/ar/Projects/VoiceSnap-2.1.1-Round2/02-P-NBL/round-2/logs/qa-runtime/new-user-home-20260603.014931/Library/Application Support/PrivateVoice Input/models/sensevoice] problems=[]
+[2026-06-03 02:18:22] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-03 02:18:22] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=false recording=false freetalk=false engineReady=false recordingHotkey=false
+2:18AM INF [AssetFileServerFS] Handling request url=/ file=.
+2:18AM INF [AssetFileServerFS] Handling request url=/assets/index-p3GQqwqB.css file=assets/index-p3GQqwqB.css
+2:18AM INF [AssetFileServerFS] Handling request url=/assets/index-yZ25Q-mY.js file=assets/index-yZ25Q-mY.js
+2:18AM INF [AssetFileServerFS] Handling request url=/wails/custom.js file=wails/custom.js
+2:18AM INF [AssetFileServerFS] Handling request url=/assets/app-icon-Bs-pS5hx.png file=assets/app-icon-Bs-pS5hx.png
+[2026-06-03 02:18:23] INFO Downloading model from URL 1: http://www.maikami.com/voicesnap/sensevoice.zip
+[2026-06-03 02:18:51] INFO Extracting model archive...
+[2026-06-03 02:18:52] INFO Model download and extraction complete
+[2026-06-03 02:18:52] INFO Initializing ASR engine...
+[2026-06-03 02:18:52] INFO Loading model sensevoice-zh from /Users/ar/Projects/VoiceSnap-2.1.1-Round2/02-P-NBL/round-2/logs/qa-runtime/new-user-home-20260603.014931/Library/Application Support/PrivateVoice Input/models/sensevoice-zh
+[2026-06-03 02:18:54] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:18:54] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
diff --git a/02-P-NBL/round-2/logs/qa-runtime/new-user-run-20260603.014931.pid b/02-P-NBL/round-2/logs/qa-runtime/new-user-run-20260603.014931.pid
new file mode 100644
index 0000000..2e4d8f1
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/new-user-run-20260603.014931.pid
@@ -0,0 +1 @@
+84784
diff --git a/02-P-NBL/round-2/logs/qa-runtime/offline-start-check-20260603.014931.log b/02-P-NBL/round-2/logs/qa-runtime/offline-start-check-20260603.014931.log
new file mode 100644
index 0000000..4d7c5d1
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/offline-start-check-20260603.014931.log
@@ -0,0 +1,38 @@
+before_wifi=Wi-Fi Power (en0): On
+turning_wifi_off
+after_wifi=Wi-Fi Power (en0): Off
+network_probe_start
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (6) Could not resolve host: www.apple.com
+restart_app_offline
+process_check
+86122 74315 /bin/zsh         /bin/zsh -lc bash -lc 'set -euo pipefail\012RUN_ID="$(cat /Users/ar/Projects/VoiceSnap-2.1.1-Round2/02-P-NBL/round-2/logs/qa-runtime/current-run-id.txt)"\012trap "networksetup -setairportpower en0 on >/dev/null 2>&1 || true" EXIT\012echo "before_wifi=$(networksetup -getairportpower en0)"\012echo "turning_wifi_off"\012networksetup -setairportpower en0 off\012sleep 6\012echo "after_wifi=$(networksetup -getairportpower en0)"\012echo "network_probe_start"\012curl -I --connect-timeout 3 https://www.apple.com >/tmp/round2-offline-curl.$$ 2>&1 || true\012head -c 1000 /tmp/round2-offline-curl.$$ || true\012rm -f /tmp/round2-offline-curl.$$\012echo "restart_app_offline"\012osascript -e "tell application \"PrivateVoice Input\" to quit" >/dev/null 2>&1 || true\012sleep 1\012open -n "/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app"\012sleep 6\012echo "process_check"\012ps -axo pid,ppid,comm,args | rg "/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app" || true\012echo "log_check"\012tail -n 80 "/Users/ar/Library/Application Support/PrivateVoice Input/app.log" | rg "PrivateVoice Input starting|executable=|Engine initialized|ASR engine ready|download|failed|error" | tail -n 40 || true\012echo "turning_wifi_on"\012networksetup -setairportpower en0 on\012sleep 3\012echo "restored_wifi=$(networksetup -getairportpower en0)"\012' 2>&1 | tee /Users/ar/Projects/VoiceSnap-2.1.1-Round2/02-P-NBL/round-2/logs/qa-runtime/offline-start-check-$(cat /Users/ar/Projects/VoiceSnap-2.1.1-Round2/02-P-NBL/round-2/logs/qa-runtime/current-run-id.txt).log | tail -c 6000
+86131 86122 bash             bash -lc set -euo pipefail\012RUN_ID="$(cat /Users/ar/Projects/VoiceSnap-2.1.1-Round2/02-P-NBL/round-2/logs/qa-runtime/current-run-id.txt)"\012trap "networksetup -setairportpower en0 on >/dev/null 2>&1 || true" EXIT\012echo "before_wifi=$(networksetup -getairportpower en0)"\012echo "turning_wifi_off"\012networksetup -setairportpower en0 off\012sleep 6\012echo "after_wifi=$(networksetup -getairportpower en0)"\012echo "network_probe_start"\012curl -I --connect-timeout 3 https://www.apple.com >/tmp/round2-offline-curl.$$ 2>&1 || true\012head -c 1000 /tmp/round2-offline-curl.$$ || true\012rm -f /tmp/round2-offline-curl.$$\012echo "restart_app_offline"\012osascript -e "tell application \"PrivateVoice Input\" to quit" >/dev/null 2>&1 || true\012sleep 1\012open -n "/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app"\012sleep 6\012echo "process_check"\012ps -axo pid,ppid,comm,args | rg "/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app" || true\012echo "log_check"\012tail -n 80 "/Users/ar/Library/Application Support/PrivateVoice Input/app.log" | rg "PrivateVoice Input starting|executable=|Engine initialized|ASR engine ready|download|failed|error" | tail -n 40 || true\012echo "turning_wifi_on"\012networksetup -setairportpower en0 on\012sleep 3\012echo "restored_wifi=$(networksetup -getairportpower en0)"\012
+86168     1 /Users/ar/Projec /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input
+86190 86131 rg               rg /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app
+log_check
+[2026-06-03 01:50:29] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 01:50:29] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 01:50:42] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Applications/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-03 01:50:49] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 01:50:49] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 01:54:21] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-03 01:54:24] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 01:54:24] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 01:54:51] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Applications/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-03 01:55:10] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Applications/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-03 02:12:11] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-03 02:12:13] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:12:13] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:20:15] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Applications/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-03 02:20:18] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:20:18] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:23:34] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-03 02:23:37] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:23:37] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:28:44] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-03 02:28:46] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:28:46] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+turning_wifi_on
+restored_wifi=Wi-Fi Power (en0): On
diff --git a/02-P-NBL/round-2/logs/qa-runtime/offline-voice-final-20260603.014931.log b/02-P-NBL/round-2/logs/qa-runtime/offline-voice-final-20260603.014931.log
new file mode 100644
index 0000000..39a8b67
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/offline-voice-final-20260603.014931.log
@@ -0,0 +1,62 @@
+run_id=20260603.014931
+started_at=2026-06-03 11:40:21
+history_before=1710
+wifi_before=Wi-Fi Power (en0): On
+turning_wifi_off=2026-06-03 11:40:21
+wifi_after_off=Wi-Fi Power (en0): Off
+network_probe_offline_start=2026-06-03 11:40:29
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (6) Could not resolve host: www.apple.com
+
+voice_window_start=2026-06-03 11:40:29
+voice_window_end=2026-06-03 11:41:44
+turning_wifi_on=2026-06-03 11:41:44
+wifi_after_restore=Wi-Fi Power (en0): On
+network_probe_restored_start=2026-06-03 11:41:52
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
+HTTP/2 200 
+server: Apple
+content-type: text/html; charset=utf-8
+x-frame-options: SAMEORIGIN
+x-xss-protection: 1; mode=block
+x-content-type-options: nosniff
+strict-transport-security: max-age=31536000; includeSubdomains; preload
+referrer-policy: no-referrer-when-downgrade
+content-security-policy: default-src 'self' blob: data: *.akamaized.net *.apple.com *.apple-mapkit.com *.cdn-apple.com *.organicfruitapps.com; child-src blob: mailto: embed.music.apple.com embed.podcasts.apple.com https://recyclingprogram.apple.com https://smb.apple.com https://nova.apple.com swdlp.apple.com www.apple.com www.instagram.com platform.twitter.com www.youtube-nocookie.com; img-src 'unsa
+history_after=1711
+last_history=但是我还是这几句。
+recent_log
+[2026-06-03 01:50:49] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 01:50:49] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 01:54:24] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 01:54:24] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:12:13] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:12:13] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:20:18] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:20:18] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:23:37] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:23:37] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:28:46] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 02:28:46] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 11:39:48] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-03 11:39:49] INFO Recording started
+[2026-06-03 11:39:49] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-03 11:39:50] INFO Hotkey released: key=R-Alt mode=hold duration=2064ms recording=true combination=false
+[2026-06-03 11:39:50] INFO Recording stopped, 28800 samples captured
+[2026-06-03 11:39:51] INFO Recognized: 我现在就配合你。
+[2026-06-03 11:39:51] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-03 11:39:51] INFO Recording started
+[2026-06-03 11:39:52] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-03 11:39:54] INFO Hotkey released: key=R-Alt mode=hold duration=2310ms recording=true combination=false
+[2026-06-03 11:39:54] INFO Recording stopped, 32800 samples captured
+[2026-06-03 11:39:54] INFO Recognized: 我在旁边等着呢。
+[2026-06-03 11:40:36] INFO Hotkey accepted: key=R-Alt vk=0xA5 mode=hold freetalk=false
+[2026-06-03 11:40:36] INFO Recording started
+[2026-06-03 11:40:36] INFO Recording started (16kHz/16-bit/mono)
+[2026-06-03 11:40:41] INFO Hotkey released: key=R-Alt mode=hold duration=4678ms recording=true combination=false
+[2026-06-03 11:40:41] INFO Recording stopped, 71200 samples captured
+[2026-06-03 11:40:41] INFO Recognized: 这是 mac 电脑用 SenseVoice 做离线识别。
+finished_at=2026-06-03 11:41:53
diff --git a/02-P-NBL/round-2/logs/qa-runtime/offline-voice-safety-20260603.014931.log b/02-P-NBL/round-2/logs/qa-runtime/offline-voice-safety-20260603.014931.log
new file mode 100644
index 0000000..a238333
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/offline-voice-safety-20260603.014931.log
@@ -0,0 +1,2 @@
+2026-06-03 02:40:51 safety restored wifi
+2026-06-03 10:45:28 safety restored wifi
diff --git a/02-P-NBL/round-2/logs/qa-runtime/offline-voice-safety-20260603.014931.pid b/02-P-NBL/round-2/logs/qa-runtime/offline-voice-safety-20260603.014931.pid
new file mode 100644
index 0000000..9813073
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/offline-voice-safety-20260603.014931.pid
@@ -0,0 +1 @@
+27621
diff --git a/02-P-NBL/round-2/logs/qa-runtime/offline-voice-start-20260603.014931.log b/02-P-NBL/round-2/logs/qa-runtime/offline-voice-start-20260603.014931.log
new file mode 100644
index 0000000..2e4c9ce
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/offline-voice-start-20260603.014931.log
@@ -0,0 +1 @@
+bash: -c: line 5: unexpected EOF while looking for matching `)'
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-local-run-20260603.014931.log b/02-P-NBL/round-2/logs/qa-runtime/round2-local-run-20260603.014931.log
new file mode 100644
index 0000000..7519242
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-local-run-20260603.014931.log
@@ -0,0 +1,57 @@
+# voicesnap
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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-2756778698/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
+[2026-06-03 01:50:24] INFO PrivateVoice Input starting... version=2.1.19 build=20260602.2022 executable=/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-build3257239160/b001/exe/voicesnap dataDir=/Users/ar/Library/Application Support/PrivateVoice Input
+[2026-06-03 01:50:24] INFO Accessibility permission granted
+[2026-06-03 01:50:24] INFO Keyboard event tap started; attempts=1 failures=0 disabled=0
+1:50AM INF Build Info: Wails=v3.0.0-alpha.71 Compiler=go1.26.3 -buildmode=exe DefaultGODEBUG="cryptocustomrand=1,tlssecpmlkem=0,urlstrictcolons=0" CGO_CPPFLAGS="" CGO_CXXFLAGS="" GOARCH=arm64 GOOS=darwin GOARM64=v8.0 -compiler=gc CGO_ENABLED=1 CGO_CFLAGS="" CGO_LDFLAGS=""
+1:50AM INF Platform Info: ID=25F71 Name=MacOS Version=26.5 Branding="MacOS 26.5"
+1:50AM INF AssetServer Info: middleware=true handler=true
+[2026-06-03 01:50:24] INFO Application initialized, starting Wails
+[2026-06-03 01:50:24] INFO Initializing ASR engine...
+[2026-06-03 01:50:24] INFO Loading model sensevoice-zh from /Users/ar/Library/Application Support/PrivateVoice Input/models/sensevoice
+[2026-06-03 01:50:24] INFO Hotkey poll: key=R-Alt vk=0xA5 keyCode=61 down=false source=none physicalDown=false trackedDown=false recentDown=false tapStarted=true
+[2026-06-03 01:50:24] INFO Hotkey poll state: key=R-Alt vk=0xA5 mode=hold down=false active=false recording=false freetalk=false engineReady=false recordingHotkey=false
+1:50AM INF [AssetFileServerFS] Handling request url=/ file=.
+1:50AM INF [AssetFileServerFS] Handling request url=/assets/index-yZ25Q-mY.js file=assets/index-yZ25Q-mY.js
+1:50AM INF [AssetFileServerFS] Handling request url=/assets/index-p3GQqwqB.css file=assets/index-p3GQqwqB.css
+1:50AM INF [AssetFileServerFS] Handling request url=/wails/custom.js file=wails/custom.js
+1:50AM INF [AssetFileServerFS] Handling request url=/assets/app-icon-Bs-pS5hx.png file=assets/app-icon-Bs-pS5hx.png
+[2026-06-03 01:50:29] INFO Engine initialized: SenseVoice · CoreML (Apple Neural Engine)
+[2026-06-03 01:50:29] INFO ASR engine ready: SenseVoice · CoreML (Apple Neural Engine)
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-local-run-20260603.014931.pid b/02-P-NBL/round-2/logs/qa-runtime/round2-local-run-20260603.014931.pid
new file mode 100644
index 0000000..505cf1e
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-local-run-20260603.014931.pid
@@ -0,0 +1 @@
+79750
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-activated.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-activated.png
new file mode 100644
index 0000000..12abc12
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-activated.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-after-restart.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-after-restart.png
new file mode 100644
index 0000000..b7b10c5
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-after-restart.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-chinese.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-chinese.png
new file mode 100644
index 0000000..c02591a
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-chinese.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1095-523.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1095-523.png
new file mode 100644
index 0000000..615d470
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1095-523.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1260-565.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1260-565.png
new file mode 100644
index 0000000..aa05fb8
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-1260-565.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-693-310.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-693-310.png
new file mode 100644
index 0000000..d77b3c7
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-cursor-693-310.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english.png
new file mode 100644
index 0000000..cc13d05
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english2.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english2.png
new file mode 100644
index 0000000..18b387e
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english2.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english3.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english3.png
new file mode 100644
index 0000000..efad772
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english3.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english4.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english4.png
new file mode 100644
index 0000000..919d329
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english4.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english5.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english5.png
new file mode 100644
index 0000000..27d12de
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english5.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english6.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english6.png
new file mode 100644
index 0000000..17b3c4b
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-english6.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-initial.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-initial.png
new file mode 100644
index 0000000..3e4125a
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-initial.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-new-user.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-new-user.png
new file mode 100644
index 0000000..9f5b003
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-new-user.png
Binary files differ
diff --git a/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-zh-manual.png b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-zh-manual.png
new file mode 100644
index 0000000..d7f5cf2
--- /dev/null
+++ b/02-P-NBL/round-2/logs/qa-runtime/round2-screen-20260603.014931-zh-manual.png
Binary files differ
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..8173aca
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,28 @@
+## 项目属性
+
+项目类型:研发项目
+主要产物:Wails / Go 桌面语音输入 App
+
+## 1. 命令输出保护
+
+保护上下文用量。
+
+任何输出量未知或可能很大的命令,都必须限制输出字节数。
+
+默认安全写法:
+
+```bash
+COMMAND 2>&1 | head -c 6000
+```
+
+## 2. 发布版本规则
+
+本项目声明为 `研发项目`,发布或分发安装包前默认遵守 `~/.codex/rules/release-versioning.md`;如本项目 release 文档或构建脚本另有更具体要求,以本项目规则为准。
+
+## 3. 测试通过后的默认打包规则
+
+当某一轮改动已经完成开发自测,并且 QA 验证也通过后,默认进入测试包交付流程,不需要再单独询问用户是否打包。
+
+执行打包前仍必须遵守发布版本规则:递增 patch 版本号、生成新的 `YYYYMMDD.HHMM` build 编号、更新 App 元数据与 `CHANGELOG.md`,并生成可分发的 macOS `.dmg`。
+
+如果只有开发自测通过,但 QA 尚未验证通过,则不得把该版本作为测试人员可用包交付;此时只说明当前处于待 QA 状态。
diff --git a/Release/PrivateVoice-Input-2.1.18-build20260601.1905/SHA256SUMS.txt b/Release/PrivateVoice-Input-2.1.18-build20260601.1905/SHA256SUMS.txt
new file mode 100644
index 0000000..7bea9bd
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.18-build20260601.1905/SHA256SUMS.txt
@@ -0,0 +1,2 @@
+ae26657fcdb0c1c8756b751833a634ddda01197f434418414d17902470dfbcbc  PrivateVoice Input-2.1.18-build20260601.1905-arm64-local.dmg
+fb823c183df02f11413d12e4eb58cc04ed281de94936e7994af3e6837c6e1131  PrivateVoice Input-2.1.18-build20260601.1905-x86_64-local.dmg
diff --git a/Release/PrivateVoice-Input-2.1.19-build20260602.2022/RELEASE_MANIFEST.md b/Release/PrivateVoice-Input-2.1.19-build20260602.2022/RELEASE_MANIFEST.md
new file mode 100644
index 0000000..b7b1560
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.19-build20260602.2022/RELEASE_MANIFEST.md
@@ -0,0 +1,110 @@
+# PrivateVoice Input 2.1.19 Build 20260602.2022 Release Manifest
+
+## 基本信息
+
+| 项目 | 内容 |
+|---|---|
+| package type | Round 1 QA 测试包 |
+| product | PrivateVoice Input |
+| version | 2.1.19 |
+| build | 20260602.2022 |
+| generated at | 2026-06-02 20:27:33 HKT |
+| source branch | codex/round1-qa-package |
+| source commit | f4194105fe06baa18f0145cc59e1914f96f2d4cb |
+| baseline commit | 3fbceec8de833416bf1ae049f959f222c3f1a4a0 |
+| release tag | v2.1.19-build20260602.2022 |
+| worktree | /Users/ar/Projects/VoiceSnap-2.1.1-QA-build |
+| signing identity | PrivateVoice Local Code Signing |
+| notarization | none |
+
+## 产物
+
+| 架构 | 路径 | SHA256 |
+|---|---|---|
+| arm64 | `Release/PrivateVoice-Input-2.1.19-build20260602.2022/PrivateVoice Input-2.1.19-build20260602.2022-arm64-local.dmg` | `765e544ed88b6a33caf5231a5249efa9e08e2adee76c19ce55c1679b074361a2` |
+| x86_64 | `Release/PrivateVoice-Input-2.1.19-build20260602.2022/PrivateVoice Input-2.1.19-build20260602.2022-x86_64-local.dmg` | `55be5da82cab427e4f6c27de7e79cd941153da18ce77e131eb3c0d4f905828e3` |
+
+SHA 文件:
+
+```text
+Release/PrivateVoice-Input-2.1.19-build20260602.2022/SHA256SUMS.txt
+```
+
+构建日志:
+
+```text
+Release/PrivateVoice-Input-2.1.19-build20260602.2022/logs/build-arm64.log
+Release/PrivateVoice-Input-2.1.19-build20260602.2022/logs/build-x86_64.log
+```
+
+## 构建环境
+
+| 项目 | 内容 |
+|---|---|
+| macOS | 26.5 (25F71) |
+| host arch | arm64 |
+| Go | go1.26.3 darwin/arm64 |
+| Node.js | v23.11.1 |
+| npm | 10.9.2 |
+
+## 源码冻结命令
+
+```bash
+git worktree add -b codex/round1-qa-package /Users/ar/Projects/VoiceSnap-2.1.1-QA-build 3fbceec
+cd /Users/ar/Projects/VoiceSnap-2.1.1-QA-build
+git commit -m "Prepare 2.1.19 Round 1 QA package"
+```
+
+源码冻结 commit:
+
+```text
+f4194105fe06baa18f0145cc59e1914f96f2d4cb
+```
+
+## 构建命令
+
+```bash
+cd /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src
+./scripts/build-local-macos.sh arm64
+./scripts/build-local-macos.sh x86_64
+```
+
+## 验证命令
+
+```bash
+cd /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/frontend
+npm ci --prefer-offline
+npm run build
+
+cd /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src
+go test ./... -count=1
+
+cd /Users/ar/Projects/VoiceSnap-2.1.1-QA-build
+git diff --check
+hdiutil verify "Release/PrivateVoice-Input-2.1.19-build20260602.2022/PrivateVoice Input-2.1.19-build20260602.2022-arm64-local.dmg"
+hdiutil verify "Release/PrivateVoice-Input-2.1.19-build20260602.2022/PrivateVoice Input-2.1.19-build20260602.2022-x86_64-local.dmg"
+codesign -vvv "Release/PrivateVoice-Input-2.1.19-build20260602.2022/PrivateVoice Input-2.1.19-build20260602.2022-arm64-local.dmg"
+codesign -vvv "Release/PrivateVoice-Input-2.1.19-build20260602.2022/PrivateVoice Input-2.1.19-build20260602.2022-x86_64-local.dmg"
+```
+
+## 验证结论
+
+已通过:
+
+- 前端 `npm run build`。
+- Go 全量测试 `go test ./... -count=1`。
+- `git diff --check`。
+- arm64 DMG `hdiutil verify`。
+- x86_64 DMG `hdiutil verify`。
+- arm64 DMG `codesign -vvv`。
+- x86_64 DMG `codesign -vvv`。
+- DMG 内容检查:两份镜像均包含 `PrivateVoice Input.app` 和 `Applications` 链接。
+- App 元数据检查:`CFBundleShortVersionString=2.1.19`,`CFBundleVersion=20260602.2022`,`CFBundleIdentifier=com.privatevoice.input`。
+
+## 已知残余风险
+
+- 本包使用 `PrivateVoice Local Code Signing` 本地签名,没有 Developer ID 签名和 notarization,不应视为跨机器正式分发包。
+- `npm ci` 报告 6 个依赖审计问题(3 moderate,3 high);本轮未升级依赖。
+- 前端构建仍有既有 Svelte a11y warning,位于 `UpdateDialog.svelte` 和 `ToggleSwitch.svelte`。
+- 构建日志中仍有 macOS 最低版本与部分依赖 dylib 的 linker warning;当前 App 元数据仍声明 `LSMinimumSystemVersion=11.0`,但 `libonnxruntime.1.23.2.dylib` 构建版本提示为 13.4,需后续单独确认最低系统版本策略。
+- 正式 QA 尚未完成真实 SenseVoice 模型、麦克风权限、断网识别、replacement、历史写入、网络观察和 macOS 窗口/Dock smoke。
diff --git a/Release/PrivateVoice-Input-2.1.19-build20260602.2022/SHA256SUMS.txt b/Release/PrivateVoice-Input-2.1.19-build20260602.2022/SHA256SUMS.txt
new file mode 100644
index 0000000..c4db7c2
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.19-build20260602.2022/SHA256SUMS.txt
@@ -0,0 +1,2 @@
+765e544ed88b6a33caf5231a5249efa9e08e2adee76c19ce55c1679b074361a2  PrivateVoice Input-2.1.19-build20260602.2022-arm64-local.dmg
+55be5da82cab427e4f6c27de7e79cd941153da18ce77e131eb3c0d4f905828e3  PrivateVoice Input-2.1.19-build20260602.2022-x86_64-local.dmg
diff --git a/Release/PrivateVoice-Input-2.1.19-build20260602.2022/logs/build-arm64.log b/Release/PrivateVoice-Input-2.1.19-build20260602.2022/logs/build-arm64.log
new file mode 100644
index 0000000..f849bf6
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.19-build20260602.2022/logs/build-arm64.log
@@ -0,0 +1,146 @@
+
+==> Preflight checks
+Using existing local signing identity: PrivateVoice Local Code Signing
+
+==> Cleaning old local build
+
+==> Building frontend
+
+> privatevoice-input-frontend@2.1.19 build
+> vite build
+
+vite v6.4.1 building for production...
+transforming...
+8:25:16 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">
+8:25:16 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>
+8:25:16 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-DAqIBjkZ.css      33.21 kB │ gzip:  5.70 kB
+dist/assets/index-B-UiAvkI.js      133.36 kB │ gzip: 44.72 kB
+✓ built in 442ms
+
+==> Building Go binary (arm64)
+# voicesnap
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-3535248902/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-QA-build/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-QA-build/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-QA-build/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-QA-build/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input: replacing existing signature
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/arm64/PrivateVoice Input.app: replacing existing signature
+
+==> Verifying app signature
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/arm64/PrivateVoice Input.app: valid on disk
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/arm64/PrivateVoice Input.app: satisfies its Designated Requirement
+Executable=/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/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=28247 flags=0x10000(runtime) hashes=872+7 location=embedded
+Signature size=1830
+Authority=PrivateVoice Local Code Signing
+Signed Time=Jun 2, 2026 at 20:25:20
+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-QA-build/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.19-build20260602.2022-arm64-local.dmg
+
+==> Signing DMG
+正在检查“Protective Master Boot Record(MBR:0)”的校验和…
+Protective Master Boot Record(MBR:0):已验证CRC32 $33D050E1
+正在检查“GPT Header(Primary GPT Header:1)”的校验和…
+    GPT Header(Primary GPT Header:1):已验证CRC32 $BB8512E8
+正在检查“GPT Partition Data(Primary GPT Table:2)”的校验和…
+GPT Partition Data(Primary GPT Table:已验证CRC32 $8706F66B
+正在检查“(Apple_Free:3)”的校验和…
+                      (Apple_Free:3):已验证CRC32 $00000000
+正在检查“disk image(Apple_APFS:4)”的校验和…
+            disk image(Apple_APFS:4):已验证CRC32 $71823483
+正在检查“(Apple_Free:5)”的校验和…
+                      (Apple_Free:5):已验证CRC32 $00000000
+正在检查“GPT Partition Data(Backup GPT Table:6)”的校验和…
+GPT Partition Data(Backup GPT Table::已验证CRC32 $8706F66B
+正在检查“GPT Header(Backup GPT Header:7)”的校验和…
+     GPT Header(Backup GPT Header:7):已验证CRC32 $F24A6C74
+已验证CRC32 $881B2254
+hdiutil: verify: checksum of "/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.19-build20260602.2022-arm64-local.dmg" is VALID
+
+==> Local build complete
+  App: /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/arm64/PrivateVoice Input.app
+  DMG: /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.19-build20260602.2022-arm64-local.dmg
+  Compatibility DMG: /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.19-arm64-local.dmg
+  Signing identity: PrivateVoice Local Code Signing
diff --git a/Release/PrivateVoice-Input-2.1.19-build20260602.2022/logs/build-x86_64.log b/Release/PrivateVoice-Input-2.1.19-build20260602.2022/logs/build-x86_64.log
new file mode 100644
index 0000000..554fef0
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.19-build20260602.2022/logs/build-x86_64.log
@@ -0,0 +1,145 @@
+
+==> Preflight checks
+Using existing local signing identity: PrivateVoice Local Code Signing
+
+==> Cleaning old local build
+
+==> Building frontend
+
+> privatevoice-input-frontend@2.1.19 build
+> vite build
+
+vite v6.4.1 building for production...
+transforming...
+8:25:47 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">
+8:25:47 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>
+8:25:47 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-DAqIBjkZ.css      33.21 kB │ gzip:  5.70 kB
+dist/assets/index-B-UiAvkI.js      133.36 kB │ gzip: 44.72 kB
+✓ built in 454ms
+
+==> Building Go binary (x86_64)
+# voicesnap
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/go.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000000.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000001.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000002.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000003.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000004.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000005.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000006.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000007.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000028.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000029.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000030.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000031.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000032.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000033.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000034.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000035.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000036.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000037.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000038.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000039.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000040.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000041.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000042.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000043.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000044.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000045.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000046.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000047.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000048.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000049.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000050.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000051.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000052.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000053.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000054.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-267578997/000055.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: building for macOS-10.13, but linking with dylib '@rpath/libsherpa-onnx-c-api.dylib' which was built for newer version 10.15
+ld: warning: building for macOS-10.13, 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-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+
+==> Code signing with stable local identity
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib: replacing existing signature
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input.app: replacing existing signature
+
+==> Verifying app signature
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input.app: valid on disk
+/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input.app: satisfies its Designated Requirement
+Executable=/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input
+Identifier=com.privatevoice.input
+Format=app bundle with Mach-O thin (x86_64)
+CodeDirectory v=20500 size=122007 flags=0x10000(runtime) hashes=3802+7 location=embedded
+Signature size=1830
+Authority=PrivateVoice Local Code Signing
+Signed Time=Jun 2, 2026 at 20:25:51
+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-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input-2.1.19-build20260602.2022-x86_64-local.dmg
+
+==> Signing DMG
+正在检查“Protective Master Boot Record(MBR:0)”的校验和…
+Protective Master Boot Record(MBR:0):已验证CRC32 $5F04DB33
+正在检查“GPT Header(Primary GPT Header:1)”的校验和…
+    GPT Header(Primary GPT Header:1):已验证CRC32 $E584EF4F
+正在检查“GPT Partition Data(Primary GPT Table:2)”的校验和…
+GPT Partition Data(Primary GPT Table:已验证CRC32 $04FB7485
+正在检查“(Apple_Free:3)”的校验和…
+                      (Apple_Free:3):已验证CRC32 $00000000
+正在检查“disk image(Apple_APFS:4)”的校验和…
+            disk image(Apple_APFS:4):已验证CRC32 $B21E894F
+正在检查“(Apple_Free:5)”的校验和…
+                      (Apple_Free:5):已验证CRC32 $00000000
+正在检查“GPT Partition Data(Backup GPT Table:6)”的校验和…
+GPT Partition Data(Backup GPT Table::已验证CRC32 $04FB7485
+正在检查“GPT Header(Backup GPT Header:7)”的校验和…
+     GPT Header(Backup GPT Header:7):已验证CRC32 $CFB41D18
+已验证CRC32 $50FB2202
+hdiutil: verify: checksum of "/Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input-2.1.19-build20260602.2022-x86_64-local.dmg" is VALID
+
+==> Local build complete
+  App: /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input.app
+  DMG: /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input-2.1.19-build20260602.2022-x86_64-local.dmg
+  Compatibility DMG: /Users/ar/Projects/VoiceSnap-2.1.1-QA-build/privatevoice.src/build/local/x86_64/PrivateVoice Input-2.1.19-x86_64-local.dmg
+  Signing identity: PrivateVoice Local Code Signing
diff --git a/Release/PrivateVoice-Input-2.1.20-build20260603.1145/RELEASE_MANIFEST.md b/Release/PrivateVoice-Input-2.1.20-build20260603.1145/RELEASE_MANIFEST.md
new file mode 100644
index 0000000..9c2c0d3
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.20-build20260603.1145/RELEASE_MANIFEST.md
@@ -0,0 +1,128 @@
+# PrivateVoice Input 2.1.20 Build 20260603.1145 Release Manifest
+
+## 基本信息
+
+| 项目 | 内容 |
+|---|---|
+| package type | Round 2 QA 通过测试包 |
+| product | PrivateVoice Input |
+| version | 2.1.20 |
+| build | 20260603.1145 |
+| generated at | 2026-06-03 11:54:00 HKT |
+| source branch | codex/round2-language-settings |
+| source commit | f66a79670c444010a59b8513c9f61257ebc7d9b6 |
+| baseline commit | f4194105fe06baa18f0145cc59e1914f96f2d4cb |
+| release tag | v2.1.20-build20260603.1145 |
+| worktree | /Users/ar/Projects/VoiceSnap-2.1.1-Round2 |
+| signing identity | PrivateVoice Local Code Signing |
+| notarization | none |
+
+## 产物
+
+| 架构 | 路径 | SHA256 |
+|---|---|---|
+| arm64 | `Release/PrivateVoice-Input-2.1.20-build20260603.1145/PrivateVoice Input-2.1.20-build20260603.1145-arm64-local.dmg` | `5e321004afb61153fb82e5ef58698d5487e5dd089bf0aaa0ba482e657ed3a4ec` |
+| x86_64 | `Release/PrivateVoice-Input-2.1.20-build20260603.1145/PrivateVoice Input-2.1.20-build20260603.1145-x86_64-local.dmg` | `cac25e70e9375610f122e6a8ee3d9813acf0dee23054b6402cd3e5e575d5f1fd` |
+
+SHA 文件:
+
+```text
+Release/PrivateVoice-Input-2.1.20-build20260603.1145/SHA256SUMS.txt
+```
+
+构建日志:
+
+```text
+Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/build-arm64.log
+Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/build-x86_64.log
+Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/verify-dmgs.log
+```
+
+QA 报告:
+
+```text
+02-P-NBL/round-2/qa-report-current.md
+```
+
+## 构建环境
+
+| 项目 | 内容 |
+|---|---|
+| macOS | 26.5 (25F71) |
+| host arch | arm64 |
+| Go | go1.26.3 darwin/arm64 |
+| Node.js | v23.11.1 |
+| npm | 10.9.2 |
+
+## 源码冻结命令
+
+```bash
+cd /Users/ar/Projects/VoiceSnap-2.1.1-Round2
+git commit -m "Prepare 2.1.20 Round 2 QA package"
+```
+
+源码冻结 commit:
+
+```text
+f66a79670c444010a59b8513c9f61257ebc7d9b6
+```
+
+## 构建命令
+
+```bash
+cd /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src
+./scripts/build-local-macos.sh arm64
+./scripts/build-local-macos.sh x86_64
+```
+
+## 验证命令
+
+```bash
+cd /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/frontend
+npm run build
+
+cd /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src
+go test ./... -count=1
+
+cd /Users/ar/Projects/VoiceSnap-2.1.1-Round2
+git diff --check
+hdiutil verify "Release/PrivateVoice-Input-2.1.20-build20260603.1145/PrivateVoice Input-2.1.20-build20260603.1145-arm64-local.dmg"
+hdiutil verify "Release/PrivateVoice-Input-2.1.20-build20260603.1145/PrivateVoice Input-2.1.20-build20260603.1145-x86_64-local.dmg"
+codesign -vvv "Release/PrivateVoice-Input-2.1.20-build20260603.1145/PrivateVoice Input-2.1.20-build20260603.1145-arm64-local.dmg"
+codesign -vvv "Release/PrivateVoice-Input-2.1.20-build20260603.1145/PrivateVoice Input-2.1.20-build20260603.1145-x86_64-local.dmg"
+```
+
+## 验证结论
+
+已通过:
+
+- 前端 `npm run build`。
+- Go 全量测试 `go test ./... -count=1`。
+- `git diff --check`。
+- arm64 DMG `hdiutil verify`。
+- x86_64 DMG `hdiutil verify`。
+- arm64 DMG `codesign -vvv`。
+- x86_64 DMG `codesign -vvv`。
+- DMG 内容检查:两份镜像均包含 `PrivateVoice Input.app` 和 `Applications` 链接。
+- App 元数据检查:`CFBundleShortVersionString=2.1.20`,`CFBundleVersion=20260603.1145`,`CFBundleIdentifier=com.privatevoice.input`。
+- Round 2 功能性 QA PASS:语言切换、重启持久化、老用户数据保护、新用户临时 HOME、断网启动、断网真实语音输入均通过。
+
+## 用户验收
+
+2026-06-03,用户确认完成以下 6 项验收,且全部符合预期:
+
+- 安装 arm64 测试包并覆盖旧版。
+- 关于页版本显示为 `2.1.20 build 20260603.1145`。
+- 设置页“语言版本”支持 `自动 / 中文 / English`,切换后 UI 文案立即变化。
+- 推理引擎仍为 `SenseVoice · CoreML (Apple Neural Engine)`,未出现 Moonshine / Parakeet / Qwen3-ASR,未重新下载模型。
+- 语言选择重启后保持。
+- `R-Alt` 真实语音输入可用,历史记录正常写入。
+
+结论:Round 2 用户验收 PASS。
+
+## 已知残余风险
+
+- 本包使用 `PrivateVoice Local Code Signing` 本地签名,没有 Developer ID 签名和 notarization,不应视为跨机器正式分发包。
+- `npm ci` 既有依赖审计问题本轮未处理;本轮仅执行 `npm run build`。
+- 前端构建仍有既有 Svelte a11y warning,位于 `UpdateDialog.svelte` 和 `ToggleSwitch.svelte`。
+- 构建日志中仍有 macOS 最低版本与部分依赖 dylib 的 linker warning;当前 App 元数据仍声明 `LSMinimumSystemVersion=11.0`,但 `libonnxruntime.1.23.2.dylib` 构建版本提示为 13.4,需后续单独确认最低系统版本策略。
diff --git a/Release/PrivateVoice-Input-2.1.20-build20260603.1145/SHA256SUMS.txt b/Release/PrivateVoice-Input-2.1.20-build20260603.1145/SHA256SUMS.txt
new file mode 100644
index 0000000..4f41159
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.20-build20260603.1145/SHA256SUMS.txt
@@ -0,0 +1,2 @@
+5e321004afb61153fb82e5ef58698d5487e5dd089bf0aaa0ba482e657ed3a4ec  PrivateVoice Input-2.1.20-build20260603.1145-arm64-local.dmg
+cac25e70e9375610f122e6a8ee3d9813acf0dee23054b6402cd3e5e575d5f1fd  PrivateVoice Input-2.1.20-build20260603.1145-x86_64-local.dmg
diff --git a/Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/build-arm64.log b/Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/build-arm64.log
new file mode 100644
index 0000000..a9f0f66
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/build-arm64.log
@@ -0,0 +1,144 @@
+
+==> Preflight checks
+Using existing local signing identity: PrivateVoice Local Code Signing
+
+==> Cleaning old local build
+
+==> Building frontend
+
+> privatevoice-input-frontend@2.1.20 build
+> vite build
+
+vite v6.4.1 building for production...
+transforming...
+11:51:36 AM [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">
+11:51:36 AM [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>
+11:51:36 AM [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-yZ25Q-mY.js      137.08 kB │ gzip: 45.83 kB
+✓ built in 492ms
+
+==> Building Go binary (arm64)
+# voicesnap
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-2695112876/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-Round2/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-Round2/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-Round2/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-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input: replacing existing signature
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app: replacing existing signature
+
+==> Verifying app signature
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app: valid on disk
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app: satisfies its Designated Requirement
+Executable=/Users/ar/Projects/VoiceSnap-2.1.1-Round2/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=28279 flags=0x10000(runtime) hashes=873+7 location=embedded
+Signature size=1830
+Authority=PrivateVoice Local Code Signing
+Signed Time=Jun 3, 2026 at 11:51:39
+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-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.20-build20260603.1145-arm64-local.dmg
+
+==> Signing DMG
+正在检查“Protective Master Boot Record(MBR:0)”的校验和…
+Protective Master Boot Record(MBR:0):已验证CRC32 $1721BF9F
+正在检查“GPT Header(Primary GPT Header:1)”的校验和…
+    GPT Header(Primary GPT Header:1):已验证CRC32 $590C3EED
+正在检查“GPT Partition Data(Primary GPT Table:2)”的校验和…
+GPT Partition Data(Primary GPT Table:已验证CRC32 $DB4DB4C1
+正在检查“(Apple_Free:3)”的校验和…
+                      (Apple_Free:3):已验证CRC32 $00000000
+正在检查“disk image(Apple_APFS:4)”的校验和…
+            disk image(Apple_APFS:4):已验证CRC32 $A4673B2A
+正在检查“GPT Partition Data(Backup GPT Table:5)”的校验和…
+GPT Partition Data(Backup GPT Table::已验证CRC32 $DB4DB4C1
+正在检查“GPT Header(Backup GPT Header:6)”的校验和…
+     GPT Header(Backup GPT Header:6):已验证CRC32 $9EF81A60
+已验证CRC32 $4C335541
+hdiutil: verify: checksum of "/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.20-build20260603.1145-arm64-local.dmg" is VALID
+
+==> Local build complete
+  App: /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input.app
+  DMG: /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.20-build20260603.1145-arm64-local.dmg
+  Compatibility DMG: /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/arm64/PrivateVoice Input-2.1.20-arm64-local.dmg
+  Signing identity: PrivateVoice Local Code Signing
diff --git a/Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/build-x86_64.log b/Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/build-x86_64.log
new file mode 100644
index 0000000..569b942
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/build-x86_64.log
@@ -0,0 +1,145 @@
+
+==> Preflight checks
+Using existing local signing identity: PrivateVoice Local Code Signing
+
+==> Cleaning old local build
+
+==> Building frontend
+
+> privatevoice-input-frontend@2.1.20 build
+> vite build
+
+vite v6.4.1 building for production...
+transforming...
+11:52:35 AM [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">
+11:52:35 AM [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>
+11:52:36 AM [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-yZ25Q-mY.js      137.08 kB │ gzip: 45.83 kB
+✓ built in 463ms
+
+==> Building Go binary (x86_64)
+# voicesnap
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/go.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000000.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000001.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000002.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000003.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000004.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000005.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000006.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000007.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000028.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000029.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000030.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000031.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000032.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000033.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000034.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000035.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000036.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000037.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000038.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000039.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000040.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000041.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000042.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000043.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000044.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000045.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000046.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000047.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000048.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000049.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000050.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000051.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000052.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000053.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000054.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1877181218/000055.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: building for macOS-10.13, but linking with dylib '@rpath/libsherpa-onnx-c-api.dylib' which was built for newer version 10.15
+ld: warning: building for macOS-10.13, 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-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+
+==> Code signing with stable local identity
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib: replacing existing signature
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input.app: replacing existing signature
+
+==> Verifying app signature
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input.app: valid on disk
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input.app: satisfies its Designated Requirement
+Executable=/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input
+Identifier=com.privatevoice.input
+Format=app bundle with Mach-O thin (x86_64)
+CodeDirectory v=20500 size=122167 flags=0x10000(runtime) hashes=3807+7 location=embedded
+Signature size=1830
+Authority=PrivateVoice Local Code Signing
+Signed Time=Jun 3, 2026 at 11:52:41
+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-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input-2.1.20-build20260603.1145-x86_64-local.dmg
+
+==> Signing DMG
+正在检查“Protective Master Boot Record(MBR:0)”的校验和…
+Protective Master Boot Record(MBR:0):已验证CRC32 $600A069B
+正在检查“GPT Header(Primary GPT Header:1)”的校验和…
+    GPT Header(Primary GPT Header:1):已验证CRC32 $15E9C1B9
+正在检查“GPT Partition Data(Primary GPT Table:2)”的校验和…
+GPT Partition Data(Primary GPT Table:已验证CRC32 $AA2A8826
+正在检查“(Apple_Free:3)”的校验和…
+                      (Apple_Free:3):已验证CRC32 $00000000
+正在检查“disk image(Apple_APFS:4)”的校验和…
+            disk image(Apple_APFS:4):已验证CRC32 $71F5DCBD
+正在检查“(Apple_Free:5)”的校验和…
+                      (Apple_Free:5):已验证CRC32 $00000000
+正在检查“GPT Partition Data(Backup GPT Table:6)”的校验和…
+GPT Partition Data(Backup GPT Table::已验证CRC32 $AA2A8826
+正在检查“GPT Header(Backup GPT Header:7)”的校验和…
+     GPT Header(Backup GPT Header:7):已验证CRC32 $EC94F2EE
+已验证CRC32 $174EA245
+hdiutil: verify: checksum of "/Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input-2.1.20-build20260603.1145-x86_64-local.dmg" is VALID
+
+==> Local build complete
+  App: /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input.app
+  DMG: /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input-2.1.20-build20260603.1145-x86_64-local.dmg
+  Compatibility DMG: /Users/ar/Projects/VoiceSnap-2.1.1-Round2/privatevoice.src/build/local/x86_64/PrivateVoice Input-2.1.20-x86_64-local.dmg
+  Signing identity: PrivateVoice Local Code Signing
diff --git a/Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/verify-dmgs.log b/Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/verify-dmgs.log
new file mode 100644
index 0000000..71047f1
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.20-build20260603.1145/logs/verify-dmgs.log
@@ -0,0 +1,60 @@
+== PrivateVoice Input-2.1.20-build20260603.1145-arm64-local.dmg ==
+正在检查“Protective Master Boot Record(MBR:0)”的校验和…
+Protective Master Boot Record(MBR:0):已验证CRC32 $1721BF9F
+正在检查“GPT Header(Primary GPT Header:1)”的校验和…
+    GPT Header(Primary GPT Header:1):已验证CRC32 $590C3EED
+正在检查“GPT Partition Data(Primary GPT Table:2)”的校验和…
+GPT Partition Data(Primary GPT Table:已验证CRC32 $DB4DB4C1
+正在检查“(Apple_Free:3)”的校验和…
+                      (Apple_Free:3):已验证CRC32 $00000000
+正在检查“disk image(Apple_APFS:4)”的校验和…
+            disk image(Apple_APFS:4):已验证CRC32 $A4673B2A
+正在检查“GPT Partition Data(Backup GPT Table:5)”的校验和…
+GPT Partition Data(Backup GPT Table::已验证CRC32 $DB4DB4C1
+正在检查“GPT Header(Backup GPT Header:6)”的校验和…
+     GPT Header(Backup GPT Header:6):已验证CRC32 $9EF81A60
+已验证CRC32 $4C335541
+hdiutil: verify: checksum of "/Users/ar/Projects/VoiceSnap-2.1.1-Round2/Release/PrivateVoice-Input-2.1.20-build20260603.1145/PrivateVoice Input-2.1.20-build20260603.1145-arm64-local.dmg" is VALID
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/Release/PrivateVoice-Input-2.1.20-build20260603.1145/PrivateVoice Input-2.1.20-build20260603.1145-arm64-local.dmg: valid on disk
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/Release/PrivateVoice-Input-2.1.20-build20260603.1145/PrivateVoice Input-2.1.20-build20260603.1145-arm64-local.dmg: satisfies its Designated Requirement
+预计CRC32 $4C335541
+/dev/disk11         	GUID_partition_scheme          	
+/dev/disk11s1       	Apple_APFS                     	
+/dev/disk12         	EF57347C-0000-11AA-AA11-0030654	
+/dev/disk12s1       	41504653-0000-11AA-AA11-0030654	/private/tmp/privatevoice-dmg.CfSGaN
+contents:
+/tmp/privatevoice-dmg.CfSGaN
+/tmp/privatevoice-dmg.CfSGaN/PrivateVoice Input.app
+/tmp/privatevoice-dmg.CfSGaN/Applications
+"disk11" ejected.
+== PrivateVoice Input-2.1.20-build20260603.1145-x86_64-local.dmg ==
+正在检查“Protective Master Boot Record(MBR:0)”的校验和…
+Protective Master Boot Record(MBR:0):已验证CRC32 $600A069B
+正在检查“GPT Header(Primary GPT Header:1)”的校验和…
+    GPT Header(Primary GPT Header:1):已验证CRC32 $15E9C1B9
+正在检查“GPT Partition Data(Primary GPT Table:2)”的校验和…
+GPT Partition Data(Primary GPT Table:已验证CRC32 $AA2A8826
+正在检查“(Apple_Free:3)”的校验和…
+                      (Apple_Free:3):已验证CRC32 $00000000
+正在检查“disk image(Apple_APFS:4)”的校验和…
+            disk image(Apple_APFS:4):已验证CRC32 $71F5DCBD
+正在检查“(Apple_Free:5)”的校验和…
+                      (Apple_Free:5):已验证CRC32 $00000000
+正在检查“GPT Partition Data(Backup GPT Table:6)”的校验和…
+GPT Partition Data(Backup GPT Table::已验证CRC32 $AA2A8826
+正在检查“GPT Header(Backup GPT Header:7)”的校验和…
+     GPT Header(Backup GPT Header:7):已验证CRC32 $EC94F2EE
+已验证CRC32 $174EA245
+hdiutil: verify: checksum of "/Users/ar/Projects/VoiceSnap-2.1.1-Round2/Release/PrivateVoice-Input-2.1.20-build20260603.1145/PrivateVoice Input-2.1.20-build20260603.1145-x86_64-local.dmg" is VALID
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/Release/PrivateVoice-Input-2.1.20-build20260603.1145/PrivateVoice Input-2.1.20-build20260603.1145-x86_64-local.dmg: valid on disk
+/Users/ar/Projects/VoiceSnap-2.1.1-Round2/Release/PrivateVoice-Input-2.1.20-build20260603.1145/PrivateVoice Input-2.1.20-build20260603.1145-x86_64-local.dmg: satisfies its Designated Requirement
+预计CRC32 $174EA245
+/dev/disk11         	GUID_partition_scheme          	
+/dev/disk11s1       	Apple_APFS                     	
+/dev/disk12         	EF57347C-0000-11AA-AA11-0030654	
+/dev/disk12s1       	41504653-0000-11AA-AA11-0030654	/private/tmp/privatevoice-dmg.dqXHHL
+contents:
+/tmp/privatevoice-dmg.dqXHHL
+/tmp/privatevoice-dmg.dqXHHL/PrivateVoice Input.app
+/tmp/privatevoice-dmg.dqXHHL/Applications
+"disk11" ejected.
diff --git a/Release/PrivateVoice-Input-2.1.21-build20260603.1327/RELEASE_MANIFEST.md b/Release/PrivateVoice-Input-2.1.21-build20260603.1327/RELEASE_MANIFEST.md
new file mode 100644
index 0000000..1ee23f2
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.21-build20260603.1327/RELEASE_MANIFEST.md
@@ -0,0 +1,88 @@
+# PrivateVoice Input 2.1.21 build20260603.1327
+
+## 包类型
+
+Round 3 正式可回滚测试包 / QA 候选包。
+
+本包用于验证英文语言版本默认安装 Moonshine English,并保持中文语言版本默认 SenseVoice 的 Round 3 需求。
+
+## 版本信息
+
+- Product: PrivateVoice Input
+- Version: 2.1.21
+- Build: 20260603.1327
+- 生成时间: 2026-06-03 13:33:42 HKT
+- 执行代理: Codex
+
+## Git 基线
+
+- Repository: `/Users/ar/Projects/VoiceSnap-2.1.1-Round3`
+- Branch: `codex/round3-moonshine-english`
+- Commit: `678bd460610d80d0a11ce8910a73fe95d00073f5`
+- Tag: `v2.1.21-build20260603.1327`
+
+## 构建命令
+
+```bash
+cd /Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src
+./scripts/build-local-macos.sh arm64
+./scripts/build-local-macos.sh x86_64
+```
+
+## 验证命令
+
+```bash
+cd /Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src
+npm run build
+go test ./... -count=1
+git diff --check
+
+cd /Users/ar/Projects/VoiceSnap-2.1.1-Round3
+codesign -vvv --deep --strict "privatevoice.src/build/local/arm64/PrivateVoice Input.app"
+codesign -vvv --deep --strict "privatevoice.src/build/local/x86_64/PrivateVoice Input.app"
+hdiutil verify "Release/PrivateVoice-Input-2.1.21-build20260603.1327/PrivateVoice Input-2.1.21-build20260603.1327-arm64-local.dmg"
+hdiutil verify "Release/PrivateVoice-Input-2.1.21-build20260603.1327/PrivateVoice Input-2.1.21-build20260603.1327-x86_64-local.dmg"
+shasum -a 256 "Release/PrivateVoice-Input-2.1.21-build20260603.1327/"*.dmg
+
+# 临时 QA 测试,不进入正式源码:
+# 使用临时模型目录调用 model.DownloadProfile(moonshine-en),随后调用 engine.NewWithResolvedModel。
+```
+
+## 产物
+
+| 架构 | 文件 | 大小 | SHA256 |
+| --- | --- | ---: | --- |
+| arm64 | `PrivateVoice Input-2.1.21-build20260603.1327-arm64-local.dmg` | 19M | `4f4949fd4f72e27b4a20133e279020496cddca7ad80fcfb0b280cb945b3d643e` |
+| x86_64 | `PrivateVoice Input-2.1.21-build20260603.1327-x86_64-local.dmg` | 22M | `0270c58ebd64a8db9355ff867efa97ec3c2343fe2e3bcbc7e50a3e15590d27dc` |
+
+## 验证结果
+
+- `npm run build`: PASS。存在既有 Svelte a11y warning,非 Round 3 新增阻断项。
+- `go test ./... -count=1`: PASS。
+- `git diff --check`: PASS。
+- arm64 app `codesign -vvv --deep --strict`: PASS。
+- x86_64 app `codesign -vvv --deep --strict`: PASS。
+- arm64 DMG `hdiutil verify`: VALID。
+- x86_64 DMG `hdiutil verify`: VALID。
+- Moonshine English 真实下载、解包、模型结构验证、sherpa-onnx 引擎加载: PASS。
+  - 下载 URL: `https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-moonshine-base-en-int8.tar.bz2`
+  - 下载体积: `250807309` bytes。
+  - 加载结果: `Engine initialized: Moonshine English · CPU`。
+
+## 日志
+
+- `logs/build-arm64.log`
+- `logs/build-x86_64.log`
+- `logs/verify-dmgs.log`
+- `logs/moonshine-download-load.log`
+- `SHA256SUMS.txt`
+
+## QA 范围
+
+本包已经完成自动化、打包门禁和 Moonshine 真实下载/加载验证。仍需真实使用 QA 验证:
+
+- 英文环境或手动切换 English 后,默认模型为 Moonshine English。
+- Moonshine English 下载成功后,可加载并识别英文。
+- 断网后英文识别仍可工作。
+- 中文环境或手动切换简体中文后,仍默认使用 SenseVoice。
+- 中英文切换时,缺模型提示、下载状态、重载行为符合 Round 3 PRD。
diff --git a/Release/PrivateVoice-Input-2.1.21-build20260603.1327/SHA256SUMS.txt b/Release/PrivateVoice-Input-2.1.21-build20260603.1327/SHA256SUMS.txt
new file mode 100644
index 0000000..00dabab
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.21-build20260603.1327/SHA256SUMS.txt
@@ -0,0 +1,2 @@
+4f4949fd4f72e27b4a20133e279020496cddca7ad80fcfb0b280cb945b3d643e  PrivateVoice Input-2.1.21-build20260603.1327-arm64-local.dmg
+0270c58ebd64a8db9355ff867efa97ec3c2343fe2e3bcbc7e50a3e15590d27dc  PrivateVoice Input-2.1.21-build20260603.1327-x86_64-local.dmg
diff --git a/Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/build-arm64.log b/Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/build-arm64.log
new file mode 100644
index 0000000..18deb51
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/build-arm64.log
@@ -0,0 +1,130 @@
+
+==> 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...
+1:32:58 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:32:58 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:32:59 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 1.28s
+
+==> Building Go binary (arm64)
+# voicesnap
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-1292996650/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-Round3/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-Round3/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-Round3/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-Round3/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input: replacing existing signature
+/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/arm64/PrivateVoice Input.app: replacing existing signature
+
+==> Verifying app signature
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/arm64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/arm64/PrivateVoice Input.app: valid on disk
+/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/arm64/PrivateVoice Input.app: satisfies its Designated Requirement
+Executable=/Users/ar/Projects/VoiceSnap-2.1.1-Round3/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=28311 flags=0x10000(runtime) hashes=874+7 location=embedded
+Signature size=1830
+Authority=PrivateVoice Local Code Signing
+Signed Time=Jun 3, 2026 at 13:33:00
+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-Round3/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 $9AC4C505
+正在检查“GPT Header(Primary GPT Header:1)”的校验和…
+    GPT Header(Primary GPT Header:1):已验证CRC32 $F98F597A
+正在检查“GPT Partition Data(Primary GPT Table:2)”的校验和…
+GPT Partition Data(Primary GPT Table:已验证CRC32 $856647DC
+正在检查“(Apple_Free:3)”的校验和…
+                      (Apple_Free:3):已验证CRC32 $00000000
diff --git a/Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/build-x86_64.log b/Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/build-x86_64.log
new file mode 100644
index 0000000..4ae6e69
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/build-x86_64.log
@@ -0,0 +1,136 @@
+
+==> 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...
+1:31:42 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:31:42 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:31:42 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 740ms
+
+==> Building Go binary (x86_64)
+# voicesnap
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/go.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000000.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000001.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000002.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000003.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000004.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000005.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000006.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000007.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000028.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000029.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000030.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000031.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000032.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000033.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000034.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000035.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000036.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000037.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000038.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000039.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000040.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000041.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000042.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000043.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000044.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000045.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000046.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000047.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000048.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000049.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000050.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000051.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000052.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000053.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000054.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: object file (/private/var/folders/tz/gdr6h5t96cj4r08kchkjx2b00000gn/T/go-link-435413150/000055.o) was built for newer 'macOS' version (26.0) than being linked (10.13)
+ld: warning: building for macOS-10.13, but linking with dylib '@rpath/libsherpa-onnx-c-api.dylib' which was built for newer version 10.15
+ld: warning: building for macOS-10.13, 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-Round3/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+
+==> Code signing with stable local identity
+/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib: replacing existing signature
+/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/x86_64/PrivateVoice Input.app: replacing existing signature
+
+==> Verifying app signature
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libsherpa-onnx-c-api.dylib
+--prepared:/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+--validated:/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/Frameworks/libonnxruntime.1.23.2.dylib
+/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/x86_64/PrivateVoice Input.app: valid on disk
+/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/x86_64/PrivateVoice Input.app: satisfies its Designated Requirement
+Executable=/Users/ar/Projects/VoiceSnap-2.1.1-Round3/privatevoice.src/build/local/x86_64/PrivateVoice Input.app/Contents/MacOS/PrivateVoice Input
+Identifier=com.privatevoice.input
+Format=app bundle with Mach-O thin (x86_64)
+CodeDirectory v=20500 size=122295 flags=0x10000(runtime) hashes=3811+7 location=embedded
+Signature size=1830
+Authority=PrivateVoice Local Code Signing
+Signed Time=Jun 3, 2026 at 13:31:49
+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-Round3/privatevoice.src/build/local/x86_64/PrivateVoice Input-2.1.21-build20260603.1327-x86_64-local.dmg
+
+==> Signing DMG
+正在检查“Protective Master Boot Record(MBR:0)”的校验和…
+Protective Master Boot Record(MBR:0):已验证CRC32 $4899B966
+正在检查“GPT Header(Primary GPT Header:1)”的校验和…
+    GPT Header(Primary GPT Header:1):已验证CRC32 $9B55D9FA
+正在检查“GPT Partition Data(Primary GPT Table:2)”的校验和…
+GPT Partition Data(Primary GPT Table:已验证CRC32 $9E62AC64
+正在检查“(Apple_Free:3)”的校验和…
+                      (Apple_Free:3):已验证CRC32 $00000000
+正在检查“disk image(Apple_APFS:4)”的校验和…
+            disk image(Apple_APFS:4):已验证CRC32 $7B970FC3
+正在检查“GPT Partition Data(Backup GPT Table:5)”的校验和…
+GPT Partition Data(Backup GPT Table::已验证CRC32 $9E62AC64
+正在检查“GPT Header(Backup GPT Header:6)”的校验和…
+     GPT Header(Backup GPT Header:6):已验证CRC32 $15CB531C
+已验证CRC32 $BBFD08FB
diff --git a/Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/moonshine-download-load.log b/Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/moonshine-download-load.log
new file mode 100644
index 0000000..46cfa80
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/moonshine-download-load.log
@@ -0,0 +1,14 @@
+=== RUN   TestMoonshineDownloadValidateAndLoad
+[2026-06-03 13:36:47] INFO Downloading model from URL 1: https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-moonshine-base-en-int8.tar.bz2
+    moonshine_download_load_test.go:28: download progress 25.3% (63354163/250807309)
+    moonshine_download_load_test.go:28: download progress 50.0% (125415434/250807309)
+    moonshine_download_load_test.go:28: download progress 75.2% (188709519/250807309)
+    moonshine_download_load_test.go:28: download progress 100.0% (250807309/250807309)
+[2026-06-03 13:40:43] INFO Extracting model archive...
+[2026-06-03 13:40:55] INFO Model download and extraction complete
+[2026-06-03 13:40:55] INFO Loading model moonshine-en backend=moonshine from /tmp/privatevoice-round3-moonshine.dzSu2w/moonshine-en
+[2026-06-03 13:40:55] INFO Engine initialized: Moonshine English · CPU
+moonshine qa ok: dir=/tmp/privatevoice-round3-moonshine.dzSu2w/moonshine-en backend=moonshine
+--- PASS: TestMoonshineDownloadValidateAndLoad (248.45s)
+PASS
+ok  	voicesnap/qa_round3_tmp	249.276s
diff --git a/Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/verify-dmgs.log b/Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/verify-dmgs.log
new file mode 100644
index 0000000..7e58e39
--- /dev/null
+++ b/Release/PrivateVoice-Input-2.1.21-build20260603.1327/logs/verify-dmgs.log
@@ -0,0 +1,34 @@
+正在检查“Protective Master Boot Record(MBR:0)”的校验和…
+Protective Master Boot Record(MBR:0):已验证CRC32 $9AC4C505
+正在检查“GPT Header(Primary GPT Header:1)”的校验和…
+    GPT Header(Primary GPT Header:1):已验证CRC32 $F98F597A
+正在检查“GPT Partition Data(Primary GPT Table:2)”的校验和…
+GPT Partition Data(Primary GPT Table:已验证CRC32 $856647DC
+正在检查“(Apple_Free:3)”的校验和…
+                      (Apple_Free:3):已验证CRC32 $00000000
+正在检查“disk image(Apple_APFS:4)”的校验和…
+            disk image(Apple_APFS:4):已验证CRC32 $C6918788
+正在检查“(Apple_Free:5)”的校验和…
+                      (Apple_Free:5):已验证CRC32 $00000000
+正在检查“GPT Partition Data(Backup GPT Table:6)”的校验和…
+GPT Partition Data(Backup GPT Table::已验证CRC32 $856647DC
+正在检查“GPT Header(Backup GPT Header:7)”的校验和…
+     GPT Header(Backup GPT Header:7):已验证CRC32 $4230B540
+已验证CRC32 $679A3586
+hdiutil: verify: checksum of "Release/PrivateVoice-Input-2.1.21-build20260603.1327/PrivateVoice Input-2.1.21-build20260603.1327-arm64-local.dmg" is VALID
+正在检查“Protective Master Boot Record(MBR:0)”的校验和…
+Protective Master Boot Record(MBR:0):已验证CRC32 $4899B966
+正在检查“GPT Header(Primary GPT Header:1)”的校验和…
+    GPT Header(Primary GPT Header:1):已验证CRC32 $9B55D9FA
+正在检查“GPT Partition Data(Primary GPT Table:2)”的校验和…
+GPT Partition Data(Primary GPT Table:已验证CRC32 $9E62AC64
+正在检查“(Apple_Free:3)”的校验和…
+                      (Apple_Free:3):已验证CRC32 $00000000
+正在检查“disk image(Apple_APFS:4)”的校验和…
+            disk image(Apple_APFS:4):已验证CRC32 $7B970FC3
+正在检查“GPT Partition Data(Backup GPT Table:5)”的校验和…
+GPT Partition Data(Backup GPT Table::已验证CRC32 $9E62AC64
+正在检查“GPT Header(Backup GPT Header:6)”的校验和…
+     GPT Header(Backup GPT Header:6):已验证CRC32 $15CB531C
+已验证CRC32 $BBFD08FB
+hdiutil: verify: checksum of "Release/PrivateVoice-Input-2.1.21-build20260603.1327/PrivateVoice Input-2.1.21-build20260603.1327-x86_64-local.dmg" is VALID
diff --git a/Release/PrivateVoice-Input-2.1.23-build20260603.1904/SHA256SUMS.txt b/Release/PrivateVoice-Input-2.1.23-build20260603.1904/SHA256SUMS.txt
index 2d8ff16..6d20ec9 100644
--- a/Release/PrivateVoice-Input-2.1.23-build20260603.1904/SHA256SUMS.txt
+++ b/Release/PrivateVoice-Input-2.1.23-build20260603.1904/SHA256SUMS.txt
@@ -1 +1 @@
-f8d4da74e98b727420982ecaca4ba03a361b7a38616d51ebf17eba5bdb4f0fac  Release/PrivateVoice-Input-2.1.23-build20260603.1904/PrivateVoice Input-2.1.23-build20260603.1904-arm64-local.dmg
+f8d4da74e98b727420982ecaca4ba03a361b7a38616d51ebf17eba5bdb4f0fac  PrivateVoice Input-2.1.23-build20260603.1904-arm64-local.dmg
diff --git "a/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.10-build20260530.1640/\346\265\213\350\257\225\350\257\264\346\230\216.md" "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.10-build20260530.1640/\346\265\213\350\257\225\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..269a4be
--- /dev/null
+++ "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.10-build20260530.1640/\346\265\213\350\257\225\350\257\264\346\230\216.md"
@@ -0,0 +1,30 @@
+# PrivateVoice Input 2.1.10 测试说明
+
+版本:2.1.10  
+Build:20260530.1640  
+用途:历史记录 CSV 勘误与词库自动扩充 Phase 1 测试包
+
+## 选择安装包
+
+- Apple Silicon Mac:`PrivateVoice Input-2.1.10-build20260530.1640-arm64-local.dmg`
+- Intel Mac:`PrivateVoice Input-2.1.10-build20260530.1640-x86_64-local.dmg`
+
+## 注意
+
+本包使用本机 `PrivateVoice Local Code Signing` 证书签名,没有 Developer ID 公证。换电脑测试时,如果 macOS 提示无法打开,可先用右键打开;如果仍被拦截,这是签名/公证限制,不代表功能代码启动失败。
+
+## 本轮重点验证
+
+- 历史页能导出勘误 CSV
+- CSV 能用 Numbers 或 Excel 打开,中文不乱码
+- 词库页能选择并预览勘误 CSV
+- 预览中新增、重复、冲突、无效、空项、超限统计正确
+- 点击确认后只追加新增规则
+- 导入后的规则能在后续识别文本中生效
+- 取消导出、取消选择文件、取消预览时不会写入词库
+
+## 校验值
+
+- arm64 SHA256:`9e13ab5257368ddef2dd04919b3b9f6623be322238d9c7cd12ac85e348572684`
+- x86_64 SHA256:`08c115217fbe441864113149d79b1d93914f63eac3101393e1e94ff94878329e`
+
diff --git "a/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.12-build20260530.1800/\346\265\213\350\257\225\350\257\264\346\230\216.md" "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.12-build20260530.1800/\346\265\213\350\257\225\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..f28744c
--- /dev/null
+++ "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.12-build20260530.1800/\346\265\213\350\257\225\350\257\264\346\230\216.md"
@@ -0,0 +1,40 @@
+# PrivateVoice Input 2.1.12 测试说明
+
+版本:2.1.12  
+Build:20260530.1800  
+用途:历史记录 CSV 勘误与词库自动扩充 Phase 1 测试包
+
+## 选择安装包
+
+- Apple Silicon Mac:`PrivateVoice Input-2.1.12-build20260530.1800-arm64-local.dmg`
+- Intel Mac:`PrivateVoice Input-2.1.12-build20260530.1800-x86_64-local.dmg`
+
+## 本轮界面变化
+
+- 勘误 CSV 导出表头改为中文
+- 样例行文字改为“正确的格式是点 CSV”
+- 词库页按钮改为“导入用户词库 / 导出用户词库”
+- “导入勘误表”按钮移动到词库页工具栏最右侧
+
+## 注意
+
+本包使用本机 `PrivateVoice Local Code Signing` 证书签名,没有 Developer ID 公证。换电脑测试时,如果 macOS 提示无法打开,可先用右键打开;如果仍被拦截,这是签名/公证限制,不代表功能代码启动失败。
+
+## 本轮重点验证
+
+- 历史页能导出勘误 CSV
+- CSV 表头为中文,示例行对普通用户可读
+- CSV 能用 Numbers 或 Excel 打开,中文不乱码
+- 词库页左侧显示“导入用户词库 / 导出用户词库”
+- 词库页右侧显示“导入勘误表”
+- 词库页能选择并预览勘误 CSV
+- 预览中新增、重复、冲突、无效、空项、超限统计正确
+- 点击确认后只追加新增规则
+- 导入后的规则能在后续识别文本中生效
+- 取消导出、取消选择文件、取消预览时不会写入词库
+
+## 校验值
+
+- arm64 SHA256:`d1a04a87342266f27bff2b97e81fa5135e1ceef01d025bc58500bdf881eafc80`
+- x86_64 SHA256:`efac067af7872a3bd07b5e59e3c78ec92d47443226cdc1a185ecdcc41594251f`
+
diff --git "a/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.13-build20260530.1949/SHA256SUMS.txt" "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.13-build20260530.1949/SHA256SUMS.txt"
new file mode 100644
index 0000000..4e20842
--- /dev/null
+++ "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.13-build20260530.1949/SHA256SUMS.txt"
@@ -0,0 +1,2 @@
+b27bf8a92928ec469515c8cb44736fde1aab49662297a3933d252e02eecedd40  PrivateVoice Input-2.1.13-build20260530.1949-arm64-local.dmg
+ec5249e2178200adfcbcbf2832a7a5c8e0317231dbaddb8cf1fd731ad5dc0792  PrivateVoice Input-2.1.13-build20260530.1949-x86_64-local.dmg
diff --git "a/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.14-build20260531.0120/SHA256SUMS.txt" "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.14-build20260531.0120/SHA256SUMS.txt"
new file mode 100644
index 0000000..cc26778
--- /dev/null
+++ "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.14-build20260531.0120/SHA256SUMS.txt"
@@ -0,0 +1,2 @@
+8f5f8b2ba0de12aa90fb74c606b28d86a4a2c9a7a487dda69758ce98d7c193c7  PrivateVoice Input-2.1.14-build20260531.0120-arm64-local.dmg
+1e7cf9f09fdf89d606a4bb5b2d0144ea51684f26ee6f2c2a400d741325839efa  PrivateVoice Input-2.1.14-build20260531.0120-x86_64-local.dmg
diff --git "a/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.15-build20260531.1102/SHA256SUMS.txt" "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.15-build20260531.1102/SHA256SUMS.txt"
new file mode 100644
index 0000000..8fe92d0
--- /dev/null
+++ "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.15-build20260531.1102/SHA256SUMS.txt"
@@ -0,0 +1,2 @@
+7439d7fce124136afb3741310ba3481c5b115393ff85e00eef10459dc2c58f29  PrivateVoice Input-2.1.15-build20260531.1102-arm64-local.dmg
+43e4105c9ba8d554642505de966f7799608f442710e3a760a2e0791047912114  PrivateVoice Input-2.1.15-build20260531.1102-x86_64-local.dmg
diff --git "a/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.16-build20260531.1131/SHA256SUMS.txt" "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.16-build20260531.1131/SHA256SUMS.txt"
new file mode 100644
index 0000000..343d5f6
--- /dev/null
+++ "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.16-build20260531.1131/SHA256SUMS.txt"
@@ -0,0 +1,2 @@
+3237c7604ec0bdcc368a399b20818fadc82b88c3a57117f57cffc18838c9919d  PrivateVoice Input-2.1.16-build20260531.1131-arm64-local.dmg
+b96d42eb1ffd9b58f9bd7757637181a6e26dcaaa199c2e054a7fa8cfccbb76eb  PrivateVoice Input-2.1.16-build20260531.1131-x86_64-local.dmg
diff --git "a/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.17-build20260531.1359/SHA256SUMS.txt" "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.17-build20260531.1359/SHA256SUMS.txt"
new file mode 100644
index 0000000..8d7782f
--- /dev/null
+++ "b/Release/X-\346\227\247\347\211\210build\346\210\220\346\236\234/PrivateVoice-Input-2.1.17-build20260531.1359/SHA256SUMS.txt"
@@ -0,0 +1,2 @@
+4ebbc0b979193a2b38a8f755f4c11130b16c9429ea7fb8a559be91d0fddab290  PrivateVoice Input-2.1.17-build20260531.1359-arm64-local.dmg
+a57b727ca7d374493883bf97e2b5cf18cc8e58ac952eb53aa105e79d8bf1cf7a  PrivateVoice Input-2.1.17-build20260531.1359-x86_64-local.dmg

--
Gitblit v1.9.3