# 录音转写对比菜单

工具栏的“转写对比”悬停或点击打开选择面板，打开和选择方案均只读。对比窗口中通过明确的“使用此策略处理”或“开始豆包转写”按钮提交处理。日历工具栏默认查看所选日期的全部录音，不要求选择小时或文件。默认版与测试版v1聚合展示当天各源件的独立结果；豆包保留已有的当天转写增强范围，不冒充完整的分人转写策略。文件列表仍保留单文件对比入口。

## 行为与数据来源

- 按当前日历范围分页读取录音元数据，每页最多50条。只列出当前账号上传的录音，内存归属其他人的可读正文不等于拥有其原件。
- 打开菜单不查询正文，也不提交处理；选择策略后分页发现当天录音及其源件。源件元数据补充服务端已确认的结束时间，跨午夜录音保留当天相交内容，排除同一长会话中的其他日期文件。结束时间尚未确认的历史源件可读取，但无法确认属于当天时不纳入批量处理。
- 长文件名按控件宽度省略显示，悬停显示完整名称；原始文件名和源件引用不变。菜单网格限制最小列宽，避免文件名把策略与状态撑出可见区域。
- 左侧按时间连续显示当天正式结果，右侧显示所选策略；每个音频标注真实的 `officialStrategy`，不读取账号偏好推断旧结果。当日混用过不同策略时也不改写历史事实。
- 没有结果时，只有服务端确认正式处理成功、原件仍存在且在保留期内，才在对比窗口提供“处理当天未生成部分”按钮。明确点击后逐文件提交既有幂等命令，执行前重新核验条件，已有结果和已使用该策略的正式录音不重复处理。部分失败保留成功提交，可再提交剩余部分。客户端在截止时禁用新处理入口，服务端继续负责最终校验。
- 已有、处理中、部分失败的独立结果均可打开，不重新启动；原件过期不影响读取已有结果。
- 豆包仍使用已有增强入口（可使用压缩播放音频），独立于完整策略原件的两天有效期；选择豆包只读取结果，只有点击“开始豆包转写”才发起当天处理。
- 选择对比不会更改账号默认策略、正式结果、已绑定说话人、总结或后续 AI 数据。
- 元数据请求最多并发 3 个；每列正文按可见区域逐页续读，每次仅一个请求。某文件处理中不阻塞后续文件，恢复后继续读取而不重复其他正文。日期/账号切换与关闭取消读取及未提交任务，已受理任务继续由服务端恢复。支持键盘打开、Escape、外部点击和加载失败重试。
- 已知正在处理的文件遇到可重试状态读取错误时，保留错误提示并继续自动查询；服务端明确不可重试的错误停止自动查询，仍可手动重试。读取恢复或轮询不创建处理任务，完成后停止轮询。

## 统一对比视图

- 策略对比与豆包对比共用 `RecordingComparisonView` 的全屏框架、列标题和发言行；左右列独立滚动，各列保留自己的阅读位置与自动分页。视图通过 portal 放在页面顶层，避免工具栏的局部层级使时间轴穿透。
- 正式结果在左，对比结果在右。策略列仍显示真实策略名称；豆包左列保留“系统转写”，因为当天可能包含不同策略生成的正式录音，不能用账号当前设置替代历史事实。
- 标题区区分“单个音频”和“当天录音”；文件名超宽省略并保留全名提示。完整策略各列的说话人编号保持独立；滚动任一列不会定位或滚动另一列，便于人工对照。
- 两种视图均支持双击发言或回车/空格播放、当前播放列暂停、关闭取消播放请求。短于一秒的正时长显示 `<1秒`，不把它误显示为零秒；正文和时间数据不变。
- 共享层只负责呈现与交互。策略原件有效期、源件与结果分页、豆包当天增强、各自的播放授权及处理提交保持独立；打开对比不会提交任务。

此前统一视图回归（当时包含滚动联动，现已移除）：全仓 14,308 项测试通过、24 项跳过；portal 层级修正后重跑 55 项相关测试通过，包含键盘焦点、按时间同步滚动、防止单击误播放、正式策略列顺序、过期结果可读、取消播放及处理提交边界。类型检查和最终 tgz 构建通过。纯 UI 变更，不新增 Host/SDK/Tools 能力或配置项。

最终安装包在隔离的官方 DSH 实例完成实际浏览器验收：策略与豆包均为正式结果在左、对比结果在右；仅打开两种对比页不提交处理，明确点击处理按钮后结果更新。两种页面均无时间轴穿透。另复现并修复处理完成移除按钮后焦点落到 body 导致 Esc 失效的问题；补充回归先失败后通过，48 项相关测试、类型检查及重新打包通过，重新安装后实际验证该场景的 Esc 关闭正常。最终浏览器验收使用 macOS 内置浏览器与本地协议夹具，不代表模型质量或生产端到端验收。

## 能力覆盖

| 消费面 | 实现 | 验证 |
| --- | --- | --- |
| UI | `RecordingComparisonMenu` 组合已有策略比较与豆包入口；复用双列结果组件 | 单测及不可变 tgz 在未修改官方 DSH 0.2.1-rc.2 的 Chrome 页面验收 |
| Host | `RecordingService.recordingStrategies` 的 `recordings` 只读动作，复用 Audio 录音查询 | 账号校验、分页引用的账号/日期绑定、空页继续、缺失归属、异常范围测试 |
| SDK | `recordingStrategies({action:'recordings',startAtMillis,endAtMillis,cursor?})`；能力 `recordingStrategyRecordingsV1` | 独立仓外 TypeScript Consumer 编译并调用已安装插件；旧 Provider 显式拒绝 |
| Tool | `arkme_recording_strategies` 增加 `recordings` 动作及日期范围参数，沿用只读权限 | 官方 DSH 真实 Agent 会话发现工具、调用并读取不透明引用结果；未触发处理 |

三端共用 Host 权限和分页处理，不暴露上游凭据或数据库ID。不新增后端接口、集合、索引、配置或原件保留成本。

## 2026-10-27 验收

- typecheck / build / diff check 通过。
- 全仓：1,261 个文件通过、18 个跳过；14,302 项测试通过、24 项跳过。
- 本地独立 DSH 使用打包插件和可控 Audio 协议夹具，验证打开菜单零提交、选择测试版零提交、在结果窗口点击处理按钮一次提交、双列结果、原件过期后已生成结果仍可读取，以及选择豆包零提交、点击开始按钮才启动当天增强。
- 夹具刻意设置“账号偏好=测试版v1、正式结果=默认版”，页面正确显示正式结果策略。
- 本轮未修改/重跑模型算法；此验收覆盖菜单、协议与状态行为，不代表新的模型质量测评。实际浏览器为 macOS Chrome，未声称 Windows/Linux 原生验收。

### 长文件名布局修正

- 仅调整 UI 宽度约束和全名提示，Tools/SDK/Host 无能力变更。
- 相关 43 项测试、typecheck 和打包构建通过。不可变 tgz 在隔离 DSH 的 Chrome 页面使用含 UUID、中文和扩展名的长文件名验收：省略号可见，`title` 保留全名；菜单 `clientWidth` 与 `scrollWidth` 均为 338px，无横向溢出，全部策略状态可见。

### 分片自动续载修正

- 共享展示层按可见高度与滚动位置自动续载；少量正文、空存储分片不会要求用户逐次点击“加载更多”。两种对比仍各自使用原分页 owner 和权限。
- 单次请求互斥；未推进的处理中游标不循环请求。网络失败保留已显示正文并提供显式重试；播放错误与分页错误分开。
- 本次仅修改 UI 状态与展示，Host/SDK/Tools 能力无变化，不增加配置。
- Node 24 全仓 1,263 个测试文件通过、18 个跳过；14,313 项测试通过、24 项跳过。相关回归、类型检查、打包构建通过。
- 最终不可变 tgz 经未修改官方 DSH 0.2.1-rc.2 的新 Profile 安装；Chrome 实际验收首分片仅两句、下一分片为空时自动继续到后续正文，无手动加载按钮，浏览期间策略与豆包提交次数均为零。页面使用本地协议夹具，不冒充云端模型端到端验收。

### 默认全天范围

- UI：日历工具栏无时间/文件选择器，直接查看当天全部录音；正文连续自动续载。单文件入口仍存在于音频文件列表。
- Audio：现有 Sources 查询增加可选 `end_at`，从同一物理源件的已确认分片时间流式投影，每页最多 100 个源件；不读取正文/声纹，不使用客户端时长提示，不新增集合、字段持久化、索引、配置或迁移。
- Host / SDK / Tools：沿用现有 `sources` 只读动作与统一 owner，增加可选 `endAtMillis` 返回字段。缺失时保持未知，不用会话结束时间或下一个文件猜测。没有新增命令或权限。
- 对比聚合只是读取视图；正式结果、独立说话人编号、播放授权、模型处理顺序和原件保留策略均不改变。

- 本轮全仓验证：1,264 个测试文件通过、18 个跳过；14,321 项测试通过、24 项跳过。类型检查、构建及最终不可变 tgz 安装通过。Audio Sources 的真实本地 MongoDB 副本集测试及根目录架构检查通过。
- 最终安装包在未修改官方 DSH 0.2.1-rc.2 中，通过真实 Agent 会话读取当天录音和源件，确认 `endAtMillis` 可读且无内部 ID；仓外 TypeScript Consumer 编译并通过公开 SDK 读取同一字段，旧 Provider 显式拒绝。
- Chrome 实际验收上午、下午两份音频连贯展示，空正文页自动继续，打开/阅读零提交，明确点击后只提交缺少结果的一份。使用本地协议夹具，未部署测试服，不代表云端模型质量或 Windows/Linux 原生验收。

### 全天对比阅读布局

- 正文区仅为已有转写呈现时间分组，连续空文件不会重复铺出空状态，也不会阻止自动续读后面的正文。时间分组保留各源件的独立说话人语义；源文件全名可悬停查看。
- 每列集中展示已完成、处理中、处理失败、未生成数量。逐文件状态收进默认折叠的“处理详情”；详情中的长文件名省略，保留完整名称提示。只有整列读完且无正文时才出现一次空提示；读取失败、处理中和未生成分别说明。
- 处理入口仍只提交符合条件且未生成的录音；查看与刷新保持只读。提交提示明确说明复用已有结果，可手动收起。正文、分人映射、播放引用、分页 owner 与后端任务均不改变。
- 能力范围：纯 UI 呈现与交互，Host / SDK / Tools 沿用现有接口，不新增能力、配置、持久状态或运维步骤。
- 相关回归覆盖九份录音中连续空结果、混合完成/处理/失败/未生成、原件过期、跨午夜、后续正文续载、已有结果零重复提交及折叠详情键盘焦点。
- 验证结果：27 项针对性测试通过；全仓 14,323 项通过、24 项跳过，唯一失败为并行打包清理 `lib/client.js` 的构建竞争，该文件的 5 项测试随后串行复验全部通过。类型检查、最终 Node 24 打包构建通过。
- 最终不可变 tgz 在未修改的官方 DSH 0.2.1-rc.2 中使用本地协议夹具验收：9 份录音中 6 份无正文，双列均自动读取到后面 3 份共 12 条正文；处理中/失败/未生成集中呈现，详情默认折叠。打开和展开详情零提交，明确点击仅提交缺少的 1 份，重开页面不增加提交；1440px 与 720px 下无横向溢出，长文件名省略且保留全名。此为 UI 验收，不代表模型质量测评；未替换用户 3082 实例。

### 最终审查：读取恢复与原件依赖

- 沿菜单、全天录音发现、源件权限、显式提交、任务幂等与恢复、分页、播放授权、原件清理检查。保留首次正式结果，不覆盖说话人、总结或后续 AI 数据；跨午夜按源件物理时间投影，已有结果不因原件到期而隐藏。
- 复现并修复：一次临时状态查询失败会使已知处理中任务退出轮询。现在依据已有错误协议区分可重试/不可重试，前者自动恢复，后者停止自动请求并保留手动重试。两类场景均有 UI 回归，读取恢复不发起处理。
- Audio 同步修复：其他策略均已接纳后，状态读取不再探测原件存储。真实本地 Mongo 测试覆盖处理中、成功、失败结果，以及缺少结果时仍核验原件；未修改任务接纳、算法或结果发布。
- 最终插件全仓 14,327 项通过、24 项跳过；类型检查、构建通过。Audio 相关真实本地 Mongo 回归 38 项及根包架构检查通过。
- 最终不可变 tgz 安装在未修改的官方 DSH 0.2.1-rc.2 的独立 Profile 中，浏览器实际复现状态接口 HTTP 503，恢复后正文自动显示，整个查看/恢复过程零提交；明确点击后仅提交缺少结果的一份。未替换用户运行中的实例。
- 本轮未重新跑模型质量测评或部署测试服/生产；发布需要同步更新插件和 Audio，无新增配置、数据库迁移或运维步骤。UI/Host/SDK/Tools 使用既有能力与权限边界，无新增业务入口。
