Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

2835 wiersze
136 KiB

  1. <!doctype html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>实装与对抗训练实测报告 · 2026-09-05</title><style>
  2. :root{color-scheme:light;--ink:#203544;--muted:#607789;--line:#dce6ec;--green:#137d6e}*{box-sizing:border-box}body{margin:0;background:#f3f6f8;color:var(--ink);font:15px/1.75 system-ui,-apple-system,"Microsoft YaHei",sans-serif}main{max-width:1220px;margin:auto;padding:32px 24px 64px}header{padding:30px 34px;background:#103c45;color:white;border-radius:16px}h1{font-size:29px;margin:0 0 12px}header p{color:#d7e8eb;margin:7px 0}nav{display:flex;gap:10px;flex-wrap:wrap;margin:22px 0}nav a{color:var(--green);text-decoration:none;background:white;border:1px solid var(--line);padding:6px 13px;border-radius:7px}section{background:white;border:1px solid var(--line);border-radius:12px;padding:26px 30px;margin:20px 0}h2{font-size:21px;margin:0 0 16px}h3{font-size:17px;margin:0 0 12px}h4{font-size:15px;margin:0 0 7px}p{margin:10px 0}ul{padding-left:22px}li+li{margin-top:7px}.badge{display:inline-block;vertical-align:middle;font-size:12px;font-weight:600;line-height:1.7;border-radius:4px;padding:2px 8px;margin-left:5px}.pass{color:#11634f;background:#e3f5ed}.fail{color:#9e2a35;background:#ffe9ec}.pending,.blocked,.pass_with_limitations{color:#7b6121;background:#fff2cc}.muted{color:var(--muted)}.note{padding:12px 16px;background:#fff8e7;border-left:3px solid #c09a3b}.stages{display:grid;grid-template-columns:1fr 1fr;gap:18px}.stage{border:1px solid var(--line);border-radius:8px;padding:20px;min-width:0}.test+.test{border-top:1px solid var(--line);margin-top:22px;padding-top:22px}.check{border-left:3px solid var(--line);padding:8px 16px;margin:12px 0}details{margin:12px 0}summary{cursor:pointer;color:var(--green)}pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:600px;overflow:auto;padding:16px;background:#f5f8fa;border:1px solid var(--line);border-radius:7px;font:12px/1.6 ui-monospace,Consolas,monospace}.gallery{display:grid;grid-template-columns:1fr 1fr;gap:20px}figure{margin:0;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:#fafcfd;min-width:0}figure img{width:100%;height:auto;display:block}figcaption{padding:10px 13px;color:var(--muted);font-size:13px}.table-scroll{overflow:auto}table{border-collapse:collapse;width:100%;font-size:13px}th,td{border:1px solid var(--line);text-align:left;padding:10px;min-width:90px}th{background:#eef6f7}footer{color:var(--muted);font-size:13px;text-align:center}a{color:var(--green)}p,li,figcaption,summary{overflow-wrap:anywhere}@media(max-width:800px){main{padding:16px 12px 40px}header,section{padding:20px}h1{font-size:24px}.stages,.gallery{grid-template-columns:1fr}}@media print{body{background:white}main{max-width:none;padding:0}header{color:var(--ink);background:white;border:1px solid var(--line)}header p{color:var(--muted)}nav{display:none}.gallery{grid-template-columns:1fr}}
  3. h1,h2,h3,h4{overflow-wrap:anywhere}.check{min-width:0}
  4. </style></head><body><main><header><h1>实装与对抗训练实测报告 <span class="badge pass_with_limitations">部分链路已验证,页面闭环受限</span></h1><p>编排 UI · 默认教学入口 · 正式教学 API</p><p>编排与 API 已验证,教学页面闭环受限。需完成默认教学页面与正式任务运行的接线,才能从页面走完新模型对应的训练。</p><p>2026-09-05 · http://127.0.0.1:6180</p><p>证据组 2/2 已完成;检查通过 26,受限 2,失败 0,待验证 0;已校验截图 25 张。</p></header><nav><a href="#method">资料与实施</a><a href="#data">保留数据</a><a href="#tests">测试证据</a><a href="#images">截图</a><a href="#scope">范围与待确认项</a><a href="report.md">Markdown 报告</a></nav>
  5. <section id="method"><h2>资料 → 产品原型 → 设计 → 开发</h2><div class="stages"><article class="stage"><h3>1 · 资料</h3><ul><li>实际查看《维修训练内容设计.pdf》第 1–3、5–6 页扫描件。第 1–2 页将虚拟、混合现实、AI 指导下的实装组织为递进训练,流程包含构建场景、编排任务、组班下发、学员训练与数据报告。</li><li>本次使用狐狸与牛奶卡车测试素材验证软件链路,不将其视为原文装备维修内容或真实维修能力考核。原文已查看页面没有单列红蓝对抗规则;对抗依据现有教学实施、渠道合同、命令幂等及步骤事实文档验证。</li><li>合同来源:unreal_tran_api/wiki/14-教学实施模块.md、19-训练定义渠道合同.md、20-教学命令幂等.md、21-教学步骤运行事实.md。</li></ul></article><article class="stage"><h3>2 · 产品原型</h3><ul><li>沿用现有训练编排工作台与模式配置表单,分别建立实装和对抗内容;保存、发布后重新打开检查步骤、分值、封面与模式参数。</li><li>实装默认运行入口为离线识别回放;对抗默认入口为本地工作台。分别记录界面实际行为,再通过正式 API 验证服务端教学闭环。</li></ul></article><article class="stage"><h3>3 · 设计</h3><ul><li>实装配置三步人工确认,分值 30 / 30 / 40;完成进度按步骤推导为 33 / 67 / 100。验证失败重试、顺序约束、事件身份及重复事件处理。</li><li>对抗配置红蓝两队、每队两人,步骤和提交均由 COMMANDER 执行;OPERATOR 用于岗位拒绝测试。验证同队共享运行、跨队隔离、服务器时限、提交与教员评定。</li><li>任务固定引用已发布训练版本;只创建本次开发测试数据。人工确认和客户端模拟参数均明确标识为测试,不连接真实工位、PLC、摄像头或视觉服务。</li></ul></article><article class="stage"><h3>4 · 开发</h3><ul><li>修复模式配置被旧channelProfiles覆盖,保持默认profile与modeConfig一致;对抗分钟/秒及旧roundDuration兼容。</li><li>保留显式空配置文本;每队人数范围与服务端1–200一致,无效数字阻止发布,不静默夹断。</li><li>保留步骤设备事件、人工确认、岗位与运行编码;增删排序后重新计算严格递增进度。</li><li>修复复制步骤编码冲突(含大小写),复制动作岗位映射随新动作编码迁移。</li><li>显式清空allowedPositions不再补回默认三岗位,保持权限边界并交由正式发布校验阻断。</li><li>修复instruction/summary双界面操作说明丢失及显式空提示恢复演示内容;用户实际编辑时同步。</li><li>正式targetId优先,目标选择同步语义引用、节点与动作,防止旧targetRef把新目标回退。</li><li>沿用上轮训练3D视口截图方案:受控TRAINING_COVER上传、同次保存资产与内容,保存/发布后列表正确显示截图。</li><li>本次均为正式工程合同适配与bugfix,未新增数据库字段、执行DDL或更改原型业务流程;测试数据通过开发API创建。</li></ul></article></div><h3 style="margin-top:24px">两种模式的验证边界</h3><div class="table-scroll"><table><thead><tr><th>模式</th><th>正式渠道</th><th>本轮 API 验证方法</th><th>必检项</th><th>默认界面边界</th></tr></thead><tbody><tr><td>实装实训</td><td>PHYSICAL</td><td>正式 API 的 MANUAL 人工事件</td><td>三步顺序、失败重试、来源权限、事件幂等、提交与评定</td><td>默认离线识别页;设备 / 视觉接入另行联调</td></tr><tr><td>对抗训练</td><td>CONFRONTATION</td><td>正式 API 的红蓝两队共享运行</td><td>岗位权限、两队隔离、顺序、时限、命令幂等、提交与评定</td><td>默认本地工作台;不混同正式 API 运行</td></tr></tbody></table></div></section>
  6. <section id="data"><h2>保留开发测试数据</h2><div class="table-scroll"><table><thead><tr><th>训练 ID</th><th>名称</th><th>模式</th><th>状态</th><th>当前发布版本</th><th>API 已测版本</th><th>步骤数</th></tr></thead><tbody><tr><td>163</td><td>实测训练-牛奶卡车实装检查-20260905</td><td>PHYSICAL</td><td>PUBLISHED</td><td>217</td><td>215</td><td>3</td></tr><tr><td>164</td><td>实测训练-狐狸红蓝协同巡检-20260905</td><td>CONFRONTATION</td><td>PUBLISHED</td><td>216</td><td>216</td><td>2</td></tr></tbody></table></div><p class="note">训练 163:API任务50固定215;说明字段兼容修复后在217做UI及封面回归,未改写任务快照。</p><details><summary>训练 163 · 发布与配置记录</summary><pre>{
  7. &quot;id&quot;: &quot;163&quot;,
  8. &quot;name&quot;: &quot;实测训练-牛奶卡车实装检查-20260905&quot;,
  9. &quot;mode&quot;: &quot;PHYSICAL&quot;,
  10. &quot;status&quot;: &quot;PUBLISHED&quot;,
  11. &quot;currentVersionId&quot;: &quot;217&quot;,
  12. &quot;publishedVersionId&quot;: &quot;217&quot;,
  13. &quot;sceneProjectId&quot;: &quot;159&quot;,
  14. &quot;sceneVersionId&quot;: &quot;209&quot;,
  15. &quot;stepCount&quot;: 3,
  16. &quot;totalScore&quot;: 100,
  17. &quot;cover&quot;: {
  18. &quot;assetId&quot;: &quot;2111&quot;,
  19. &quot;image&quot;: &quot;screenshots/physical-final-cover.jpg&quot;
  20. },
  21. &quot;trainingMode&quot;: &quot;PHYSICAL&quot;,
  22. &quot;modeConfig&quot;: {
  23. &quot;type&quot;: &quot;PHYSICAL&quot;,
  24. &quot;stationName&quot;: &quot;牛奶卡车测试工位 A&quot;,
  25. &quot;equipmentCode&quot;: &quot;E2E-TRUCK-163&quot;,
  26. &quot;gatewayProtocol&quot;: &quot;HTTP 测试网关&quot;,
  27. &quot;sensorChannels&quot;: &quot;人工外观确认;测试状态点位&quot;,
  28. &quot;safetyInterlocks&quot;: &quot;测试工位隔离确认&quot;
  29. },
  30. &quot;steps&quot;: [
  31. {
  32. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  33. &quot;actionCode&quot;: &quot;PHYSICAL-A01&quot;,
  34. &quot;title&quot;: &quot;核对卡车工位与装备&quot;,
  35. &quot;summary&quot;: &quot;核对测试工位与牛奶卡车编号。&quot;,
  36. &quot;targetId&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  37. &quot;allowedPositions&quot;: [],
  38. &quot;physicalEventRule&quot;: {
  39. &quot;source&quot;: &quot;MANUAL&quot;,
  40. &quot;eventType&quot;: &quot;step.physical-s01.confirmed&quot;,
  41. &quot;progressPercent&quot;: 33,
  42. &quot;manualConfirmAllowed&quot;: true
  43. },
  44. &quot;score&quot;: 30
  45. },
  46. {
  47. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  48. &quot;actionCode&quot;: &quot;PHYSICAL-A02&quot;,
  49. &quot;title&quot;: &quot;检查卡车外观状态&quot;,
  50. &quot;summary&quot;: &quot;人工确认卡车外观状态,使用受控事件记录检查。&quot;,
  51. &quot;targetId&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  52. &quot;allowedPositions&quot;: [],
  53. &quot;physicalEventRule&quot;: {
  54. &quot;source&quot;: &quot;MANUAL&quot;,
  55. &quot;eventType&quot;: &quot;step.physical-s02.confirmed&quot;,
  56. &quot;progressPercent&quot;: 67,
  57. &quot;manualConfirmAllowed&quot;: true
  58. },
  59. &quot;score&quot;: 30
  60. },
  61. {
  62. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  63. &quot;actionCode&quot;: &quot;PHYSICAL-A03&quot;,
  64. &quot;title&quot;: &quot;确认检查完成&quot;,
  65. &quot;summary&quot;: &quot;核实步骤记录并提交检查结果。&quot;,
  66. &quot;targetId&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  67. &quot;allowedPositions&quot;: [],
  68. &quot;physicalEventRule&quot;: {
  69. &quot;source&quot;: &quot;MANUAL&quot;,
  70. &quot;eventType&quot;: &quot;step.physical-s03.confirmed&quot;,
  71. &quot;progressPercent&quot;: 100,
  72. &quot;manualConfirmAllowed&quot;: true
  73. },
  74. &quot;score&quot;: 40
  75. }
  76. ],
  77. &quot;apiTestVersionId&quot;: &quot;215&quot;,
  78. &quot;apiVersionNote&quot;: &quot;API任务50固定215;说明字段兼容修复后在217做UI及封面回归,未改写任务快照。&quot;
  79. }</pre></details><details><summary>训练 164 · 发布与配置记录</summary><pre>{
  80. &quot;id&quot;: &quot;164&quot;,
  81. &quot;name&quot;: &quot;实测训练-狐狸红蓝协同巡检-20260905&quot;,
  82. &quot;mode&quot;: &quot;CONFRONTATION&quot;,
  83. &quot;status&quot;: &quot;PUBLISHED&quot;,
  84. &quot;currentVersionId&quot;: &quot;216&quot;,
  85. &quot;publishedVersionId&quot;: &quot;216&quot;,
  86. &quot;sceneProjectId&quot;: &quot;160&quot;,
  87. &quot;sceneVersionId&quot;: &quot;210&quot;,
  88. &quot;stepCount&quot;: 2,
  89. &quot;totalScore&quot;: 100,
  90. &quot;cover&quot;: {
  91. &quot;assetId&quot;: &quot;2108&quot;,
  92. &quot;image&quot;: &quot;screenshots/confrontation-final-cover.jpg&quot;
  93. },
  94. &quot;trainingMode&quot;: &quot;CONFRONTATION&quot;,
  95. &quot;modeConfig&quot;: {
  96. &quot;type&quot;: &quot;CONFRONTATION&quot;,
  97. &quot;redTeamName&quot;: &quot;狐狸巡检红队&quot;,
  98. &quot;blueTeamName&quot;: &quot;狐狸巡检蓝队&quot;,
  99. &quot;teamSize&quot;: 2,
  100. &quot;roundDurationMinutes&quot;: 7,
  101. &quot;objective&quot;: &quot;两队分别完成狐狸模型巡检并确认状态&quot;,
  102. &quot;winRule&quot;: &quot;按已完成步骤与协同检查结果评分&quot;,
  103. &quot;submitPositions&quot;: [
  104. &quot;COMMANDER&quot;
  105. ],
  106. &quot;roundDuration&quot;: 7,
  107. &quot;eventInjections&quot;: &quot;&quot;
  108. },
  109. &quot;steps&quot;: [
  110. {
  111. &quot;stepCode&quot;: &quot;CONFRONTATION-S01&quot;,
  112. &quot;actionCode&quot;: &quot;CONFRONTATION-A01&quot;,
  113. &quot;title&quot;: &quot;识别狐狸巡检目标&quot;,
  114. &quot;summary&quot;: &quot;红蓝两队分别识别场景中的狐狸模型,由指挥员确认目标。&quot;,
  115. &quot;targetId&quot;: &quot;scene:OBJ-1788605916565-6&quot;,
  116. &quot;allowedPositions&quot;: [
  117. &quot;COMMANDER&quot;
  118. ],
  119. &quot;physicalEventRule&quot;: {},
  120. &quot;score&quot;: 50
  121. },
  122. {
  123. &quot;stepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  124. &quot;actionCode&quot;: &quot;CONFRONTATION-A02&quot;,
  125. &quot;title&quot;: &quot;完成狐狸状态检查&quot;,
  126. &quot;summary&quot;: &quot;由指挥员完成状态确认,操作员协同观察;提交团队检查结果。&quot;,
  127. &quot;targetId&quot;: &quot;scene:OBJ-1788605916565-6&quot;,
  128. &quot;allowedPositions&quot;: [
  129. &quot;COMMANDER&quot;
  130. ],
  131. &quot;physicalEventRule&quot;: {},
  132. &quot;score&quot;: 50
  133. }
  134. ],
  135. &quot;apiTestVersionId&quot;: &quot;216&quot;
  136. }</pre></details><h3>正式教学任务与运行</h3><div class="table-scroll"><table><thead><tr><th>任务 ID</th><th>运行 ID</th><th>渠道</th><th>队伍</th><th>状态</th><th>完成度</th><th>评定分</th></tr></thead><tbody><tr><td>50</td><td>44</td><td>PHYSICAL</td><td>NEUTRAL</td><td>REVIEWED</td><td>100</td><td>100</td></tr><tr><td>51</td><td>45</td><td>CONFRONTATION</td><td>RED</td><td>REVIEWED</td><td>100</td><td>100</td></tr><tr><td>51</td><td>46</td><td>CONFRONTATION</td><td>BLUE</td><td>REVIEWED</td><td>100</td><td>100</td></tr></tbody></table></div><details><summary>本次新增数据 ID</summary><pre>{
  137. &quot;assignments&quot;: [
  138. &quot;50&quot;,
  139. &quot;51&quot;
  140. ],
  141. &quot;runs&quot;: [
  142. &quot;44&quot;,
  143. &quot;45&quot;,
  144. &quot;46&quot;
  145. ],
  146. &quot;users&quot;: [
  147. &quot;95&quot;,
  148. &quot;96&quot;,
  149. &quot;97&quot;,
  150. &quot;98&quot;
  151. ],
  152. &quot;note&quot;: &quot;仅新建本次开发测试数据,未修改或删除既有账号、任务与运行。&quot;
  153. }</pre></details><p class="muted">随机测试密码与登录会话不写入报告;保留新建数据用于追溯。</p></section>
  154. <section id="tests"><h2>5 · 测试</h2><p>证据组 2/2 已完成;检查通过 26,受限 2,失败 0,待验证 0;已校验截图 25 张。</p><article class="test"><h3>实装实训与对抗训练真实流程测试 <span class="badge pass_with_limitations">部分链路已验证,页面闭环受限</span></h3><p class="muted">证据类型:UI · evidence.json</p><div class="check"><h4>实装:创建、绑定牛奶卡车、3步配置、保存重开与发布 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  155. &quot;title&quot;: &quot;实装:创建、绑定牛奶卡车、3步配置、保存重开与发布&quot;,
  156. &quot;status&quot;: &quot;PASS&quot;,
  157. &quot;screenshots&quot;: [
  158. &quot;screenshots/physical-settings-reopen.png&quot;,
  159. &quot;screenshots/physical-authoring.png&quot;,
  160. &quot;screenshots/physical-preflight.png&quot;,
  161. &quot;screenshots/physical-published.png&quot;
  162. ],
  163. &quot;details&quot;: {
  164. &quot;id&quot;: &quot;163&quot;,
  165. &quot;version&quot;: &quot;215&quot;,
  166. &quot;progress&quot;: [
  167. 33,
  168. 67,
  169. 100
  170. ],
  171. &quot;profile&quot;: {
  172. &quot;type&quot;: &quot;PHYSICAL&quot;,
  173. &quot;stationName&quot;: &quot;牛奶卡车测试工位 A&quot;,
  174. &quot;equipmentCode&quot;: &quot;E2E-TRUCK-163&quot;,
  175. &quot;gatewayProtocol&quot;: &quot;HTTP 测试网关&quot;,
  176. &quot;sensorChannels&quot;: &quot;人工外观确认;测试状态点位&quot;,
  177. &quot;safetyInterlocks&quot;: &quot;测试工位隔离确认&quot;
  178. }
  179. }
  180. }</pre></details></div><div class="check"><h4>对抗:每队人数为小数时阻止发布 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  181. &quot;title&quot;: &quot;对抗:每队人数为小数时阻止发布&quot;,
  182. &quot;status&quot;: &quot;PASS&quot;,
  183. &quot;screenshots&quot;: [
  184. &quot;screenshots/confrontation-invalid-team-size.png&quot;
  185. ],
  186. &quot;details&quot;: {
  187. &quot;input&quot;: 2.5,
  188. &quot;message&quot;: &quot;发布校验未通过\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关闭&quot;
  189. }
  190. }</pre></details></div><div class="check"><h4>对抗:显式清空岗位后保存重开,不恢复默认授权 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  191. &quot;title&quot;: &quot;对抗:显式清空岗位后保存重开,不恢复默认授权&quot;,
  192. &quot;status&quot;: &quot;PASS&quot;,
  193. &quot;screenshots&quot;: [
  194. &quot;screenshots/confrontation-empty-positions.png&quot;
  195. ],
  196. &quot;details&quot;: {
  197. &quot;allowedPositions&quot;: [],
  198. &quot;published&quot;: false
  199. }
  200. }</pre></details></div><div class="check"><h4>对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  201. &quot;title&quot;: &quot;对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布&quot;,
  202. &quot;status&quot;: &quot;PASS&quot;,
  203. &quot;screenshots&quot;: [
  204. &quot;screenshots/confrontation-positions.png&quot;,
  205. &quot;screenshots/confrontation-settings-reopen.png&quot;,
  206. &quot;screenshots/confrontation-authoring.png&quot;,
  207. &quot;screenshots/confrontation-preflight.png&quot;,
  208. &quot;screenshots/confrontation-published.png&quot;
  209. ],
  210. &quot;details&quot;: {
  211. &quot;id&quot;: &quot;164&quot;,
  212. &quot;version&quot;: &quot;216&quot;,
  213. &quot;profile&quot;: {
  214. &quot;type&quot;: &quot;CONFRONTATION&quot;,
  215. &quot;redTeamName&quot;: &quot;狐狸巡检红队&quot;,
  216. &quot;blueTeamName&quot;: &quot;狐狸巡检蓝队&quot;,
  217. &quot;teamSize&quot;: 2,
  218. &quot;roundDurationMinutes&quot;: 7,
  219. &quot;objective&quot;: &quot;两队分别完成狐狸模型巡检并确认状态&quot;,
  220. &quot;winRule&quot;: &quot;按已完成步骤与协同检查结果评分&quot;,
  221. &quot;submitPositions&quot;: [
  222. &quot;COMMANDER&quot;
  223. ],
  224. &quot;roundDuration&quot;: 7,
  225. &quot;eventInjections&quot;: &quot;&quot;
  226. },
  227. &quot;steps&quot;: [
  228. {
  229. &quot;title&quot;: &quot;识别狐狸巡检目标&quot;,
  230. &quot;summary&quot;: &quot;红蓝两队分别识别场景中的狐狸模型,由指挥员确认目标。&quot;,
  231. &quot;allowedPositions&quot;: [
  232. &quot;COMMANDER&quot;
  233. ]
  234. },
  235. {
  236. &quot;title&quot;: &quot;完成狐狸状态检查&quot;,
  237. &quot;summary&quot;: &quot;由指挥员完成状态确认,操作员协同观察;提交团队检查结果。&quot;,
  238. &quot;allowedPositions&quot;: [
  239. &quot;COMMANDER&quot;
  240. ]
  241. }
  242. ]
  243. }
  244. }</pre></details></div><div class="check"><h4>实装:说明兼容修复回写,重新截图封面及发布 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  245. &quot;title&quot;: &quot;实装:说明兼容修复回写,重新截图封面及发布&quot;,
  246. &quot;status&quot;: &quot;PASS&quot;,
  247. &quot;screenshots&quot;: [
  248. &quot;screenshots/physical-final-published.png&quot;
  249. ],
  250. &quot;details&quot;: {
  251. &quot;projectId&quot;: &quot;163&quot;,
  252. &quot;publishedVersionId&quot;: &quot;217&quot;,
  253. &quot;apiTestVersionId&quot;: &quot;215&quot;,
  254. &quot;note&quot;: &quot;既有任务50固定215;本次仅回填说明与更新截图封面,未改写任务快照。&quot;,
  255. &quot;steps&quot;: [
  256. {
  257. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  258. &quot;actionCode&quot;: &quot;PHYSICAL-A01&quot;,
  259. &quot;summary&quot;: &quot;核对测试工位与牛奶卡车编号。&quot;,
  260. &quot;physicalEventRule&quot;: {
  261. &quot;source&quot;: &quot;MANUAL&quot;,
  262. &quot;eventType&quot;: &quot;step.physical-s01.confirmed&quot;,
  263. &quot;progressPercent&quot;: 33,
  264. &quot;manualConfirmAllowed&quot;: true
  265. }
  266. },
  267. {
  268. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  269. &quot;actionCode&quot;: &quot;PHYSICAL-A02&quot;,
  270. &quot;summary&quot;: &quot;人工确认卡车外观状态,使用受控事件记录检查。&quot;,
  271. &quot;physicalEventRule&quot;: {
  272. &quot;source&quot;: &quot;MANUAL&quot;,
  273. &quot;eventType&quot;: &quot;step.physical-s02.confirmed&quot;,
  274. &quot;progressPercent&quot;: 67,
  275. &quot;manualConfirmAllowed&quot;: true
  276. }
  277. },
  278. {
  279. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  280. &quot;actionCode&quot;: &quot;PHYSICAL-A03&quot;,
  281. &quot;summary&quot;: &quot;核实步骤记录并提交检查结果。&quot;,
  282. &quot;physicalEventRule&quot;: {
  283. &quot;source&quot;: &quot;MANUAL&quot;,
  284. &quot;eventType&quot;: &quot;step.physical-s03.confirmed&quot;,
  285. &quot;progressPercent&quot;: 100,
  286. &quot;manualConfirmAllowed&quot;: true
  287. }
  288. }
  289. ]
  290. }
  291. }</pre></details></div><div class="check"><h4>实装默认页面:离线播放与候选复核可操作,无法执行新卡车正式步骤 <span class="badge blocked">受限(需功能接线)</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  292. &quot;title&quot;: &quot;实装默认页面:离线播放与候选复核可操作,无法执行新卡车正式步骤&quot;,
  293. &quot;status&quot;: &quot;BLOCKED&quot;,
  294. &quot;screenshots&quot;: [
  295. &quot;screenshots/physical-teaching-list.png&quot;,
  296. &quot;screenshots/physical-offline-preview.png&quot;,
  297. &quot;screenshots/physical-offline-confirmed.png&quot;
  298. ],
  299. &quot;details&quot;: {
  300. &quot;assignmentId&quot;: &quot;50&quot;,
  301. &quot;previewUrl&quot;: &quot;/teaching/physical-training/preview/50&quot;,
  302. &quot;observed&quot;: &quot;进入任务后仍显示固定45秒维修识别录像,确认只改变本次页面候选,未加载卡车三步正式运行。&quot;,
  303. &quot;businessWrites&quot;: [],
  304. &quot;required&quot;: &quot;需将正式任务快照、场景、人工/设备事件及运行记录接入工作台。&quot;
  305. }
  306. }</pre></details></div><div class="check"><h4>对抗默认页面:新建下拉仅有本地液压预设,无法选择已发布狐狸训练 <span class="badge blocked">受限(需功能接线)</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  307. &quot;title&quot;: &quot;对抗默认页面:新建下拉仅有本地液压预设,无法选择已发布狐狸训练&quot;,
  308. &quot;status&quot;: &quot;BLOCKED&quot;,
  309. &quot;screenshots&quot;: [
  310. &quot;screenshots/confrontation-final-entry.png&quot;,
  311. &quot;screenshots/confrontation-final-local-create.png&quot;
  312. ],
  313. &quot;details&quot;: {
  314. &quot;options&quot;: [
  315. &quot;桥梁架设装备液压系统检测与维修训练&quot;
  316. ],
  317. &quot;formalAssignmentId&quot;: &quot;51&quot;,
  318. &quot;formalAssignmentExists&quot;: true,
  319. &quot;required&quot;: &quot;需将默认任务清单、创建表单和执行入口接入正式对抗任务服务,并确认通用巡检与五阶段排故的适用范围。&quot;
  320. }
  321. }</pre></details></div><div class="check"><h4>训练列表两种模式展示各自真实截图封面 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  322. &quot;title&quot;: &quot;训练列表两种模式展示各自真实截图封面&quot;,
  323. &quot;status&quot;: &quot;PASS&quot;,
  324. &quot;screenshots&quot;: [
  325. &quot;screenshots/physical-list-cover.png&quot;,
  326. &quot;screenshots/confrontation-list-cover.png&quot;
  327. ],
  328. &quot;details&quot;: {
  329. &quot;projects&quot;: [
  330. &quot;163&quot;,
  331. &quot;164&quot;
  332. ],
  333. &quot;authenticatedImagesLoaded&quot;: true
  334. }
  335. }</pre></details></div><div class="check"><h4>牛奶卡车实装检查:发布重开、模型实际可见、截图封面 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  336. &quot;title&quot;: &quot;牛奶卡车实装检查:发布重开、模型实际可见、截图封面&quot;,
  337. &quot;status&quot;: &quot;PASS&quot;,
  338. &quot;screenshots&quot;: [
  339. &quot;screenshots/physical-independent-reopen.png&quot;,
  340. &quot;screenshots/physical-independent-settings.png&quot;,
  341. &quot;screenshots/physical-final-cover.jpg&quot;
  342. ],
  343. &quot;details&quot;: {
  344. &quot;state&quot;: &quot;ready&quot;,
  345. &quot;meshes&quot;: 5,
  346. &quot;visibleMeshes&quot;: 5,
  347. &quot;skinnedMeshes&quot;: 0,
  348. &quot;position&quot;: [
  349. 4.2,
  350. 0.20617168998977797,
  351. -0.4356763541543951
  352. ],
  353. &quot;scale&quot;: [
  354. 1.2323086149245381,
  355. 1.2323086149245381,
  356. 1.2323086149245381
  357. ],
  358. &quot;finiteBounds&quot;: true,
  359. &quot;size&quot;: [
  360. 3.4406057210321332,
  361. 3.390913184034896,
  362. 6.000000000000001
  363. ],
  364. &quot;camera&quot;: {
  365. &quot;position&quot;: [
  366. 10.565439077211714,
  367. 5.0456876852867705,
  368. 7.37050840519251
  369. ],
  370. &quot;target&quot;: [
  371. 4.2,
  372. 1.695456592017448,
  373. 0
  374. ]
  375. },
  376. &quot;sample&quot;: {
  377. &quot;width&quot;: 320,
  378. &quot;height&quot;: 180,
  379. &quot;changedPixels&quot;: 11669
  380. },
  381. &quot;scene&quot;: {
  382. &quot;projectId&quot;: &quot;159&quot;,
  383. &quot;versionId&quot;: &quot;209&quot;
  384. },
  385. &quot;targets&quot;: [
  386. {
  387. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  388. &quot;name&quot;: &quot;牛奶卡车检验主装备&quot;,
  389. &quot;source&quot;: &quot;scene&quot;
  390. },
  391. {
  392. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-1ba581e6&quot;,
  393. &quot;name&quot;: &quot;Yup2Zup&quot;,
  394. &quot;source&quot;: &quot;scene&quot;
  395. },
  396. {
  397. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-004dec41&quot;,
  398. &quot;name&quot;: &quot;Cesium_Milk_Truck&quot;,
  399. &quot;source&quot;: &quot;scene&quot;
  400. },
  401. {
  402. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-5f7e4bee&quot;,
  403. &quot;name&quot;: &quot;Cesium_Milk_Truck_1&quot;,
  404. &quot;source&quot;: &quot;scene&quot;
  405. },
  406. {
  407. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-607e4d81&quot;,
  408. &quot;name&quot;: &quot;Cesium_Milk_Truck_2&quot;,
  409. &quot;source&quot;: &quot;scene&quot;
  410. },
  411. {
  412. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-5d7e48c8&quot;,
  413. &quot;name&quot;: &quot;Cesium_Milk_Truck_3&quot;,
  414. &quot;source&quot;: &quot;scene&quot;
  415. },
  416. {
  417. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-5e7e4a5b&quot;,
  418. &quot;name&quot;: &quot;Node&quot;,
  419. &quot;source&quot;: &quot;scene&quot;
  420. },
  421. {
  422. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-ce2feac4&quot;,
  423. &quot;name&quot;: &quot;Wheels&quot;,
  424. &quot;source&quot;: &quot;scene&quot;
  425. },
  426. {
  427. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-637e523a&quot;,
  428. &quot;name&quot;: &quot;Node001&quot;,
  429. &quot;source&quot;: &quot;scene&quot;
  430. },
  431. {
  432. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-f417f82d&quot;,
  433. &quot;name&quot;: &quot;Wheels001&quot;,
  434. &quot;source&quot;: &quot;scene&quot;
  435. }
  436. ],
  437. &quot;steps&quot;: [
  438. {
  439. &quot;title&quot;: &quot;核对卡车工位与装备&quot;,
  440. &quot;targetId&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  441. &quot;weight&quot;: 30
  442. },
  443. {
  444. &quot;title&quot;: &quot;检查卡车外观状态&quot;,
  445. &quot;targetId&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  446. &quot;weight&quot;: 30
  447. },
  448. {
  449. &quot;title&quot;: &quot;确认检查完成&quot;,
  450. &quot;targetId&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  451. &quot;weight&quot;: 40
  452. }
  453. ],
  454. &quot;cover&quot;: {
  455. &quot;assetId&quot;: &quot;2111&quot;,
  456. &quot;bytes&quot;: 42163,
  457. &quot;sha256&quot;: &quot;efb7060464f840bde78744d89567c609dc7b7922216d1c948fe22c1eed3d41a4&quot;,
  458. &quot;width&quot;: 628,
  459. &quot;height&quot;: 640
  460. },
  461. &quot;pageErrors&quot;: [],
  462. &quot;blockedWrites&quot;: []
  463. }
  464. }</pre></details></div><div class="check"><h4>狐狸红蓝协同巡检:发布重开、模型实际可见、截图封面 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  465. &quot;title&quot;: &quot;狐狸红蓝协同巡检:发布重开、模型实际可见、截图封面&quot;,
  466. &quot;status&quot;: &quot;PASS&quot;,
  467. &quot;screenshots&quot;: [
  468. &quot;screenshots/confrontation-independent-reopen.png&quot;,
  469. &quot;screenshots/confrontation-independent-settings.png&quot;,
  470. &quot;screenshots/confrontation-final-cover.jpg&quot;
  471. ],
  472. &quot;details&quot;: {
  473. &quot;state&quot;: &quot;ready&quot;,
  474. &quot;meshes&quot;: 1,
  475. &quot;visibleMeshes&quot;: 1,
  476. &quot;skinnedMeshes&quot;: 1,
  477. &quot;position&quot;: [
  478. -7.5,
  479. 0.10930174852949677,
  480. 0.3440109341705351
  481. ],
  482. &quot;scale&quot;: [
  483. 0.03616375932570189,
  484. 0.03616375932570189,
  485. 0.03616375932570189
  486. ],
  487. &quot;finiteBounds&quot;: true,
  488. &quot;size&quot;: [
  489. 0.9658796100519353,
  490. 2.811899945787403,
  491. 6
  492. ],
  493. &quot;camera&quot;: {
  494. &quot;position&quot;: [
  495. -0.04179225073787585,
  496. 6.099634646023559,
  497. 17.355036987378313
  498. ],
  499. &quot;target&quot;: [
  500. -7.512232860974557,
  501. 1.4059499759307126,
  502. -2.2204460492503126e-16
  503. ]
  504. },
  505. &quot;sample&quot;: {
  506. &quot;width&quot;: 320,
  507. &quot;height&quot;: 180,
  508. &quot;changedPixels&quot;: 827
  509. },
  510. &quot;scene&quot;: {
  511. &quot;projectId&quot;: &quot;160&quot;,
  512. &quot;versionId&quot;: &quot;210&quot;
  513. },
  514. &quot;targets&quot;: [
  515. {
  516. &quot;id&quot;: &quot;scene:OBJ-1788605873329-2&quot;,
  517. &quot;name&quot;: &quot;维修装备主体 02&quot;,
  518. &quot;source&quot;: &quot;scene&quot;
  519. },
  520. {
  521. &quot;id&quot;: &quot;scene:OBJ-1788605916565-6&quot;,
  522. &quot;name&quot;: &quot;狐狸野外巡检目标&quot;,
  523. &quot;source&quot;: &quot;scene&quot;
  524. },
  525. {
  526. &quot;id&quot;: &quot;scene:OBJ-1788605916565-6/part/interaction-a3d35c26&quot;,
  527. &quot;name&quot;: &quot;fox&quot;,
  528. &quot;source&quot;: &quot;scene&quot;
  529. }
  530. ],
  531. &quot;steps&quot;: [
  532. {
  533. &quot;title&quot;: &quot;识别狐狸巡检目标&quot;,
  534. &quot;targetId&quot;: &quot;scene:OBJ-1788605916565-6&quot;,
  535. &quot;weight&quot;: 50
  536. },
  537. {
  538. &quot;title&quot;: &quot;完成狐狸状态检查&quot;,
  539. &quot;targetId&quot;: &quot;scene:OBJ-1788605916565-6&quot;,
  540. &quot;weight&quot;: 50
  541. }
  542. ],
  543. &quot;cover&quot;: {
  544. &quot;assetId&quot;: &quot;2108&quot;,
  545. &quot;bytes&quot;: 51257,
  546. &quot;sha256&quot;: &quot;79779a9d1e40c0c160fa3dab25e83931639942f53e2ee3a5da12f9f86ad70081&quot;,
  547. &quot;width&quot;: 628,
  548. &quot;height&quot;: 640
  549. },
  550. &quot;pageErrors&quot;: [],
  551. &quot;blockedWrites&quot;: []
  552. }
  553. }</pre></details></div><details><summary>evidence.json · 完整记录</summary><pre>{
  554. &quot;title&quot;: &quot;实装实训与对抗训练真实流程测试&quot;,
  555. &quot;startedAt&quot;: &quot;2026-09-05T15:37:32.805Z&quot;,
  556. &quot;status&quot;: &quot;PASS_WITH_LIMITATIONS&quot;,
  557. &quot;checks&quot;: [
  558. {
  559. &quot;title&quot;: &quot;实装:创建、绑定牛奶卡车、3步配置、保存重开与发布&quot;,
  560. &quot;status&quot;: &quot;PASS&quot;,
  561. &quot;screenshots&quot;: [
  562. &quot;screenshots/physical-settings-reopen.png&quot;,
  563. &quot;screenshots/physical-authoring.png&quot;,
  564. &quot;screenshots/physical-preflight.png&quot;,
  565. &quot;screenshots/physical-published.png&quot;
  566. ],
  567. &quot;details&quot;: {
  568. &quot;id&quot;: &quot;163&quot;,
  569. &quot;version&quot;: &quot;215&quot;,
  570. &quot;progress&quot;: [
  571. 33,
  572. 67,
  573. 100
  574. ],
  575. &quot;profile&quot;: {
  576. &quot;type&quot;: &quot;PHYSICAL&quot;,
  577. &quot;stationName&quot;: &quot;牛奶卡车测试工位 A&quot;,
  578. &quot;equipmentCode&quot;: &quot;E2E-TRUCK-163&quot;,
  579. &quot;gatewayProtocol&quot;: &quot;HTTP 测试网关&quot;,
  580. &quot;sensorChannels&quot;: &quot;人工外观确认;测试状态点位&quot;,
  581. &quot;safetyInterlocks&quot;: &quot;测试工位隔离确认&quot;
  582. }
  583. }
  584. },
  585. {
  586. &quot;title&quot;: &quot;对抗:每队人数为小数时阻止发布&quot;,
  587. &quot;status&quot;: &quot;PASS&quot;,
  588. &quot;screenshots&quot;: [
  589. &quot;screenshots/confrontation-invalid-team-size.png&quot;
  590. ],
  591. &quot;details&quot;: {
  592. &quot;input&quot;: 2.5,
  593. &quot;message&quot;: &quot;发布校验未通过\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关闭&quot;
  594. }
  595. },
  596. {
  597. &quot;title&quot;: &quot;对抗:显式清空岗位后保存重开,不恢复默认授权&quot;,
  598. &quot;status&quot;: &quot;PASS&quot;,
  599. &quot;screenshots&quot;: [
  600. &quot;screenshots/confrontation-empty-positions.png&quot;
  601. ],
  602. &quot;details&quot;: {
  603. &quot;allowedPositions&quot;: [],
  604. &quot;published&quot;: false
  605. }
  606. },
  607. {
  608. &quot;title&quot;: &quot;对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布&quot;,
  609. &quot;status&quot;: &quot;PASS&quot;,
  610. &quot;screenshots&quot;: [
  611. &quot;screenshots/confrontation-positions.png&quot;,
  612. &quot;screenshots/confrontation-settings-reopen.png&quot;,
  613. &quot;screenshots/confrontation-authoring.png&quot;,
  614. &quot;screenshots/confrontation-preflight.png&quot;,
  615. &quot;screenshots/confrontation-published.png&quot;
  616. ],
  617. &quot;details&quot;: {
  618. &quot;id&quot;: &quot;164&quot;,
  619. &quot;version&quot;: &quot;216&quot;,
  620. &quot;profile&quot;: {
  621. &quot;type&quot;: &quot;CONFRONTATION&quot;,
  622. &quot;redTeamName&quot;: &quot;狐狸巡检红队&quot;,
  623. &quot;blueTeamName&quot;: &quot;狐狸巡检蓝队&quot;,
  624. &quot;teamSize&quot;: 2,
  625. &quot;roundDurationMinutes&quot;: 7,
  626. &quot;objective&quot;: &quot;两队分别完成狐狸模型巡检并确认状态&quot;,
  627. &quot;winRule&quot;: &quot;按已完成步骤与协同检查结果评分&quot;,
  628. &quot;submitPositions&quot;: [
  629. &quot;COMMANDER&quot;
  630. ],
  631. &quot;roundDuration&quot;: 7,
  632. &quot;eventInjections&quot;: &quot;&quot;
  633. },
  634. &quot;steps&quot;: [
  635. {
  636. &quot;title&quot;: &quot;识别狐狸巡检目标&quot;,
  637. &quot;summary&quot;: &quot;红蓝两队分别识别场景中的狐狸模型,由指挥员确认目标。&quot;,
  638. &quot;allowedPositions&quot;: [
  639. &quot;COMMANDER&quot;
  640. ]
  641. },
  642. {
  643. &quot;title&quot;: &quot;完成狐狸状态检查&quot;,
  644. &quot;summary&quot;: &quot;由指挥员完成状态确认,操作员协同观察;提交团队检查结果。&quot;,
  645. &quot;allowedPositions&quot;: [
  646. &quot;COMMANDER&quot;
  647. ]
  648. }
  649. ]
  650. }
  651. },
  652. {
  653. &quot;title&quot;: &quot;实装:说明兼容修复回写,重新截图封面及发布&quot;,
  654. &quot;status&quot;: &quot;PASS&quot;,
  655. &quot;screenshots&quot;: [
  656. &quot;screenshots/physical-final-published.png&quot;
  657. ],
  658. &quot;details&quot;: {
  659. &quot;projectId&quot;: &quot;163&quot;,
  660. &quot;publishedVersionId&quot;: &quot;217&quot;,
  661. &quot;apiTestVersionId&quot;: &quot;215&quot;,
  662. &quot;note&quot;: &quot;既有任务50固定215;本次仅回填说明与更新截图封面,未改写任务快照。&quot;,
  663. &quot;steps&quot;: [
  664. {
  665. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  666. &quot;actionCode&quot;: &quot;PHYSICAL-A01&quot;,
  667. &quot;summary&quot;: &quot;核对测试工位与牛奶卡车编号。&quot;,
  668. &quot;physicalEventRule&quot;: {
  669. &quot;source&quot;: &quot;MANUAL&quot;,
  670. &quot;eventType&quot;: &quot;step.physical-s01.confirmed&quot;,
  671. &quot;progressPercent&quot;: 33,
  672. &quot;manualConfirmAllowed&quot;: true
  673. }
  674. },
  675. {
  676. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  677. &quot;actionCode&quot;: &quot;PHYSICAL-A02&quot;,
  678. &quot;summary&quot;: &quot;人工确认卡车外观状态,使用受控事件记录检查。&quot;,
  679. &quot;physicalEventRule&quot;: {
  680. &quot;source&quot;: &quot;MANUAL&quot;,
  681. &quot;eventType&quot;: &quot;step.physical-s02.confirmed&quot;,
  682. &quot;progressPercent&quot;: 67,
  683. &quot;manualConfirmAllowed&quot;: true
  684. }
  685. },
  686. {
  687. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  688. &quot;actionCode&quot;: &quot;PHYSICAL-A03&quot;,
  689. &quot;summary&quot;: &quot;核实步骤记录并提交检查结果。&quot;,
  690. &quot;physicalEventRule&quot;: {
  691. &quot;source&quot;: &quot;MANUAL&quot;,
  692. &quot;eventType&quot;: &quot;step.physical-s03.confirmed&quot;,
  693. &quot;progressPercent&quot;: 100,
  694. &quot;manualConfirmAllowed&quot;: true
  695. }
  696. }
  697. ]
  698. }
  699. },
  700. {
  701. &quot;title&quot;: &quot;实装默认页面:离线播放与候选复核可操作,无法执行新卡车正式步骤&quot;,
  702. &quot;status&quot;: &quot;BLOCKED&quot;,
  703. &quot;screenshots&quot;: [
  704. &quot;screenshots/physical-teaching-list.png&quot;,
  705. &quot;screenshots/physical-offline-preview.png&quot;,
  706. &quot;screenshots/physical-offline-confirmed.png&quot;
  707. ],
  708. &quot;details&quot;: {
  709. &quot;assignmentId&quot;: &quot;50&quot;,
  710. &quot;previewUrl&quot;: &quot;/teaching/physical-training/preview/50&quot;,
  711. &quot;observed&quot;: &quot;进入任务后仍显示固定45秒维修识别录像,确认只改变本次页面候选,未加载卡车三步正式运行。&quot;,
  712. &quot;businessWrites&quot;: [],
  713. &quot;required&quot;: &quot;需将正式任务快照、场景、人工/设备事件及运行记录接入工作台。&quot;
  714. }
  715. },
  716. {
  717. &quot;title&quot;: &quot;对抗默认页面:新建下拉仅有本地液压预设,无法选择已发布狐狸训练&quot;,
  718. &quot;status&quot;: &quot;BLOCKED&quot;,
  719. &quot;screenshots&quot;: [
  720. &quot;screenshots/confrontation-final-entry.png&quot;,
  721. &quot;screenshots/confrontation-final-local-create.png&quot;
  722. ],
  723. &quot;details&quot;: {
  724. &quot;options&quot;: [
  725. &quot;桥梁架设装备液压系统检测与维修训练&quot;
  726. ],
  727. &quot;formalAssignmentId&quot;: &quot;51&quot;,
  728. &quot;formalAssignmentExists&quot;: true,
  729. &quot;required&quot;: &quot;需将默认任务清单、创建表单和执行入口接入正式对抗任务服务,并确认通用巡检与五阶段排故的适用范围。&quot;
  730. }
  731. },
  732. {
  733. &quot;title&quot;: &quot;训练列表两种模式展示各自真实截图封面&quot;,
  734. &quot;status&quot;: &quot;PASS&quot;,
  735. &quot;screenshots&quot;: [
  736. &quot;screenshots/physical-list-cover.png&quot;,
  737. &quot;screenshots/confrontation-list-cover.png&quot;
  738. ],
  739. &quot;details&quot;: {
  740. &quot;projects&quot;: [
  741. &quot;163&quot;,
  742. &quot;164&quot;
  743. ],
  744. &quot;authenticatedImagesLoaded&quot;: true
  745. }
  746. },
  747. {
  748. &quot;title&quot;: &quot;牛奶卡车实装检查:发布重开、模型实际可见、截图封面&quot;,
  749. &quot;status&quot;: &quot;PASS&quot;,
  750. &quot;screenshots&quot;: [
  751. &quot;screenshots/physical-independent-reopen.png&quot;,
  752. &quot;screenshots/physical-independent-settings.png&quot;,
  753. &quot;screenshots/physical-final-cover.jpg&quot;
  754. ],
  755. &quot;details&quot;: {
  756. &quot;state&quot;: &quot;ready&quot;,
  757. &quot;meshes&quot;: 5,
  758. &quot;visibleMeshes&quot;: 5,
  759. &quot;skinnedMeshes&quot;: 0,
  760. &quot;position&quot;: [
  761. 4.2,
  762. 0.20617168998977797,
  763. -0.4356763541543951
  764. ],
  765. &quot;scale&quot;: [
  766. 1.2323086149245381,
  767. 1.2323086149245381,
  768. 1.2323086149245381
  769. ],
  770. &quot;finiteBounds&quot;: true,
  771. &quot;size&quot;: [
  772. 3.4406057210321332,
  773. 3.390913184034896,
  774. 6.000000000000001
  775. ],
  776. &quot;camera&quot;: {
  777. &quot;position&quot;: [
  778. 10.565439077211714,
  779. 5.0456876852867705,
  780. 7.37050840519251
  781. ],
  782. &quot;target&quot;: [
  783. 4.2,
  784. 1.695456592017448,
  785. 0
  786. ]
  787. },
  788. &quot;sample&quot;: {
  789. &quot;width&quot;: 320,
  790. &quot;height&quot;: 180,
  791. &quot;changedPixels&quot;: 11669
  792. },
  793. &quot;scene&quot;: {
  794. &quot;projectId&quot;: &quot;159&quot;,
  795. &quot;versionId&quot;: &quot;209&quot;
  796. },
  797. &quot;targets&quot;: [
  798. {
  799. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  800. &quot;name&quot;: &quot;牛奶卡车检验主装备&quot;,
  801. &quot;source&quot;: &quot;scene&quot;
  802. },
  803. {
  804. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-1ba581e6&quot;,
  805. &quot;name&quot;: &quot;Yup2Zup&quot;,
  806. &quot;source&quot;: &quot;scene&quot;
  807. },
  808. {
  809. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-004dec41&quot;,
  810. &quot;name&quot;: &quot;Cesium_Milk_Truck&quot;,
  811. &quot;source&quot;: &quot;scene&quot;
  812. },
  813. {
  814. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-5f7e4bee&quot;,
  815. &quot;name&quot;: &quot;Cesium_Milk_Truck_1&quot;,
  816. &quot;source&quot;: &quot;scene&quot;
  817. },
  818. {
  819. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-607e4d81&quot;,
  820. &quot;name&quot;: &quot;Cesium_Milk_Truck_2&quot;,
  821. &quot;source&quot;: &quot;scene&quot;
  822. },
  823. {
  824. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-5d7e48c8&quot;,
  825. &quot;name&quot;: &quot;Cesium_Milk_Truck_3&quot;,
  826. &quot;source&quot;: &quot;scene&quot;
  827. },
  828. {
  829. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-5e7e4a5b&quot;,
  830. &quot;name&quot;: &quot;Node&quot;,
  831. &quot;source&quot;: &quot;scene&quot;
  832. },
  833. {
  834. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-ce2feac4&quot;,
  835. &quot;name&quot;: &quot;Wheels&quot;,
  836. &quot;source&quot;: &quot;scene&quot;
  837. },
  838. {
  839. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-637e523a&quot;,
  840. &quot;name&quot;: &quot;Node001&quot;,
  841. &quot;source&quot;: &quot;scene&quot;
  842. },
  843. {
  844. &quot;id&quot;: &quot;scene:OBJ-1788605199171-2/part/interaction-f417f82d&quot;,
  845. &quot;name&quot;: &quot;Wheels001&quot;,
  846. &quot;source&quot;: &quot;scene&quot;
  847. }
  848. ],
  849. &quot;steps&quot;: [
  850. {
  851. &quot;title&quot;: &quot;核对卡车工位与装备&quot;,
  852. &quot;targetId&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  853. &quot;weight&quot;: 30
  854. },
  855. {
  856. &quot;title&quot;: &quot;检查卡车外观状态&quot;,
  857. &quot;targetId&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  858. &quot;weight&quot;: 30
  859. },
  860. {
  861. &quot;title&quot;: &quot;确认检查完成&quot;,
  862. &quot;targetId&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  863. &quot;weight&quot;: 40
  864. }
  865. ],
  866. &quot;cover&quot;: {
  867. &quot;assetId&quot;: &quot;2111&quot;,
  868. &quot;bytes&quot;: 42163,
  869. &quot;sha256&quot;: &quot;efb7060464f840bde78744d89567c609dc7b7922216d1c948fe22c1eed3d41a4&quot;,
  870. &quot;width&quot;: 628,
  871. &quot;height&quot;: 640
  872. },
  873. &quot;pageErrors&quot;: [],
  874. &quot;blockedWrites&quot;: []
  875. }
  876. },
  877. {
  878. &quot;title&quot;: &quot;狐狸红蓝协同巡检:发布重开、模型实际可见、截图封面&quot;,
  879. &quot;status&quot;: &quot;PASS&quot;,
  880. &quot;screenshots&quot;: [
  881. &quot;screenshots/confrontation-independent-reopen.png&quot;,
  882. &quot;screenshots/confrontation-independent-settings.png&quot;,
  883. &quot;screenshots/confrontation-final-cover.jpg&quot;
  884. ],
  885. &quot;details&quot;: {
  886. &quot;state&quot;: &quot;ready&quot;,
  887. &quot;meshes&quot;: 1,
  888. &quot;visibleMeshes&quot;: 1,
  889. &quot;skinnedMeshes&quot;: 1,
  890. &quot;position&quot;: [
  891. -7.5,
  892. 0.10930174852949677,
  893. 0.3440109341705351
  894. ],
  895. &quot;scale&quot;: [
  896. 0.03616375932570189,
  897. 0.03616375932570189,
  898. 0.03616375932570189
  899. ],
  900. &quot;finiteBounds&quot;: true,
  901. &quot;size&quot;: [
  902. 0.9658796100519353,
  903. 2.811899945787403,
  904. 6
  905. ],
  906. &quot;camera&quot;: {
  907. &quot;position&quot;: [
  908. -0.04179225073787585,
  909. 6.099634646023559,
  910. 17.355036987378313
  911. ],
  912. &quot;target&quot;: [
  913. -7.512232860974557,
  914. 1.4059499759307126,
  915. -2.2204460492503126e-16
  916. ]
  917. },
  918. &quot;sample&quot;: {
  919. &quot;width&quot;: 320,
  920. &quot;height&quot;: 180,
  921. &quot;changedPixels&quot;: 827
  922. },
  923. &quot;scene&quot;: {
  924. &quot;projectId&quot;: &quot;160&quot;,
  925. &quot;versionId&quot;: &quot;210&quot;
  926. },
  927. &quot;targets&quot;: [
  928. {
  929. &quot;id&quot;: &quot;scene:OBJ-1788605873329-2&quot;,
  930. &quot;name&quot;: &quot;维修装备主体 02&quot;,
  931. &quot;source&quot;: &quot;scene&quot;
  932. },
  933. {
  934. &quot;id&quot;: &quot;scene:OBJ-1788605916565-6&quot;,
  935. &quot;name&quot;: &quot;狐狸野外巡检目标&quot;,
  936. &quot;source&quot;: &quot;scene&quot;
  937. },
  938. {
  939. &quot;id&quot;: &quot;scene:OBJ-1788605916565-6/part/interaction-a3d35c26&quot;,
  940. &quot;name&quot;: &quot;fox&quot;,
  941. &quot;source&quot;: &quot;scene&quot;
  942. }
  943. ],
  944. &quot;steps&quot;: [
  945. {
  946. &quot;title&quot;: &quot;识别狐狸巡检目标&quot;,
  947. &quot;targetId&quot;: &quot;scene:OBJ-1788605916565-6&quot;,
  948. &quot;weight&quot;: 50
  949. },
  950. {
  951. &quot;title&quot;: &quot;完成狐狸状态检查&quot;,
  952. &quot;targetId&quot;: &quot;scene:OBJ-1788605916565-6&quot;,
  953. &quot;weight&quot;: 50
  954. }
  955. ],
  956. &quot;cover&quot;: {
  957. &quot;assetId&quot;: &quot;2108&quot;,
  958. &quot;bytes&quot;: 51257,
  959. &quot;sha256&quot;: &quot;79779a9d1e40c0c160fa3dab25e83931639942f53e2ee3a5da12f9f86ad70081&quot;,
  960. &quot;width&quot;: 628,
  961. &quot;height&quot;: 640
  962. },
  963. &quot;pageErrors&quot;: [],
  964. &quot;blockedWrites&quot;: []
  965. }
  966. }
  967. ],
  968. &quot;projects&quot;: [
  969. {
  970. &quot;id&quot;: &quot;163&quot;,
  971. &quot;name&quot;: &quot;实测训练-牛奶卡车实装检查-20260905&quot;,
  972. &quot;mode&quot;: &quot;PHYSICAL&quot;,
  973. &quot;status&quot;: &quot;PUBLISHED&quot;,
  974. &quot;currentVersionId&quot;: &quot;217&quot;,
  975. &quot;publishedVersionId&quot;: &quot;217&quot;,
  976. &quot;sceneProjectId&quot;: &quot;159&quot;,
  977. &quot;sceneVersionId&quot;: &quot;209&quot;,
  978. &quot;stepCount&quot;: 3,
  979. &quot;totalScore&quot;: 100,
  980. &quot;cover&quot;: {
  981. &quot;assetId&quot;: &quot;2111&quot;,
  982. &quot;image&quot;: &quot;screenshots/physical-final-cover.jpg&quot;
  983. },
  984. &quot;trainingMode&quot;: &quot;PHYSICAL&quot;,
  985. &quot;modeConfig&quot;: {
  986. &quot;type&quot;: &quot;PHYSICAL&quot;,
  987. &quot;stationName&quot;: &quot;牛奶卡车测试工位 A&quot;,
  988. &quot;equipmentCode&quot;: &quot;E2E-TRUCK-163&quot;,
  989. &quot;gatewayProtocol&quot;: &quot;HTTP 测试网关&quot;,
  990. &quot;sensorChannels&quot;: &quot;人工外观确认;测试状态点位&quot;,
  991. &quot;safetyInterlocks&quot;: &quot;测试工位隔离确认&quot;
  992. },
  993. &quot;steps&quot;: [
  994. {
  995. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  996. &quot;actionCode&quot;: &quot;PHYSICAL-A01&quot;,
  997. &quot;title&quot;: &quot;核对卡车工位与装备&quot;,
  998. &quot;summary&quot;: &quot;核对测试工位与牛奶卡车编号。&quot;,
  999. &quot;targetId&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  1000. &quot;allowedPositions&quot;: [],
  1001. &quot;physicalEventRule&quot;: {
  1002. &quot;source&quot;: &quot;MANUAL&quot;,
  1003. &quot;eventType&quot;: &quot;step.physical-s01.confirmed&quot;,
  1004. &quot;progressPercent&quot;: 33,
  1005. &quot;manualConfirmAllowed&quot;: true
  1006. },
  1007. &quot;score&quot;: 30
  1008. },
  1009. {
  1010. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  1011. &quot;actionCode&quot;: &quot;PHYSICAL-A02&quot;,
  1012. &quot;title&quot;: &quot;检查卡车外观状态&quot;,
  1013. &quot;summary&quot;: &quot;人工确认卡车外观状态,使用受控事件记录检查。&quot;,
  1014. &quot;targetId&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  1015. &quot;allowedPositions&quot;: [],
  1016. &quot;physicalEventRule&quot;: {
  1017. &quot;source&quot;: &quot;MANUAL&quot;,
  1018. &quot;eventType&quot;: &quot;step.physical-s02.confirmed&quot;,
  1019. &quot;progressPercent&quot;: 67,
  1020. &quot;manualConfirmAllowed&quot;: true
  1021. },
  1022. &quot;score&quot;: 30
  1023. },
  1024. {
  1025. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  1026. &quot;actionCode&quot;: &quot;PHYSICAL-A03&quot;,
  1027. &quot;title&quot;: &quot;确认检查完成&quot;,
  1028. &quot;summary&quot;: &quot;核实步骤记录并提交检查结果。&quot;,
  1029. &quot;targetId&quot;: &quot;scene:OBJ-1788605199171-2&quot;,
  1030. &quot;allowedPositions&quot;: [],
  1031. &quot;physicalEventRule&quot;: {
  1032. &quot;source&quot;: &quot;MANUAL&quot;,
  1033. &quot;eventType&quot;: &quot;step.physical-s03.confirmed&quot;,
  1034. &quot;progressPercent&quot;: 100,
  1035. &quot;manualConfirmAllowed&quot;: true
  1036. },
  1037. &quot;score&quot;: 40
  1038. }
  1039. ],
  1040. &quot;apiTestVersionId&quot;: &quot;215&quot;,
  1041. &quot;apiVersionNote&quot;: &quot;API任务50固定215;说明字段兼容修复后在217做UI及封面回归,未改写任务快照。&quot;
  1042. },
  1043. {
  1044. &quot;id&quot;: &quot;164&quot;,
  1045. &quot;name&quot;: &quot;实测训练-狐狸红蓝协同巡检-20260905&quot;,
  1046. &quot;mode&quot;: &quot;CONFRONTATION&quot;,
  1047. &quot;status&quot;: &quot;PUBLISHED&quot;,
  1048. &quot;currentVersionId&quot;: &quot;216&quot;,
  1049. &quot;publishedVersionId&quot;: &quot;216&quot;,
  1050. &quot;sceneProjectId&quot;: &quot;160&quot;,
  1051. &quot;sceneVersionId&quot;: &quot;210&quot;,
  1052. &quot;stepCount&quot;: 2,
  1053. &quot;totalScore&quot;: 100,
  1054. &quot;cover&quot;: {
  1055. &quot;assetId&quot;: &quot;2108&quot;,
  1056. &quot;image&quot;: &quot;screenshots/confrontation-final-cover.jpg&quot;
  1057. },
  1058. &quot;trainingMode&quot;: &quot;CONFRONTATION&quot;,
  1059. &quot;modeConfig&quot;: {
  1060. &quot;type&quot;: &quot;CONFRONTATION&quot;,
  1061. &quot;redTeamName&quot;: &quot;狐狸巡检红队&quot;,
  1062. &quot;blueTeamName&quot;: &quot;狐狸巡检蓝队&quot;,
  1063. &quot;teamSize&quot;: 2,
  1064. &quot;roundDurationMinutes&quot;: 7,
  1065. &quot;objective&quot;: &quot;两队分别完成狐狸模型巡检并确认状态&quot;,
  1066. &quot;winRule&quot;: &quot;按已完成步骤与协同检查结果评分&quot;,
  1067. &quot;submitPositions&quot;: [
  1068. &quot;COMMANDER&quot;
  1069. ],
  1070. &quot;roundDuration&quot;: 7,
  1071. &quot;eventInjections&quot;: &quot;&quot;
  1072. },
  1073. &quot;steps&quot;: [
  1074. {
  1075. &quot;stepCode&quot;: &quot;CONFRONTATION-S01&quot;,
  1076. &quot;actionCode&quot;: &quot;CONFRONTATION-A01&quot;,
  1077. &quot;title&quot;: &quot;识别狐狸巡检目标&quot;,
  1078. &quot;summary&quot;: &quot;红蓝两队分别识别场景中的狐狸模型,由指挥员确认目标。&quot;,
  1079. &quot;targetId&quot;: &quot;scene:OBJ-1788605916565-6&quot;,
  1080. &quot;allowedPositions&quot;: [
  1081. &quot;COMMANDER&quot;
  1082. ],
  1083. &quot;physicalEventRule&quot;: {},
  1084. &quot;score&quot;: 50
  1085. },
  1086. {
  1087. &quot;stepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  1088. &quot;actionCode&quot;: &quot;CONFRONTATION-A02&quot;,
  1089. &quot;title&quot;: &quot;完成狐狸状态检查&quot;,
  1090. &quot;summary&quot;: &quot;由指挥员完成状态确认,操作员协同观察;提交团队检查结果。&quot;,
  1091. &quot;targetId&quot;: &quot;scene:OBJ-1788605916565-6&quot;,
  1092. &quot;allowedPositions&quot;: [
  1093. &quot;COMMANDER&quot;
  1094. ],
  1095. &quot;physicalEventRule&quot;: {},
  1096. &quot;score&quot;: 50
  1097. }
  1098. ],
  1099. &quot;apiTestVersionId&quot;: &quot;216&quot;
  1100. }
  1101. ],
  1102. &quot;bugs&quot;: [],
  1103. &quot;limitations&quot;: [
  1104. &quot;实装为MANUAL人工事件合同测试,没有接真实PLC、摄像头、视觉识别服务或安全联锁设备。&quot;,
  1105. &quot;两步狐狸巡检用于通用步骤与红蓝岗位合同,不是需要CONF-INSPECT等五个固定编码的完整排故作业;未宣称排故工作台阶段回写已打通。&quot;,
  1106. &quot;对抗验证服务端设置了7分钟截止时刻,未等待自然超时触发;未把API账号请求视为多人跨浏览器实时协同UI测试。&quot;,
  1107. &quot;牛奶卡车沿用原发布场景的视角,车间立柱遮挡部分车身;真实模型已渲染且封面来自该视口。&quot;,
  1108. &quot;实装当前发布217仅回填兼容说明并更新封面;已完成教学任务50仍固定不可变版本215。&quot;,
  1109. &quot;历史仅positionActions设置动作岗位的定义在教学读取侧与当前发布预检存在口径差异;本次按现有发布规则配置非空allowedPositions,未改后端岗位合同。&quot;,
  1110. &quot;开发环境列表切换曾出现一次15秒超时,刷新后恢复;独立复测两种模式共6次查询均HTTP 200、耗时247–403ms,未复现稳定慢查询。详见list-api-latency.json。&quot;
  1111. ],
  1112. &quot;pageErrors&quot;: [],
  1113. &quot;development&quot;: [
  1114. &quot;修复模式配置被旧channelProfiles覆盖,保持默认profile与modeConfig一致;对抗分钟/秒及旧roundDuration兼容。&quot;,
  1115. &quot;保留显式空配置文本;每队人数范围与服务端1–200一致,无效数字阻止发布,不静默夹断。&quot;,
  1116. &quot;保留步骤设备事件、人工确认、岗位与运行编码;增删排序后重新计算严格递增进度。&quot;,
  1117. &quot;修复复制步骤编码冲突(含大小写),复制动作岗位映射随新动作编码迁移。&quot;,
  1118. &quot;显式清空allowedPositions不再补回默认三岗位,保持权限边界并交由正式发布校验阻断。&quot;,
  1119. &quot;修复instruction/summary双界面操作说明丢失及显式空提示恢复演示内容;用户实际编辑时同步。&quot;,
  1120. &quot;正式targetId优先,目标选择同步语义引用、节点与动作,防止旧targetRef把新目标回退。&quot;,
  1121. &quot;沿用上轮训练3D视口截图方案:受控TRAINING_COVER上传、同次保存资产与内容,保存/发布后列表正确显示截图。&quot;,
  1122. &quot;本次均为正式工程合同适配与bugfix,未新增数据库字段、执行DDL或更改原型业务流程;测试数据通过开发API创建。&quot;
  1123. ],
  1124. &quot;commands&quot;: [
  1125. {
  1126. &quot;command&quot;: &quot;pnpm run build&quot;,
  1127. &quot;status&quot;: &quot;PASS&quot;,
  1128. &quot;details&quot;: &quot;vue-tsc、Vite构建和legacy iframe分发校验均通过;仅已有包体积提示。&quot;
  1129. },
  1130. {
  1131. &quot;command&quot;: &quot;node --test tools/training-*.test.mjs(本次8个聚焦文件)&quot;,
  1132. &quot;status&quot;: &quot;PASS&quot;,
  1133. &quot;details&quot;: &quot;94/94通过,涵盖封面、场景、真实模型、目标、元数据、模式与步骤兼容。&quot;
  1134. },
  1135. {
  1136. &quot;command&quot;: &quot;pnpm run test:training-legacy&quot;,
  1137. &quot;status&quot;: &quot;PASS&quot;,
  1138. &quot;details&quot;: &quot;两项既有训练/地形合同检查通过。&quot;
  1139. },
  1140. {
  1141. &quot;command&quot;: &quot;content-training-studio.spec.ts / Edge&quot;,
  1142. &quot;status&quot;: &quot;PASS&quot;,
  1143. &quot;details&quot;: &quot;7/7通过(mock API的工作台回归),无跳过、无不稳定用例,独立报告studio-regression/html/index.html。&quot;
  1144. },
  1145. {
  1146. &quot;command&quot;: &quot;UTE2E_TRAINING_MODES=1 UTE2E_BASE_URL=http://192.168.31.168:6180 node tools/training-scene-visibility.e2e.mjs&quot;,
  1147. &quot;status&quot;: &quot;PASS&quot;,
  1148. &quot;details&quot;: &quot;独立Edge会话2/2通过,真实LAN服务、禁止业务写请求;模型可见像素差、固定场景依赖、JPEG尺寸与SHA-256全部通过。&quot;
  1149. },
  1150. {
  1151. &quot;command&quot;: &quot;node tools/training-modes-api-live.mjs(163:215;164:216)&quot;,
  1152. &quot;status&quot;: &quot;PASS&quot;,
  1153. &quot;details&quot;: &quot;18/18检查组通过,90次正式教学API请求;含训练/场景/模型固定快照只读复核,详见api-evidence.json。&quot;
  1154. }
  1155. ],
  1156. &quot;confirmationItems&quot;: [
  1157. &quot;将实装工作台从固定离线识别回放扩展为读取正式任务、已发布场景和步骤,并接入人工/设备事件、提交与结果。&quot;,
  1158. &quot;将对抗默认入口从本地预设任务接入正式任务清单、创建和执行链路;确认通用巡检步骤与五阶段排故工作台的适用范围。&quot;
  1159. ],
  1160. &quot;finishedAt&quot;: &quot;2026-09-05T15:58:39.239Z&quot;
  1161. }</pre></details></article><article class="test"><h3>实装人工事件与红蓝对抗正式 API 闭环 <span class="badge pass">通过</span></h3><p class="muted">证据类型:API · api-evidence.json</p><div class="check"><h4>开始命令重放不会重复激活或递增次数 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1162. &quot;title&quot;: &quot;开始命令重放不会重复激活或递增次数&quot;,
  1163. &quot;status&quot;: &quot;PASS&quot;,
  1164. &quot;details&quot;: {
  1165. &quot;runId&quot;: &quot;44&quot;,
  1166. &quot;version&quot;: 2,
  1167. &quot;attemptCount&quot;: 1
  1168. }
  1169. }</pre></details></div><div class="check"><h4>实装任务固定发布版本、分配学员并开始 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1170. &quot;title&quot;: &quot;实装任务固定发布版本、分配学员并开始&quot;,
  1171. &quot;status&quot;: &quot;PASS&quot;,
  1172. &quot;details&quot;: {
  1173. &quot;assignmentId&quot;: &quot;50&quot;,
  1174. &quot;run&quot;: {
  1175. &quot;id&quot;: &quot;44&quot;,
  1176. &quot;assignmentId&quot;: &quot;50&quot;,
  1177. &quot;status&quot;: &quot;IN_PROGRESS&quot;,
  1178. &quot;version&quot;: 2,
  1179. &quot;progressPercent&quot;: 0,
  1180. &quot;currentStepCode&quot;: &quot;PHYSICAL-S01&quot;,
  1181. &quot;score&quot;: null,
  1182. &quot;passed&quot;: null
  1183. },
  1184. &quot;content&quot;: {
  1185. &quot;projectId&quot;: &quot;163&quot;,
  1186. &quot;versionId&quot;: &quot;215&quot;
  1187. },
  1188. &quot;rules&quot;: [
  1189. {
  1190. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  1191. &quot;source&quot;: &quot;MANUAL&quot;,
  1192. &quot;eventType&quot;: &quot;step.physical-s01.confirmed&quot;,
  1193. &quot;progressPercent&quot;: 33
  1194. },
  1195. {
  1196. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  1197. &quot;source&quot;: &quot;MANUAL&quot;,
  1198. &quot;eventType&quot;: &quot;step.physical-s02.confirmed&quot;,
  1199. &quot;progressPercent&quot;: 67
  1200. },
  1201. {
  1202. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  1203. &quot;source&quot;: &quot;MANUAL&quot;,
  1204. &quot;eventType&quot;: &quot;step.physical-s03.confirmed&quot;,
  1205. &quot;progressPercent&quot;: 100
  1206. }
  1207. ]
  1208. }
  1209. }</pre></details></div><div class="check"><h4>实装拒绝普通进度接口、抢跑、提前提交及错误事件身份 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1210. &quot;title&quot;: &quot;实装拒绝普通进度接口、抢跑、提前提交及错误事件身份&quot;,
  1211. &quot;status&quot;: &quot;PASS&quot;,
  1212. &quot;details&quot;: {
  1213. &quot;runId&quot;: &quot;44&quot;,
  1214. &quot;forbiddenProgress&quot;: {
  1215. &quot;status&quot;: 403,
  1216. &quot;message&quot;: &quot;实装运行只能由设备、视觉或人工确认事件推进&quot;
  1217. },
  1218. &quot;prematureSubmit&quot;: {
  1219. &quot;status&quot;: 409,
  1220. &quot;message&quot;: &quot;训练步骤尚未全部完成,不能提交&quot;
  1221. },
  1222. &quot;skipped&quot;: {
  1223. &quot;status&quot;: 409,
  1224. &quot;message&quot;: &quot;物理事件必须匹配当前待完成步骤,不能跳步或回退&quot;
  1225. },
  1226. &quot;untrustedDevice&quot;: {
  1227. &quot;status&quot;: 403,
  1228. &quot;message&quot;: &quot;无权执行此操作&quot;
  1229. },
  1230. &quot;managerManual&quot;: {
  1231. &quot;status&quot;: 403,
  1232. &quot;message&quot;: &quot;当前学员不是该运行成员&quot;
  1233. },
  1234. &quot;progressUnchanged&quot;: 0
  1235. }
  1236. }</pre></details></div><div class="check"><h4>实装不匹配事件失败,必须重试后才可继续 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1237. &quot;title&quot;: &quot;实装不匹配事件失败,必须重试后才可继续&quot;,
  1238. &quot;status&quot;: &quot;PASS&quot;,
  1239. &quot;details&quot;: {
  1240. &quot;runId&quot;: &quot;44&quot;,
  1241. &quot;outcome&quot;: &quot;UNMATCHED&quot;,
  1242. &quot;beforeRetry&quot;: {
  1243. &quot;status&quot;: 409,
  1244. &quot;message&quot;: &quot;实装步骤失败后必须先重试,完成后不能再次推进&quot;
  1245. },
  1246. &quot;facts&quot;: [
  1247. {
  1248. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  1249. &quot;status&quot;: &quot;IN_PROGRESS&quot;,
  1250. &quot;targetProgressPercent&quot;: 33,
  1251. &quot;attemptCount&quot;: 2,
  1252. &quot;failureCount&quot;: 1,
  1253. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  1254. },
  1255. {
  1256. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  1257. &quot;status&quot;: &quot;PENDING&quot;,
  1258. &quot;targetProgressPercent&quot;: 67,
  1259. &quot;attemptCount&quot;: 0,
  1260. &quot;failureCount&quot;: 0,
  1261. &quot;evidenceSourceCode&quot;: &quot;NONE&quot;
  1262. },
  1263. {
  1264. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  1265. &quot;status&quot;: &quot;PENDING&quot;,
  1266. &quot;targetProgressPercent&quot;: 100,
  1267. &quot;attemptCount&quot;: 0,
  1268. &quot;failureCount&quot;: 0,
  1269. &quot;evidenceSourceCode&quot;: &quot;NONE&quot;
  1270. }
  1271. ]
  1272. }
  1273. }</pre></details></div><div class="check"><h4>实装逐步人工确认、事件幂等与载荷冲突 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1274. &quot;title&quot;: &quot;实装逐步人工确认、事件幂等与载荷冲突&quot;,
  1275. &quot;status&quot;: &quot;PASS&quot;,
  1276. &quot;details&quot;: {
  1277. &quot;runId&quot;: &quot;44&quot;,
  1278. &quot;progression&quot;: [
  1279. {
  1280. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  1281. &quot;eventId&quot;: &quot;MANUAL-FF103EF3-B498-4EAC-8F06-42DE46CC9CE4&quot;,
  1282. &quot;progress&quot;: 33,
  1283. &quot;replayVersion&quot;: 5,
  1284. &quot;alteredEventStatus&quot;: 409
  1285. },
  1286. {
  1287. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  1288. &quot;eventId&quot;: &quot;MANUAL-9D8A36B7-C161-4736-A71E-D1700E55216B&quot;,
  1289. &quot;progress&quot;: 67,
  1290. &quot;replayVersion&quot;: 6,
  1291. &quot;alteredEventStatus&quot;: 409
  1292. },
  1293. {
  1294. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  1295. &quot;eventId&quot;: &quot;MANUAL-1D1ADE8F-D32B-434B-A7D8-A2571E502137&quot;,
  1296. &quot;progress&quot;: 100,
  1297. &quot;replayVersion&quot;: 7,
  1298. &quot;alteredEventStatus&quot;: 409
  1299. }
  1300. ],
  1301. &quot;facts&quot;: [
  1302. {
  1303. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  1304. &quot;status&quot;: &quot;COMPLETED&quot;,
  1305. &quot;targetProgressPercent&quot;: 33,
  1306. &quot;attemptCount&quot;: 2,
  1307. &quot;failureCount&quot;: 1,
  1308. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  1309. },
  1310. {
  1311. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  1312. &quot;status&quot;: &quot;COMPLETED&quot;,
  1313. &quot;targetProgressPercent&quot;: 67,
  1314. &quot;attemptCount&quot;: 1,
  1315. &quot;failureCount&quot;: 0,
  1316. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  1317. },
  1318. {
  1319. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  1320. &quot;status&quot;: &quot;COMPLETED&quot;,
  1321. &quot;targetProgressPercent&quot;: 100,
  1322. &quot;attemptCount&quot;: 1,
  1323. &quot;failureCount&quot;: 0,
  1324. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  1325. }
  1326. ]
  1327. }
  1328. }</pre></details></div><div class="check"><h4>PHYSICAL 提交、教员评定与结果回读 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1329. &quot;title&quot;: &quot;PHYSICAL 提交、教员评定与结果回读&quot;,
  1330. &quot;status&quot;: &quot;PASS&quot;,
  1331. &quot;details&quot;: {
  1332. &quot;run&quot;: {
  1333. &quot;id&quot;: &quot;44&quot;,
  1334. &quot;assignmentId&quot;: &quot;50&quot;,
  1335. &quot;status&quot;: &quot;REVIEWED&quot;,
  1336. &quot;version&quot;: 9,
  1337. &quot;progressPercent&quot;: 100,
  1338. &quot;currentStepCode&quot;: &quot;PHYSICAL-S03&quot;,
  1339. &quot;score&quot;: 100,
  1340. &quot;passed&quot;: true
  1341. },
  1342. &quot;submitReplay&quot;: true,
  1343. &quot;reviewReplay&quot;: true,
  1344. &quot;facts&quot;: [
  1345. {
  1346. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  1347. &quot;status&quot;: &quot;COMPLETED&quot;,
  1348. &quot;targetProgressPercent&quot;: 33,
  1349. &quot;attemptCount&quot;: 2,
  1350. &quot;failureCount&quot;: 1,
  1351. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  1352. },
  1353. {
  1354. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  1355. &quot;status&quot;: &quot;COMPLETED&quot;,
  1356. &quot;targetProgressPercent&quot;: 67,
  1357. &quot;attemptCount&quot;: 1,
  1358. &quot;failureCount&quot;: 0,
  1359. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  1360. },
  1361. {
  1362. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  1363. &quot;status&quot;: &quot;COMPLETED&quot;,
  1364. &quot;targetProgressPercent&quot;: 100,
  1365. &quot;attemptCount&quot;: 1,
  1366. &quot;failureCount&quot;: 0,
  1367. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  1368. }
  1369. ]
  1370. }
  1371. }</pre></details></div><div class="check"><h4>对抗红蓝两队各两人,按队伍共享且运行互相独立 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1372. &quot;title&quot;: &quot;对抗红蓝两队各两人,按队伍共享且运行互相独立&quot;,
  1373. &quot;status&quot;: &quot;PASS&quot;,
  1374. &quot;details&quot;: {
  1375. &quot;assignmentId&quot;: &quot;51&quot;,
  1376. &quot;content&quot;: {
  1377. &quot;projectId&quot;: &quot;164&quot;,
  1378. &quot;versionId&quot;: &quot;216&quot;
  1379. },
  1380. &quot;configuration&quot;: {
  1381. &quot;teamSize&quot;: 2,
  1382. &quot;roundDurationMinutes&quot;: 7,
  1383. &quot;submitPositions&quot;: [
  1384. &quot;COMMANDER&quot;
  1385. ]
  1386. },
  1387. &quot;runs&quot;: [
  1388. {
  1389. &quot;id&quot;: &quot;46&quot;,
  1390. &quot;assignmentId&quot;: &quot;51&quot;,
  1391. &quot;status&quot;: &quot;ACCEPTED&quot;,
  1392. &quot;version&quot;: 1,
  1393. &quot;progressPercent&quot;: 0,
  1394. &quot;currentStepCode&quot;: &quot;&quot;,
  1395. &quot;score&quot;: null,
  1396. &quot;passed&quot;: null
  1397. },
  1398. {
  1399. &quot;id&quot;: &quot;45&quot;,
  1400. &quot;assignmentId&quot;: &quot;51&quot;,
  1401. &quot;status&quot;: &quot;ACCEPTED&quot;,
  1402. &quot;version&quot;: 1,
  1403. &quot;progressPercent&quot;: 0,
  1404. &quot;currentStepCode&quot;: &quot;&quot;,
  1405. &quot;score&quot;: null,
  1406. &quot;passed&quot;: null
  1407. }
  1408. ]
  1409. }
  1410. }</pre></details></div><div class="check"><h4>对抗学员不能读取另一队运行明细 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1411. &quot;title&quot;: &quot;对抗学员不能读取另一队运行明细&quot;,
  1412. &quot;status&quot;: &quot;PASS&quot;,
  1413. &quot;details&quot;: {
  1414. &quot;requestingTeam&quot;: &quot;RED&quot;,
  1415. &quot;otherRunId&quot;: &quot;46&quot;,
  1416. &quot;response&quot;: {
  1417. &quot;status&quot;: 403,
  1418. &quot;message&quot;: &quot;无权查看该训练运行&quot;
  1419. }
  1420. }
  1421. }</pre></details></div><div class="check"><h4>开始命令重放不会重复激活或递增次数 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1422. &quot;title&quot;: &quot;开始命令重放不会重复激活或递增次数&quot;,
  1423. &quot;status&quot;: &quot;PASS&quot;,
  1424. &quot;details&quot;: {
  1425. &quot;runId&quot;: &quot;45&quot;,
  1426. &quot;version&quot;: 2,
  1427. &quot;attemptCount&quot;: 1
  1428. }
  1429. }</pre></details></div><div class="check"><h4>RED 队岗位越权、跳步和提前提交均拒绝 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1430. &quot;title&quot;: &quot;RED 队岗位越权、跳步和提前提交均拒绝&quot;,
  1431. &quot;status&quot;: &quot;PASS&quot;,
  1432. &quot;details&quot;: {
  1433. &quot;runId&quot;: &quot;45&quot;,
  1434. &quot;wrongPosition&quot;: {
  1435. &quot;status&quot;: 403,
  1436. &quot;message&quot;: &quot;当前岗位不能推进共享训练进度&quot;
  1437. },
  1438. &quot;skipped&quot;: {
  1439. &quot;status&quot;: 400,
  1440. &quot;message&quot;: &quot;必须按发布顺序完成当前步骤,不能跳步或回退&quot;
  1441. },
  1442. &quot;earlySubmit&quot;: {
  1443. &quot;status&quot;: 409,
  1444. &quot;message&quot;: &quot;训练步骤尚未全部完成,不能提交&quot;
  1445. },
  1446. &quot;deadlineAt&quot;: 1788623936,
  1447. &quot;serverNow&quot;: 1788623517
  1448. }
  1449. }</pre></details></div><div class="check"><h4>RED 队授权动作逐步推进、重放幂等、提交负责人限制 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1450. &quot;title&quot;: &quot;RED 队授权动作逐步推进、重放幂等、提交负责人限制&quot;,
  1451. &quot;status&quot;: &quot;PASS&quot;,
  1452. &quot;details&quot;: {
  1453. &quot;runId&quot;: &quot;45&quot;,
  1454. &quot;progression&quot;: [
  1455. {
  1456. &quot;stepCode&quot;: &quot;CONFRONTATION-S01&quot;,
  1457. &quot;progress&quot;: 50,
  1458. &quot;replayVersion&quot;: 3,
  1459. &quot;changedCommandStatus&quot;: 409
  1460. },
  1461. {
  1462. &quot;stepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  1463. &quot;progress&quot;: 100,
  1464. &quot;replayVersion&quot;: 4,
  1465. &quot;changedCommandStatus&quot;: 409
  1466. }
  1467. ],
  1468. &quot;wrongSubmitPosition&quot;: {
  1469. &quot;status&quot;: 403,
  1470. &quot;message&quot;: &quot;共享训练仅允许任务声明的负责人岗位提交结果&quot;
  1471. }
  1472. }
  1473. }</pre></details></div><div class="check"><h4>CONFRONTATION 提交、教员评定与结果回读 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1474. &quot;title&quot;: &quot;CONFRONTATION 提交、教员评定与结果回读&quot;,
  1475. &quot;status&quot;: &quot;PASS&quot;,
  1476. &quot;details&quot;: {
  1477. &quot;run&quot;: {
  1478. &quot;id&quot;: &quot;45&quot;,
  1479. &quot;assignmentId&quot;: &quot;51&quot;,
  1480. &quot;status&quot;: &quot;REVIEWED&quot;,
  1481. &quot;version&quot;: 6,
  1482. &quot;progressPercent&quot;: 100,
  1483. &quot;currentStepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  1484. &quot;score&quot;: 100,
  1485. &quot;passed&quot;: true
  1486. },
  1487. &quot;submitReplay&quot;: true,
  1488. &quot;reviewReplay&quot;: true,
  1489. &quot;facts&quot;: [
  1490. {
  1491. &quot;stepCode&quot;: &quot;CONFRONTATION-S01&quot;,
  1492. &quot;status&quot;: &quot;COMPLETED&quot;,
  1493. &quot;targetProgressPercent&quot;: 50,
  1494. &quot;attemptCount&quot;: 1,
  1495. &quot;failureCount&quot;: 0,
  1496. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  1497. },
  1498. {
  1499. &quot;stepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  1500. &quot;status&quot;: &quot;COMPLETED&quot;,
  1501. &quot;targetProgressPercent&quot;: 100,
  1502. &quot;attemptCount&quot;: 1,
  1503. &quot;failureCount&quot;: 0,
  1504. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  1505. }
  1506. ]
  1507. }
  1508. }</pre></details></div><div class="check"><h4>红队完成不会推进蓝队进度 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1509. &quot;title&quot;: &quot;红队完成不会推进蓝队进度&quot;,
  1510. &quot;status&quot;: &quot;PASS&quot;,
  1511. &quot;details&quot;: {
  1512. &quot;redRunId&quot;: &quot;45&quot;,
  1513. &quot;blueRun&quot;: {
  1514. &quot;id&quot;: &quot;46&quot;,
  1515. &quot;assignmentId&quot;: &quot;51&quot;,
  1516. &quot;status&quot;: &quot;ACCEPTED&quot;,
  1517. &quot;version&quot;: 1,
  1518. &quot;progressPercent&quot;: 0,
  1519. &quot;currentStepCode&quot;: &quot;&quot;,
  1520. &quot;score&quot;: null,
  1521. &quot;passed&quot;: null
  1522. }
  1523. }
  1524. }</pre></details></div><div class="check"><h4>开始命令重放不会重复激活或递增次数 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1525. &quot;title&quot;: &quot;开始命令重放不会重复激活或递增次数&quot;,
  1526. &quot;status&quot;: &quot;PASS&quot;,
  1527. &quot;details&quot;: {
  1528. &quot;runId&quot;: &quot;46&quot;,
  1529. &quot;version&quot;: 2,
  1530. &quot;attemptCount&quot;: 1
  1531. }
  1532. }</pre></details></div><div class="check"><h4>BLUE 队岗位越权、跳步和提前提交均拒绝 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1533. &quot;title&quot;: &quot;BLUE 队岗位越权、跳步和提前提交均拒绝&quot;,
  1534. &quot;status&quot;: &quot;PASS&quot;,
  1535. &quot;details&quot;: {
  1536. &quot;runId&quot;: &quot;46&quot;,
  1537. &quot;wrongPosition&quot;: {
  1538. &quot;status&quot;: 403,
  1539. &quot;message&quot;: &quot;当前岗位不能推进共享训练进度&quot;
  1540. },
  1541. &quot;skipped&quot;: {
  1542. &quot;status&quot;: 400,
  1543. &quot;message&quot;: &quot;必须按发布顺序完成当前步骤,不能跳步或回退&quot;
  1544. },
  1545. &quot;earlySubmit&quot;: {
  1546. &quot;status&quot;: 409,
  1547. &quot;message&quot;: &quot;训练步骤尚未全部完成,不能提交&quot;
  1548. },
  1549. &quot;deadlineAt&quot;: 1788623942,
  1550. &quot;serverNow&quot;: 1788623523
  1551. }
  1552. }</pre></details></div><div class="check"><h4>BLUE 队授权动作逐步推进、重放幂等、提交负责人限制 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1553. &quot;title&quot;: &quot;BLUE 队授权动作逐步推进、重放幂等、提交负责人限制&quot;,
  1554. &quot;status&quot;: &quot;PASS&quot;,
  1555. &quot;details&quot;: {
  1556. &quot;runId&quot;: &quot;46&quot;,
  1557. &quot;progression&quot;: [
  1558. {
  1559. &quot;stepCode&quot;: &quot;CONFRONTATION-S01&quot;,
  1560. &quot;progress&quot;: 50,
  1561. &quot;replayVersion&quot;: 3,
  1562. &quot;changedCommandStatus&quot;: 409
  1563. },
  1564. {
  1565. &quot;stepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  1566. &quot;progress&quot;: 100,
  1567. &quot;replayVersion&quot;: 4,
  1568. &quot;changedCommandStatus&quot;: 409
  1569. }
  1570. ],
  1571. &quot;wrongSubmitPosition&quot;: {
  1572. &quot;status&quot;: 403,
  1573. &quot;message&quot;: &quot;共享训练仅允许任务声明的负责人岗位提交结果&quot;
  1574. }
  1575. }
  1576. }</pre></details></div><div class="check"><h4>CONFRONTATION 提交、教员评定与结果回读 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1577. &quot;title&quot;: &quot;CONFRONTATION 提交、教员评定与结果回读&quot;,
  1578. &quot;status&quot;: &quot;PASS&quot;,
  1579. &quot;details&quot;: {
  1580. &quot;run&quot;: {
  1581. &quot;id&quot;: &quot;46&quot;,
  1582. &quot;assignmentId&quot;: &quot;51&quot;,
  1583. &quot;status&quot;: &quot;REVIEWED&quot;,
  1584. &quot;version&quot;: 6,
  1585. &quot;progressPercent&quot;: 100,
  1586. &quot;currentStepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  1587. &quot;score&quot;: 100,
  1588. &quot;passed&quot;: true
  1589. },
  1590. &quot;submitReplay&quot;: true,
  1591. &quot;reviewReplay&quot;: true,
  1592. &quot;facts&quot;: [
  1593. {
  1594. &quot;stepCode&quot;: &quot;CONFRONTATION-S01&quot;,
  1595. &quot;status&quot;: &quot;COMPLETED&quot;,
  1596. &quot;targetProgressPercent&quot;: 50,
  1597. &quot;attemptCount&quot;: 1,
  1598. &quot;failureCount&quot;: 0,
  1599. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  1600. },
  1601. {
  1602. &quot;stepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  1603. &quot;status&quot;: &quot;COMPLETED&quot;,
  1604. &quot;targetProgressPercent&quot;: 100,
  1605. &quot;attemptCount&quot;: 1,
  1606. &quot;failureCount&quot;: 0,
  1607. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  1608. }
  1609. ]
  1610. }
  1611. }</pre></details></div><div class="check"><h4>正式任务快照固定训练、场景与模型发布版本 <span class="badge pass">通过</span></h4><details><summary>查看脱敏详细记录</summary><pre>{
  1612. &quot;title&quot;: &quot;正式任务快照固定训练、场景与模型发布版本&quot;,
  1613. &quot;status&quot;: &quot;PASS&quot;,
  1614. &quot;details&quot;: {
  1615. &quot;snapshots&quot;: [
  1616. {
  1617. &quot;assignmentId&quot;: &quot;50&quot;,
  1618. &quot;channel&quot;: &quot;PHYSICAL&quot;,
  1619. &quot;content&quot;: {
  1620. &quot;projectId&quot;: &quot;163&quot;,
  1621. &quot;versionId&quot;: &quot;215&quot;
  1622. },
  1623. &quot;frozenScene&quot;: {
  1624. &quot;projectId&quot;: &quot;159&quot;,
  1625. &quot;versionId&quot;: &quot;209&quot;,
  1626. &quot;models&quot;: [
  1627. {
  1628. &quot;projectId&quot;: &quot;156&quot;,
  1629. &quot;versionId&quot;: &quot;204&quot;,
  1630. &quot;assetCode&quot;: &quot;MODEL_MTO6WI6K_08-CESIUMMILKTRUCK&quot;
  1631. }
  1632. ]
  1633. }
  1634. },
  1635. {
  1636. &quot;assignmentId&quot;: &quot;51&quot;,
  1637. &quot;channel&quot;: &quot;CONFRONTATION&quot;,
  1638. &quot;content&quot;: {
  1639. &quot;projectId&quot;: &quot;164&quot;,
  1640. &quot;versionId&quot;: &quot;216&quot;
  1641. },
  1642. &quot;frozenScene&quot;: {
  1643. &quot;projectId&quot;: &quot;160&quot;,
  1644. &quot;versionId&quot;: &quot;210&quot;,
  1645. &quot;models&quot;: [
  1646. {
  1647. &quot;projectId&quot;: &quot;157&quot;,
  1648. &quot;versionId&quot;: &quot;201&quot;,
  1649. &quot;assetCode&quot;: &quot;MODEL_MTO6V5W6_09-FOX&quot;
  1650. }
  1651. ]
  1652. }
  1653. }
  1654. ]
  1655. }
  1656. }</pre></details></div><details><summary>api-evidence.json · 完整记录</summary><pre>{
  1657. &quot;title&quot;: &quot;实装人工事件与红蓝对抗正式 API 闭环&quot;,
  1658. &quot;status&quot;: &quot;PASS&quot;,
  1659. &quot;startedAt&quot;: &quot;2026-09-05T15:48:46.342Z&quot;,
  1660. &quot;baseURL&quot;: &quot;http://127.0.0.1:6180&quot;,
  1661. &quot;method&quot;: &quot;真实 Auth / Gateway / Tran API;新建隔离学生与开发测试任务;不连接设备、视觉推理或外部通知。&quot;,
  1662. &quot;references&quot;: {
  1663. &quot;PHYSICAL&quot;: {
  1664. &quot;projectId&quot;: &quot;163&quot;,
  1665. &quot;versionId&quot;: &quot;215&quot;
  1666. },
  1667. &quot;CONFRONTATION&quot;: {
  1668. &quot;projectId&quot;: &quot;164&quot;,
  1669. &quot;versionId&quot;: &quot;216&quot;
  1670. }
  1671. },
  1672. &quot;checks&quot;: [
  1673. {
  1674. &quot;title&quot;: &quot;开始命令重放不会重复激活或递增次数&quot;,
  1675. &quot;status&quot;: &quot;PASS&quot;,
  1676. &quot;details&quot;: {
  1677. &quot;runId&quot;: &quot;44&quot;,
  1678. &quot;version&quot;: 2,
  1679. &quot;attemptCount&quot;: 1
  1680. }
  1681. },
  1682. {
  1683. &quot;title&quot;: &quot;实装任务固定发布版本、分配学员并开始&quot;,
  1684. &quot;status&quot;: &quot;PASS&quot;,
  1685. &quot;details&quot;: {
  1686. &quot;assignmentId&quot;: &quot;50&quot;,
  1687. &quot;run&quot;: {
  1688. &quot;id&quot;: &quot;44&quot;,
  1689. &quot;assignmentId&quot;: &quot;50&quot;,
  1690. &quot;status&quot;: &quot;IN_PROGRESS&quot;,
  1691. &quot;version&quot;: 2,
  1692. &quot;progressPercent&quot;: 0,
  1693. &quot;currentStepCode&quot;: &quot;PHYSICAL-S01&quot;,
  1694. &quot;score&quot;: null,
  1695. &quot;passed&quot;: null
  1696. },
  1697. &quot;content&quot;: {
  1698. &quot;projectId&quot;: &quot;163&quot;,
  1699. &quot;versionId&quot;: &quot;215&quot;
  1700. },
  1701. &quot;rules&quot;: [
  1702. {
  1703. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  1704. &quot;source&quot;: &quot;MANUAL&quot;,
  1705. &quot;eventType&quot;: &quot;step.physical-s01.confirmed&quot;,
  1706. &quot;progressPercent&quot;: 33
  1707. },
  1708. {
  1709. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  1710. &quot;source&quot;: &quot;MANUAL&quot;,
  1711. &quot;eventType&quot;: &quot;step.physical-s02.confirmed&quot;,
  1712. &quot;progressPercent&quot;: 67
  1713. },
  1714. {
  1715. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  1716. &quot;source&quot;: &quot;MANUAL&quot;,
  1717. &quot;eventType&quot;: &quot;step.physical-s03.confirmed&quot;,
  1718. &quot;progressPercent&quot;: 100
  1719. }
  1720. ]
  1721. }
  1722. },
  1723. {
  1724. &quot;title&quot;: &quot;实装拒绝普通进度接口、抢跑、提前提交及错误事件身份&quot;,
  1725. &quot;status&quot;: &quot;PASS&quot;,
  1726. &quot;details&quot;: {
  1727. &quot;runId&quot;: &quot;44&quot;,
  1728. &quot;forbiddenProgress&quot;: {
  1729. &quot;status&quot;: 403,
  1730. &quot;message&quot;: &quot;实装运行只能由设备、视觉或人工确认事件推进&quot;
  1731. },
  1732. &quot;prematureSubmit&quot;: {
  1733. &quot;status&quot;: 409,
  1734. &quot;message&quot;: &quot;训练步骤尚未全部完成,不能提交&quot;
  1735. },
  1736. &quot;skipped&quot;: {
  1737. &quot;status&quot;: 409,
  1738. &quot;message&quot;: &quot;物理事件必须匹配当前待完成步骤,不能跳步或回退&quot;
  1739. },
  1740. &quot;untrustedDevice&quot;: {
  1741. &quot;status&quot;: 403,
  1742. &quot;message&quot;: &quot;无权执行此操作&quot;
  1743. },
  1744. &quot;managerManual&quot;: {
  1745. &quot;status&quot;: 403,
  1746. &quot;message&quot;: &quot;当前学员不是该运行成员&quot;
  1747. },
  1748. &quot;progressUnchanged&quot;: 0
  1749. }
  1750. },
  1751. {
  1752. &quot;title&quot;: &quot;实装不匹配事件失败,必须重试后才可继续&quot;,
  1753. &quot;status&quot;: &quot;PASS&quot;,
  1754. &quot;details&quot;: {
  1755. &quot;runId&quot;: &quot;44&quot;,
  1756. &quot;outcome&quot;: &quot;UNMATCHED&quot;,
  1757. &quot;beforeRetry&quot;: {
  1758. &quot;status&quot;: 409,
  1759. &quot;message&quot;: &quot;实装步骤失败后必须先重试,完成后不能再次推进&quot;
  1760. },
  1761. &quot;facts&quot;: [
  1762. {
  1763. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  1764. &quot;status&quot;: &quot;IN_PROGRESS&quot;,
  1765. &quot;targetProgressPercent&quot;: 33,
  1766. &quot;attemptCount&quot;: 2,
  1767. &quot;failureCount&quot;: 1,
  1768. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  1769. },
  1770. {
  1771. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  1772. &quot;status&quot;: &quot;PENDING&quot;,
  1773. &quot;targetProgressPercent&quot;: 67,
  1774. &quot;attemptCount&quot;: 0,
  1775. &quot;failureCount&quot;: 0,
  1776. &quot;evidenceSourceCode&quot;: &quot;NONE&quot;
  1777. },
  1778. {
  1779. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  1780. &quot;status&quot;: &quot;PENDING&quot;,
  1781. &quot;targetProgressPercent&quot;: 100,
  1782. &quot;attemptCount&quot;: 0,
  1783. &quot;failureCount&quot;: 0,
  1784. &quot;evidenceSourceCode&quot;: &quot;NONE&quot;
  1785. }
  1786. ]
  1787. }
  1788. },
  1789. {
  1790. &quot;title&quot;: &quot;实装逐步人工确认、事件幂等与载荷冲突&quot;,
  1791. &quot;status&quot;: &quot;PASS&quot;,
  1792. &quot;details&quot;: {
  1793. &quot;runId&quot;: &quot;44&quot;,
  1794. &quot;progression&quot;: [
  1795. {
  1796. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  1797. &quot;eventId&quot;: &quot;MANUAL-FF103EF3-B498-4EAC-8F06-42DE46CC9CE4&quot;,
  1798. &quot;progress&quot;: 33,
  1799. &quot;replayVersion&quot;: 5,
  1800. &quot;alteredEventStatus&quot;: 409
  1801. },
  1802. {
  1803. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  1804. &quot;eventId&quot;: &quot;MANUAL-9D8A36B7-C161-4736-A71E-D1700E55216B&quot;,
  1805. &quot;progress&quot;: 67,
  1806. &quot;replayVersion&quot;: 6,
  1807. &quot;alteredEventStatus&quot;: 409
  1808. },
  1809. {
  1810. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  1811. &quot;eventId&quot;: &quot;MANUAL-1D1ADE8F-D32B-434B-A7D8-A2571E502137&quot;,
  1812. &quot;progress&quot;: 100,
  1813. &quot;replayVersion&quot;: 7,
  1814. &quot;alteredEventStatus&quot;: 409
  1815. }
  1816. ],
  1817. &quot;facts&quot;: [
  1818. {
  1819. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  1820. &quot;status&quot;: &quot;COMPLETED&quot;,
  1821. &quot;targetProgressPercent&quot;: 33,
  1822. &quot;attemptCount&quot;: 2,
  1823. &quot;failureCount&quot;: 1,
  1824. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  1825. },
  1826. {
  1827. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  1828. &quot;status&quot;: &quot;COMPLETED&quot;,
  1829. &quot;targetProgressPercent&quot;: 67,
  1830. &quot;attemptCount&quot;: 1,
  1831. &quot;failureCount&quot;: 0,
  1832. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  1833. },
  1834. {
  1835. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  1836. &quot;status&quot;: &quot;COMPLETED&quot;,
  1837. &quot;targetProgressPercent&quot;: 100,
  1838. &quot;attemptCount&quot;: 1,
  1839. &quot;failureCount&quot;: 0,
  1840. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  1841. }
  1842. ]
  1843. }
  1844. },
  1845. {
  1846. &quot;title&quot;: &quot;PHYSICAL 提交、教员评定与结果回读&quot;,
  1847. &quot;status&quot;: &quot;PASS&quot;,
  1848. &quot;details&quot;: {
  1849. &quot;run&quot;: {
  1850. &quot;id&quot;: &quot;44&quot;,
  1851. &quot;assignmentId&quot;: &quot;50&quot;,
  1852. &quot;status&quot;: &quot;REVIEWED&quot;,
  1853. &quot;version&quot;: 9,
  1854. &quot;progressPercent&quot;: 100,
  1855. &quot;currentStepCode&quot;: &quot;PHYSICAL-S03&quot;,
  1856. &quot;score&quot;: 100,
  1857. &quot;passed&quot;: true
  1858. },
  1859. &quot;submitReplay&quot;: true,
  1860. &quot;reviewReplay&quot;: true,
  1861. &quot;facts&quot;: [
  1862. {
  1863. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  1864. &quot;status&quot;: &quot;COMPLETED&quot;,
  1865. &quot;targetProgressPercent&quot;: 33,
  1866. &quot;attemptCount&quot;: 2,
  1867. &quot;failureCount&quot;: 1,
  1868. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  1869. },
  1870. {
  1871. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  1872. &quot;status&quot;: &quot;COMPLETED&quot;,
  1873. &quot;targetProgressPercent&quot;: 67,
  1874. &quot;attemptCount&quot;: 1,
  1875. &quot;failureCount&quot;: 0,
  1876. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  1877. },
  1878. {
  1879. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  1880. &quot;status&quot;: &quot;COMPLETED&quot;,
  1881. &quot;targetProgressPercent&quot;: 100,
  1882. &quot;attemptCount&quot;: 1,
  1883. &quot;failureCount&quot;: 0,
  1884. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  1885. }
  1886. ]
  1887. }
  1888. },
  1889. {
  1890. &quot;title&quot;: &quot;对抗红蓝两队各两人,按队伍共享且运行互相独立&quot;,
  1891. &quot;status&quot;: &quot;PASS&quot;,
  1892. &quot;details&quot;: {
  1893. &quot;assignmentId&quot;: &quot;51&quot;,
  1894. &quot;content&quot;: {
  1895. &quot;projectId&quot;: &quot;164&quot;,
  1896. &quot;versionId&quot;: &quot;216&quot;
  1897. },
  1898. &quot;configuration&quot;: {
  1899. &quot;teamSize&quot;: 2,
  1900. &quot;roundDurationMinutes&quot;: 7,
  1901. &quot;submitPositions&quot;: [
  1902. &quot;COMMANDER&quot;
  1903. ]
  1904. },
  1905. &quot;runs&quot;: [
  1906. {
  1907. &quot;id&quot;: &quot;46&quot;,
  1908. &quot;assignmentId&quot;: &quot;51&quot;,
  1909. &quot;status&quot;: &quot;ACCEPTED&quot;,
  1910. &quot;version&quot;: 1,
  1911. &quot;progressPercent&quot;: 0,
  1912. &quot;currentStepCode&quot;: &quot;&quot;,
  1913. &quot;score&quot;: null,
  1914. &quot;passed&quot;: null
  1915. },
  1916. {
  1917. &quot;id&quot;: &quot;45&quot;,
  1918. &quot;assignmentId&quot;: &quot;51&quot;,
  1919. &quot;status&quot;: &quot;ACCEPTED&quot;,
  1920. &quot;version&quot;: 1,
  1921. &quot;progressPercent&quot;: 0,
  1922. &quot;currentStepCode&quot;: &quot;&quot;,
  1923. &quot;score&quot;: null,
  1924. &quot;passed&quot;: null
  1925. }
  1926. ]
  1927. }
  1928. },
  1929. {
  1930. &quot;title&quot;: &quot;对抗学员不能读取另一队运行明细&quot;,
  1931. &quot;status&quot;: &quot;PASS&quot;,
  1932. &quot;details&quot;: {
  1933. &quot;requestingTeam&quot;: &quot;RED&quot;,
  1934. &quot;otherRunId&quot;: &quot;46&quot;,
  1935. &quot;response&quot;: {
  1936. &quot;status&quot;: 403,
  1937. &quot;message&quot;: &quot;无权查看该训练运行&quot;
  1938. }
  1939. }
  1940. },
  1941. {
  1942. &quot;title&quot;: &quot;开始命令重放不会重复激活或递增次数&quot;,
  1943. &quot;status&quot;: &quot;PASS&quot;,
  1944. &quot;details&quot;: {
  1945. &quot;runId&quot;: &quot;45&quot;,
  1946. &quot;version&quot;: 2,
  1947. &quot;attemptCount&quot;: 1
  1948. }
  1949. },
  1950. {
  1951. &quot;title&quot;: &quot;RED 队岗位越权、跳步和提前提交均拒绝&quot;,
  1952. &quot;status&quot;: &quot;PASS&quot;,
  1953. &quot;details&quot;: {
  1954. &quot;runId&quot;: &quot;45&quot;,
  1955. &quot;wrongPosition&quot;: {
  1956. &quot;status&quot;: 403,
  1957. &quot;message&quot;: &quot;当前岗位不能推进共享训练进度&quot;
  1958. },
  1959. &quot;skipped&quot;: {
  1960. &quot;status&quot;: 400,
  1961. &quot;message&quot;: &quot;必须按发布顺序完成当前步骤,不能跳步或回退&quot;
  1962. },
  1963. &quot;earlySubmit&quot;: {
  1964. &quot;status&quot;: 409,
  1965. &quot;message&quot;: &quot;训练步骤尚未全部完成,不能提交&quot;
  1966. },
  1967. &quot;deadlineAt&quot;: 1788623936,
  1968. &quot;serverNow&quot;: 1788623517
  1969. }
  1970. },
  1971. {
  1972. &quot;title&quot;: &quot;RED 队授权动作逐步推进、重放幂等、提交负责人限制&quot;,
  1973. &quot;status&quot;: &quot;PASS&quot;,
  1974. &quot;details&quot;: {
  1975. &quot;runId&quot;: &quot;45&quot;,
  1976. &quot;progression&quot;: [
  1977. {
  1978. &quot;stepCode&quot;: &quot;CONFRONTATION-S01&quot;,
  1979. &quot;progress&quot;: 50,
  1980. &quot;replayVersion&quot;: 3,
  1981. &quot;changedCommandStatus&quot;: 409
  1982. },
  1983. {
  1984. &quot;stepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  1985. &quot;progress&quot;: 100,
  1986. &quot;replayVersion&quot;: 4,
  1987. &quot;changedCommandStatus&quot;: 409
  1988. }
  1989. ],
  1990. &quot;wrongSubmitPosition&quot;: {
  1991. &quot;status&quot;: 403,
  1992. &quot;message&quot;: &quot;共享训练仅允许任务声明的负责人岗位提交结果&quot;
  1993. }
  1994. }
  1995. },
  1996. {
  1997. &quot;title&quot;: &quot;CONFRONTATION 提交、教员评定与结果回读&quot;,
  1998. &quot;status&quot;: &quot;PASS&quot;,
  1999. &quot;details&quot;: {
  2000. &quot;run&quot;: {
  2001. &quot;id&quot;: &quot;45&quot;,
  2002. &quot;assignmentId&quot;: &quot;51&quot;,
  2003. &quot;status&quot;: &quot;REVIEWED&quot;,
  2004. &quot;version&quot;: 6,
  2005. &quot;progressPercent&quot;: 100,
  2006. &quot;currentStepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  2007. &quot;score&quot;: 100,
  2008. &quot;passed&quot;: true
  2009. },
  2010. &quot;submitReplay&quot;: true,
  2011. &quot;reviewReplay&quot;: true,
  2012. &quot;facts&quot;: [
  2013. {
  2014. &quot;stepCode&quot;: &quot;CONFRONTATION-S01&quot;,
  2015. &quot;status&quot;: &quot;COMPLETED&quot;,
  2016. &quot;targetProgressPercent&quot;: 50,
  2017. &quot;attemptCount&quot;: 1,
  2018. &quot;failureCount&quot;: 0,
  2019. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  2020. },
  2021. {
  2022. &quot;stepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  2023. &quot;status&quot;: &quot;COMPLETED&quot;,
  2024. &quot;targetProgressPercent&quot;: 100,
  2025. &quot;attemptCount&quot;: 1,
  2026. &quot;failureCount&quot;: 0,
  2027. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  2028. }
  2029. ]
  2030. }
  2031. },
  2032. {
  2033. &quot;title&quot;: &quot;红队完成不会推进蓝队进度&quot;,
  2034. &quot;status&quot;: &quot;PASS&quot;,
  2035. &quot;details&quot;: {
  2036. &quot;redRunId&quot;: &quot;45&quot;,
  2037. &quot;blueRun&quot;: {
  2038. &quot;id&quot;: &quot;46&quot;,
  2039. &quot;assignmentId&quot;: &quot;51&quot;,
  2040. &quot;status&quot;: &quot;ACCEPTED&quot;,
  2041. &quot;version&quot;: 1,
  2042. &quot;progressPercent&quot;: 0,
  2043. &quot;currentStepCode&quot;: &quot;&quot;,
  2044. &quot;score&quot;: null,
  2045. &quot;passed&quot;: null
  2046. }
  2047. }
  2048. },
  2049. {
  2050. &quot;title&quot;: &quot;开始命令重放不会重复激活或递增次数&quot;,
  2051. &quot;status&quot;: &quot;PASS&quot;,
  2052. &quot;details&quot;: {
  2053. &quot;runId&quot;: &quot;46&quot;,
  2054. &quot;version&quot;: 2,
  2055. &quot;attemptCount&quot;: 1
  2056. }
  2057. },
  2058. {
  2059. &quot;title&quot;: &quot;BLUE 队岗位越权、跳步和提前提交均拒绝&quot;,
  2060. &quot;status&quot;: &quot;PASS&quot;,
  2061. &quot;details&quot;: {
  2062. &quot;runId&quot;: &quot;46&quot;,
  2063. &quot;wrongPosition&quot;: {
  2064. &quot;status&quot;: 403,
  2065. &quot;message&quot;: &quot;当前岗位不能推进共享训练进度&quot;
  2066. },
  2067. &quot;skipped&quot;: {
  2068. &quot;status&quot;: 400,
  2069. &quot;message&quot;: &quot;必须按发布顺序完成当前步骤,不能跳步或回退&quot;
  2070. },
  2071. &quot;earlySubmit&quot;: {
  2072. &quot;status&quot;: 409,
  2073. &quot;message&quot;: &quot;训练步骤尚未全部完成,不能提交&quot;
  2074. },
  2075. &quot;deadlineAt&quot;: 1788623942,
  2076. &quot;serverNow&quot;: 1788623523
  2077. }
  2078. },
  2079. {
  2080. &quot;title&quot;: &quot;BLUE 队授权动作逐步推进、重放幂等、提交负责人限制&quot;,
  2081. &quot;status&quot;: &quot;PASS&quot;,
  2082. &quot;details&quot;: {
  2083. &quot;runId&quot;: &quot;46&quot;,
  2084. &quot;progression&quot;: [
  2085. {
  2086. &quot;stepCode&quot;: &quot;CONFRONTATION-S01&quot;,
  2087. &quot;progress&quot;: 50,
  2088. &quot;replayVersion&quot;: 3,
  2089. &quot;changedCommandStatus&quot;: 409
  2090. },
  2091. {
  2092. &quot;stepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  2093. &quot;progress&quot;: 100,
  2094. &quot;replayVersion&quot;: 4,
  2095. &quot;changedCommandStatus&quot;: 409
  2096. }
  2097. ],
  2098. &quot;wrongSubmitPosition&quot;: {
  2099. &quot;status&quot;: 403,
  2100. &quot;message&quot;: &quot;共享训练仅允许任务声明的负责人岗位提交结果&quot;
  2101. }
  2102. }
  2103. },
  2104. {
  2105. &quot;title&quot;: &quot;CONFRONTATION 提交、教员评定与结果回读&quot;,
  2106. &quot;status&quot;: &quot;PASS&quot;,
  2107. &quot;details&quot;: {
  2108. &quot;run&quot;: {
  2109. &quot;id&quot;: &quot;46&quot;,
  2110. &quot;assignmentId&quot;: &quot;51&quot;,
  2111. &quot;status&quot;: &quot;REVIEWED&quot;,
  2112. &quot;version&quot;: 6,
  2113. &quot;progressPercent&quot;: 100,
  2114. &quot;currentStepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  2115. &quot;score&quot;: 100,
  2116. &quot;passed&quot;: true
  2117. },
  2118. &quot;submitReplay&quot;: true,
  2119. &quot;reviewReplay&quot;: true,
  2120. &quot;facts&quot;: [
  2121. {
  2122. &quot;stepCode&quot;: &quot;CONFRONTATION-S01&quot;,
  2123. &quot;status&quot;: &quot;COMPLETED&quot;,
  2124. &quot;targetProgressPercent&quot;: 50,
  2125. &quot;attemptCount&quot;: 1,
  2126. &quot;failureCount&quot;: 0,
  2127. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  2128. },
  2129. {
  2130. &quot;stepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  2131. &quot;status&quot;: &quot;COMPLETED&quot;,
  2132. &quot;targetProgressPercent&quot;: 100,
  2133. &quot;attemptCount&quot;: 1,
  2134. &quot;failureCount&quot;: 0,
  2135. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  2136. }
  2137. ]
  2138. }
  2139. },
  2140. {
  2141. &quot;title&quot;: &quot;正式任务快照固定训练、场景与模型发布版本&quot;,
  2142. &quot;status&quot;: &quot;PASS&quot;,
  2143. &quot;details&quot;: {
  2144. &quot;snapshots&quot;: [
  2145. {
  2146. &quot;assignmentId&quot;: &quot;50&quot;,
  2147. &quot;channel&quot;: &quot;PHYSICAL&quot;,
  2148. &quot;content&quot;: {
  2149. &quot;projectId&quot;: &quot;163&quot;,
  2150. &quot;versionId&quot;: &quot;215&quot;
  2151. },
  2152. &quot;frozenScene&quot;: {
  2153. &quot;projectId&quot;: &quot;159&quot;,
  2154. &quot;versionId&quot;: &quot;209&quot;,
  2155. &quot;models&quot;: [
  2156. {
  2157. &quot;projectId&quot;: &quot;156&quot;,
  2158. &quot;versionId&quot;: &quot;204&quot;,
  2159. &quot;assetCode&quot;: &quot;MODEL_MTO6WI6K_08-CESIUMMILKTRUCK&quot;
  2160. }
  2161. ]
  2162. }
  2163. },
  2164. {
  2165. &quot;assignmentId&quot;: &quot;51&quot;,
  2166. &quot;channel&quot;: &quot;CONFRONTATION&quot;,
  2167. &quot;content&quot;: {
  2168. &quot;projectId&quot;: &quot;164&quot;,
  2169. &quot;versionId&quot;: &quot;216&quot;
  2170. },
  2171. &quot;frozenScene&quot;: {
  2172. &quot;projectId&quot;: &quot;160&quot;,
  2173. &quot;versionId&quot;: &quot;210&quot;,
  2174. &quot;models&quot;: [
  2175. {
  2176. &quot;projectId&quot;: &quot;157&quot;,
  2177. &quot;versionId&quot;: &quot;201&quot;,
  2178. &quot;assetCode&quot;: &quot;MODEL_MTO6V5W6_09-FOX&quot;
  2179. }
  2180. ]
  2181. }
  2182. }
  2183. ]
  2184. }
  2185. }
  2186. ],
  2187. &quot;assignments&quot;: [
  2188. {
  2189. &quot;id&quot;: &quot;50&quot;,
  2190. &quot;code&quot;: &quot;UTE2E-MODES-MTOK5BBA-PHYSICAL&quot;,
  2191. &quot;channel&quot;: &quot;PHYSICAL&quot;,
  2192. &quot;contentProjectId&quot;: &quot;163&quot;,
  2193. &quot;contentVersionId&quot;: &quot;215&quot;,
  2194. &quot;status&quot;: &quot;PUBLISHED&quot;,
  2195. &quot;version&quot;: 1,
  2196. &quot;frozenScene&quot;: {
  2197. &quot;projectId&quot;: &quot;159&quot;,
  2198. &quot;versionId&quot;: &quot;209&quot;,
  2199. &quot;models&quot;: [
  2200. {
  2201. &quot;projectId&quot;: &quot;156&quot;,
  2202. &quot;versionId&quot;: &quot;204&quot;,
  2203. &quot;assetCode&quot;: &quot;MODEL_MTO6WI6K_08-CESIUMMILKTRUCK&quot;
  2204. }
  2205. ]
  2206. }
  2207. },
  2208. {
  2209. &quot;id&quot;: &quot;51&quot;,
  2210. &quot;code&quot;: &quot;UTE2E-MODES-MTOK5BBA-CONFRONTATION&quot;,
  2211. &quot;channel&quot;: &quot;CONFRONTATION&quot;,
  2212. &quot;contentProjectId&quot;: &quot;164&quot;,
  2213. &quot;contentVersionId&quot;: &quot;216&quot;,
  2214. &quot;status&quot;: &quot;PUBLISHED&quot;,
  2215. &quot;version&quot;: 1,
  2216. &quot;frozenScene&quot;: {
  2217. &quot;projectId&quot;: &quot;160&quot;,
  2218. &quot;versionId&quot;: &quot;210&quot;,
  2219. &quot;models&quot;: [
  2220. {
  2221. &quot;projectId&quot;: &quot;157&quot;,
  2222. &quot;versionId&quot;: &quot;201&quot;,
  2223. &quot;assetCode&quot;: &quot;MODEL_MTO6V5W6_09-FOX&quot;
  2224. }
  2225. ]
  2226. }
  2227. }
  2228. ],
  2229. &quot;runs&quot;: [
  2230. {
  2231. &quot;id&quot;: &quot;44&quot;,
  2232. &quot;assignmentId&quot;: &quot;50&quot;,
  2233. &quot;status&quot;: &quot;REVIEWED&quot;,
  2234. &quot;version&quot;: 9,
  2235. &quot;progressPercent&quot;: 100,
  2236. &quot;currentStepCode&quot;: &quot;PHYSICAL-S03&quot;,
  2237. &quot;score&quot;: 100,
  2238. &quot;passed&quot;: true,
  2239. &quot;channel&quot;: &quot;PHYSICAL&quot;,
  2240. &quot;team&quot;: &quot;NEUTRAL&quot;,
  2241. &quot;stepFacts&quot;: [
  2242. {
  2243. &quot;stepCode&quot;: &quot;PHYSICAL-S01&quot;,
  2244. &quot;status&quot;: &quot;COMPLETED&quot;,
  2245. &quot;targetProgressPercent&quot;: 33,
  2246. &quot;attemptCount&quot;: 2,
  2247. &quot;failureCount&quot;: 1,
  2248. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  2249. },
  2250. {
  2251. &quot;stepCode&quot;: &quot;PHYSICAL-S02&quot;,
  2252. &quot;status&quot;: &quot;COMPLETED&quot;,
  2253. &quot;targetProgressPercent&quot;: 67,
  2254. &quot;attemptCount&quot;: 1,
  2255. &quot;failureCount&quot;: 0,
  2256. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  2257. },
  2258. {
  2259. &quot;stepCode&quot;: &quot;PHYSICAL-S03&quot;,
  2260. &quot;status&quot;: &quot;COMPLETED&quot;,
  2261. &quot;targetProgressPercent&quot;: 100,
  2262. &quot;attemptCount&quot;: 1,
  2263. &quot;failureCount&quot;: 0,
  2264. &quot;evidenceSourceCode&quot;: &quot;MANUAL&quot;
  2265. }
  2266. ]
  2267. },
  2268. {
  2269. &quot;id&quot;: &quot;45&quot;,
  2270. &quot;assignmentId&quot;: &quot;51&quot;,
  2271. &quot;status&quot;: &quot;REVIEWED&quot;,
  2272. &quot;version&quot;: 6,
  2273. &quot;progressPercent&quot;: 100,
  2274. &quot;currentStepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  2275. &quot;score&quot;: 100,
  2276. &quot;passed&quot;: true,
  2277. &quot;channel&quot;: &quot;CONFRONTATION&quot;,
  2278. &quot;team&quot;: &quot;RED&quot;,
  2279. &quot;stepFacts&quot;: [
  2280. {
  2281. &quot;stepCode&quot;: &quot;CONFRONTATION-S01&quot;,
  2282. &quot;status&quot;: &quot;COMPLETED&quot;,
  2283. &quot;targetProgressPercent&quot;: 50,
  2284. &quot;attemptCount&quot;: 1,
  2285. &quot;failureCount&quot;: 0,
  2286. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  2287. },
  2288. {
  2289. &quot;stepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  2290. &quot;status&quot;: &quot;COMPLETED&quot;,
  2291. &quot;targetProgressPercent&quot;: 100,
  2292. &quot;attemptCount&quot;: 1,
  2293. &quot;failureCount&quot;: 0,
  2294. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  2295. }
  2296. ]
  2297. },
  2298. {
  2299. &quot;id&quot;: &quot;46&quot;,
  2300. &quot;assignmentId&quot;: &quot;51&quot;,
  2301. &quot;status&quot;: &quot;REVIEWED&quot;,
  2302. &quot;version&quot;: 6,
  2303. &quot;progressPercent&quot;: 100,
  2304. &quot;currentStepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  2305. &quot;score&quot;: 100,
  2306. &quot;passed&quot;: true,
  2307. &quot;channel&quot;: &quot;CONFRONTATION&quot;,
  2308. &quot;team&quot;: &quot;BLUE&quot;,
  2309. &quot;stepFacts&quot;: [
  2310. {
  2311. &quot;stepCode&quot;: &quot;CONFRONTATION-S01&quot;,
  2312. &quot;status&quot;: &quot;COMPLETED&quot;,
  2313. &quot;targetProgressPercent&quot;: 50,
  2314. &quot;attemptCount&quot;: 1,
  2315. &quot;failureCount&quot;: 0,
  2316. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  2317. },
  2318. {
  2319. &quot;stepCode&quot;: &quot;CONFRONTATION-S02&quot;,
  2320. &quot;status&quot;: &quot;COMPLETED&quot;,
  2321. &quot;targetProgressPercent&quot;: 100,
  2322. &quot;attemptCount&quot;: 1,
  2323. &quot;failureCount&quot;: 0,
  2324. &quot;evidenceSourceCode&quot;: &quot;COMMAND&quot;
  2325. }
  2326. ]
  2327. }
  2328. ],
  2329. &quot;actors&quot;: [
  2330. {
  2331. &quot;userId&quot;: &quot;95&quot;,
  2332. &quot;team&quot;: &quot;RED&quot;,
  2333. &quot;position&quot;: &quot;COMMANDER&quot;,
  2334. &quot;departmentId&quot;: &quot;5&quot;
  2335. },
  2336. {
  2337. &quot;userId&quot;: &quot;96&quot;,
  2338. &quot;team&quot;: &quot;RED&quot;,
  2339. &quot;position&quot;: &quot;OPERATOR&quot;,
  2340. &quot;departmentId&quot;: &quot;5&quot;
  2341. },
  2342. {
  2343. &quot;userId&quot;: &quot;97&quot;,
  2344. &quot;team&quot;: &quot;BLUE&quot;,
  2345. &quot;position&quot;: &quot;COMMANDER&quot;,
  2346. &quot;departmentId&quot;: &quot;5&quot;
  2347. },
  2348. {
  2349. &quot;userId&quot;: &quot;98&quot;,
  2350. &quot;team&quot;: &quot;BLUE&quot;,
  2351. &quot;position&quot;: &quot;OPERATOR&quot;,
  2352. &quot;departmentId&quot;: &quot;5&quot;
  2353. }
  2354. ],
  2355. &quot;requests&quot;: [
  2356. {
  2357. &quot;method&quot;: &quot;POST&quot;,
  2358. &quot;path&quot;: &quot;/api/tran/v1/teaching/assignments&quot;,
  2359. &quot;status&quot;: 200
  2360. },
  2361. {
  2362. &quot;method&quot;: &quot;POST&quot;,
  2363. &quot;path&quot;: &quot;/api/tran/v1/teaching/assignments/50/publish&quot;,
  2364. &quot;status&quot;: 200
  2365. },
  2366. {
  2367. &quot;method&quot;: &quot;POST&quot;,
  2368. &quot;path&quot;: &quot;/api/tran/v1/teaching/assignments/50/accept&quot;,
  2369. &quot;status&quot;: 200
  2370. },
  2371. {
  2372. &quot;method&quot;: &quot;POST&quot;,
  2373. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/start&quot;,
  2374. &quot;status&quot;: 200
  2375. },
  2376. {
  2377. &quot;method&quot;: &quot;POST&quot;,
  2378. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/start&quot;,
  2379. &quot;status&quot;: 200
  2380. },
  2381. {
  2382. &quot;method&quot;: &quot;GET&quot;,
  2383. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/steps&quot;,
  2384. &quot;status&quot;: 200
  2385. },
  2386. {
  2387. &quot;method&quot;: &quot;PUT&quot;,
  2388. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/progress&quot;,
  2389. &quot;status&quot;: 403
  2390. },
  2391. {
  2392. &quot;method&quot;: &quot;POST&quot;,
  2393. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/submit&quot;,
  2394. &quot;status&quot;: 409
  2395. },
  2396. {
  2397. &quot;method&quot;: &quot;POST&quot;,
  2398. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2399. &quot;status&quot;: 409
  2400. },
  2401. {
  2402. &quot;method&quot;: &quot;POST&quot;,
  2403. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2404. &quot;status&quot;: 403
  2405. },
  2406. {
  2407. &quot;method&quot;: &quot;POST&quot;,
  2408. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2409. &quot;status&quot;: 403
  2410. },
  2411. {
  2412. &quot;method&quot;: &quot;GET&quot;,
  2413. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44&quot;,
  2414. &quot;status&quot;: 200
  2415. },
  2416. {
  2417. &quot;method&quot;: &quot;POST&quot;,
  2418. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2419. &quot;status&quot;: 200
  2420. },
  2421. {
  2422. &quot;method&quot;: &quot;GET&quot;,
  2423. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/steps&quot;,
  2424. &quot;status&quot;: 200
  2425. },
  2426. {
  2427. &quot;method&quot;: &quot;GET&quot;,
  2428. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44&quot;,
  2429. &quot;status&quot;: 200
  2430. },
  2431. {
  2432. &quot;method&quot;: &quot;POST&quot;,
  2433. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2434. &quot;status&quot;: 409
  2435. },
  2436. {
  2437. &quot;method&quot;: &quot;POST&quot;,
  2438. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/start&quot;,
  2439. &quot;status&quot;: 200
  2440. },
  2441. {
  2442. &quot;method&quot;: &quot;GET&quot;,
  2443. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/steps&quot;,
  2444. &quot;status&quot;: 200
  2445. },
  2446. {
  2447. &quot;method&quot;: &quot;POST&quot;,
  2448. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2449. &quot;status&quot;: 200
  2450. },
  2451. {
  2452. &quot;method&quot;: &quot;GET&quot;,
  2453. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44&quot;,
  2454. &quot;status&quot;: 200
  2455. },
  2456. {
  2457. &quot;method&quot;: &quot;POST&quot;,
  2458. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2459. &quot;status&quot;: 200
  2460. },
  2461. {
  2462. &quot;method&quot;: &quot;GET&quot;,
  2463. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44&quot;,
  2464. &quot;status&quot;: 200
  2465. },
  2466. {
  2467. &quot;method&quot;: &quot;POST&quot;,
  2468. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2469. &quot;status&quot;: 409
  2470. },
  2471. {
  2472. &quot;method&quot;: &quot;POST&quot;,
  2473. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2474. &quot;status&quot;: 200
  2475. },
  2476. {
  2477. &quot;method&quot;: &quot;GET&quot;,
  2478. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44&quot;,
  2479. &quot;status&quot;: 200
  2480. },
  2481. {
  2482. &quot;method&quot;: &quot;POST&quot;,
  2483. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2484. &quot;status&quot;: 200
  2485. },
  2486. {
  2487. &quot;method&quot;: &quot;GET&quot;,
  2488. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44&quot;,
  2489. &quot;status&quot;: 200
  2490. },
  2491. {
  2492. &quot;method&quot;: &quot;POST&quot;,
  2493. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2494. &quot;status&quot;: 409
  2495. },
  2496. {
  2497. &quot;method&quot;: &quot;POST&quot;,
  2498. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2499. &quot;status&quot;: 200
  2500. },
  2501. {
  2502. &quot;method&quot;: &quot;GET&quot;,
  2503. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44&quot;,
  2504. &quot;status&quot;: 200
  2505. },
  2506. {
  2507. &quot;method&quot;: &quot;POST&quot;,
  2508. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2509. &quot;status&quot;: 200
  2510. },
  2511. {
  2512. &quot;method&quot;: &quot;GET&quot;,
  2513. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44&quot;,
  2514. &quot;status&quot;: 200
  2515. },
  2516. {
  2517. &quot;method&quot;: &quot;POST&quot;,
  2518. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/physical-events&quot;,
  2519. &quot;status&quot;: 409
  2520. },
  2521. {
  2522. &quot;method&quot;: &quot;GET&quot;,
  2523. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/steps&quot;,
  2524. &quot;status&quot;: 200
  2525. },
  2526. {
  2527. &quot;method&quot;: &quot;POST&quot;,
  2528. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/submit&quot;,
  2529. &quot;status&quot;: 200
  2530. },
  2531. {
  2532. &quot;method&quot;: &quot;POST&quot;,
  2533. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/submit&quot;,
  2534. &quot;status&quot;: 200
  2535. },
  2536. {
  2537. &quot;method&quot;: &quot;POST&quot;,
  2538. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/review&quot;,
  2539. &quot;status&quot;: 200
  2540. },
  2541. {
  2542. &quot;method&quot;: &quot;POST&quot;,
  2543. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/review&quot;,
  2544. &quot;status&quot;: 200
  2545. },
  2546. {
  2547. &quot;method&quot;: &quot;GET&quot;,
  2548. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/44/steps&quot;,
  2549. &quot;status&quot;: 200
  2550. },
  2551. {
  2552. &quot;method&quot;: &quot;POST&quot;,
  2553. &quot;path&quot;: &quot;/api/tran/v1/teaching/assignments&quot;,
  2554. &quot;status&quot;: 200
  2555. },
  2556. {
  2557. &quot;method&quot;: &quot;POST&quot;,
  2558. &quot;path&quot;: &quot;/api/tran/v1/teaching/assignments/51/publish&quot;,
  2559. &quot;status&quot;: 200
  2560. },
  2561. {
  2562. &quot;method&quot;: &quot;POST&quot;,
  2563. &quot;path&quot;: &quot;/api/tran/v1/teaching/assignments/51/accept&quot;,
  2564. &quot;status&quot;: 200
  2565. },
  2566. {
  2567. &quot;method&quot;: &quot;POST&quot;,
  2568. &quot;path&quot;: &quot;/api/tran/v1/teaching/assignments/51/accept&quot;,
  2569. &quot;status&quot;: 200
  2570. },
  2571. {
  2572. &quot;method&quot;: &quot;POST&quot;,
  2573. &quot;path&quot;: &quot;/api/tran/v1/teaching/assignments/51/accept&quot;,
  2574. &quot;status&quot;: 200
  2575. },
  2576. {
  2577. &quot;method&quot;: &quot;POST&quot;,
  2578. &quot;path&quot;: &quot;/api/tran/v1/teaching/assignments/51/accept&quot;,
  2579. &quot;status&quot;: 200
  2580. },
  2581. {
  2582. &quot;method&quot;: &quot;GET&quot;,
  2583. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs?assignmentId=51&amp;size=100&quot;,
  2584. &quot;status&quot;: 200
  2585. },
  2586. {
  2587. &quot;method&quot;: &quot;GET&quot;,
  2588. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46&quot;,
  2589. &quot;status&quot;: 403
  2590. },
  2591. {
  2592. &quot;method&quot;: &quot;POST&quot;,
  2593. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/start&quot;,
  2594. &quot;status&quot;: 200
  2595. },
  2596. {
  2597. &quot;method&quot;: &quot;POST&quot;,
  2598. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/start&quot;,
  2599. &quot;status&quot;: 200
  2600. },
  2601. {
  2602. &quot;method&quot;: &quot;GET&quot;,
  2603. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/steps&quot;,
  2604. &quot;status&quot;: 200
  2605. },
  2606. {
  2607. &quot;method&quot;: &quot;GET&quot;,
  2608. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/execution&quot;,
  2609. &quot;status&quot;: 200
  2610. },
  2611. {
  2612. &quot;method&quot;: &quot;PUT&quot;,
  2613. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/progress&quot;,
  2614. &quot;status&quot;: 403
  2615. },
  2616. {
  2617. &quot;method&quot;: &quot;PUT&quot;,
  2618. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/progress&quot;,
  2619. &quot;status&quot;: 400
  2620. },
  2621. {
  2622. &quot;method&quot;: &quot;POST&quot;,
  2623. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/submit&quot;,
  2624. &quot;status&quot;: 409
  2625. },
  2626. {
  2627. &quot;method&quot;: &quot;GET&quot;,
  2628. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45&quot;,
  2629. &quot;status&quot;: 200
  2630. },
  2631. {
  2632. &quot;method&quot;: &quot;PUT&quot;,
  2633. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/progress&quot;,
  2634. &quot;status&quot;: 200
  2635. },
  2636. {
  2637. &quot;method&quot;: &quot;PUT&quot;,
  2638. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/progress&quot;,
  2639. &quot;status&quot;: 200
  2640. },
  2641. {
  2642. &quot;method&quot;: &quot;PUT&quot;,
  2643. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/progress&quot;,
  2644. &quot;status&quot;: 409
  2645. },
  2646. {
  2647. &quot;method&quot;: &quot;PUT&quot;,
  2648. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/progress&quot;,
  2649. &quot;status&quot;: 200
  2650. },
  2651. {
  2652. &quot;method&quot;: &quot;PUT&quot;,
  2653. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/progress&quot;,
  2654. &quot;status&quot;: 200
  2655. },
  2656. {
  2657. &quot;method&quot;: &quot;PUT&quot;,
  2658. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/progress&quot;,
  2659. &quot;status&quot;: 409
  2660. },
  2661. {
  2662. &quot;method&quot;: &quot;POST&quot;,
  2663. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/submit&quot;,
  2664. &quot;status&quot;: 403
  2665. },
  2666. {
  2667. &quot;method&quot;: &quot;POST&quot;,
  2668. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/submit&quot;,
  2669. &quot;status&quot;: 200
  2670. },
  2671. {
  2672. &quot;method&quot;: &quot;POST&quot;,
  2673. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/submit&quot;,
  2674. &quot;status&quot;: 200
  2675. },
  2676. {
  2677. &quot;method&quot;: &quot;POST&quot;,
  2678. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/review&quot;,
  2679. &quot;status&quot;: 200
  2680. },
  2681. {
  2682. &quot;method&quot;: &quot;POST&quot;,
  2683. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/review&quot;,
  2684. &quot;status&quot;: 200
  2685. },
  2686. {
  2687. &quot;method&quot;: &quot;GET&quot;,
  2688. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/45/steps&quot;,
  2689. &quot;status&quot;: 200
  2690. },
  2691. {
  2692. &quot;method&quot;: &quot;GET&quot;,
  2693. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46&quot;,
  2694. &quot;status&quot;: 200
  2695. },
  2696. {
  2697. &quot;method&quot;: &quot;POST&quot;,
  2698. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/start&quot;,
  2699. &quot;status&quot;: 200
  2700. },
  2701. {
  2702. &quot;method&quot;: &quot;POST&quot;,
  2703. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/start&quot;,
  2704. &quot;status&quot;: 200
  2705. },
  2706. {
  2707. &quot;method&quot;: &quot;GET&quot;,
  2708. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/steps&quot;,
  2709. &quot;status&quot;: 200
  2710. },
  2711. {
  2712. &quot;method&quot;: &quot;GET&quot;,
  2713. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/execution&quot;,
  2714. &quot;status&quot;: 200
  2715. },
  2716. {
  2717. &quot;method&quot;: &quot;PUT&quot;,
  2718. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/progress&quot;,
  2719. &quot;status&quot;: 403
  2720. },
  2721. {
  2722. &quot;method&quot;: &quot;PUT&quot;,
  2723. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/progress&quot;,
  2724. &quot;status&quot;: 400
  2725. },
  2726. {
  2727. &quot;method&quot;: &quot;POST&quot;,
  2728. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/submit&quot;,
  2729. &quot;status&quot;: 409
  2730. },
  2731. {
  2732. &quot;method&quot;: &quot;GET&quot;,
  2733. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46&quot;,
  2734. &quot;status&quot;: 200
  2735. },
  2736. {
  2737. &quot;method&quot;: &quot;PUT&quot;,
  2738. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/progress&quot;,
  2739. &quot;status&quot;: 200
  2740. },
  2741. {
  2742. &quot;method&quot;: &quot;PUT&quot;,
  2743. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/progress&quot;,
  2744. &quot;status&quot;: 200
  2745. },
  2746. {
  2747. &quot;method&quot;: &quot;PUT&quot;,
  2748. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/progress&quot;,
  2749. &quot;status&quot;: 409
  2750. },
  2751. {
  2752. &quot;method&quot;: &quot;PUT&quot;,
  2753. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/progress&quot;,
  2754. &quot;status&quot;: 200
  2755. },
  2756. {
  2757. &quot;method&quot;: &quot;PUT&quot;,
  2758. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/progress&quot;,
  2759. &quot;status&quot;: 200
  2760. },
  2761. {
  2762. &quot;method&quot;: &quot;PUT&quot;,
  2763. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/progress&quot;,
  2764. &quot;status&quot;: 409
  2765. },
  2766. {
  2767. &quot;method&quot;: &quot;POST&quot;,
  2768. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/submit&quot;,
  2769. &quot;status&quot;: 403
  2770. },
  2771. {
  2772. &quot;method&quot;: &quot;POST&quot;,
  2773. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/submit&quot;,
  2774. &quot;status&quot;: 200
  2775. },
  2776. {
  2777. &quot;method&quot;: &quot;POST&quot;,
  2778. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/submit&quot;,
  2779. &quot;status&quot;: 200
  2780. },
  2781. {
  2782. &quot;method&quot;: &quot;POST&quot;,
  2783. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/review&quot;,
  2784. &quot;status&quot;: 200
  2785. },
  2786. {
  2787. &quot;method&quot;: &quot;POST&quot;,
  2788. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/review&quot;,
  2789. &quot;status&quot;: 200
  2790. },
  2791. {
  2792. &quot;method&quot;: &quot;GET&quot;,
  2793. &quot;path&quot;: &quot;/api/tran/v1/teaching/runs/46/steps&quot;,
  2794. &quot;status&quot;: 200
  2795. },
  2796. {
  2797. &quot;method&quot;: &quot;GET&quot;,
  2798. &quot;path&quot;: &quot;/api/tran/v1/teaching/assignments/50&quot;,
  2799. &quot;status&quot;: 200
  2800. },
  2801. {
  2802. &quot;method&quot;: &quot;GET&quot;,
  2803. &quot;path&quot;: &quot;/api/tran/v1/teaching/assignments/51&quot;,
  2804. &quot;status&quot;: 200
  2805. }
  2806. ],
  2807. &quot;limitations&quot;: [
  2808. &quot;实装事件均为本次自动化提交的 MANUAL 人工确认或明确的权限拒绝测试,不代表真实设备、PLC、摄像机或视觉模型联调。&quot;,
  2809. &quot;教学运行结果来自正式 API;默认实装离线回放和默认对抗本地工作台的显示另行记录,不混同为服务端运行闭环。&quot;,
  2810. &quot;对抗按四名隔离学员的独立会话依次操作,检查服务端截止时间已生效;未等待整局自然超时,也不代表多人同时操作的压力或网络同步测试。&quot;,
  2811. &quot;测试账号使用本次随机密码,密码与会话仅在运行内存中;报告只保留用户 ID、队伍和岗位以便追溯。&quot;
  2812. ],
  2813. &quot;finishedAt&quot;: &quot;2026-09-05T15:58:56.293Z&quot;,
  2814. &quot;retainedData&quot;: {
  2815. &quot;assignments&quot;: [
  2816. &quot;50&quot;,
  2817. &quot;51&quot;
  2818. ],
  2819. &quot;runs&quot;: [
  2820. &quot;44&quot;,
  2821. &quot;45&quot;,
  2822. &quot;46&quot;
  2823. ],
  2824. &quot;users&quot;: [
  2825. &quot;95&quot;,
  2826. &quot;96&quot;,
  2827. &quot;97&quot;,
  2828. &quot;98&quot;
  2829. ],
  2830. &quot;note&quot;: &quot;仅新建本次开发测试数据,未修改或删除既有账号、任务与运行。&quot;
  2831. }
  2832. }</pre></details></article><h3>测试命令与构建</h3><div class="check"><h4>pnpm run build <span class="badge pass">通过</span></h4><p>vue-tsc、Vite构建和legacy iframe分发校验均通过;仅已有包体积提示。</p></div><div class="check"><h4>node --test tools/training-*.test.mjs(本次8个聚焦文件) <span class="badge pass">通过</span></h4><p>94/94通过,涵盖封面、场景、真实模型、目标、元数据、模式与步骤兼容。</p></div><div class="check"><h4>pnpm run test:training-legacy <span class="badge pass">通过</span></h4><p>两项既有训练/地形合同检查通过。</p></div><div class="check"><h4>content-training-studio.spec.ts / Edge <span class="badge pass">通过</span></h4><p>7/7通过(mock API的工作台回归),无跳过、无不稳定用例,独立报告studio-regression/html/index.html。</p></div><div class="check"><h4>UTE2E_TRAINING_MODES=1 UTE2E_BASE_URL=http://192.168.31.168:6180 node tools/training-scene-visibility.e2e.mjs <span class="badge pass">通过</span></h4><p>独立Edge会话2/2通过,真实LAN服务、禁止业务写请求;模型可见像素差、固定场景依赖、JPEG尺寸与SHA-256全部通过。</p></div><div class="check"><h4>node tools/training-modes-api-live.mjs(163:215;164:216) <span class="badge pass">通过</span></h4><p>18/18检查组通过,90次正式教学API请求;含训练/场景/模型固定快照只读复核,详见api-evidence.json。</p></div></section>
  2833. <section id="images"><h2>真实浏览器截图</h2><p class="muted">截图只来自实际存在的文件;API 请求结果单列,不以 UI 截图代替。</p><div class="gallery"><figure><a href="screenshots/physical-settings-reopen.png" target="_blank" rel="noopener"><img src="screenshots/physical-settings-reopen.png" alt="实装:创建、绑定牛奶卡车、3步配置、保存重开与发布" loading="lazy"></a><figcaption>实装:创建、绑定牛奶卡车、3步配置、保存重开与发布 · 点击查看原图</figcaption></figure><figure><a href="screenshots/physical-authoring.png" target="_blank" rel="noopener"><img src="screenshots/physical-authoring.png" alt="实装:创建、绑定牛奶卡车、3步配置、保存重开与发布" loading="lazy"></a><figcaption>实装:创建、绑定牛奶卡车、3步配置、保存重开与发布 · 点击查看原图</figcaption></figure><figure><a href="screenshots/physical-preflight.png" target="_blank" rel="noopener"><img src="screenshots/physical-preflight.png" alt="实装:创建、绑定牛奶卡车、3步配置、保存重开与发布" loading="lazy"></a><figcaption>实装:创建、绑定牛奶卡车、3步配置、保存重开与发布 · 点击查看原图</figcaption></figure><figure><a href="screenshots/physical-published.png" target="_blank" rel="noopener"><img src="screenshots/physical-published.png" alt="实装:创建、绑定牛奶卡车、3步配置、保存重开与发布" loading="lazy"></a><figcaption>实装:创建、绑定牛奶卡车、3步配置、保存重开与发布 · 点击查看原图</figcaption></figure><figure><a href="screenshots/confrontation-invalid-team-size.png" target="_blank" rel="noopener"><img src="screenshots/confrontation-invalid-team-size.png" alt="对抗:每队人数为小数时阻止发布" loading="lazy"></a><figcaption>对抗:每队人数为小数时阻止发布 · 点击查看原图</figcaption></figure><figure><a href="screenshots/confrontation-empty-positions.png" target="_blank" rel="noopener"><img src="screenshots/confrontation-empty-positions.png" alt="对抗:显式清空岗位后保存重开,不恢复默认授权" loading="lazy"></a><figcaption>对抗:显式清空岗位后保存重开,不恢复默认授权 · 点击查看原图</figcaption></figure><figure><a href="screenshots/confrontation-positions.png" target="_blank" rel="noopener"><img src="screenshots/confrontation-positions.png" alt="对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布" loading="lazy"></a><figcaption>对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布 · 点击查看原图</figcaption></figure><figure><a href="screenshots/confrontation-settings-reopen.png" target="_blank" rel="noopener"><img src="screenshots/confrontation-settings-reopen.png" alt="对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布" loading="lazy"></a><figcaption>对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布 · 点击查看原图</figcaption></figure><figure><a href="screenshots/confrontation-authoring.png" target="_blank" rel="noopener"><img src="screenshots/confrontation-authoring.png" alt="对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布" loading="lazy"></a><figcaption>对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布 · 点击查看原图</figcaption></figure><figure><a href="screenshots/confrontation-preflight.png" target="_blank" rel="noopener"><img src="screenshots/confrontation-preflight.png" alt="对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布" loading="lazy"></a><figcaption>对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布 · 点击查看原图</figcaption></figure><figure><a href="screenshots/confrontation-published.png" target="_blank" rel="noopener"><img src="screenshots/confrontation-published.png" alt="对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布" loading="lazy"></a><figcaption>对抗:狐狸场景、两步巡检、岗位配置、说明往返与发布 · 点击查看原图</figcaption></figure><figure><a href="screenshots/physical-final-published.png" target="_blank" rel="noopener"><img src="screenshots/physical-final-published.png" alt="实装:说明兼容修复回写,重新截图封面及发布" loading="lazy"></a><figcaption>实装:说明兼容修复回写,重新截图封面及发布 · 点击查看原图</figcaption></figure><figure><a href="screenshots/physical-teaching-list.png" target="_blank" rel="noopener"><img src="screenshots/physical-teaching-list.png" alt="实装默认页面:离线播放与候选复核可操作,无法执行新卡车正式步骤" loading="lazy"></a><figcaption>实装默认页面:离线播放与候选复核可操作,无法执行新卡车正式步骤 · 点击查看原图</figcaption></figure><figure><a href="screenshots/physical-offline-preview.png" target="_blank" rel="noopener"><img src="screenshots/physical-offline-preview.png" alt="实装默认页面:离线播放与候选复核可操作,无法执行新卡车正式步骤" loading="lazy"></a><figcaption>实装默认页面:离线播放与候选复核可操作,无法执行新卡车正式步骤 · 点击查看原图</figcaption></figure><figure><a href="screenshots/physical-offline-confirmed.png" target="_blank" rel="noopener"><img src="screenshots/physical-offline-confirmed.png" alt="实装默认页面:离线播放与候选复核可操作,无法执行新卡车正式步骤" loading="lazy"></a><figcaption>实装默认页面:离线播放与候选复核可操作,无法执行新卡车正式步骤 · 点击查看原图</figcaption></figure><figure><a href="screenshots/confrontation-final-entry.png" target="_blank" rel="noopener"><img src="screenshots/confrontation-final-entry.png" alt="对抗默认页面:新建下拉仅有本地液压预设,无法选择已发布狐狸训练" loading="lazy"></a><figcaption>对抗默认页面:新建下拉仅有本地液压预设,无法选择已发布狐狸训练 · 点击查看原图</figcaption></figure><figure><a href="screenshots/confrontation-final-local-create.png" target="_blank" rel="noopener"><img src="screenshots/confrontation-final-local-create.png" alt="对抗默认页面:新建下拉仅有本地液压预设,无法选择已发布狐狸训练" loading="lazy"></a><figcaption>对抗默认页面:新建下拉仅有本地液压预设,无法选择已发布狐狸训练 · 点击查看原图</figcaption></figure><figure><a href="screenshots/physical-list-cover.png" target="_blank" rel="noopener"><img src="screenshots/physical-list-cover.png" alt="训练列表两种模式展示各自真实截图封面" loading="lazy"></a><figcaption>训练列表两种模式展示各自真实截图封面 · 点击查看原图</figcaption></figure><figure><a href="screenshots/confrontation-list-cover.png" target="_blank" rel="noopener"><img src="screenshots/confrontation-list-cover.png" alt="训练列表两种模式展示各自真实截图封面" loading="lazy"></a><figcaption>训练列表两种模式展示各自真实截图封面 · 点击查看原图</figcaption></figure><figure><a href="screenshots/physical-independent-reopen.png" target="_blank" rel="noopener"><img src="screenshots/physical-independent-reopen.png" alt="牛奶卡车实装检查:发布重开、模型实际可见、截图封面" loading="lazy"></a><figcaption>牛奶卡车实装检查:发布重开、模型实际可见、截图封面 · 点击查看原图</figcaption></figure><figure><a href="screenshots/physical-independent-settings.png" target="_blank" rel="noopener"><img src="screenshots/physical-independent-settings.png" alt="牛奶卡车实装检查:发布重开、模型实际可见、截图封面" loading="lazy"></a><figcaption>牛奶卡车实装检查:发布重开、模型实际可见、截图封面 · 点击查看原图</figcaption></figure><figure><a href="screenshots/physical-final-cover.jpg" target="_blank" rel="noopener"><img src="screenshots/physical-final-cover.jpg" alt="实测训练-牛奶卡车实装检查-20260905" loading="lazy"></a><figcaption>实测训练-牛奶卡车实装检查-20260905 · 点击查看原图</figcaption></figure><figure><a href="screenshots/confrontation-independent-reopen.png" target="_blank" rel="noopener"><img src="screenshots/confrontation-independent-reopen.png" alt="狐狸红蓝协同巡检:发布重开、模型实际可见、截图封面" loading="lazy"></a><figcaption>狐狸红蓝协同巡检:发布重开、模型实际可见、截图封面 · 点击查看原图</figcaption></figure><figure><a href="screenshots/confrontation-independent-settings.png" target="_blank" rel="noopener"><img src="screenshots/confrontation-independent-settings.png" alt="狐狸红蓝协同巡检:发布重开、模型实际可见、截图封面" loading="lazy"></a><figcaption>狐狸红蓝协同巡检:发布重开、模型实际可见、截图封面 · 点击查看原图</figcaption></figure><figure><a href="screenshots/confrontation-final-cover.jpg" target="_blank" rel="noopener"><img src="screenshots/confrontation-final-cover.jpg" alt="实测训练-狐狸红蓝协同巡检-20260905" loading="lazy"></a><figcaption>实测训练-狐狸红蓝协同巡检-20260905 · 点击查看原图</figcaption></figure></div></section>
  2834. <section id="scope"><h2>范围、限制与待确认项</h2><ul><li>本报告区分编排 UI、默认教学 UI 和正式教学 API 三类证据;API 成功不能证明默认 UI 已连接该服务端运行。</li><li>实装的设备或视觉事件链路未接真实设备验证;人工确认测试不能替代实机联调、安全联锁或实际操作技能考核。</li><li>对抗的默认本地工作台与正式服务端任务分别留证;无证据时不声称多人跨浏览器实时协作或正式比赛胜负已联调。</li><li>正式 API 对抗由四个隔离学员会话依次操作;检查服务端截止时间已生效,未等待整局自然超时,不作为多人并发或网络同步压力测试。</li><li>100 分评定仅验证接口和结果留痕,不代表学员实际维修能力。测试不会向他人发送消息或下发真实设备指令。</li></ul><h3>实测边界与限制</h3><ul><li>实装为MANUAL人工事件合同测试,没有接真实PLC、摄像头、视觉识别服务或安全联锁设备。</li><li>两步狐狸巡检用于通用步骤与红蓝岗位合同,不是需要CONF-INSPECT等五个固定编码的完整排故作业;未宣称排故工作台阶段回写已打通。</li><li>对抗验证服务端设置了7分钟截止时刻,未等待自然超时触发;未把API账号请求视为多人跨浏览器实时协同UI测试。</li><li>牛奶卡车沿用原发布场景的视角,车间立柱遮挡部分车身;真实模型已渲染且封面来自该视口。</li><li>实装当前发布217仅回填兼容说明并更新封面;已完成教学任务50仍固定不可变版本215。</li><li>历史仅positionActions设置动作岗位的定义在教学读取侧与当前发布预检存在口径差异;本次按现有发布规则配置非空allowedPositions,未改后端岗位合同。</li><li>开发环境列表切换曾出现一次15秒超时,刷新后恢复;独立复测两种模式共6次查询均HTTP 200、耗时247–403ms,未复现稳定慢查询。详见list-api-latency.json。</li><li>实装事件均为本次自动化提交的 MANUAL 人工确认或明确的权限拒绝测试,不代表真实设备、PLC、摄像机或视觉模型联调。</li><li>教学运行结果来自正式 API;默认实装离线回放和默认对抗本地工作台的显示另行记录,不混同为服务端运行闭环。</li><li>对抗按四名隔离学员的独立会话依次操作,检查服务端截止时间已生效;未等待整局自然超时,也不代表多人同时操作的压力或网络同步测试。</li><li>测试账号使用本次随机密码,密码与会话仅在运行内存中;报告只保留用户 ID、队伍和岗位以便追溯。</li></ul><h3>需要另行确认的功能范围</h3><ul><li>将实装工作台从固定离线识别回放扩展为读取正式任务、已发布场景和步骤,并接入人工/设备事件、提交与结果。</li><li>将对抗默认入口从本地预设任务接入正式任务清单、创建和执行链路;确认通用巡检步骤与五阶段排故工作台的适用范围。</li></ul></section><footer>报告生成:2026/9/6 00:01:37(Asia/Shanghai) · evidence.json / api-evidence.json · 图片经本地文件校验</footer></main></body></html>