Parcourir la source

docs(cockpit): 记录视频生命周期续作证据与未闭合边界

ChenJZ il y a 7 heures
Parent
commit
2fc5ed17d8
1 fichiers modifiés avec 68 ajouts et 0 suppressions
  1. 68 0
      docs/cockpit-video-lifecycle-acceptance.md

+ 68 - 0
docs/cockpit-video-lifecycle-acceptance.md

@@ -0,0 +1,68 @@
+# 03 视频生命周期续作验收记录(2026-11-12)
+
+## 当前结论
+
+本轮修复已验证并独立提交,**03 仍保持打开**。前端不再以手工拼装的地下宿主测试代替 Root 旅程;主服务不再用参数集合模拟 SQL 查询;提供方取消由独立持久化快照和 CAS 保护。下方历史审查中的几个核心缺陷已修,但重启后的停止回执恢复和超出 SIP 订阅期限的迟到应答仍是代码收口缺口,不能仅以测试全绿关闭。
+
+固定续作基点:前端 `dcbe5691`、后端 `cb435cd4`。前端期间他人提交 `0f3db501`(资产详情)保持原样;本轮没有用 HEAD 重建共享文件、没有覆盖或暂存其它在制品。
+
+## 本轮提交
+
+| 仓库 | 提交 | 内容 |
+|---|---|---|
+| 前端 | `ac5419cd` | 真实 Root 三入口、刷新和同轮退出/失效来源保护 |
+| 后端 | `3969e499` | CAS 取消意图、完整代次流名、原节点回收、旧 GB 对话接管、SIP/RTP/Hook 精确边界与测试 |
+| 后端 | `719fe092` | ACTIVE 写入/提交失败补偿、旧新观看共享/加入期限、实际媒体节点字段、H2 SQL 回归 |
+
+前端作者 ChenJZ;后端作者 Kazerin。提交前核对身份;均未推送。本记录不把其它会话的提交或在制改动计为本票成果。
+
+## 实际验证
+
+- 前端:**43 项通过**——真实 Root hosts 9、辅助 journey 16、session/transport/player/contract 18。9 是用例数量,不是票面九项全部完成。
+- 后端:本次 `mvn -o -fae ... clean test`,**未使用 failure.ignore**,真实退出码 0、BUILD SUCCESS。模块汇总为 zksy-system **270**、zksy-admin **844**、zk-api-service **22**、video-service **92**,共 **1228 项,0 失败/错误/跳过**。clean 排除了历史编译产物命中;不把旧报告混进计数。
+- 其中 [实际 SQL/事务测试](<E:/pipe-ner-server/pipe-network-service/zksy-admin/src/test/java/com/zksy/web/controller/cockpit/VideoPreparedSqlTransactionTest.java>) **23 项**,不是 Map 模拟计数;使用真实 MyBatis-Plus SQL、H2 内存数据库、Spring JDBC 事务管理器。媒体与提交失败/确认丢失是受控外部故障。
+- 提供方包括 [CAS/期限竞态](<E:/pipe-ner-server/video-service/src/test/java/com/zksy/video/lifecycle/VideoLifecycleRaceTest.java>) 7 项、[旧 GB 接管贯通](<E:/pipe-ner-server/video-service/src/test/java/com/zksy/video/lifecycle/AdoptedGbDeepSeamTest.java>) 7 项、[受管 GB 深层组合](<E:/pipe-ner-server/video-service/src/test/java/com/zksy/video/lifecycle/ManagedGbDeepSeamTest.java>) 18 项,以及节点/Manual/Hook/Invite 保留等用例。底层 I/O 是替身,不代表实际设备已停止。
+- [实际节点迁移测试](<E:/pipe-ner-server/pipe-network-service/sql/tests/video_session_media_node.test.mjs>) 在 PGlite 内存库执行真实 SQL,通过;保留旧行的未知节点为空,不回填默认节点,重复运行按一次性迁移约定失败且不改原值。
+
+验证命令(对应仓库根目录):
+
+```bash
+node tests/cockpit-video/run.mjs --hosts
+node tests/cockpit-video/run.mjs
+node --test tests/cockpit-video/session.mjs tests/cockpit-video/transport.mjs tests/cockpit-video/player.mjs tests/cockpit-video/contract.mjs
+# 后端使用本机既有离线settings:
+JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 mvn -o -fae -gs .scratch/log-gis-contract-20261111/maven-offline-settings.xml clean test
+```
+
+[本轮完整后端日志](<E:/pipe-ner-server/.scratch/video03-lifecycle/round-review-fixed-full.log>);[前端隔离基点与 RED/GREEN 交接](<../.scratch/cockpit-video-monitoring/task20-frontend-result.md>)。初始夹具/编译错误与行为红信号已区分,不将缺依赖、导入冲突、旧 class 命中算作产品红灯。
+
+## 从第一性原理保留的约束
+
+1. **UI 可见性不是观看归属。** [Panel](<../src/modules/cockpit/components/VideoMonitorPanel.vue>)同步观察真实选择/一级模式离开;同轮回来也不能复活旧观看。[Store](<../src/modules/cockpit/stores/videoStore.js>)只允许仍有效的来源重绑同码;合法重绑不建第二条流。刷新/锚点暂隐/部分失败保留选择,完整新快照确认移除才关闭。
+2. **收到或发送请求不是资源证明。** [提供方协调](<E:/pipe-ner-server/video-service/src/main/java/com/zksy/video/lifecycle/VideoLifecycleService.java>)先登记开始意图,再调用媒体;取消不可被独立迟到快照覆盖,重复 start 不重复分配。启动期限固定,超期媒体结果进入清理,不对外发布。取消时启动尚在途,即使先收到删除确认也不能提前报 STOPPED。
+3. **真实句柄与节点不能猜。** 每代使用完整 UUID;新受管 GB 不再复用传统通道流名。[Manual 适配](<E:/pipe-ner-server/video-service/src/main/java/com/zksy/video/lifecycle/ManualLifecycleMedia.java>)只保存实际 add 返回的 key,[GB 适配](<E:/pipe-ner-server/video-service/src/main/java/com/zksy/video/lifecycle/Gb28181LifecycleMedia.java>)在已记录节点探测。媒体查询错误不等同“不存在”,构造播放 URL 不等同“流就绪”。
+4. **旧流接管必须能精确退出。** 接管旧 GB 的实际节点、Call-ID、SSRC、分配 token、SIP tags 后,记录不可复用的观察凭据;只有匹配 BYE 2xx 与本次 RTP 关闭证据都成立才完成。同名新对话/新 allocation 不复用旧关闭回执。旧 Manual 后来观看者复用亲自确认的 key/node,不再 add;冷进程停止可接受 SQL 保存的明确 node+key,而非默认节点。
+5. **提交失败不等于媒体没启动。** [主生命周期](<E:/pipe-ner-server/pipe-network-service/zksy-system/src/main/java/com/zksy/cockpit/video/VideoLiveLifecycle.java>)对 ACTIVE SQL 或 commit/ack 失败先重新读取同代记录与其他观看者,再只释放自己或回收最后一位底流。数据库持续不可用时保留已提交的意图供扫描,不盲停。
+6. **物理代次启动期限与后来观看者的期限不同。** 已 ACTIVE 的共享底流可以被后来观看者加入;不能因为原 30 秒期限已过便立刻清掉新加入者。加入者自身仍受有界失联期限约束,不能靠其他人心跳永久保活。
+
+## 独立双轴审查及后续修复
+
+Standards 与 Spec 在不同子代理中独立运行,未用 Lead 的自查替代。原始结论保留在本会话:
+
+- **Standards**:0 成文硬违规;确认两个工程风险——旧 GB 可接管但 stopManaged 拒绝旧名,以及第二名旧 Manual 观看无法复用。未把类体量、合理适配转发、状态字符串一概判成硬违规。
+- **Spec**:确认上述两项,加上共享加入者的期限竞态、旧 Manual 停止遗漏已持久化节点,共四项实际错误;同时保留 SIP 迟到/重启证据缺失的未完成结论。
+- 四项已补代码与回归:主期限/节点/有界加入/旧接管的 RED→GREEN 日志在后端 `.scratch/video03-lifecycle/review-shared-*`;旧 GB 回收已补真实 adapter→Play→RTP/Hook/Invite/Session/Commander 组合,不再只 mock stop=true。整体 clean test 已覆盖最终拼接状态。审查修复后未声称“独立审查零缺口”。
+
+## 依赖、迁移与剩余工作
+
+用户明确批准 H2 **2.1.214** 仅 test scope(发布许可 MPL-2.0/EPL-1.0);jar SHA-256 `d623cdc0f61d218cf549a8d09f1c391ff91096116b22e2475475fce4fbe72bd0`。没有把 H2 放进应用运行依赖,没有连接真实数据库。
+
+真实部署前按顺序核对 [01 匿名归属迁移](<E:/pipe-ner-server/docs/video-session-anonymous-owner-20261110.sql>)、[03 准备会话迁移](<E:/pipe-ner-server/docs/video-session-prepared-20261111.sql>)、[03 实际节点补充迁移](<E:/pipe-ner-server/docs/video-session-media-node-20261112.sql>)。均未在真实数据库执行。
+
+**03 仍未关闭的具体原因:**
+
+- SIP 订阅超时移除回调后才到达的真实 200,应答处理还缺可恢复的“已发送 INVITE → 实际对话 → 精确终止”记录;不能用本次“仍可投递的迟到 callback”测试冒充此边界完成。
+- 部分精确停止/旧流接管回执仍在进程内。重启后凭据不可辨认时安全保持 Pending,但尚无跨进程恢复闭环;共享存储 CAS 测试也不是实际 Redis 集群持久性验证。
+- Manual 创建响应连实际 key 一起丢失时没有已核实的恢复接口,按用户批准保留 Pending,不猜 key、不借 close_streams 伪称删除代理。正常有 key 的停止/共享路径已经测试,但此异常不能写成“已回收”。
+
+本轮没有启动服务、浏览器、真实媒体接口、真实 SQL 或设备操作;按项目规则已跳过应用 build/debug。43/1228 是离线合同证据,不是现场播放、部署可用性或物理云台停止验收。04–07 未在本轮实施,03 也不是规格的最后一张票。