{ "title": "实装实训与对抗训练真实流程测试", "startedAt": "2026-09-05T15:37:32.805Z", "status": "PASS_WITH_LIMITATIONS", "checks": [ { "title": "实装:创建、绑定牛奶卡车、3步配置、保存重开与发布", "status": "PASS", "screenshots": [ "screenshots/physical-settings-reopen.png", "screenshots/physical-authoring.png", "screenshots/physical-preflight.png", "screenshots/physical-published.png" ], "details": { "id": "163", "version": "215", "progress": [ 33, 67, 100 ], "profile": { "type": "PHYSICAL", "stationName": "牛奶卡车测试工位 A", "equipmentCode": "E2E-TRUCK-163", "gatewayProtocol": "HTTP 测试网关", "sensorChannels": "人工外观确认;测试状态点位", "safetyInterlocks": "测试工位隔离确认" } } }, { "title": "对抗:每队人数为小数时阻止发布", "status": "PASS", "screenshots": [ "screenshots/confrontation-invalid-team-size.png" ], "details": { "input": 2.5, "message": "发布校验未通过\n×\n发现 1 个必须处理的问题\n\n2 个步骤 · 1 个目标 · 0 个故障 · 及格线 80 分\n\n!\n每队人数必须是 1 到 200 的整数\nmodeConfig.teamSize\ni\n本步骤尚未配置必选安全前置条件\nsteps[0].safetyRules\ni\n本步骤尚未配置必选安全前置条件\nsteps[1].safetyRules\ni\n尚未绑定离线讲解文件,运行时将保留字幕并使用默认本地语音\nsteps.audio\n关闭" } }, { "title": "对抗:显式清空岗位后保存重开,不恢复默认授权", "status": "PASS", "screenshots": [ "screenshots/confrontation-empty-positions.png" ], "details": { "allowedPositions": [ ], "published": false } }, { "title": "对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布", "status": "PASS", "screenshots": [ "screenshots/confrontation-positions.png", "screenshots/confrontation-settings-reopen.png", "screenshots/confrontation-authoring.png", "screenshots/confrontation-preflight.png", "screenshots/confrontation-published.png" ], "details": { "id": "164", "version": "216", "profile": { "type": "CONFRONTATION", "redTeamName": "狐狸巡检红队", "blueTeamName": "狐狸巡检蓝队", "teamSize": 2, "roundDurationMinutes": 7, "objective": "两队分别完成狐狸模型巡检并确认状态", "winRule": "按已完成步骤与协同检查结果评分", "submitPositions": [ "COMMANDER" ], "roundDuration": 7, "eventInjections": "" }, "steps": [ { "title": "识别狐狸巡检目标", "summary": "红蓝两队分别识别场景中的狐狸模型,由指挥员确认目标。", "allowedPositions": [ "COMMANDER" ] }, { "title": "完成狐狸状态检查", "summary": "由指挥员完成状态确认,操作员协同观察;提交团队检查结果。", "allowedPositions": [ "COMMANDER" ] } ] } }, { "title": "实装:说明兼容修复回写,重新截图封面及发布", "status": "PASS", "screenshots": [ "screenshots/physical-final-published.png" ], "details": { "projectId": "163", "publishedVersionId": "217", "apiTestVersionId": "215", "note": "既有任务50固定215;本次仅回填说明与更新截图封面,未改写任务快照。", "steps": [ { "stepCode": "PHYSICAL-S01", "actionCode": "PHYSICAL-A01", "summary": "核对测试工位与牛奶卡车编号。", "physicalEventRule": { "source": "MANUAL", "eventType": "step.physical-s01.confirmed", "progressPercent": 33, "manualConfirmAllowed": true } }, { "stepCode": "PHYSICAL-S02", "actionCode": "PHYSICAL-A02", "summary": "人工确认卡车外观状态,使用受控事件记录检查。", "physicalEventRule": { "source": "MANUAL", "eventType": "step.physical-s02.confirmed", "progressPercent": 67, "manualConfirmAllowed": true } }, { "stepCode": "PHYSICAL-S03", "actionCode": "PHYSICAL-A03", "summary": "核实步骤记录并提交检查结果。", "physicalEventRule": { "source": "MANUAL", "eventType": "step.physical-s03.confirmed", "progressPercent": 100, "manualConfirmAllowed": true } } ] } }, { "title": "实装默认页面:离线播放与候选复核可操作,无法执行新卡车正式步骤", "status": "BLOCKED", "screenshots": [ "screenshots/physical-teaching-list.png", "screenshots/physical-offline-preview.png", "screenshots/physical-offline-confirmed.png" ], "details": { "assignmentId": "50", "previewUrl": "/teaching/physical-training/preview/50", "observed": "进入任务后仍显示固定45秒维修识别录像,确认只改变本次页面候选,未加载卡车三步正式运行。", "businessWrites": [ ], "required": "需将正式任务快照、场景、人工/设备事件及运行记录接入工作台。" } }, { "title": "对抗默认页面:新建下拉仅有本地液压预设,无法选择已发布狐狸训练", "status": "BLOCKED", "screenshots": [ "screenshots/confrontation-final-entry.png", "screenshots/confrontation-final-local-create.png" ], "details": { "options": [ "桥梁架设装备液压系统检测与维修训练" ], "formalAssignmentId": "51", "formalAssignmentExists": true, "required": "需将默认任务清单、创建表单和执行入口接入正式对抗任务服务,并确认通用巡检与五阶段排故的适用范围。" } }, { "title": "训练列表两种模式展示各自真实截图封面", "status": "PASS", "screenshots": [ "screenshots/physical-list-cover.png", "screenshots/confrontation-list-cover.png" ], "details": { "projects": [ "163", "164" ], "authenticatedImagesLoaded": true } }, { "title": "牛奶卡车实装检查:发布重开、模型实际可见、截图封面", "status": "PASS", "screenshots": [ "screenshots/physical-independent-reopen.png", "screenshots/physical-independent-settings.png", "screenshots/physical-final-cover.jpg" ], "details": { "state": "ready", "meshes": 5, "visibleMeshes": 5, "skinnedMeshes": 0, "position": [ 4.2, 0.20617168998977797, -0.4356763541543951 ], "scale": [ 1.2323086149245381, 1.2323086149245381, 1.2323086149245381 ], "finiteBounds": true, "size": [ 3.4406057210321332, 3.390913184034896, 6.000000000000001 ], "camera": { "position": [ 10.565439077211714, 5.0456876852867705, 7.37050840519251 ], "target": [ 4.2, 1.695456592017448, 0 ] }, "sample": { "width": 320, "height": 180, "changedPixels": 11669 }, "scene": { "projectId": "159", "versionId": "209" }, "targets": [ { "id": "scene:OBJ-1788605199171-2", "name": "牛奶卡车检验主装备", "source": "scene" }, { "id": "scene:OBJ-1788605199171-2/part/interaction-1ba581e6", "name": "Yup2Zup", "source": "scene" }, { "id": "scene:OBJ-1788605199171-2/part/interaction-004dec41", "name": "Cesium_Milk_Truck", "source": "scene" }, { "id": "scene:OBJ-1788605199171-2/part/interaction-5f7e4bee", "name": "Cesium_Milk_Truck_1", "source": "scene" }, { "id": "scene:OBJ-1788605199171-2/part/interaction-607e4d81", "name": "Cesium_Milk_Truck_2", "source": "scene" }, { "id": "scene:OBJ-1788605199171-2/part/interaction-5d7e48c8", "name": "Cesium_Milk_Truck_3", "source": "scene" }, { "id": "scene:OBJ-1788605199171-2/part/interaction-5e7e4a5b", "name": "Node", "source": "scene" }, { "id": "scene:OBJ-1788605199171-2/part/interaction-ce2feac4", "name": "Wheels", "source": "scene" }, { "id": "scene:OBJ-1788605199171-2/part/interaction-637e523a", "name": "Node001", "source": "scene" }, { "id": "scene:OBJ-1788605199171-2/part/interaction-f417f82d", "name": "Wheels001", "source": "scene" } ], "steps": [ { "title": "核对卡车工位与装备", "targetId": "scene:OBJ-1788605199171-2", "weight": 30 }, { "title": "检查卡车外观状态", "targetId": "scene:OBJ-1788605199171-2", "weight": 30 }, { "title": "确认检查完成", "targetId": "scene:OBJ-1788605199171-2", "weight": 40 } ], "cover": { "assetId": "2111", "bytes": 42163, "sha256": "efb7060464f840bde78744d89567c609dc7b7922216d1c948fe22c1eed3d41a4", "width": 628, "height": 640 }, "pageErrors": [ ], "blockedWrites": [ ] } }, { "title": "狐狸红蓝协同巡检:发布重开、模型实际可见、截图封面", "status": "PASS", "screenshots": [ "screenshots/confrontation-independent-reopen.png", "screenshots/confrontation-independent-settings.png", "screenshots/confrontation-final-cover.jpg" ], "details": { "state": "ready", "meshes": 1, "visibleMeshes": 1, "skinnedMeshes": 1, "position": [ -7.5, 0.10930174852949677, 0.3440109341705351 ], "scale": [ 0.03616375932570189, 0.03616375932570189, 0.03616375932570189 ], "finiteBounds": true, "size": [ 0.9658796100519353, 2.811899945787403, 6 ], "camera": { "position": [ -0.04179225073787585, 6.099634646023559, 17.355036987378313 ], "target": [ -7.512232860974557, 1.4059499759307126, -2.2204460492503126E-16 ] }, "sample": { "width": 320, "height": 180, "changedPixels": 827 }, "scene": { "projectId": "160", "versionId": "210" }, "targets": [ { "id": "scene:OBJ-1788605873329-2", "name": "维修装备主体 02", "source": "scene" }, { "id": "scene:OBJ-1788605916565-6", "name": "狐狸野外巡检目标", "source": "scene" }, { "id": "scene:OBJ-1788605916565-6/part/interaction-a3d35c26", "name": "fox", "source": "scene" } ], "steps": [ { "title": "识别狐狸巡检目标", "targetId": "scene:OBJ-1788605916565-6", "weight": 50 }, { "title": "完成狐狸状态检查", "targetId": "scene:OBJ-1788605916565-6", "weight": 50 } ], "cover": { "assetId": "2108", "bytes": 51257, "sha256": "79779a9d1e40c0c160fa3dab25e83931639942f53e2ee3a5da12f9f86ad70081", "width": 628, "height": 640 }, "pageErrors": [ ], "blockedWrites": [ ] } } ], "projects": [ { "id": "163", "name": "实测训练-牛奶卡车实装检查-20260905", "mode": "PHYSICAL", "status": "PUBLISHED", "currentVersionId": "217", "publishedVersionId": "217", "sceneProjectId": "159", "sceneVersionId": "209", "stepCount": 3, "totalScore": 100, "cover": { "assetId": "2111", "image": "screenshots/physical-final-cover.jpg" }, "trainingMode": "PHYSICAL", "modeConfig": { "type": "PHYSICAL", "stationName": "牛奶卡车测试工位 A", "equipmentCode": "E2E-TRUCK-163", "gatewayProtocol": "HTTP 测试网关", "sensorChannels": "人工外观确认;测试状态点位", "safetyInterlocks": "测试工位隔离确认" }, "steps": [ { "stepCode": "PHYSICAL-S01", "actionCode": "PHYSICAL-A01", "title": "核对卡车工位与装备", "summary": "核对测试工位与牛奶卡车编号。", "targetId": "scene:OBJ-1788605199171-2", "allowedPositions": [ ], "physicalEventRule": { "source": "MANUAL", "eventType": "step.physical-s01.confirmed", "progressPercent": 33, "manualConfirmAllowed": true }, "score": 30 }, { "stepCode": "PHYSICAL-S02", "actionCode": "PHYSICAL-A02", "title": "检查卡车外观状态", "summary": "人工确认卡车外观状态,使用受控事件记录检查。", "targetId": "scene:OBJ-1788605199171-2", "allowedPositions": [ ], "physicalEventRule": { "source": "MANUAL", "eventType": "step.physical-s02.confirmed", "progressPercent": 67, "manualConfirmAllowed": true }, "score": 30 }, { "stepCode": "PHYSICAL-S03", "actionCode": "PHYSICAL-A03", "title": "确认检查完成", "summary": "核实步骤记录并提交检查结果。", "targetId": "scene:OBJ-1788605199171-2", "allowedPositions": [ ], "physicalEventRule": { "source": "MANUAL", "eventType": "step.physical-s03.confirmed", "progressPercent": 100, "manualConfirmAllowed": true }, "score": 40 } ], "apiTestVersionId": "215", "apiVersionNote": "API任务50固定215;说明字段兼容修复后在217做UI及封面回归,未改写任务快照。" }, { "id": "164", "name": "实测训练-狐狸红蓝协同巡检-20260905", "mode": "CONFRONTATION", "status": "PUBLISHED", "currentVersionId": "216", "publishedVersionId": "216", "sceneProjectId": "160", "sceneVersionId": "210", "stepCount": 2, "totalScore": 100, "cover": { "assetId": "2108", "image": "screenshots/confrontation-final-cover.jpg" }, "trainingMode": "CONFRONTATION", "modeConfig": { "type": "CONFRONTATION", "redTeamName": "狐狸巡检红队", "blueTeamName": "狐狸巡检蓝队", "teamSize": 2, "roundDurationMinutes": 7, "objective": "两队分别完成狐狸模型巡检并确认状态", "winRule": "按已完成步骤与协同检查结果评分", "submitPositions": [ "COMMANDER" ], "roundDuration": 7, "eventInjections": "" }, "steps": [ { "stepCode": "CONFRONTATION-S01", "actionCode": "CONFRONTATION-A01", "title": "识别狐狸巡检目标", "summary": "红蓝两队分别识别场景中的狐狸模型,由指挥员确认目标。", "targetId": "scene:OBJ-1788605916565-6", "allowedPositions": [ "COMMANDER" ], "physicalEventRule": { }, "score": 50 }, { "stepCode": "CONFRONTATION-S02", "actionCode": "CONFRONTATION-A02", "title": "完成狐狸状态检查", "summary": "由指挥员完成状态确认,操作员协同观察;提交团队检查结果。", "targetId": "scene:OBJ-1788605916565-6", "allowedPositions": [ "COMMANDER" ], "physicalEventRule": { }, "score": 50 } ], "apiTestVersionId": "216" } ], "bugs": [ ], "limitations": [ "实装为MANUAL人工事件合同测试,没有接真实PLC、摄像头、视觉识别服务或安全联锁设备。", "两步狐狸巡检用于通用步骤与红蓝岗位合同,不是需要CONF-INSPECT等五个固定编码的完整排故作业;未宣称排故工作台阶段回写已打通。", "对抗验证服务端设置了7分钟截止时刻,未等待自然超时触发;未把API账号请求视为多人跨浏览器实时协同UI测试。", "牛奶卡车沿用原发布场景的视角,车间立柱遮挡部分车身;真实模型已渲染且封面来自该视口。", "实装当前发布217仅回填兼容说明并更新封面;已完成教学任务50仍固定不可变版本215。", "历史仅positionActions设置动作岗位的定义在教学读取侧与当前发布预检存在口径差异;本次按现有发布规则配置非空allowedPositions,未改后端岗位合同。", "开发环境列表切换曾出现一次15秒超时,刷新后恢复;独立复测两种模式共6次查询均HTTP 200、耗时247–403ms,未复现稳定慢查询。详见list-api-latency.json。" ], "pageErrors": [ ], "development": [ "修复模式配置被旧channelProfiles覆盖,保持默认profile与modeConfig一致;对抗分钟/秒及旧roundDuration兼容。", "保留显式空配置文本;每队人数范围与服务端1–200一致,无效数字阻止发布,不静默夹断。", "保留步骤设备事件、人工确认、岗位与运行编码;增删排序后重新计算严格递增进度。", "修复复制步骤编码冲突(含大小写),复制动作岗位映射随新动作编码迁移。", "显式清空allowedPositions不再补回默认三岗位,保持权限边界并交由正式发布校验阻断。", "修复instruction/summary双界面操作说明丢失及显式空提示恢复演示内容;用户实际编辑时同步。", "正式targetId优先,目标选择同步语义引用、节点与动作,防止旧targetRef把新目标回退。", "沿用上轮训练3D视口截图方案:受控TRAINING_COVER上传、同次保存资产与内容,保存/发布后列表正确显示截图。", "本次均为正式工程合同适配与bugfix,未新增数据库字段、执行DDL或更改原型业务流程;测试数据通过开发API创建。" ], "commands": [ { "command": "pnpm run build", "status": "PASS", "details": "vue-tsc、Vite构建和legacy iframe分发校验均通过;仅已有包体积提示。" }, { "command": "node --test tools/training-*.test.mjs(本次8个聚焦文件)", "status": "PASS", "details": "94/94通过,涵盖封面、场景、真实模型、目标、元数据、模式与步骤兼容。" }, { "command": "pnpm run test:training-legacy", "status": "PASS", "details": "两项既有训练/地形合同检查通过。" }, { "command": "content-training-studio.spec.ts / Edge", "status": "PASS", "details": "7/7通过(mock API的工作台回归),无跳过、无不稳定用例,独立报告studio-regression/html/index.html。" }, { "command": "UTE2E_TRAINING_MODES=1 UTE2E_BASE_URL=http://192.168.31.168:6180 node tools/training-scene-visibility.e2e.mjs", "status": "PASS", "details": "独立Edge会话2/2通过,真实LAN服务、禁止业务写请求;模型可见像素差、固定场景依赖、JPEG尺寸与SHA-256全部通过。" }, { "command": "node tools/training-modes-api-live.mjs(163:215;164:216)", "status": "PASS", "details": "18/18检查组通过,90次正式教学API请求;含训练/场景/模型固定快照只读复核,详见api-evidence.json。" } ], "confirmationItems": [ "将实装工作台从固定离线识别回放扩展为读取正式任务、已发布场景和步骤,并接入人工/设备事件、提交与结果。", "将对抗默认入口从本地预设任务接入正式任务清单、创建和执行链路;确认通用巡检步骤与五阶段排故工作台的适用范围。" ], "finishedAt": "2026-09-05T15:58:39.239Z" }