用户确认按“X-ASR 松键后尾部采集保护”方案修复偶发尾字掉字问题,并要求:
仅改 X-ASR 实验分支的尾部采集相关代码与测试:
privatevoice.src/internal/engine/engine.goReleaseTailCaptureEngine 可选能力接口。privatevoice.src/internal/engine/engine_darwin.goReleaseTailCaptureDelay()。300ms。privatevoice.src/app.goreplaceEngine() 时缓存 tail delay 到 releaseTailCaptureNanos,停止录音路径不再抢 engineMu。StopAndGetSamples()。HasVoiceActivity() 改到尾采和停止录音之后读取。isStoppingRecording,尾采未完成时阻止下一次录音启动,避免连续触发串音或设备状态竞争。privatevoice.src/app_live_caption_test.goprivatevoice.src/internal/engine/engine_darwin_test.go第一轮发现阻塞问题:
engineMu,可能与实时字幕/识别锁形成录音生命周期竞态。hasVoice 在尾采前快照,尾采期间捕获到的语音可能不参与 VAD。已修复后第二轮复审:
engineMu;isStoppingRecording 阻止尾采期间新录音。StopAndGetSamples(),再读取 HasVoiceActivity()。isStoppingRecording,已补。第一轮无阻塞,指出:
releaseTailCaptureDelay() 等 engineMu 有可感知延迟风险。已修复后第二轮复审:
自动化 QA 通过,未使用临时 GUI/AX/cliclick/screencapture 命令。
本地执行:
go test ./...:通过;仅有既有 macOS / onnxruntime 最低系统版本链接 warning。go test -race . ./internal/engine ./internal/audio ./internal/input:通过。go test -race -count=20 -run 'TestStartRecordingIgnoredWhileStoppingRecording|TestStartTapRecordingIgnoredWhileStoppingRecording|TestReleaseTailCapture' .:通过。npm run build:通过;仅有既有 Svelte a11y warning。./scripts/build-local-macos.sh arm64:通过,签名与 DMG verify 成功。该构建未安装到 /Applications,且未递增 build,因此仅作为构建验证证据。QA 角色独立结论:
engineMu。isStoppingRecording 覆盖连续快速触发风险。真实语音尾字效果需要用户拿后续测试包做人工验证:
当前工作区存在大量与本次修复无关的 Release 产物、文档、AGENTS 等未提交/未跟踪变动。本次提交必须只包含上述源码、测试与本记录,不得混入无关产物。