diff --git a/docs/requirements/handoff-HEL-905.json b/docs/requirements/handoff-HEL-905.json new file mode 100644 index 0000000..7477c08 --- /dev/null +++ b/docs/requirements/handoff-HEL-905.json @@ -0,0 +1,30 @@ +{ + "baseline_version": "1.12", + "read_commit": "7cb73429f7a0585bed17873179a627c890336c70", + "task": "HEL-905:HEL-903 前端返修与 HEL-904 后台返修的统一离线复审(总工)。在自己独立分支 hel-905-unified-review@7cb73429 集成前端088ac62(原作者源码51669aa,11文件逐字节一致)与后台07dda2b,不重出架构、不另起视觉、不重复派工;一次审完三处前端修正(语音合成五态与ASR无单独健康检查的诚实说明、演示零API外发、session voice固定本次声音)与500/503/断连恢复流(先刷新找cg-编号条目、缺资料标注、不自动重登记/不自动删除)、后台通话持有方案的失败/取消/挂断转欠账/TTL结算路径、以及补测包材料可批性。真实cap=0,零部署、零下载安装、不发真实请求、不合并PR", + "requirement_ids": ["CG-006", "CG-009", "CG-010", "CG-013", "CG-014", "CG-015", "CG-016", "CG-018", "CG-019", "CG-020", "CG-021", "VIS-003", "VIS-004", "VIS-008", "VIS-010", "VIS-013", "UX-001", "UX-003", "UX-005", "UX-006", "AM-001", "GOV-001", "GOV-002", "GOV-003", "GOV-004", "GOV-005", "GOV-006", "DEL-001"], + "deliverable": "统一复审结论(本卡评论)+集成分支 origin/hel-905-unified-review @ 7cb73429f7a0585bed17873179a627c890336c70(merge 前端088ac62与后台07dda2b于 b09a907 之上,历史正常保留)。独立核验:11文件SHA256与原作者改后清单逐一一致;前端三处修正与恢复流按源码逐行复核(callVoiceOf只认严格id、default=默认声音、缺答=声音未说明不猜、失败/结束复位OFF、late grant被stale/gen挡住;演示模式全部效果守if(!real)不发任何请求;uncertain分类422/409/离线=不确定false、5xx/发送后断=不确定true,主按钮换刷新列表、从不自动重登记);后台持有hold在capture写文件后无await间隙登记、挂断成功/挂断失败转欠账/TTL到期/dispatch失败/请求取消五路释放、Event门控无sleep。总工独立复跑(复用既有venv311,零安装):pytest tests 380/380、verify_hel899_custom_voice 12/12、ruff src tests scripts 通过;需求检查4/4(origin/main与b09a907各带/不带本handoff)。前端构建/单测/浏览器因web/node_modules缺失未独立复跑,如实列为待批项,不以作者148/148、90/90冒充", + "acceptance": [ + "集成核验:7cb73429含088ac62与07dda2b两个先祖、基点b09a907;author-manifest.json 11文件改后SHA256与统一head工作树逐一一致(含handoff JSON共11项match 11/11);前端仅作者源码,总工未替作者改视觉方向", + "前端三处修正复核:readVoiceStatus五态(none/off/ok/down/unknown)+ASR行如实写「没有单独的健康检查,以实际通话为准」;演示模式services/voiceStatus效果全守if(!real)零API外发;session voice只取本通grant严格id、命名查找按id匹配、跨id答案不显示、结束/失败复位、下一通用新选择", + "恢复流复核:uncertain(5xx/发送后断/体不完整)→提示先刷新找cg-新条目、刷新前后集合比对指认新增项、idOnly条目如实标注「只有编号,缺本地资料」并说明可试听可用、无删除入口、绝不自动重登记或自动删除;Chromium自动重发登记POST的服务端非幂等风险如实保留(重试另立新cg-编号+共享注册表孤儿条目,合同§2.2如实声明,不宣称前端提示已解决服务端幂等)", + "后台通话持有复核:capture写文件后同步登记持有(无await间隙);挂断成功、挂断失败转清理欠账、TTL到期_prune、dispatch失败、开房请求在途取消五条路径均释放持有;期间apply只记选择不写worker文件,会话响应voice=worker本通话实读;重叠通话较新capture重写文件的残余如实记录于合同§2.5,顺序用例通过不称竞态根除", + "总工独立复跑:pytest tests -q 380/380、python -I scripts/verify_hel899_custom_voice.py 12/12、ruff check src tests scripts 通过(venv311=Python3.11.16复用,零安装零下载);需求检查4/4通过", + "补测包核对(材料,不执行):连续ASR精确计数仍为待补阻塞且包内如实声明;包首行不声称材料齐备;停声量测单一时基、female_soft参考段sha256、8090新增cg-清单与回收、共享TTS快照恢复、失败计入用量等逐项在案;候选上限未超904已收紧值" + ], + "deferred": [ + "前端独立复跑(同锁npm安装、tsc/vitest/build、浏览器两主题×电脑/手机、录音释放/字幕/取消迟到/演示零外发):web/node_modules缺失,本轮禁止安装,列为待主卡批准项;作者148/148与90/90仅为作者证据", + "真实登记/试听/应用、真实worker读时点、打断停声帧级量测、真机麦克风:待主卡集中请批新窗口后执行,本轮真实cap=0、未部署、未触旧服务与8090/4080", + "挂断失败转欠账与TTL到期释放持有时,远端房间删除落地前的极端未入场worker仍可能读到后续写透值:与重叠通话同类残余、每worker仍整通话单一音色,建议下轮在合同§2.5残余段一并补写明(非阻塞)", + "连续ASR分钟级时长/连接重试的程序计数手段:仍为待补阻塞,窗口启动前须由总管在.12验证LiveKit/worker侧指标可执行性", + "CG-009/R6删除与完整备份恢复、R5真机与整体验收、R1-R7完整功能继续承接;本卡通过≠自定义音色用户验收,更≠完整产品完成;旧HEL-879窗口封账永不重开" + ], + "requirement_changes": [], + "verification": [ + "git:7cb73429为origin/hel-905-unified-review head,merge-base核088ac62/07dda2b均为先祖、基点b09a907未回退、母线与PR#11未改写", + "SHA256:docs/rework/hel903/preservation/author-manifest.json全部11项与统一head工作树一致(独立脚本核对match 11/11)", + "venv311(Python3.11.16)独立复跑:pytest tests 380/380、verify_hel899_custom_voice.py 12/12、ruff check src tests scripts 通过", + "需求检查4/4:--base-ref origin/main 与 --base-ref b09a907 各带/不带 docs/requirements/handoff-HEL-905.json 全部通过(60项)", + "未验证(如实):前端构建/单测/浏览器未独立复跑(缺node_modules,不安装);真实语音链路全部未动;补测包材料审读基于文档与源码,实际量测留获批窗口" + ] +} diff --git a/docs/rework/hel902/r5-followup-package.md b/docs/rework/hel902/r5-followup-package.md index dd04b94..53be5ef 100644 --- a/docs/rework/hel902/r5-followup-package.md +++ b/docs/rework/hel902/r5-followup-package.md @@ -1,6 +1,8 @@ # HEL-902 补测包:自定义声音真机窗口申请材料(交总管集中请批) -状态:**材料备齐,未获批前真实 cap=0;本包只写材料,绝不执行**。所有上限为 +状态:**材料基本备齐,其中连续通话 ASR 精确计数手段仍是待补阻塞(§4,窗口前 +须在 .12 验证,不通过则含连续通话的步骤不得启动);未获批前真实 cap=0; +本包只写材料,绝不执行**。所有上限为 **新的一次性窗口授权**,不复用、不重开 HEL-879 已封账(其 14/40 请求、 42717/500000 tokens、12/200 TTS 段保持封存,永不重开;剩余数≠新许可)。 工程参数由工程定(只能收紧、不能放宽),用户只批准真实用量与设备操作。 @@ -67,9 +69,12 @@ - worker 日志 `turn_cancel`→最后 TTS 段发送时间差**只是内部子段 证据**(附日志行),不能单独证明用户听到了约 1 秒停声;人工秒表 仅作辅助复核。 - - **文字打断语音**与**真实设备麦克风打断**两个方向都做:文字方向= - 她语音输出中发送文字→声即停;麦克风方向必须用 LAN 机真实麦克风 - (非 fake device,不把假设备当真机)。 + - **文字打断语音**与**真实设备麦克风打断**两个方向都做:文字方向= + 她语音输出中发送文字→声即停;麦克风方向必须用 LAN 机真实麦克风 + (非 fake device,不把假设备当真机)。**麦克风方向的 T0 必须是 + 同一录制时间轴上本地麦克风音轨的实际起声帧**(如 OBS 单文件多 + 音轨:一轨浏览器输出、一轨本地麦克风,同一时钟可分离分析); + 仅画面中的说话动作不能直接代替实际音频起点。 - 真实浏览器/设备麦克风路径:LAN 机真实麦克风完成第 4 项;如用户 愿意,iPhone Safari 经 8363 WSS + 证书信任步骤试一连(可选,失败 不影响其余结论)。 @@ -112,7 +117,7 @@ | LLM 请求 | ≤20 | 统一账本 acquire | **程序硬闸**(`think/budget.py`) | | LLM tokens | ≤60000 | 同上 | **程序硬闸** | | 嵌入 | 0 | acquire 拒绝 | **程序硬闸** | -| 登记转写 ASR | ≤3 | `voice-usage.jsonl` `register_asr` 行(含本地元数据落盘失败者) | 工程监看(程序计数、非硬闸) | +| 登记转写 ASR | ≤3 | `voice-usage.jsonl` `register_asr` 行(含本地元数据落盘失败者)+**面板侧转写失败/断连的如实口径见下** | 工程监看(程序计数、非硬闸) | | 试听合成 | ≤10 | `preview_tts` 行(含 TTS 出站无成功响应者) | 工程监看(同上) | | 通话 TTS 段 | ≤40 | worker 侧流水/日志计数 | 工程监看(见下,需窗口前验证命令) | | 音色登记(8090 upload) | ≤3 | 上传出站次数(含断连后已生效者) | 工程监看(面板上传账) | @@ -124,14 +129,25 @@ (统一账本 acquire,超限直接拒绝);其余上限是**工程监看或程序计数**, 靠实时看数+负责人停机,**不拿事后流水冒充硬闸**。 +**登记转写 ASR 口径的如实边界(HEL-905 复审核实)**:`register_asr` 流水 +只在**登记成功(含本地元数据落盘失败)且参考文字来自转写**时记录;面板侧 +转写**失败或上传断连**时 API 只见到面板拒绝/异常,不产生 `register_asr` +行——这部分用量不靠该流水,而由「音色登记(8090 upload)≤3(含断连后已 +生效者)」上界覆盖:**每次转写尝试必伴随一次 upload 出站**,两项上限须 +一起监看,不得只看 `register_asr` 行宣称 ASR 用量。 + **连续通话 ASR(worker 内 FunASR 连续识别,区别于登记转写 ASR)的计数 手段与停机**: -- 墙钟代理(可程序数,命令可执行):实例旁会话账本 `-voice-sessions.json` - 记录每通 `created_at`(开房)与转入清理时的 `first_debt_at`(≈挂断)。 - 已结通话墙钟合计: - `jq '[.debts[] | (.first_debt_at - .session.created_at)] | add // 0' -voice-sessions.json`; - 在途通话看 `.sessions[]` 的 `created_at`(到点人工掐表)。通话墙钟总时长 +- 墙钟代理(可程序数,命令可执行;**如实声明其边界**):实例旁会话账本 + `-voice-sessions.json` 只保留**当前** `.sessions`(在途)与 `.debts` + (删除未落定的欠账)——**删除成功的通话会从账本里移除**,因此 + `jq '[.debts[] | (.first_debt_at - .session.created_at)] | add // 0' + -voice-sessions.json` 只合计**残存欠账**,是全窗用量的下界核对, + **不能冒充整个窗口的通话墙钟合计**。逐通墙钟以开房/挂断当时记录为准: + 每通 `POST /api/voice/session` 与 `DELETE` 的时刻由窗口负责人当场记录 + 逐通归档(≤3 通,人工可数),账本 jq 只作残存欠账与在途通话的核对 + (在途看 `.sessions[]` 的 `created_at`)。通话墙钟总时长 ≥麦克风推流时长的上界,再加 §2 每通 ≤15 分钟操作掐表即 ≤45 分钟总上限 的执行手段;窗口负责人:总管。到线即停:停开新会话并挂断在途会话 (`DELETE /api/voice/session/{id}`)。