# 录音日历与三层覆盖时间轴

更新日期：2026-09-19。范围：桌面插件源码与独立 Web 预览，不修改手机端、后端或已安装 Arkme 客户端。

## 呈现口径

- 日历去除外层卡片、内层网格的双重边框和星期分隔线，使用留白与柔和选中底色；日期、农历、时长及新录音提示保持。
- 时间轴底色表示无已知录音，淡蓝色覆盖表示实际音频范围，人声片段叠加在覆盖层上。详细轴保留不同说话人的颜色。
- 录音覆盖来自原始音频分片的起点、时长，不再由首尾转写推算；分片之间的真实空档不能补满。
- 云端覆盖必须有 `session.belong_usr === 当前登录用户 ID` 的明确归属。仅有上传账号 `user_id` 相同，或说话人识别为本人，均不能替代这个条件；`belong_usr=0`、归属他人不纳入，缺失归属标记为范围待确认。
- 时间轴人声层和说话人统计使用相同的录音归属范围。每日转写列表及其播放/编辑能力保持原有可访问范围，不删除或修改用户录音。日历月度总时长仍沿用已有后端统计口径，本轮不改统计接口。
- 08:00–20:00 的完整录音即使没有转写，也显示这 12 小时覆盖。没有转写不等于确认静音，界面使用“暂无已识别人声”。
- 读取失败或数据不完整时明确提示，不把未知区间断言为无录音。

## 数据与兼容

`recordings.day` 新增可选 `coverage`。继续使用现有每日音频读取合同，无新增后端接口：

- `child_ls` 的 `start_at + duration` 提供物理音频区间，兼容历史相对 session 起点的偏移；按所选日期裁剪。
- 每日接口查询当前账号的 session 及其全部 children，不以 `has_asr` 为查询条件；插件再筛选明确归属于本人的 session。归属判断使用服务端认证用户，不接受前端传入任意用户 ID。
- 浏览器转写条目新增可选 `recordingBelongsToViewer` 标志，仅用于时间轴范围；它与已有的 `isSelf`（说话人身份）互不替代，不暴露源 session ID。
- 缺少 children 时，只有完成且时长严格等于起止跨度的连续 session 才可回退；其余标记范围待确认。
- “已识别人声”目前使用已有非背景音转写片段，不声称存在独立、完整的 VAD 人声结果。
- 手机长录音、手机 Web 控制的全天候录音及导入文件，只要已经形成云端音频分片，均走相同覆盖逻辑。
- 手机当前仍在录制、尚未同步的范围不能由桌面猜测；跨端实时录制状态仍依赖同事提供的统一状态合同。

## 本机直接录音

- 用已采集 PCM 时长扩展覆盖，不把申请权限/启动中当作有录音。
- 覆盖按环境及账号隔离，并按日期裁剪；录制中右端点呼吸，保存/停止后不继续呼吸。
- 待上传保留本机覆盖；上传接受后保留不含音频的临时覆盖元数据，直到云端相同范围确认后移交。
- 多个相邻或重叠云端分片可联合确认完整范围，但不能跨越真实缺口。上传衔接期按现有退避刷新方式拉取每日数据，离开录音页停止轮询。
- 临时“已提交”元数据仅本次运行保留；已完成云端录音仍由每日数据恢复，不伪造持久跨端状态。

## 验证记录

- 初版 9 个相关测试文件、167 项自动测试通过。补齐明确归属口径后，11 个相关测试文件、217 项自动测试通过；类型检查、构建、差异格式检查通过。
- 自动测试覆盖：完全无转写的 12 小时录音、分片空档、跨午夜、历史相对起点、识别中、错误/未知状态、账号隔离、本机录音与上传交接、覆盖缩放、停止呼吸及原有时间轴交互。
- 在固定、已登录的 `http://127.0.0.1:3098/` 实测：9 月 17 日有录音且有人声、9 月 18 日无录音、9 月 19 日有录音无转写。确认 30 分钟到 15 分钟缩放、明暗配色与页面无横向溢出。
- 真实界面验证未开启麦克风、未上传音频、未修改或删除用户录音。直接录音生命周期使用隔离测试数据验证，不等同于新增真人长录音端到端验收。
- 保持原深色偏好；预览不换端口、不重新读取钥匙串，不触碰正式客户端。
