工程版本日志 · 2026.10.04
浮层定位与托盘状态生命周期
2.0.39 候选将浮层放在本次录音对应的显示器,并防止旧停止回调破坏新会话的托盘反馈。以下记录已完成的验证;安装与公开发布验收仍待完成。
01 · 用户症状
旧屏幕坐标与不完整的状态反馈。
检查已安装 Mac 2.0.32 的封装内容后确认:它会更新 tooltip 和菜单,却没有更新托盘图像的状态代码。隐藏浮层后,用户便缺少可见的状态提示。浮层定位同时只保存一组全局 X/Y,可能把上一块屏幕的坐标带入新录音。这些证据指向桌面展示与生命周期问题,不能据此认定 ASR 失败。
02 · 显示器定位
让位置属于当前会话。
2.0.39 通过有界的前台窗口几何查询选择对应显示器,并按显示器保存归一化位置。录音期间锁定自动定位,用户仍可拖动。会话 guard 阻止晚到的几何结果移动较新的录音浮层;显示器移除或尺寸、缩放等指标变化时会重新布局。
Mac 的 will-move 在位置提交前触发,修复后读取实际 move 事件,并排除程序触发的 resize。Windows 等实际移动完成后再调整尺寸。几何查询的时限分别为 Mac 350 ms、Windows 800 ms、可选 X11 xdotool 命令 250 ms。音频采集和 ASR 启动不会等待查询。
查询只读取窗口边界,不读取标题、内容、Cookie、麦克风数据或剪贴板文字。
03 · 托盘生命周期
旧停止回调不能清空新录音。
五个缓存图标保留完整品牌图案,分别表示就绪、红色录音点、琥珀色时钟、绿色勾和珊瑚色错误标记。波形帧不会反复合成图标;隐藏浮层后,托盘仍能显示状态。
MediaRecorder.onstop 现在先检查取消标记和当前录音身份,再清理本地与主进程状态。旧回调不能清空新会话。
04 · 验证
每项检查都有明确边界。
| 检查 | 观察结果 | 证据边界 |
|---|---|---|
| 桌面测试 / 构建 | 220 项:218 通过,2 项 Windows 专用签名检查跳过,0 失败;构建通过 | 代码检查 |
| Mac 隐藏原生浮层探针 | 两块物理显示器上的 26 项断言通过 | 程序驱动的移动 |
| Mac 原生 Tray 探针 | 五种状态全部通过 | 其他系统的图标渲染不代表原生托盘验收 |
| Windows CI 37197345934 | 内部未签名安装包;Windows x64、Mac arm64 / x64、Linux x64 的封装公开 WAV 本地 ASR 验证通过 | 未进行 GUI 安装验收 |
| Linux CI 37197348457 | AppImage / deb 封装与 ELF 原生检查通过 | 未进行 GUI 安装验收 |
CI 使用源码版本 f0efa948f5e6。受控测试不能证明物理鼠标拖动、全屏 Space、混合 DPI、手动麦克风采集、快捷键或目标应用粘贴已验收,也没有新的延迟改善结论。
05 · 发布边界
报告发布与二进制发布分别验收。
Mac arm64 2.0.39 候选已通过 Developer ID 身份、严格签名、架构以及麦克风 / 音频 entitlement 检查,仍未公证、未安装。公开 stable feed 仍提供 2.0.19。
Apple 公证预检返回 HTTP 403,要求接受缺失或已过期的必要账号协议。这不能证明 API key 已过期;法律协议须由账号持有人接受。Windows 也仍缺少已批准的生产签名身份。