diff --git a/reports/bridge-lecture-polish-20260915/ACCEPTANCE.md b/reports/bridge-lecture-polish-20260915/ACCEPTANCE.md
new file mode 100644
index 0000000..0a61257
--- /dev/null
+++ b/reports/bridge-lecture-polish-20260915/ACCEPTANCE.md
@@ -0,0 +1,27 @@
+# 桥梁数字教员讲解修正验收
+
+2026-09-15,开发、本机局域网及测试环境均通过。
+
+- 四个任务默认视频讲解;场景加载完成且首帧显示后才播放。通过延迟真实模型/解码资源响应,确认 loading 可见时没有讲解播放调用。浏览器拒绝自动播放时保留视频模式,点击播放后正常继续。
+- 右上角场景信息和整车工具使用纵向布局;1920、1600、1366 三种宽度无重叠。“三维实时交互”角标已移除。数字人框保持 3:4。
+- 审核 39 段讲解及全部安全提示,重新生成 006 第 7 步、007 第 8/9/11 步、008 第 11/15 步。移除原稿、未展开、未给出参数等制作说明;008 保留记录依据并提交教员核对的要求。现用文件为 39 段 MP4、41 个 WAV,旧版本文件保留。
+- 浮窗按钮与展开面板无阴影,头像绿点已移除。原因是公开接口优先用了旧上传视频,测试环境文件不存在返回 404;已统一使用随项目发布的内置头像。验收检查了实际教员 PNG 地址和图片加载完成,避免把临时品牌图标当作头像通过。
+- 测试环境实际任务 86–89、固定内容版本 533–536 的全部 39 个步骤与新视频/讲解文字准确绑定;动作定义不变。
+
+## 验证记录
+
+- 前端两项目构建通过;桥梁脚本、媒体绑定及正式入口 14 项契约测试通过。
+- Java 17 `mvn test` 通过,Surefire 汇总 562 项,失败/错误为 0。
+- 公开头像接口回归 2 项通过,包含旧上传文件缺失的重现案例。
+- 四任务前两步的视频播放、语音切换、视频失败备用、切步停止、刷新和关闭通过,见 `playback/live-result.json`。
+- 本机、局域网、测试环境的 39 个 MP4 与 41 个 WAV HTTP SHA-256 均与发布文件一致;MP4 Range 返回 206。
+- 三个数字人在测试环境 `/human/viewer/{id}` 完成真实语音驱动,收到开始/结束事件并有持续嘴部运动,无浏览器错误。见 `ai_person/ape2e/reports/instructors-v2-test-20260915/stable-viewer-validation.json`。
+
+## 测试发布
+
+- 数字车间:http://1.14.103.234:6180
+- 数字人平台:http://1.14.103.234:7180
+- 镜像:`digital-human-service:lecture-v2-20260915`,运行摘要 `6d66dd620303ea162047d7a9713b30f0f36575750f1a9a03c4f44aaf58f7659d`,容器 healthy。
+- 五个源码仓库均已发布,提交及备份位置见 `deployment.json`。数据库无待执行的新变更;已有四任务及有效训练记录保留。
+- 测试环境原有 v2 素材修改与新提交逐文件核对一致后,保存在名为 `lecture-v2-20260915-pre-deploy` 的 Git stash 中,再快进更新源码。
+- 常规构建提示:前端部分包超过 500 kB;FastAPI 测试客户端有上游弃用提示。检查均成功。
diff --git a/reports/bridge-lecture-polish-20260915/index.html b/reports/bridge-lecture-polish-20260915/index.html
index 4e6d847..2c95237 100644
--- a/reports/bridge-lecture-polish-20260915/index.html
+++ b/reports/bridge-lecture-polish-20260915/index.html
@@ -1 +1 @@
-
桥梁数字教员讲解修正验收桥梁数字教员讲解修正验收 · 2026-09-15
四套任务共39段讲解,6段重新生成。默认视频模式,等待场景加载完成后播放;保留语音切换与旧文件。右上角按内容自动排列,移除“三维实时交互”角标。公开浮窗显示真实教员头像,移除阴影和头像绿点。验证:local 浏览器回归 文件校验 · lan 浏览器回归 文件校验。另通过前端构建、14项脚本契约测试、562项Java测试、2项公开头像接口测试。
本次重新生成的6段
TASK-VIRTUAL-006 · 第7步第7步,按正常步骤操作架桥车。按正常操作步骤操作架桥车。
4.88s · 已替换 · 原文件保留 TASK-VIRTUAL-007 · 第8步第8步,安装新液压泵。安装新的液压泵。
3.36s · 已替换 · 原文件保留 TASK-VIRTUAL-007 · 第9步第9步,向新泵加注液压油。打开新液压泵加油口,加注液压油。
4.96s · 已替换 · 原文件保留 TASK-VIRTUAL-007 · 第11步第11步,启动设备试验。启动设备进行试验。
3.28s · 已替换 · 原文件保留 TASK-VIRTUAL-008 · 第11步第11步,核对大腔控制油口管路连接。核对大腔控制油口管路连接,记录处理方式及依据,并提交教员核对。
8.48s · 已替换 · 原文件保留 TASK-VIRTUAL-008 · 第15步第15步,核对小腔控制油口管路连接。核对小腔控制油口管路连接,记录处理方式及依据,并提交教员核对。
8.24s · 已替换 · 原文件保留 当前39段讲解清单
TASK-VIRTUAL-006 · 重型支援桥液压泵应急替代
- 保持架桥车运行并断开取力器:第1步,保持架桥车运行并断开取力器。保持架桥车发动机运转,确保架桥车取力器处于断开状态。
- 连接两车液压软管:第2步,连接两车液压软管。连接支援车与架桥车液压软管。架桥车快接接头位于液压油箱右侧;支援车快接接头位于驾驶室外右下方。
- 打开支援车回油截止阀:第3步,打开支援车回油截止阀。打开支援车液压油箱快接接头处的回油截止阀。
- 打开互救作业开关:第4步,打开互救作业开关。打开辅助控制盒上的“互救作业”开关。
- 打开滤油器出口连通球阀:第5步,打开滤油器出口连通球阀。打开两个输油滤油器出口处的连通球阀。
- 接通支援车液压取力器:第6步,接通支援车液压取力器。接通支援车液压系统取力器,向架桥车供油。
- 按正常步骤操作架桥车:第7步,按正常步骤操作架桥车。按正常操作步骤操作架桥车。
TASK-VIRTUAL-007 · 重型支援桥前泵换件修复
- 停机并初裁牛皮纸:第1步,停机并初裁牛皮纸。架桥车熄火;按液压泵与取力器结合面形状初步裁剪牛皮纸。
- 关闭液压油箱出油口一号球阀:第2步,关闭液压油箱出油口一号球阀。将一号球阀手柄从平行管道转到垂直管道。
- 拆开并包扎进出油管:第3步,拆开并包扎进出油管。用大活动扳手拆开液压泵进、出油管接头,用塑料袋包扎管口。
- 拆下四个安装螺栓:第4步,拆下四个安装螺栓。用开口扳手拆下液压泵与取力器之间的四个安装螺栓。
- 取下旧前泵:第5步,取下旧前泵。取下原前泵。
- 修裁牛皮纸:第6步,修裁牛皮纸。进一步裁剪牛皮纸,使其与液压泵安装面及取力器结合面吻合。
- 放置牛皮纸垫:第7步,放置牛皮纸垫。将裁好的牛皮纸放在取力器接口处。
- 安装新液压泵:第8步,安装新液压泵。安装新的液压泵。
- 向新泵加注液压油:第9步,向新泵加注液压油。打开新液压泵加油口,加注液压油。
- 恢复进出油管连接:第10步,恢复进出油管连接。用大活动扳手连接并拧紧液压泵进、出油管。
- 启动设备试验:第11步,启动设备试验。启动设备进行试验。
TASK-VIRTUAL-008 · 重型支援桥平衡阀拆拼互换
- 清洗小腔平衡阀:第1步,清洗小腔平衡阀。用清洗剂清洗平衡阀和管接头,并用抹布擦净。
- 拆开小腔控制油口管路:第2步,拆开小腔控制油口管路。用十九号开口扳手拆开控制油口管路,用塑料袋包扎管口。
- 拆下小腔平衡阀:第3步,拆下小腔平衡阀。用八号内六角扳手拆下安装螺栓,取下平衡阀。
- 封堵小腔油口:第4步,封堵小腔油口。用两个油堵封住两个油口,擦净阀座结合面。
- 清洗大腔平衡阀:第5步,清洗大腔平衡阀。用清洗剂清洗平衡阀和管接头,并用抹布擦净。
- 拆开大腔控制油口管路:第6步,拆开大腔控制油口管路。用十九号开口扳手拆开控制油口管路,用塑料袋包扎管口。
- 拆下大腔平衡阀:第7步,拆下大腔平衡阀。用八号内六角扳手拆下安装螺栓,取下平衡阀。
- 封堵大腔油口:第8步,封堵大腔油口。用两个油堵封住两个油口,擦净阀座结合面。
- 准备安装大腔平衡阀:第9步,准备安装大腔平衡阀。擦净平衡阀及阀座结合面,取下两个油堵。
- 安装大腔平衡阀:第10步,安装大腔平衡阀。将平衡阀放置于阀座上,用八号内六角扳手安装四个安装螺栓。
- 核对大腔控制油口管路连接:第11步,核对大腔控制油口管路连接。核对大腔控制油口管路连接,记录处理方式及依据,并提交教员核对。
- 紧固大腔阀体连接螺栓:第12步,紧固大腔阀体连接螺栓。用内六角扳手拧紧四个阀体连接螺栓。
- 准备安装小腔平衡阀:第13步,准备安装小腔平衡阀。擦净平衡阀及阀座结合面,取下两个油堵。
- 安装小腔平衡阀:第14步,安装小腔平衡阀。将平衡阀放置于阀座上,用八号内六角扳手安装四个安装螺栓。
- 核对小腔控制油口管路连接:第15步,核对小腔控制油口管路连接。核对小腔控制油口管路连接,记录处理方式及依据,并提交教员核对。
- 紧固小腔阀体连接螺栓:第16步,紧固小腔阀体连接螺栓。用内六角扳手拧紧四个阀体连接螺栓。
\ No newline at end of file
+桥梁数字教员讲解修正验收桥梁数字教员讲解修正验收 · 2026-09-15
本次重新生成的6段
TASK-VIRTUAL-006 · 第7步第7步,按正常步骤操作架桥车。按正常操作步骤操作架桥车。
4.88s · 已替换 · 原文件保留 TASK-VIRTUAL-007 · 第8步第8步,安装新液压泵。安装新的液压泵。
3.36s · 已替换 · 原文件保留 TASK-VIRTUAL-007 · 第9步第9步,向新泵加注液压油。打开新液压泵加油口,加注液压油。
4.96s · 已替换 · 原文件保留 TASK-VIRTUAL-007 · 第11步第11步,启动设备试验。启动设备进行试验。
3.28s · 已替换 · 原文件保留 TASK-VIRTUAL-008 · 第11步第11步,核对大腔控制油口管路连接。核对大腔控制油口管路连接,记录处理方式及依据,并提交教员核对。
8.48s · 已替换 · 原文件保留 TASK-VIRTUAL-008 · 第15步第15步,核对小腔控制油口管路连接。核对小腔控制油口管路连接,记录处理方式及依据,并提交教员核对。
8.24s · 已替换 · 原文件保留 当前39段讲解清单
TASK-VIRTUAL-006 · 重型支援桥液压泵应急替代
- 保持架桥车运行并断开取力器:第1步,保持架桥车运行并断开取力器。保持架桥车发动机运转,确保架桥车取力器处于断开状态。
- 连接两车液压软管:第2步,连接两车液压软管。连接支援车与架桥车液压软管。架桥车快接接头位于液压油箱右侧;支援车快接接头位于驾驶室外右下方。
- 打开支援车回油截止阀:第3步,打开支援车回油截止阀。打开支援车液压油箱快接接头处的回油截止阀。
- 打开互救作业开关:第4步,打开互救作业开关。打开辅助控制盒上的“互救作业”开关。
- 打开滤油器出口连通球阀:第5步,打开滤油器出口连通球阀。打开两个输油滤油器出口处的连通球阀。
- 接通支援车液压取力器:第6步,接通支援车液压取力器。接通支援车液压系统取力器,向架桥车供油。
- 按正常步骤操作架桥车:第7步,按正常步骤操作架桥车。按正常操作步骤操作架桥车。
TASK-VIRTUAL-007 · 重型支援桥前泵换件修复
- 停机并初裁牛皮纸:第1步,停机并初裁牛皮纸。架桥车熄火;按液压泵与取力器结合面形状初步裁剪牛皮纸。
- 关闭液压油箱出油口一号球阀:第2步,关闭液压油箱出油口一号球阀。将一号球阀手柄从平行管道转到垂直管道。
- 拆开并包扎进出油管:第3步,拆开并包扎进出油管。用大活动扳手拆开液压泵进、出油管接头,用塑料袋包扎管口。
- 拆下四个安装螺栓:第4步,拆下四个安装螺栓。用开口扳手拆下液压泵与取力器之间的四个安装螺栓。
- 取下旧前泵:第5步,取下旧前泵。取下原前泵。
- 修裁牛皮纸:第6步,修裁牛皮纸。进一步裁剪牛皮纸,使其与液压泵安装面及取力器结合面吻合。
- 放置牛皮纸垫:第7步,放置牛皮纸垫。将裁好的牛皮纸放在取力器接口处。
- 安装新液压泵:第8步,安装新液压泵。安装新的液压泵。
- 向新泵加注液压油:第9步,向新泵加注液压油。打开新液压泵加油口,加注液压油。
- 恢复进出油管连接:第10步,恢复进出油管连接。用大活动扳手连接并拧紧液压泵进、出油管。
- 启动设备试验:第11步,启动设备试验。启动设备进行试验。
TASK-VIRTUAL-008 · 重型支援桥平衡阀拆拼互换
- 清洗小腔平衡阀:第1步,清洗小腔平衡阀。用清洗剂清洗平衡阀和管接头,并用抹布擦净。
- 拆开小腔控制油口管路:第2步,拆开小腔控制油口管路。用十九号开口扳手拆开控制油口管路,用塑料袋包扎管口。
- 拆下小腔平衡阀:第3步,拆下小腔平衡阀。用八号内六角扳手拆下安装螺栓,取下平衡阀。
- 封堵小腔油口:第4步,封堵小腔油口。用两个油堵封住两个油口,擦净阀座结合面。
- 清洗大腔平衡阀:第5步,清洗大腔平衡阀。用清洗剂清洗平衡阀和管接头,并用抹布擦净。
- 拆开大腔控制油口管路:第6步,拆开大腔控制油口管路。用十九号开口扳手拆开控制油口管路,用塑料袋包扎管口。
- 拆下大腔平衡阀:第7步,拆下大腔平衡阀。用八号内六角扳手拆下安装螺栓,取下平衡阀。
- 封堵大腔油口:第8步,封堵大腔油口。用两个油堵封住两个油口,擦净阀座结合面。
- 准备安装大腔平衡阀:第9步,准备安装大腔平衡阀。擦净平衡阀及阀座结合面,取下两个油堵。
- 安装大腔平衡阀:第10步,安装大腔平衡阀。将平衡阀放置于阀座上,用八号内六角扳手安装四个安装螺栓。
- 核对大腔控制油口管路连接:第11步,核对大腔控制油口管路连接。核对大腔控制油口管路连接,记录处理方式及依据,并提交教员核对。
- 紧固大腔阀体连接螺栓:第12步,紧固大腔阀体连接螺栓。用内六角扳手拧紧四个阀体连接螺栓。
- 准备安装小腔平衡阀:第13步,准备安装小腔平衡阀。擦净平衡阀及阀座结合面,取下两个油堵。
- 安装小腔平衡阀:第14步,安装小腔平衡阀。将平衡阀放置于阀座上,用八号内六角扳手安装四个安装螺栓。
- 核对小腔控制油口管路连接:第15步,核对小腔控制油口管路连接。核对小腔控制油口管路连接,记录处理方式及依据,并提交教员核对。
- 紧固小腔阀体连接螺栓:第16步,紧固小腔阀体连接螺栓。用内六角扳手拧紧四个阀体连接螺栓。
测试环境

\ No newline at end of file
diff --git a/reports/bridge-lecture-polish-20260915/lan/delivery.json b/reports/bridge-lecture-polish-20260915/lan/delivery.json
new file mode 100644
index 0000000..0de957c
--- /dev/null
+++ b/reports/bridge-lecture-polish-20260915/lan/delivery.json
@@ -0,0 +1,9 @@
+{
+ "origin": "http://192.168.31.168:6180",
+ "videos": 39,
+ "audio": 41,
+ "allTextsClean": true,
+ "exactFiles": true,
+ "buildCopiesMatch": true,
+ "rangeRequests": true
+}
\ No newline at end of file
diff --git a/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-005.png b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-005.png
new file mode 100644
index 0000000..2610a29
Binary files /dev/null and b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-005.png differ
diff --git a/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-006.png b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-006.png
new file mode 100644
index 0000000..127d01a
Binary files /dev/null and b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-006.png differ
diff --git a/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-007.png b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-007.png
new file mode 100644
index 0000000..08b5c6f
Binary files /dev/null and b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-007.png differ
diff --git a/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-008.png b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-008.png
new file mode 100644
index 0000000..6700012
Binary files /dev/null and b/reports/bridge-lecture-polish-20260915/test/TASK-VIRTUAL-008.png differ
diff --git a/reports/bridge-lecture-polish-20260915/test/bindings.json b/reports/bridge-lecture-polish-20260915/test/bindings.json
new file mode 100644
index 0000000..c3a7f6d
--- /dev/null
+++ b/reports/bridge-lecture-polish-20260915/test/bindings.json
@@ -0,0 +1,33 @@
+{
+ "origin": "http://1.14.103.234:6180",
+ "result": [
+ {
+ "task": "TASK-VIRTUAL-005",
+ "id": "86",
+ "version": "533",
+ "exactVideoAndTextBindings": 5,
+ "operationsUnchanged": true
+ },
+ {
+ "task": "TASK-VIRTUAL-006",
+ "id": "87",
+ "version": "534",
+ "exactVideoAndTextBindings": 7,
+ "operationsUnchanged": true
+ },
+ {
+ "task": "TASK-VIRTUAL-007",
+ "id": "88",
+ "version": "535",
+ "exactVideoAndTextBindings": 11,
+ "operationsUnchanged": true
+ },
+ {
+ "task": "TASK-VIRTUAL-008",
+ "id": "89",
+ "version": "536",
+ "exactVideoAndTextBindings": 16,
+ "operationsUnchanged": true
+ }
+ ]
+}
\ No newline at end of file
diff --git a/reports/bridge-lecture-polish-20260915/test/delivery.json b/reports/bridge-lecture-polish-20260915/test/delivery.json
new file mode 100644
index 0000000..b5715c2
--- /dev/null
+++ b/reports/bridge-lecture-polish-20260915/test/delivery.json
@@ -0,0 +1,9 @@
+{
+ "origin": "http://1.14.103.234:6180",
+ "videos": 39,
+ "audio": 41,
+ "allTextsClean": true,
+ "exactFiles": true,
+ "buildCopiesMatch": true,
+ "rangeRequests": true
+}
\ No newline at end of file
diff --git a/reports/bridge-lecture-polish-20260915/test/result.json b/reports/bridge-lecture-polish-20260915/test/result.json
new file mode 100644
index 0000000..37cc413
--- /dev/null
+++ b/reports/bridge-lecture-polish-20260915/test/result.json
@@ -0,0 +1,82 @@
+{
+ "origin": "http://1.14.103.234:6180",
+ "delayed": 8,
+ "checks": [
+ {
+ "task": "TASK-VIRTUAL-005",
+ "videoDefault": true,
+ "noPlaybackWhileLoading": true,
+ "autoplayRestrictionRetainsVideo": true,
+ "noHudOverlap": [
+ 1920,
+ 1600,
+ 1366
+ ],
+ "plays": [
+ {
+ "loading": false,
+ "src": "/legacy/virtual-training/videos/narration/bridge-pump-switch/v2/instructor-1-v2/step-01-bd17dc16621458c4.mp4"
+ }
+ ]
+ },
+ {
+ "task": "TASK-VIRTUAL-006",
+ "videoDefault": true,
+ "noPlaybackWhileLoading": true,
+ "autoplayRestrictionRetainsVideo": true,
+ "noHudOverlap": [
+ 1920,
+ 1600,
+ 1366
+ ],
+ "plays": [
+ {
+ "loading": false,
+ "src": "/legacy/virtual-training/videos/narration/bridge-pump-substitute/v3/instructor-1-v2/step-01-053bd89d013ca8c2.mp4"
+ }
+ ]
+ },
+ {
+ "task": "TASK-VIRTUAL-007",
+ "videoDefault": true,
+ "noPlaybackWhileLoading": true,
+ "autoplayRestrictionRetainsVideo": true,
+ "noHudOverlap": [
+ 1920,
+ 1600,
+ 1366
+ ],
+ "plays": [
+ {
+ "loading": false,
+ "src": "/legacy/virtual-training/videos/narration/bridge-pump-replace/v3/instructor-1-v2/step-01-071874b4ec4b9e19.mp4"
+ }
+ ]
+ },
+ {
+ "task": "TASK-VIRTUAL-008",
+ "videoDefault": true,
+ "noPlaybackWhileLoading": true,
+ "autoplayRestrictionRetainsVideo": true,
+ "noHudOverlap": [
+ 1920,
+ 1600,
+ 1366
+ ],
+ "plays": [
+ {
+ "loading": false,
+ "src": "/legacy/virtual-training/videos/narration/bridge-balance-valve-swap/v3/instructor-1-v2/step-01-8540f64d275cd500.mp4"
+ }
+ ]
+ },
+ {
+ "widget": "http://1.14.103.234:7180",
+ "avatarLoaded": true,
+ "avatar": "/avatars/builtin/equipment-instructor-1.png",
+ "greenDotRemoved": true,
+ "launcherAndPanelShadows": "none"
+ }
+ ],
+ "errors": []
+}
\ No newline at end of file
diff --git a/reports/bridge-lecture-polish-20260915/test/widget.png b/reports/bridge-lecture-polish-20260915/test/widget.png
new file mode 100644
index 0000000..17976c9
Binary files /dev/null and b/reports/bridge-lecture-polish-20260915/test/widget.png differ
diff --git a/tools/bridge-lecture-bindings.mjs b/tools/bridge-lecture-bindings.mjs
new file mode 100644
index 0000000..4f34c32
--- /dev/null
+++ b/tools/bridge-lecture-bindings.mjs
@@ -0,0 +1,23 @@
+import fs from 'node:fs';
+import assert from 'node:assert/strict';
+import {credentials} from './role-permissions-live.mjs';
+import videos from '../../unreal_tran_web/src/features/virtual-training-scripts/narration-video-manifest.js';
+import {scriptTrainingDefinition} from '../../unreal_tran_web/src/features/virtual-training-scripts/registry.js';
+const origin=process.env.BASE_URL || 'http://127.0.0.1:6180';
+const dir=process.env.REPORT_DIR || 'reports/bridge-lecture-polish-20260915/local';
+const login=await fetch(`${origin}/api/auth/v1/auth/login`,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({...credentials('root'),roleCode:'admin',rememberMe:false})}).then(r=>r.json());
+assert.ok(login.data?.accessToken);
+const tasks=await fetch(`${origin}/api/tran/v1/teaching/assignments?channel=VIRTUAL&assignmentKind=TRAINING&size=100`,{headers:{Authorization:`Bearer ${login.data.accessToken}`}}).then(r=>r.json());
+const result=[];
+for(const script of videos.scripts){
+ const task=tasks.data.records.find(t=>t.code===script.code);assert.ok(task);
+ const definition=scriptTrainingDefinition(task);
+ assert.equal(definition.steps.length,script.steps.length);
+ for(const [i,clip] of script.steps.entries()){
+ assert.equal(definition.steps[i].audio.narrationUrl,clip.url,script.code+' '+clip.number);
+ assert.equal(definition.steps[i].audio.narrationText,clip.text);
+ assert.deepEqual(definition.steps[i].action,task.definitionSnapshot.steps[i].action);
+ }
+ result.push({task:script.code,id:task.id,version:task.contentVersionId,exactVideoAndTextBindings:script.steps.length,operationsUnchanged:true});
+}
+fs.mkdirSync(dir,{recursive:true});fs.writeFileSync(dir+'/bindings.json',JSON.stringify({origin,result},null,2));console.log(JSON.stringify(result));