训练编排真实测试报告 通过

狐狸与牛奶卡车 · 场景 → 任务步骤 → 保存与发布

2026-09-05 · http://127.0.0.1:6180 · Microsoft Edge / Playwright · 教员编排与独立浏览器只读重开

证据组:3/3 通过;明确检查:通过 9,失败 0,待验证 0;已校验截图 19 张。

资料 → 产品原型 → 设计 → 开发

1 · 资料

  • 参考《文档/维修训练内容设计.pdf》(6 页)与已有场景制作成果。按“场景 → 任务步骤 → 学习 / 训练 / 评估”的资料结构检查实现。
  • 本次使用已发布的狐狸场景和牛奶卡车场景验证训练编排,确认真实模型可见、步骤目标来自绑定场景、保存及发布使用服务端版本。

2 · 产品原型

  • 沿用现有三维训练编排工作台:选择场景、选择三维对象、配置任务步骤、保存草稿和发布。
  • 新建时的液压模板仅作为现有界面起点;绑定新场景后不得继续选择该场景中不存在的液压设备。

3 · 设计

  • 两条独立训练分别绑定狐狸与卡车的明确发布版本;每条配置两步、每步 50 分,总计 100 分,并核验重新打开后的状态。
  • 保存时以三维视口截图生成训练封面;模型可见性要通过实际截图及模型显示 / 隐藏的像素差异判断。
  • 将正常流程、独立浏览器只读重开、资源失败、封面失败、版本冲突及并发切换分别留证。独立重开阻断所有业务写请求,核验模型像素可见性、封面哈希与发布依赖;不将其表述为只读角色权限测试。

4 · 开发

  • 场景目录对接已发布内容版本;GLB 通过受控下载读取;训练依赖固定到所选场景版本,恢复项目时保留来源元数据。
  • 修复蒙皮模型缩放后的骨骼矩阵与包围盒刷新;场景恢复、部位覆盖和高亮使用一致的尺寸计算。
  • 绑定场景后移除不存在的内置操作目标,过滤隐藏或已删除对象及其子目标。
  • 保存和发布等待异步操作完成;封面与内容在同一次版本保存中持久化;失败、冲突及并发切换必须保留可恢复状态。最终实现效果以下方真实测试记录为准。
  • 修复旧工程快照回写覆盖最新名称与训练形态;场景绑定进行中禁止保存和发布,避免模型尚未加载成功就写入新的场景依赖。

保留训练数据

训练 ID名称状态当前版本发布版本场景 ID固定场景版本步骤数总分
161实测训练-狐狸野外巡检-已验证-20260905PUBLISHED2132131602102100
162实测训练-牛奶卡车进场检查-已验证-20260905PUBLISHED2142141592092100
训练 161:版本、步骤、封面与依赖记录
{
  "id": "161",
  "name": "实测训练-狐狸野外巡检-已验证-20260905",
  "status": "PUBLISHED",
  "currentVersionId": "213",
  "publishedVersionId": "213",
  "sceneProjectId": "160",
  "sceneVersionId": "210",
  "stepCount": 2,
  "totalScore": 100,
  "cover": {
    "assetId": "2098",
    "sha256": "7b7c41e441e525e151ad4bd46fe3b01c249282368331f04cebe6a0eac0141267",
    "sizeBytes": 52518,
    "image": "screenshots/fox-final-cover.jpg"
  }
}
训练 162:版本、步骤、封面与依赖记录
{
  "id": "162",
  "name": "实测训练-牛奶卡车进场检查-已验证-20260905",
  "status": "PUBLISHED",
  "currentVersionId": "214",
  "publishedVersionId": "214",
  "sceneProjectId": "159",
  "sceneVersionId": "209",
  "stepCount": 2,
  "totalScore": 100,
  "cover": {
    "assetId": "2100",
    "sha256": "efb7060464f840bde78744d89567c609dc7b7922216d1c948fe22c1eed3d41a4",
    "sizeBytes": 42163,
    "image": "screenshots/truck-final-cover.jpg"
  }
}

保留两条真实训练供后续查看;本报告生成器不创建、修改或删除业务数据。

5 · 测试

证据组:3/3 通过;明确检查:通过 9,失败 0,待验证 0;已校验截图 19 张。

过程检查记录执行当时的版本;最终数据以上方保留项目及同版本独立重开记录为准。

真实UI训练编排与发布实测 通过

使用真实已发布场景创建、编排并保留两条训练,列表显示截图封面 通过

查看脱敏后的完整记录
{
  "title": "使用真实已发布场景创建、编排并保留两条训练,列表显示截图封面",
  "status": "PASS",
  "screenshots": [
    "screenshots/02-published-scenes.png",
    "screenshots/20-training-list-final.png"
  ],
  "details": {
    "projects": [
      {
        "id": "161",
        "status": "PUBLISHED",
        "sceneProjectId": "160",
        "sceneVersionId": "210",
        "stepCount": 2,
        "totalScore": 100
      },
      {
        "id": "162",
        "status": "PUBLISHED",
        "sceneProjectId": "159",
        "sceneVersionId": "209",
        "stepCount": 2,
        "totalScore": 100
      }
    ]
  }
}

狐狸两步编排、复制删除、排序撤销、高级时间轴、项目名称保存及发布 通过

查看脱敏后的完整记录
{
  "status": "PASS",
  "title": "狐狸两步编排、复制删除、排序撤销、高级时间轴、项目名称保存及发布",
  "id": "161",
  "name": "实测训练-狐狸野外巡检-已验证-20260905",
  "publishedVersionId": "211",
  "coverId": "2095",
  "steps": [
    {
      "title": "识别狐狸巡检目标",
      "target": "scene:OBJ-1788605916565-6",
      "stepCode": "VIRTUAL-S01",
      "actionCode": "VIRTUAL-A01",
      "score": 50
    },
    {
      "title": "检查狐狸外观并确认状态",
      "target": "scene:OBJ-1788605916565-6",
      "stepCode": "VIRTUAL-S02",
      "actionCode": "VIRTUAL-A02",
      "score": 50
    }
  ],
  "errors": [],
  "failed": [],
  "screenshots": [
    "screenshots/09-fox-advanced-timeline.png",
    "screenshots/10-fox-preflight.png"
  ]
}

狐狸三维点击选目标、调整视角并截图发布、异常恢复 通过

查看脱敏后的完整记录
{
  "status": "PASS",
  "title": "狐狸三维点击选目标、调整视角并截图发布、异常恢复",
  "id": "161",
  "publishedVersionId": "213",
  "pick": {
    "x": 1065.015625,
    "y": 750.5,
    "targetId": "scene:OBJ-1788605916565-6/part/interaction-a3d35c26"
  },
  "cameraBefore": [
    -0.04179225073787585,
    6.099634646023559,
    17.355036987378313
  ],
  "cameraAfter": [
    -0.9408733025235376,
    5.534741198620379,
    15.26632686671827
  ],
  "cover": {
    "id": "2098",
    "sizeBytes": 52518,
    "sha256": "7b7c41e441e525e151ad4bd46fe3b01c249282368331f04cebe6a0eac0141267",
    "equalsCurrentViewport": true
  },
  "errors": [],
  "screenshots": [
    "screenshots/16-fox-mesh-picking.png",
    "screenshots/17-fox-final-published.png"
  ]
}

卡车三维拾取、项目名称及任务说明保存、隐藏外壳视角截图发布 通过

查看脱敏后的完整记录
{
  "status": "PASS",
  "title": "卡车三维拾取、项目名称及任务说明保存、隐藏外壳视角截图发布",
  "id": "162",
  "name": "实测训练-牛奶卡车进场检查-已验证-20260905",
  "publishedVersionId": "214",
  "coverId": "2100",
  "pick": {
    "x": 1065.015625,
    "y": 750.5,
    "targetId": "scene:OBJ-1788605199171-2/part/interaction-5f7e4bee"
  },
  "stepCount": 2,
  "totalScore": 100,
  "errors": [],
  "screenshots": [
    "screenshots/18-truck-mesh-picking.png",
    "screenshots/19-truck-final-published.png"
  ]
}
final-evidence.json · 完整记录
{
  "title": "真实UI训练编排与发布实测",
  "status": "PASS",
  "finishedAt": "2026-09-05T15:23:29.909Z",
  "projects": [
    {
      "id": "161",
      "name": "实测训练-狐狸野外巡检-已验证-20260905",
      "status": "PUBLISHED",
      "currentVersionId": "213",
      "publishedVersionId": "213",
      "sceneProjectId": "160",
      "sceneVersionId": "210",
      "stepCount": 2,
      "totalScore": 100,
      "cover": {
        "assetId": "2098",
        "sha256": "7b7c41e441e525e151ad4bd46fe3b01c249282368331f04cebe6a0eac0141267",
        "sizeBytes": 52518,
        "image": "screenshots/fox-final-cover.jpg"
      }
    },
    {
      "id": "162",
      "name": "实测训练-牛奶卡车进场检查-已验证-20260905",
      "status": "PUBLISHED",
      "currentVersionId": "214",
      "publishedVersionId": "214",
      "sceneProjectId": "159",
      "sceneVersionId": "209",
      "stepCount": 2,
      "totalScore": 100,
      "cover": {
        "assetId": "2100",
        "sha256": "efb7060464f840bde78744d89567c609dc7b7922216d1c948fe22c1eed3d41a4",
        "sizeBytes": 42163,
        "image": "screenshots/truck-final-cover.jpg"
      }
    }
  ],
  "checks": [
    {
      "title": "使用真实已发布场景创建、编排并保留两条训练,列表显示截图封面",
      "status": "PASS",
      "screenshots": [
        "screenshots/02-published-scenes.png",
        "screenshots/20-training-list-final.png"
      ],
      "details": {
        "projects": [
          {
            "id": "161",
            "status": "PUBLISHED",
            "sceneProjectId": "160",
            "sceneVersionId": "210",
            "stepCount": 2,
            "totalScore": 100
          },
          {
            "id": "162",
            "status": "PUBLISHED",
            "sceneProjectId": "159",
            "sceneVersionId": "209",
            "stepCount": 2,
            "totalScore": 100
          }
        ]
      }
    },
    {
      "status": "PASS",
      "title": "狐狸两步编排、复制删除、排序撤销、高级时间轴、项目名称保存及发布",
      "id": "161",
      "name": "实测训练-狐狸野外巡检-已验证-20260905",
      "publishedVersionId": "211",
      "coverId": "2095",
      "steps": [
        {
          "title": "识别狐狸巡检目标",
          "target": "scene:OBJ-1788605916565-6",
          "stepCode": "VIRTUAL-S01",
          "actionCode": "VIRTUAL-A01",
          "score": 50
        },
        {
          "title": "检查狐狸外观并确认状态",
          "target": "scene:OBJ-1788605916565-6",
          "stepCode": "VIRTUAL-S02",
          "actionCode": "VIRTUAL-A02",
          "score": 50
        }
      ],
      "errors": [],
      "failed": [],
      "screenshots": [
        "screenshots/09-fox-advanced-timeline.png",
        "screenshots/10-fox-preflight.png"
      ]
    },
    {
      "status": "PASS",
      "title": "狐狸三维点击选目标、调整视角并截图发布、异常恢复",
      "id": "161",
      "publishedVersionId": "213",
      "pick": {
        "x": 1065.015625,
        "y": 750.5,
        "targetId": "scene:OBJ-1788605916565-6/part/interaction-a3d35c26"
      },
      "cameraBefore": [
        -0.04179225073787585,
        6.099634646023559,
        17.355036987378313
      ],
      "cameraAfter": [
        -0.9408733025235376,
        5.534741198620379,
        15.26632686671827
      ],
      "cover": {
        "id": "2098",
        "sizeBytes": 52518,
        "sha256": "7b7c41e441e525e151ad4bd46fe3b01c249282368331f04cebe6a0eac0141267",
        "equalsCurrentViewport": true
      },
      "errors": [],
      "screenshots": [
        "screenshots/16-fox-mesh-picking.png",
        "screenshots/17-fox-final-published.png"
      ]
    },
    {
      "status": "PASS",
      "title": "卡车三维拾取、项目名称及任务说明保存、隐藏外壳视角截图发布",
      "id": "162",
      "name": "实测训练-牛奶卡车进场检查-已验证-20260905",
      "publishedVersionId": "214",
      "coverId": "2100",
      "pick": {
        "x": 1065.015625,
        "y": 750.5,
        "targetId": "scene:OBJ-1788605199171-2/part/interaction-5f7e4bee"
      },
      "stepCount": 2,
      "totalScore": 100,
      "errors": [],
      "screenshots": [
        "screenshots/18-truck-mesh-picking.png",
        "screenshots/19-truck-final-published.png"
      ]
    }
  ],
  "commands": [
    {
      "command": "pnpm run build",
      "status": "PASS",
      "details": "vue-tsc、Vite构建、iframe产物一致性验证通过;有既有chunk体积和DRACO路径构建提示。"
    },
    {
      "command": "pnpm run test:training-legacy",
      "status": "PASS",
      "details": "训练原型迁移和野外场景共享定义两个合同均通过。"
    },
    {
      "command": "node --test tools/training-cover.test.mjs tools/training-scene-api.test.mjs tools/training-model-placement.test.mjs tools/training-scene-targets.test.mjs tools/training-project-metadata.test.mjs",
      "status": "PASS",
      "details": "48/48通过。首次合跑1个测试夹具缺renderSaveState回调,修复夹具后全量复跑通过。"
    },
    {
      "command": "node tools/training-scene-visibility.e2e.mjs",
      "status": "PASS",
      "details": "独立浏览器只读重开验证,最终版本变更后再次运行;细项以readonly-evidence.json为准。"
    }
  ],
  "limitations": [
    "本次未创建教学下发任务,也未验证学员端完成训练;现有“预览训练”入口仍提示先发布再从虚实训练下发任务。",
    "未配置讲解音频和必选安全前置条件,编辑器校验给出非阻断提醒;两条为轻量素材功能测试,不作为正式维修教学内容。",
    "狐狸源场景实际已更新至V3(版本210),使用目录当时的真实发布版;未修改两个源场景或源模型。",
    "训练封面截取保存时的当前视角;卡车封面通过现有“隐藏外壳”按钮隐藏围护结构,立柱仍遮挡部分车身。这是继承的源场景及视角,不是模型未加载;重新打开时仍按固定场景还原相机。",
    "本轮没有新增需确认的功能变更,截图封面按本次明确授权实现;未改变数据库结构,无DDL变更。"
  ],
  "pageErrors": []
}

独立浏览器重开、真实模型可见性及封面验证 通过

狐狸野外巡检:发布重开、模型实际可见、截图封面 通过

查看脱敏后的完整记录
{
  "title": "狐狸野外巡检:发布重开、模型实际可见、截图封面",
  "status": "PASS",
  "screenshots": [
    "screenshots/fox-independent-reopen.png",
    "screenshots/fox-final-cover.jpg"
  ],
  "details": {
    "state": "ready",
    "meshes": 1,
    "visibleMeshes": 1,
    "skinnedMeshes": 1,
    "position": [
      -7.5,
      0.10930174852949677,
      0.3440109341705351
    ],
    "scale": [
      0.03616375932570189,
      0.03616375932570189,
      0.03616375932570189
    ],
    "finiteBounds": true,
    "size": [
      0.9658796100519353,
      2.811899945787403,
      6
    ],
    "camera": {
      "position": [
        -0.04179225073787585,
        6.099634646023559,
        17.355036987378313
      ],
      "target": [
        -7.512232860974557,
        1.4059499759307126,
        -2.2204460492503126e-16
      ]
    },
    "sample": {
      "width": 320,
      "height": 180,
      "changedPixels": 827
    },
    "scene": {
      "projectId": "160",
      "versionId": "210"
    },
    "targets": [
      {
        "id": "scene:OBJ-1788605873329-2",
        "name": "维修装备主体 02",
        "source": "scene"
      },
      {
        "id": "scene:OBJ-1788605916565-6",
        "name": "狐狸野外巡检目标",
        "source": "scene"
      },
      {
        "id": "scene:OBJ-1788605916565-6/part/interaction-a3d35c26",
        "name": "fox",
        "source": "scene"
      }
    ],
    "steps": [
      {
        "title": "识别狐狸巡检目标",
        "targetId": "scene:OBJ-1788605916565-6",
        "weight": 50
      },
      {
        "title": "检查狐狸外观并确认状态",
        "targetId": "scene:OBJ-1788605916565-6",
        "weight": 50
      }
    ],
    "cover": {
      "assetId": "2098",
      "bytes": 52518,
      "sha256": "7b7c41e441e525e151ad4bd46fe3b01c249282368331f04cebe6a0eac0141267",
      "width": 628,
      "height": 640
    },
    "pageErrors": [],
    "blockedWrites": []
  }
}

牛奶卡车进场检查:发布重开、模型实际可见、截图封面 通过

查看脱敏后的完整记录
{
  "title": "牛奶卡车进场检查:发布重开、模型实际可见、截图封面",
  "status": "PASS",
  "screenshots": [
    "screenshots/truck-independent-reopen.png",
    "screenshots/truck-final-cover.jpg"
  ],
  "details": {
    "state": "ready",
    "meshes": 5,
    "visibleMeshes": 5,
    "skinnedMeshes": 0,
    "position": [
      4.2,
      0.20617168998977797,
      -0.4356763541543951
    ],
    "scale": [
      1.2323086149245381,
      1.2323086149245381,
      1.2323086149245381
    ],
    "finiteBounds": true,
    "size": [
      3.4406057210321332,
      3.390913184034896,
      6.000000000000001
    ],
    "camera": {
      "position": [
        10.565439077211714,
        5.0456876852867705,
        7.37050840519251
      ],
      "target": [
        4.2,
        1.695456592017448,
        0
      ]
    },
    "sample": {
      "width": 320,
      "height": 180,
      "changedPixels": 11669
    },
    "scene": {
      "projectId": "159",
      "versionId": "209"
    },
    "targets": [
      {
        "id": "scene:OBJ-1788605199171-2",
        "name": "牛奶卡车检验主装备",
        "source": "scene"
      },
      {
        "id": "scene:OBJ-1788605199171-2/part/interaction-1ba581e6",
        "name": "Yup2Zup",
        "source": "scene"
      },
      {
        "id": "scene:OBJ-1788605199171-2/part/interaction-004dec41",
        "name": "Cesium_Milk_Truck",
        "source": "scene"
      },
      {
        "id": "scene:OBJ-1788605199171-2/part/interaction-5f7e4bee",
        "name": "Cesium_Milk_Truck_1",
        "source": "scene"
      },
      {
        "id": "scene:OBJ-1788605199171-2/part/interaction-607e4d81",
        "name": "Cesium_Milk_Truck_2",
        "source": "scene"
      },
      {
        "id": "scene:OBJ-1788605199171-2/part/interaction-5d7e48c8",
        "name": "Cesium_Milk_Truck_3",
        "source": "scene"
      },
      {
        "id": "scene:OBJ-1788605199171-2/part/interaction-5e7e4a5b",
        "name": "Node",
        "source": "scene"
      },
      {
        "id": "scene:OBJ-1788605199171-2/part/interaction-ce2feac4",
        "name": "Wheels",
        "source": "scene"
      },
      {
        "id": "scene:OBJ-1788605199171-2/part/interaction-637e523a",
        "name": "Node001",
        "source": "scene"
      },
      {
        "id": "scene:OBJ-1788605199171-2/part/interaction-f417f82d",
        "name": "Wheels001",
        "source": "scene"
      }
    ],
    "steps": [
      {
        "title": "识别牛奶卡车检验目标",
        "targetId": "scene:OBJ-1788605199171-2",
        "weight": 50
      },
      {
        "title": "检查卡车外观并确认状态",
        "targetId": "scene:OBJ-1788605199171-2",
        "weight": 50
      }
    ],
    "cover": {
      "assetId": "2100",
      "bytes": 42163,
      "sha256": "efb7060464f840bde78744d89567c609dc7b7922216d1c948fe22c1eed3d41a4",
      "width": 628,
      "height": 640
    },
    "pageErrors": [],
    "blockedWrites": []
  }
}
readonly-evidence.json · 完整记录
{
  "title": "独立浏览器重开、真实模型可见性及封面验证",
  "status": "PASS",
  "startedAt": "2026-09-05T15:23:16.479Z",
  "checks": [
    {
      "title": "狐狸野外巡检:发布重开、模型实际可见、截图封面",
      "status": "PASS",
      "screenshots": [
        "screenshots/fox-independent-reopen.png",
        "screenshots/fox-final-cover.jpg"
      ],
      "details": {
        "state": "ready",
        "meshes": 1,
        "visibleMeshes": 1,
        "skinnedMeshes": 1,
        "position": [
          -7.5,
          0.10930174852949677,
          0.3440109341705351
        ],
        "scale": [
          0.03616375932570189,
          0.03616375932570189,
          0.03616375932570189
        ],
        "finiteBounds": true,
        "size": [
          0.9658796100519353,
          2.811899945787403,
          6
        ],
        "camera": {
          "position": [
            -0.04179225073787585,
            6.099634646023559,
            17.355036987378313
          ],
          "target": [
            -7.512232860974557,
            1.4059499759307126,
            -2.2204460492503126e-16
          ]
        },
        "sample": {
          "width": 320,
          "height": 180,
          "changedPixels": 827
        },
        "scene": {
          "projectId": "160",
          "versionId": "210"
        },
        "targets": [
          {
            "id": "scene:OBJ-1788605873329-2",
            "name": "维修装备主体 02",
            "source": "scene"
          },
          {
            "id": "scene:OBJ-1788605916565-6",
            "name": "狐狸野外巡检目标",
            "source": "scene"
          },
          {
            "id": "scene:OBJ-1788605916565-6/part/interaction-a3d35c26",
            "name": "fox",
            "source": "scene"
          }
        ],
        "steps": [
          {
            "title": "识别狐狸巡检目标",
            "targetId": "scene:OBJ-1788605916565-6",
            "weight": 50
          },
          {
            "title": "检查狐狸外观并确认状态",
            "targetId": "scene:OBJ-1788605916565-6",
            "weight": 50
          }
        ],
        "cover": {
          "assetId": "2098",
          "bytes": 52518,
          "sha256": "7b7c41e441e525e151ad4bd46fe3b01c249282368331f04cebe6a0eac0141267",
          "width": 628,
          "height": 640
        },
        "pageErrors": [],
        "blockedWrites": []
      }
    },
    {
      "title": "牛奶卡车进场检查:发布重开、模型实际可见、截图封面",
      "status": "PASS",
      "screenshots": [
        "screenshots/truck-independent-reopen.png",
        "screenshots/truck-final-cover.jpg"
      ],
      "details": {
        "state": "ready",
        "meshes": 5,
        "visibleMeshes": 5,
        "skinnedMeshes": 0,
        "position": [
          4.2,
          0.20617168998977797,
          -0.4356763541543951
        ],
        "scale": [
          1.2323086149245381,
          1.2323086149245381,
          1.2323086149245381
        ],
        "finiteBounds": true,
        "size": [
          3.4406057210321332,
          3.390913184034896,
          6.000000000000001
        ],
        "camera": {
          "position": [
            10.565439077211714,
            5.0456876852867705,
            7.37050840519251
          ],
          "target": [
            4.2,
            1.695456592017448,
            0
          ]
        },
        "sample": {
          "width": 320,
          "height": 180,
          "changedPixels": 11669
        },
        "scene": {
          "projectId": "159",
          "versionId": "209"
        },
        "targets": [
          {
            "id": "scene:OBJ-1788605199171-2",
            "name": "牛奶卡车检验主装备",
            "source": "scene"
          },
          {
            "id": "scene:OBJ-1788605199171-2/part/interaction-1ba581e6",
            "name": "Yup2Zup",
            "source": "scene"
          },
          {
            "id": "scene:OBJ-1788605199171-2/part/interaction-004dec41",
            "name": "Cesium_Milk_Truck",
            "source": "scene"
          },
          {
            "id": "scene:OBJ-1788605199171-2/part/interaction-5f7e4bee",
            "name": "Cesium_Milk_Truck_1",
            "source": "scene"
          },
          {
            "id": "scene:OBJ-1788605199171-2/part/interaction-607e4d81",
            "name": "Cesium_Milk_Truck_2",
            "source": "scene"
          },
          {
            "id": "scene:OBJ-1788605199171-2/part/interaction-5d7e48c8",
            "name": "Cesium_Milk_Truck_3",
            "source": "scene"
          },
          {
            "id": "scene:OBJ-1788605199171-2/part/interaction-5e7e4a5b",
            "name": "Node",
            "source": "scene"
          },
          {
            "id": "scene:OBJ-1788605199171-2/part/interaction-ce2feac4",
            "name": "Wheels",
            "source": "scene"
          },
          {
            "id": "scene:OBJ-1788605199171-2/part/interaction-637e523a",
            "name": "Node001",
            "source": "scene"
          },
          {
            "id": "scene:OBJ-1788605199171-2/part/interaction-f417f82d",
            "name": "Wheels001",
            "source": "scene"
          }
        ],
        "steps": [
          {
            "title": "识别牛奶卡车检验目标",
            "targetId": "scene:OBJ-1788605199171-2",
            "weight": 50
          },
          {
            "title": "检查卡车外观并确认状态",
            "targetId": "scene:OBJ-1788605199171-2",
            "weight": 50
          }
        ],
        "cover": {
          "assetId": "2100",
          "bytes": 42163,
          "sha256": "efb7060464f840bde78744d89567c609dc7b7922216d1c948fe22c1eed3d41a4",
          "width": 628,
          "height": 640
        },
        "pageErrors": [],
        "blockedWrites": []
      }
    }
  ],
  "projects": [
    {
      "id": "161",
      "name": "实测训练-狐狸野外巡检-已验证-20260905",
      "status": "PUBLISHED",
      "currentVersionId": "213",
      "publishedVersionId": "213",
      "sceneProjectId": "160",
      "sceneVersionId": "210",
      "stepCount": 2,
      "totalScore": 100,
      "cover": {
        "assetId": "2098",
        "image": "screenshots/fox-final-cover.jpg"
      }
    },
    {
      "id": "162",
      "name": "实测训练-牛奶卡车进场检查-已验证-20260905",
      "status": "PUBLISHED",
      "currentVersionId": "214",
      "publishedVersionId": "214",
      "sceneProjectId": "159",
      "sceneVersionId": "209",
      "stepCount": 2,
      "totalScore": 100,
      "cover": {
        "assetId": "2100",
        "image": "screenshots/truck-final-cover.jpg"
      }
    }
  ],
  "finishedAt": "2026-09-05T15:24:01.659Z"
}

真实浏览器异常分支验证(定向注入HTTP失败) 通过

封面上传503:训练内容仍保存并保留原封面 通过

查看脱敏后的完整记录
{
  "title": "封面上传503:训练内容仍保存并保留原封面",
  "status": "PASS",
  "details": {
    "beforeVersion": 6,
    "afterVersion": 7,
    "sameCover": true,
    "stepCount": 2
  },
  "screenshot": "screenshots/12-cover-failure-preserves-old.png"
}

保存409:不覆盖服务端内容和封面,并保持未保存提示 通过

查看脱敏后的完整记录
{
  "title": "保存409:不覆盖服务端内容和封面,并保持未保存提示",
  "status": "PASS",
  "details": {
    "version": 7,
    "putAttempts": 1,
    "sameCover": true
  },
  "screenshot": "screenshots/13-save-conflict.png"
}

切换场景下载失败:保持原场景、绑定期间禁止保存发布、零项目写入 通过

查看脱敏后的完整记录
{
  "title": "切换场景下载失败:保持原场景、绑定期间禁止保存发布、零项目写入",
  "status": "PASS",
  "details": {
    "retainedSceneProjectId": "160",
    "blockedDownloads": 1,
    "putCount": 0
  },
  "screenshots": [
    "screenshots/14-binding-disables-save.png",
    "screenshots/15-binding-failure-retains-scene.png"
  ]
}
error-evidence.json · 完整记录
{
  "title": "真实浏览器异常分支验证(定向注入HTTP失败)",
  "status": "PASS",
  "checks": [
    {
      "title": "封面上传503:训练内容仍保存并保留原封面",
      "status": "PASS",
      "details": {
        "beforeVersion": 6,
        "afterVersion": 7,
        "sameCover": true,
        "stepCount": 2
      },
      "screenshot": "screenshots/12-cover-failure-preserves-old.png"
    },
    {
      "title": "保存409:不覆盖服务端内容和封面,并保持未保存提示",
      "status": "PASS",
      "details": {
        "version": 7,
        "putAttempts": 1,
        "sameCover": true
      },
      "screenshot": "screenshots/13-save-conflict.png"
    },
    {
      "title": "切换场景下载失败:保持原场景、绑定期间禁止保存发布、零项目写入",
      "status": "PASS",
      "details": {
        "retainedSceneProjectId": "160",
        "blockedDownloads": 1,
        "putCount": 0
      },
      "screenshots": [
        "screenshots/14-binding-disables-save.png",
        "screenshots/15-binding-failure-retains-scene.png"
      ]
    }
  ]
}

执行命令与验证结果

pnpm run build 通过

vue-tsc、Vite构建、iframe产物一致性验证通过;有既有chunk体积和DRACO路径构建提示。

pnpm run test:training-legacy 通过

训练原型迁移和野外场景共享定义两个合同均通过。

node --test tools/training-cover.test.mjs tools/training-scene-api.test.mjs tools/training-model-placement.test.mjs tools/training-scene-targets.test.mjs tools/training-project-metadata.test.mjs 通过

48/48通过。首次合跑1个测试夹具缺renderSaveState回调,修复夹具后全量复跑通过。

node tools/training-scene-visibility.e2e.mjs 通过

独立浏览器只读重开验证,最终版本变更后再次运行;细项以readonly-evidence.json为准。

最终及异常验证截图

过程截图 · 不计入最终通过结论

这些截图只记录测试中途状态;最终两步、总分、版本和封面以上方证据为准。

范围、限制与功能确认结论

实测限制与后续项