No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 

6136 líneas
259 KiB

  1. {
  2. "generatedAt": "2026-09-06T10:36:39.541Z",
  3. "overall": "PASS",
  4. "finalRun": true,
  5. "finalArtifactsVerified": true,
  6. "featureCount": {
  7. "total": 119,
  8. "pass": 119,
  9. "fail": 0,
  10. "pending": 0
  11. },
  12. "featureKinds": {
  13. "browser": 112,
  14. "focused": 7
  15. },
  16. "e2eCount": {
  17. "total": 33,
  18. "pass": 33,
  19. "fail": 0,
  20. "pending": 0
  21. },
  22. "validationTotals": [
  23. {
  24. "kind": "构建与类型检查",
  25. "checks": 1,
  26. "passedChecks": 1,
  27. "tests": 0,
  28. "passedTests": 0
  29. },
  30. {
  31. "kind": "后端构建与测试",
  32. "checks": 1,
  33. "passedChecks": 1,
  34. "tests": 373,
  35. "passedTests": 373
  36. },
  37. {
  38. "kind": "Node 合同与单元",
  39. "checks": 2,
  40. "passedChecks": 2,
  41. "tests": 138,
  42. "passedTests": 138
  43. }
  44. ],
  45. "cleanupCount": {
  46. "projects": 167,
  47. "projectsRemoved": 167,
  48. "originals": 4,
  49. "originalsUnchanged": 4,
  50. "users": 28,
  51. "usersRemoved": 28,
  52. "roles": 34,
  53. "rolesRemoved": 34
  54. },
  55. "unknownIds": [],
  56. "missing": [],
  57. "malformed": [],
  58. "features": [
  59. {
  60. "id": "project.load",
  61. "group": "工程入口与顶部命令",
  62. "name": "按真实项目 ID 打开已存场景",
  63. "source": {
  64. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  65. "symbol": "async function loadProject",
  66. "line": 547
  67. },
  68. "implementation": "本轮修复已完成验证",
  69. "boundary": "服务端 content 与版本是真值;不得以模板种子覆盖有效旧工程。",
  70. "acceptance": "独立新会话打开,真实模型可见、固定版本及对象字段一致。",
  71. "fix": "新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。",
  72. "fixIds": [
  73. "SCENE-F18"
  74. ],
  75. "verification": "PASS",
  76. "evidence": [
  77. {
  78. "status": "PASS",
  79. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  80. "recordedAt": "2026-09-06T10:30:14.385Z",
  81. "kind": "browser",
  82. "ids": [
  83. "project.load",
  84. "project.title",
  85. "project.save",
  86. "selection.tree",
  87. "property.name",
  88. "property.visible",
  89. "property.operable",
  90. "property.position",
  91. "property.rotation",
  92. "property.scale",
  93. "property.device-id",
  94. "property.model-id",
  95. "property.semantic",
  96. "part.source",
  97. "panel.binding",
  98. "cover.capture",
  99. "cover.atomic"
  100. ],
  101. "file": "evidence/fox-properties-cover.json",
  102. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  103. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  104. "screenshots": []
  105. },
  106. {
  107. "status": "PASS",
  108. "testTitle": "successful parallel restores retain document order after delayed GLBs and split-object batches finish out of order",
  109. "kind": "unit",
  110. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  111. "ids": [
  112. "project.load",
  113. "selection.tree"
  114. ],
  115. "file": "validation.json",
  116. "title": "successful parallel restores retain document order after delayed GLBs and split-object batches finish out of order",
  117. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  118. "screenshots": []
  119. }
  120. ]
  121. },
  122. {
  123. "id": "project.retry",
  124. "group": "工程入口与顶部命令",
  125. "name": "项目或挂载加载失败后重新加载",
  126. "source": {
  127. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  128. "symbol": "mountError",
  129. "line": 76
  130. },
  131. "implementation": "本轮修复已完成验证",
  132. "boundary": "错误详情自动消退,保留中性失败状态与重试按钮。",
  133. "acceptance": "注入加载失败;无可写半场景;恢复网络后按钮重试成功。",
  134. "fix": "前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。",
  135. "fixIds": [
  136. "SCENE-F12"
  137. ],
  138. "verification": "PASS",
  139. "evidence": [
  140. {
  141. "status": "PASS",
  142. "testTitle": "加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载",
  143. "recordedAt": "2026-09-06T10:24:14.518Z",
  144. "kind": "browser",
  145. "ids": [
  146. "project.retry",
  147. "glb.pending",
  148. "leave.busy"
  149. ],
  150. "file": "evidence/loading-retry.json",
  151. "title": "加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载",
  152. "details": "GET503只留中性失败和重试;延迟受控下载时禁用写入/导出/预览并阻止关闭,释放后真实狐狸加载。",
  153. "screenshots": []
  154. },
  155. {
  156. "status": "PASS",
  157. "testTitle": "a failed fixed-version lookup is evicted and the same reference can be retried",
  158. "kind": "unit",
  159. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  160. "ids": [
  161. "project.retry"
  162. ],
  163. "file": "validation.json",
  164. "title": "a failed fixed-version lookup is evicted and the same reference can be retried",
  165. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  166. "screenshots": []
  167. }
  168. ]
  169. },
  170. {
  171. "id": "project.title",
  172. "group": "工程入口与顶部命令",
  173. "name": "当前场景名称与项目说明按钮",
  174. "source": {
  175. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  176. "symbol": "project: () => this.toast",
  177. "line": 599
  178. },
  179. "implementation": "已有实现已完成验证",
  180. "boundary": "现有标题显示服务端名称;说明按钮不是重命名输入框。",
  181. "acceptance": "长名称完整 title 正确;点击说明反映内容 API 管理。",
  182. "fix": "尚未关联本轮修复记录",
  183. "fixIds": [],
  184. "verification": "PASS",
  185. "evidence": [
  186. {
  187. "status": "PASS",
  188. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  189. "recordedAt": "2026-09-06T10:30:14.385Z",
  190. "kind": "browser",
  191. "ids": [
  192. "project.load",
  193. "project.title",
  194. "project.save",
  195. "selection.tree",
  196. "property.name",
  197. "property.visible",
  198. "property.operable",
  199. "property.position",
  200. "property.rotation",
  201. "property.scale",
  202. "property.device-id",
  203. "property.model-id",
  204. "property.semantic",
  205. "part.source",
  206. "panel.binding",
  207. "cover.capture",
  208. "cover.atomic"
  209. ],
  210. "file": "evidence/fox-properties-cover.json",
  211. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  212. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  213. "screenshots": []
  214. }
  215. ]
  216. },
  217. {
  218. "id": "project.new",
  219. "group": "工程入口与顶部命令",
  220. "name": "顶部新建独立工程",
  221. "source": {
  222. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  223. "symbol": "new: () =>",
  224. "line": 575
  225. },
  226. "implementation": "本轮修复已完成验证",
  227. "boundary": "基线代码重置当前模板;本轮由宿主接真实创建 API,必须保留原项目。",
  228. "acceptance": "取消/失败不清原工程;成功新 ID;保存重开与列表对应。",
  229. "fix": "顶部新建委托宿主命名与创建 API,先确认未保存内容。选择放弃也要等创建及导航成功后才清除原 dirty/恢复稿;创建503仍保留原稿。成功后刷新原缓存页,避免再次打开时将已放弃修改冒称已保存。取消、失败不清原场景,成功导航到新项目 ID,并有创建并发守卫。",
  230. "fixIds": [
  231. "SCENE-F02"
  232. ],
  233. "verification": "PASS",
  234. "evidence": [
  235. {
  236. "status": "PASS",
  237. "testTitle": "新建独立场景:取消、失败、保护原工程以及成功新 ID",
  238. "recordedAt": "2026-09-06T10:30:58.245Z",
  239. "kind": "browser",
  240. "ids": [
  241. "project.new"
  242. ],
  243. "file": "evidence/new-project.json",
  244. "title": "新建独立场景:取消、失败、保护原工程以及成功新 ID",
  245. "details": "取消命名、创建503保留原工程、创建成功新ID、保存刷新与原工程内容核对。",
  246. "screenshots": []
  247. }
  248. ]
  249. },
  250. {
  251. "id": "project.back",
  252. "group": "工程入口与顶部命令",
  253. "name": "返回场景制作列表并保留场景标签",
  254. "source": {
  255. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  256. "symbol": "back: () =>",
  257. "line": 598
  258. },
  259. "implementation": "已有实现已完成验证",
  260. "boundary": "平台约定返回列表等同切换标签,保留场景缓存和未存稿,不弹关闭确认;真正关闭标签才询问。",
  261. "acceptance": "未存状态返回列表不写服务器、不丢场景;重新点原标签恢复输入和选择。",
  262. "fix": "尚未关联本轮修复记录",
  263. "fixIds": [],
  264. "verification": "PASS",
  265. "evidence": [
  266. {
  267. "status": "PASS",
  268. "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  269. "recordedAt": "2026-09-06T10:27:04.782Z",
  270. "kind": "browser",
  271. "ids": [
  272. "validation.complete",
  273. "validation.bindings",
  274. "panel.validation",
  275. "publish.saved",
  276. "publish.failure",
  277. "publish.fixed-model",
  278. "cover.atomic",
  279. "project.back"
  280. ],
  281. "file": "evidence/publish-fixed-version.json",
  282. "title": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  283. "details": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。",
  284. "screenshots": []
  285. }
  286. ]
  287. },
  288. {
  289. "id": "project.save",
  290. "group": "工程入口与顶部命令",
  291. "name": "保存草稿按钮",
  292. "source": {
  293. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  294. "symbol": "async saveProject()",
  295. "line": 1874
  296. },
  297. "implementation": "本轮修复已完成验证",
  298. "boundary": "只有服务器保存完成才显示成功;本地恢复缓冲不是自动入库。",
  299. "acceptance": "编辑后真实 PUT,刷新值一致,version 前进一次。",
  300. "fix": "完整 PUT 回写原有相同 SCENE_MODEL 三元组时沿用场景授权边界;新增或改版依赖仍要求来源模型可见及范围权限,不扩大模型页面访问权。",
  301. "fixIds": [
  302. "SCENE-F14"
  303. ],
  304. "verification": "PASS",
  305. "evidence": [
  306. {
  307. "status": "PASS",
  308. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  309. "recordedAt": "2026-09-06T10:30:14.385Z",
  310. "kind": "browser",
  311. "ids": [
  312. "project.load",
  313. "project.title",
  314. "project.save",
  315. "selection.tree",
  316. "property.name",
  317. "property.visible",
  318. "property.operable",
  319. "property.position",
  320. "property.rotation",
  321. "property.scale",
  322. "property.device-id",
  323. "property.model-id",
  324. "property.semantic",
  325. "part.source",
  326. "panel.binding",
  327. "cover.capture",
  328. "cover.atomic"
  329. ],
  330. "file": "evidence/fox-properties-cover.json",
  331. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  332. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  333. "screenshots": []
  334. },
  335. {
  336. "status": "PASS",
  337. "testTitle": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突",
  338. "recordedAt": "2026-09-06T10:24:27.147Z",
  339. "kind": "browser",
  340. "ids": [
  341. "project.concurrent-save",
  342. "project.save",
  343. "project.save-key",
  344. "recovery.autobuffer",
  345. "recovery.same-version"
  346. ],
  347. "file": "evidence/save-concurrency.json",
  348. "title": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突",
  349. "details": "延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。",
  350. "screenshots": []
  351. },
  352. {
  353. "status": "PASS",
  354. "testTitle": "双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿",
  355. "recordedAt": "2026-09-06T10:25:56.822Z",
  356. "kind": "browser",
  357. "ids": [
  358. "recovery.multi-session",
  359. "recovery.autobuffer",
  360. "recovery.discard",
  361. "project.save"
  362. ],
  363. "file": "evidence/scene-multi-session.json",
  364. "title": "双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿",
  365. "details": "",
  366. "screenshots": []
  367. }
  368. ]
  369. },
  370. {
  371. "id": "project.save-key",
  372. "group": "工程入口与顶部命令",
  373. "name": "Ctrl/Meta+S 保存快捷键",
  374. "source": {
  375. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  376. "symbol": "handleKeyboard(event)",
  377. "line": 469
  378. },
  379. "implementation": "已有实现已完成验证",
  380. "boundary": "键盘与按钮走相同保存/权限/忙碌守卫。",
  381. "acceptance": "实际按键触发一次保存;表单内与非表单焦点分别核查。",
  382. "fix": "尚未关联本轮修复记录",
  383. "fixIds": [],
  384. "verification": "PASS",
  385. "evidence": [
  386. {
  387. "status": "PASS",
  388. "testTitle": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突",
  389. "recordedAt": "2026-09-06T10:24:27.147Z",
  390. "kind": "browser",
  391. "ids": [
  392. "project.concurrent-save",
  393. "project.save",
  394. "project.save-key",
  395. "recovery.autobuffer",
  396. "recovery.same-version"
  397. ],
  398. "file": "evidence/save-concurrency.json",
  399. "title": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突",
  400. "details": "延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。",
  401. "screenshots": []
  402. },
  403. {
  404. "status": "PASS",
  405. "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  406. "recordedAt": "2026-09-06T10:30:32.596Z",
  407. "kind": "browser",
  408. "ids": [
  409. "project.save-key",
  410. "part.transform",
  411. "part.soft-delete",
  412. "history.undo",
  413. "history.redo",
  414. "property.name",
  415. "view.enclosure-full",
  416. "view.enclosure-xray",
  417. "view.enclosure-hidden"
  418. ],
  419. "file": "evidence/truck-part-history.json",
  420. "title": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  421. "details": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。",
  422. "screenshots": []
  423. }
  424. ]
  425. },
  426. {
  427. "id": "project.save-failure",
  428. "group": "工程入口与顶部命令",
  429. "name": "保存失败保留修改和恢复稿",
  430. "source": {
  431. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  432. "symbol": "async saveProject()",
  433. "line": 1874
  434. },
  435. "implementation": "已有实现已完成验证",
  436. "boundary": "网络失败或业务拒绝不能清 dirty;不弹虚假保存成功。",
  437. "acceptance": "定向 503 后对象/字段保留,恢复后重试与刷新成功。",
  438. "fix": "尚未关联本轮修复记录",
  439. "fixIds": [],
  440. "verification": "PASS",
  441. "evidence": [
  442. {
  443. "status": "PASS",
  444. "testTitle": "保存失败与封面降级:503 保留草稿,封面上传失败保留旧图,恢复后可重试",
  445. "recordedAt": "2026-09-06T10:26:33.388Z",
  446. "kind": "browser",
  447. "ids": [
  448. "project.save-failure",
  449. "cover.failure"
  450. ],
  451. "file": "evidence/save-cover-failure.json",
  452. "title": "保存失败与封面降级:503 保留草稿,封面上传失败保留旧图,恢复后可重试",
  453. "details": "正文PUT503不清草稿;封面上传503保留旧图但正文可保存;恢复服务后保存刷新。截图异常和409另由聚焦合同验证。",
  454. "screenshots": []
  455. }
  456. ]
  457. },
  458. {
  459. "id": "project.conflict",
  460. "group": "工程入口与顶部命令",
  461. "name": "409 乐观锁冲突保护",
  462. "source": {
  463. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  464. "symbol": "function describeSaveError",
  465. "line": 432
  466. },
  467. "implementation": "已有实现已完成验证",
  468. "boundary": "服务器最新版本不覆盖;恢复副本可下载/隔离。",
  469. "acceptance": "独立副本制造版本冲突;验证失败提示、旧版本不覆盖与本地稿保留。",
  470. "fix": "尚未关联本轮修复记录",
  471. "fixIds": [],
  472. "verification": "PASS",
  473. "evidence": [
  474. {
  475. "status": "PASS",
  476. "testTitle": "同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载",
  477. "recordedAt": "2026-09-06T10:26:49.585Z",
  478. "kind": "browser",
  479. "ids": [
  480. "project.conflict",
  481. "recovery.autobuffer",
  482. "recovery.same-version",
  483. "recovery.stale-version"
  484. ],
  485. "file": "evidence/real-recovery-conflict.json",
  486. "title": "同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载",
  487. "details": "真实未存输入产生恢复稿,同版本恢复不自动入库;另一版本先保存后409拒绝覆盖,旧稿隔离下载。",
  488. "screenshots": []
  489. },
  490. {
  491. "status": "PASS",
  492. "testTitle": "upload conflict propagates without any content PUT",
  493. "kind": "unit",
  494. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  495. "ids": [
  496. "project.conflict",
  497. "cover.failure"
  498. ],
  499. "file": "validation.json",
  500. "title": "upload conflict propagates without any content PUT",
  501. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  502. "screenshots": []
  503. }
  504. ]
  505. },
  506. {
  507. "id": "project.concurrent-save",
  508. "group": "工程入口与顶部命令",
  509. "name": "重复保存与保存中继续编辑",
  510. "source": {
  511. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  512. "symbol": "const saveRevision = this.changeRevision",
  513. "line": 1887
  514. },
  515. "implementation": "本轮修复已完成验证",
  516. "boundary": "提交快照与后续编辑分开;后续修改不能随早先请求完成清掉。",
  517. "acceptance": "延迟 PUT、连点保存并继续改值;一次旧提交、新修改仍 dirty。",
  518. "fix": "开始保存时取消之前安排的恢复稿定时器,避免它覆盖宿主保存快照 nonce;保存中的后续编辑仍单独保留。",
  519. "fixIds": [
  520. "SCENE-F08"
  521. ],
  522. "verification": "PASS",
  523. "evidence": [
  524. {
  525. "status": "PASS",
  526. "testTitle": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突",
  527. "recordedAt": "2026-09-06T10:24:27.147Z",
  528. "kind": "browser",
  529. "ids": [
  530. "project.concurrent-save",
  531. "project.save",
  532. "project.save-key",
  533. "recovery.autobuffer",
  534. "recovery.same-version"
  535. ],
  536. "file": "evidence/save-concurrency.json",
  537. "title": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突",
  538. "details": "延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。",
  539. "screenshots": []
  540. }
  541. ]
  542. },
  543. {
  544. "id": "json.export",
  545. "group": "工程文件与资源导入",
  546. "name": "导出当前场景 JSON",
  547. "source": {
  548. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  549. "symbol": "exportProject()",
  550. "line": 578
  551. },
  552. "implementation": "已有实现已完成验证",
  553. "boundary": "导出 edit3dv4.scene、对象/部件覆盖、渲染和稳定资源引用;不冒称自包含 GLB 包。",
  554. "acceptance": "打开下载 JSON 核对内容、结构和无临时 blob 依赖。",
  555. "fix": "尚未关联本轮修复记录",
  556. "fixIds": [],
  557. "verification": "PASS",
  558. "evidence": [
  559. {
  560. "status": "PASS",
  561. "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  562. "recordedAt": "2026-09-06T10:26:19.703Z",
  563. "kind": "browser",
  564. "ids": [
  565. "json.export",
  566. "json.import",
  567. "json.invalid",
  568. "json.missing-resource",
  569. "json.rendering",
  570. "glb.import",
  571. "glb.invalid",
  572. "glb.references",
  573. "validation.references"
  574. ],
  575. "file": "evidence/json-glb-roundtrip.json",
  576. "title": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  577. "details": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。",
  578. "screenshots": []
  579. },
  580. {
  581. "status": "PASS",
  582. "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  583. "recordedAt": "2026-09-06T10:31:05.221Z",
  584. "kind": "browser",
  585. "ids": [
  586. "permission.readonly",
  587. "permission.update",
  588. "permission.publish",
  589. "preview.enter",
  590. "preview.exit",
  591. "preview.lock",
  592. "json.export"
  593. ],
  594. "file": "evidence/readonly.json",
  595. "title": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  596. "details": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。",
  597. "screenshots": []
  598. }
  599. ]
  600. },
  601. {
  602. "id": "json.import",
  603. "group": "工程文件与资源导入",
  604. "name": "导入有效场景工程 JSON",
  605. "source": {
  606. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  607. "symbol": "importProject(event)",
  608. "line": 462
  609. },
  610. "implementation": "本轮修复已完成验证",
  611. "boundary": "替换当前编辑文档后仍需保存;不得写入另一个项目身份。",
  612. "acceptance": "导出后实际文件导入、保存、重开;对象与渲染参数往返一致。",
  613. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  614. "fixIds": [
  615. "SCENE-F03"
  616. ],
  617. "verification": "PASS",
  618. "evidence": [
  619. {
  620. "status": "PASS",
  621. "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  622. "recordedAt": "2026-09-06T10:26:19.703Z",
  623. "kind": "browser",
  624. "ids": [
  625. "json.export",
  626. "json.import",
  627. "json.invalid",
  628. "json.missing-resource",
  629. "json.rendering",
  630. "glb.import",
  631. "glb.invalid",
  632. "glb.references",
  633. "validation.references"
  634. ],
  635. "file": "evidence/json-glb-roundtrip.json",
  636. "title": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  637. "details": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。",
  638. "screenshots": []
  639. }
  640. ]
  641. },
  642. {
  643. "id": "json.invalid",
  644. "group": "工程文件与资源导入",
  645. "name": "非法 JSON / 错误 schema 拒绝",
  646. "source": {
  647. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  648. "symbol": "importProject(event)",
  649. "line": 462
  650. },
  651. "implementation": "本轮修复已完成验证",
  652. "boundary": "解析或结构错误不得清空当前场景。",
  653. "acceptance": "非法 JSON 与非场景文档各一次,原工程和模型仍可编辑。",
  654. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  655. "fixIds": [
  656. "SCENE-F03"
  657. ],
  658. "verification": "PASS",
  659. "evidence": [
  660. {
  661. "status": "PASS",
  662. "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  663. "recordedAt": "2026-09-06T10:26:19.703Z",
  664. "kind": "browser",
  665. "ids": [
  666. "json.export",
  667. "json.import",
  668. "json.invalid",
  669. "json.missing-resource",
  670. "json.rendering",
  671. "glb.import",
  672. "glb.invalid",
  673. "glb.references",
  674. "validation.references"
  675. ],
  676. "file": "evidence/json-glb-roundtrip.json",
  677. "title": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  678. "details": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。",
  679. "screenshots": []
  680. }
  681. ]
  682. },
  683. {
  684. "id": "json.missing-resource",
  685. "group": "工程文件与资源导入",
  686. "name": "JSON 缺失/错误受控引用拒绝与回滚",
  687. "source": {
  688. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  689. "symbol": "async restoreImportedObject",
  690. "line": 2016
  691. },
  692. "implementation": "本轮修复已完成验证",
  693. "boundary": "错误资产编码不能回退为另一个模型;恢复失败不半替换。",
  694. "acceptance": "导入显式不存在编码/版本;原对象保留或明确阻断,零错误发布。",
  695. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。;前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。",
  696. "fixIds": [
  697. "SCENE-F03",
  698. "SCENE-F12"
  699. ],
  700. "verification": "PASS",
  701. "evidence": [
  702. {
  703. "status": "PASS",
  704. "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  705. "recordedAt": "2026-09-06T10:26:19.703Z",
  706. "kind": "browser",
  707. "ids": [
  708. "json.export",
  709. "json.import",
  710. "json.invalid",
  711. "json.missing-resource",
  712. "json.rendering",
  713. "glb.import",
  714. "glb.invalid",
  715. "glb.references",
  716. "validation.references"
  717. ],
  718. "file": "evidence/json-glb-roundtrip.json",
  719. "title": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  720. "details": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。",
  721. "screenshots": []
  722. },
  723. {
  724. "status": "PASS",
  725. "testTitle": "a failed replacement GLB keeps the previous live scene rather than clearing an unsaved draft",
  726. "kind": "unit",
  727. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  728. "ids": [
  729. "json.missing-resource"
  730. ],
  731. "file": "validation.json",
  732. "title": "a failed replacement GLB keeps the previous live scene rather than clearing an unsaved draft",
  733. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  734. "screenshots": []
  735. },
  736. {
  737. "status": "PASS",
  738. "testTitle": "an explicit missing code cannot fall back to the first READY asset",
  739. "kind": "unit",
  740. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  741. "ids": [
  742. "validation.references",
  743. "json.missing-resource"
  744. ],
  745. "file": "validation.json",
  746. "title": "an explicit missing code cannot fall back to the first READY asset",
  747. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  748. "screenshots": []
  749. }
  750. ]
  751. },
  752. {
  753. "id": "json.rendering",
  754. "group": "工程文件与资源导入",
  755. "name": "相机、灯光、雾和环境序列化往返",
  756. "source": {
  757. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  758. "symbol": "serializeRendering()",
  759. "line": 857
  760. },
  761. "implementation": "本轮修复已完成验证",
  762. "boundary": "当前默认 UI 不提供全部渲染编辑器;导入/保存仍须保留其文档参数。",
  763. "acceptance": "合法带渲染参数文档导入、实际画面比对、保存重开字段一致。",
  764. "fix": "透视按钮实际恢复先前观察位置;导入、加载和历史恢复存在已保存相机时不再被车辆自动聚焦覆盖。",
  765. "fixIds": [
  766. "SCENE-F04"
  767. ],
  768. "verification": "PASS",
  769. "evidence": [
  770. {
  771. "status": "PASS",
  772. "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  773. "recordedAt": "2026-09-06T10:26:19.703Z",
  774. "kind": "browser",
  775. "ids": [
  776. "json.export",
  777. "json.import",
  778. "json.invalid",
  779. "json.missing-resource",
  780. "json.rendering",
  781. "glb.import",
  782. "glb.invalid",
  783. "glb.references",
  784. "validation.references"
  785. ],
  786. "file": "evidence/json-glb-roundtrip.json",
  787. "title": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  788. "details": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。",
  789. "screenshots": []
  790. },
  791. {
  792. "status": "PASS",
  793. "testTitle": "loading and history restoration preserve an authored camera rather than auto-focusing a vehicle",
  794. "kind": "unit",
  795. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  796. "ids": [
  797. "json.rendering",
  798. "history.undo"
  799. ],
  800. "file": "validation.json",
  801. "title": "loading and history restoration preserve an authored camera rather than auto-focusing a vehicle",
  802. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  803. "screenshots": []
  804. }
  805. ]
  806. },
  807. {
  808. "id": "glb.import",
  809. "group": "工程文件与资源导入",
  810. "name": "本地 GLB 上传并加入当前场景",
  811. "source": {
  812. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  813. "symbol": "async importGLB(event)",
  814. "line": 2122
  815. },
  816. "implementation": "本轮修复已完成验证",
  817. "boundary": "上传到内容服务,消费票据后解析;对象加入不等于工程已保存。",
  818. "acceptance": "真实选择小 GLB,上传/登记/可见/保存重开均完成。",
  819. "fix": "恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。",
  820. "fixIds": [
  821. "SCENE-F06"
  822. ],
  823. "verification": "PASS",
  824. "evidence": [
  825. {
  826. "status": "PASS",
  827. "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  828. "recordedAt": "2026-09-06T10:26:19.703Z",
  829. "kind": "browser",
  830. "ids": [
  831. "json.export",
  832. "json.import",
  833. "json.invalid",
  834. "json.missing-resource",
  835. "json.rendering",
  836. "glb.import",
  837. "glb.invalid",
  838. "glb.references",
  839. "validation.references"
  840. ],
  841. "file": "evidence/json-glb-roundtrip.json",
  842. "title": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  843. "details": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。",
  844. "screenshots": []
  845. }
  846. ]
  847. },
  848. {
  849. "id": "glb.invalid",
  850. "group": "工程文件与资源导入",
  851. "name": "非 GLB / 损坏 GLB / 上传失败处理",
  852. "source": {
  853. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  854. "symbol": "async importGLB(event)",
  855. "line": 2122
  856. },
  857. "implementation": "已有实现已完成验证",
  858. "boundary": "上传或解析失败不插入占位对象;原场景应保留,提示可重试。",
  859. "acceptance": "错误格式及损坏文件、上传 503;验证对象数/旧资产/后续成功导入。",
  860. "fix": "尚未关联本轮修复记录",
  861. "fixIds": [],
  862. "verification": "PASS",
  863. "evidence": [
  864. {
  865. "status": "PASS",
  866. "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  867. "recordedAt": "2026-09-06T10:26:19.703Z",
  868. "kind": "browser",
  869. "ids": [
  870. "json.export",
  871. "json.import",
  872. "json.invalid",
  873. "json.missing-resource",
  874. "json.rendering",
  875. "glb.import",
  876. "glb.invalid",
  877. "glb.references",
  878. "validation.references"
  879. ],
  880. "file": "evidence/json-glb-roundtrip.json",
  881. "title": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  882. "details": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。",
  883. "screenshots": []
  884. }
  885. ]
  886. },
  887. {
  888. "id": "glb.pending",
  889. "group": "工程文件与资源导入",
  890. "name": "资源加载/上传期间操作互斥",
  891. "source": {
  892. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  893. "symbol": "setModelLoading(loading",
  894. "line": 1411
  895. },
  896. "implementation": "已有实现已完成验证",
  897. "boundary": "加载中的模型不能被半保存、导出或发布;不能离开造成旧请求污染新项目。",
  898. "acceptance": "延迟下载/上传,操作禁用与待完成状态一致,完成后恢复。",
  899. "fix": "尚未关联本轮修复记录",
  900. "fixIds": [],
  901. "verification": "PASS",
  902. "evidence": [
  903. {
  904. "status": "PASS",
  905. "testTitle": "加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载",
  906. "recordedAt": "2026-09-06T10:24:14.518Z",
  907. "kind": "browser",
  908. "ids": [
  909. "project.retry",
  910. "glb.pending",
  911. "leave.busy"
  912. ],
  913. "file": "evidence/loading-retry.json",
  914. "title": "加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载",
  915. "details": "GET503只留中性失败和重试;延迟受控下载时禁用写入/导出/预览并阻止关闭,释放后真实狐狸加载。",
  916. "screenshots": []
  917. },
  918. {
  919. "status": "PASS",
  920. "testTitle": "replacement failure waits for other started loads before restoring the original scene",
  921. "kind": "unit",
  922. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  923. "ids": [
  924. "history.failure",
  925. "glb.pending"
  926. ],
  927. "file": "validation.json",
  928. "title": "replacement failure waits for other started loads before restoring the original scene",
  929. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  930. "screenshots": []
  931. },
  932. {
  933. "status": "PASS",
  934. "testTitle": "an upload finishing after a project switch cannot register into the new session",
  935. "kind": "unit",
  936. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  937. "ids": [
  938. "glb.pending",
  939. "lifecycle.destroy"
  940. ],
  941. "file": "validation.json",
  942. "title": "an upload finishing after a project switch cannot register into the new session",
  943. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  944. "screenshots": []
  945. }
  946. ]
  947. },
  948. {
  949. "id": "glb.references",
  950. "group": "工程文件与资源导入",
  951. "name": "本项目 GLB 稳定资产引用",
  952. "source": {
  953. "file": "../../../unreal_tran_web/src/features/scene-legacy/serverAssetStore.ts",
  954. "symbol": "async put(blob",
  955. "line": 113
  956. },
  957. "implementation": "本轮修复已完成验证",
  958. "boundary": "自导入使用 content://asset/scene/{projectId}/{assetCode} 和 READY 资产;blob 只供运行。",
  959. "acceptance": "重新会话受控下载成功,主对象/资产身份一致,无本地缓存依赖。",
  960. "fix": "前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。;新增 SceneResourceReferenceValidator 检查 objects 和递归 splitParts;自有/固定版本资源的所有显式引用必须指向同一 READY 模型文件,错误引用在发布/提交前阻断,保留受控的内置资源和旧引用兼容。",
  961. "fixIds": [
  962. "SCENE-F12",
  963. "SCENE-F13"
  964. ],
  965. "verification": "PASS",
  966. "evidence": [
  967. {
  968. "status": "PASS",
  969. "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  970. "recordedAt": "2026-09-06T10:26:19.703Z",
  971. "kind": "browser",
  972. "ids": [
  973. "json.export",
  974. "json.import",
  975. "json.invalid",
  976. "json.missing-resource",
  977. "json.rendering",
  978. "glb.import",
  979. "glb.invalid",
  980. "glb.references",
  981. "validation.references"
  982. ],
  983. "file": "evidence/json-glb-roundtrip.json",
  984. "title": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  985. "details": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。",
  986. "screenshots": []
  987. },
  988. {
  989. "status": "PASS",
  990. "testTitle": "copied scene keeps its original pseudo URI but reads its own copied asset by stable code",
  991. "kind": "unit",
  992. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  993. "ids": [
  994. "glb.references"
  995. ],
  996. "file": "validation.json",
  997. "title": "copied scene keeps its original pseudo URI but reads its own copied asset by stable code",
  998. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  999. "screenshots": []
  1000. }
  1001. ]
  1002. },
  1003. {
  1004. "id": "panel.left-tabs",
  1005. "group": "左侧目录与资源放置",
  1006. "name": "场景大纲 / 资源库 / 场景模板切换",
  1007. "source": {
  1008. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1009. "symbol": "const leftTab =",
  1010. "line": 540
  1011. },
  1012. "implementation": "已有实现已完成验证",
  1013. "boundary": "切面板不写业务文档;筛选状态行为需一致。",
  1014. "acceptance": "三页签均可达,无 DOM 异常或资源目录中断。",
  1015. "fix": "尚未关联本轮修复记录",
  1016. "fixIds": [],
  1017. "verification": "PASS",
  1018. "evidence": [
  1019. {
  1020. "status": "PASS",
  1021. "testTitle": "模板搜索与未保存切换确认保留和放弃",
  1022. "recordedAt": "2026-09-06T10:28:42.077Z",
  1023. "kind": "e2e",
  1024. "ids": [
  1025. "panel.left-tabs",
  1026. "search.templates",
  1027. "template.switch-cancel"
  1028. ],
  1029. "file": "evidence/template-confirm.json",
  1030. "title": "模板搜索与未保存切换确认保留和放弃",
  1031. "details": "中文/无匹配/清空搜索;真实取消保留对象,真实确认放弃并切换空白模板后保存。",
  1032. "screenshots": [
  1033. "29-template-confirm-empty.png"
  1034. ]
  1035. }
  1036. ]
  1037. },
  1038. {
  1039. "id": "search.tree",
  1040. "group": "左侧目录与资源放置",
  1041. "name": "对象/部件名称搜索与清空",
  1042. "source": {
  1043. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1044. "symbol": "renderTree()",
  1045. "line": 627
  1046. },
  1047. "implementation": "已有实现已完成验证",
  1048. "boundary": "根名与部件名可命中;无匹配状态应清楚,非删除对象。",
  1049. "acceptance": "根名/部件名/无结果/清空分别核对行和真实对象数。",
  1050. "fix": "尚未关联本轮修复记录",
  1051. "fixIds": [],
  1052. "verification": "PASS",
  1053. "evidence": [
  1054. {
  1055. "status": "PASS",
  1056. "testTitle": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开",
  1057. "recordedAt": "2026-09-06T10:29:25.167Z",
  1058. "kind": "e2e",
  1059. "ids": [
  1060. "assets.catalog",
  1061. "assets.model-double-click",
  1062. "assets.model-drop",
  1063. "search.tree",
  1064. "part.source",
  1065. "property.visible"
  1066. ],
  1067. "file": "evidence/published-model-assets.json",
  1068. "title": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开",
  1069. "details": "API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。",
  1070. "screenshots": [
  1071. "33-fox-placed-visible.png",
  1072. "34-truck-placed-part-restored.png"
  1073. ]
  1074. }
  1075. ]
  1076. },
  1077. {
  1078. "id": "search.assets",
  1079. "group": "左侧目录与资源放置",
  1080. "name": "资源搜索与异步刷新保留筛选",
  1081. "source": {
  1082. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1083. "symbol": "applyLeftFilter()",
  1084. "line": 742
  1085. },
  1086. "implementation": "已有实现已完成验证",
  1087. "boundary": "只筛当前目录;异步重绘不复活不匹配卡片。",
  1088. "acceptance": "命中、无结果、清空,目录重绘后过滤仍正确。",
  1089. "fix": "尚未关联本轮修复记录",
  1090. "fixIds": [],
  1091. "verification": "PASS",
  1092. "evidence": [
  1093. {
  1094. "status": "PASS",
  1095. "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1096. "recordedAt": "2026-09-06T10:28:51.941Z",
  1097. "kind": "e2e",
  1098. "ids": [
  1099. "asset.diagnostic",
  1100. "asset.equipment",
  1101. "asset.workbench",
  1102. "asset.shelf",
  1103. "asset.safety-zone",
  1104. "asset.camera",
  1105. "asset.worker",
  1106. "asset.light",
  1107. "assets.basic-double-click",
  1108. "assets.basic-drop",
  1109. "search.assets",
  1110. "panel.objects"
  1111. ],
  1112. "file": "evidence/basic-assets.json",
  1113. "title": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1114. "details": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。",
  1115. "screenshots": [
  1116. "30-eight-basic-assets-reopened.png"
  1117. ]
  1118. }
  1119. ]
  1120. },
  1121. {
  1122. "id": "search.templates",
  1123. "group": "左侧目录与资源放置",
  1124. "name": "模板搜索与清空",
  1125. "source": {
  1126. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1127. "symbol": "filterLeft(query)",
  1128. "line": 2278
  1129. },
  1130. "implementation": "已有实现已完成验证",
  1131. "boundary": "模板卡片与同一搜索框联动。",
  1132. "acceptance": "中文模板关键字过滤、无结果和清空。",
  1133. "fix": "尚未关联本轮修复记录",
  1134. "fixIds": [],
  1135. "verification": "PASS",
  1136. "evidence": [
  1137. {
  1138. "status": "PASS",
  1139. "testTitle": "模板搜索与未保存切换确认保留和放弃",
  1140. "recordedAt": "2026-09-06T10:28:42.077Z",
  1141. "kind": "e2e",
  1142. "ids": [
  1143. "panel.left-tabs",
  1144. "search.templates",
  1145. "template.switch-cancel"
  1146. ],
  1147. "file": "evidence/template-confirm.json",
  1148. "title": "模板搜索与未保存切换确认保留和放弃",
  1149. "details": "中文/无匹配/清空搜索;真实取消保留对象,真实确认放弃并切换空白模板后保存。",
  1150. "screenshots": [
  1151. "29-template-confirm-empty.png"
  1152. ]
  1153. }
  1154. ]
  1155. },
  1156. {
  1157. "id": "assets.catalog",
  1158. "group": "左侧目录与资源放置",
  1159. "name": "真实已发布模型成果目录",
  1160. "source": {
  1161. "file": "../../../unreal_tran_web/src/features/scene-legacy/contentApiClient.ts",
  1162. "symbol": "async listPublishedModels",
  1163. "line": 783
  1164. },
  1165. "implementation": "本轮修复已完成验证",
  1166. "boundary": "目录由 API 预加载,当前默认不以 localStorage 发布清单为真值。",
  1167. "acceptance": "显示发布模型名称/版本,草稿不冒充已发布,空态可操作。",
  1168. "fix": "移除 runtime 旧 content.update 门槛,独立计算新建、更新和发布;无模型页面权限时不加载新模型目录,但既有固定依赖仍可按场景授权读取。",
  1169. "fixIds": [
  1170. "SCENE-F01"
  1171. ],
  1172. "verification": "PASS",
  1173. "evidence": [
  1174. {
  1175. "status": "PASS",
  1176. "testTitle": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开",
  1177. "recordedAt": "2026-09-06T10:29:25.167Z",
  1178. "kind": "e2e",
  1179. "ids": [
  1180. "assets.catalog",
  1181. "assets.model-double-click",
  1182. "assets.model-drop",
  1183. "search.tree",
  1184. "part.source",
  1185. "property.visible"
  1186. ],
  1187. "file": "evidence/published-model-assets.json",
  1188. "title": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开",
  1189. "details": "API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。",
  1190. "screenshots": [
  1191. "33-fox-placed-visible.png",
  1192. "34-truck-placed-part-restored.png"
  1193. ]
  1194. }
  1195. ]
  1196. },
  1197. {
  1198. "id": "assets.model-double-click",
  1199. "group": "左侧目录与资源放置",
  1200. "name": "双击已发布模型放置",
  1201. "source": {
  1202. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1203. "symbol": "async placeEditorAsset",
  1204. "line": 1357
  1205. },
  1206. "implementation": "已有实现已完成验证",
  1207. "boundary": "按固定 project/version/assetCode 导入当前实例,继承发布部件和材质。",
  1208. "acceptance": "狐狸和卡车分别双击加入、真实可见、保存重开固定版本。",
  1209. "fix": "尚未关联本轮修复记录",
  1210. "fixIds": [],
  1211. "verification": "PASS",
  1212. "evidence": [
  1213. {
  1214. "status": "PASS",
  1215. "testTitle": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开",
  1216. "recordedAt": "2026-09-06T10:29:25.167Z",
  1217. "kind": "e2e",
  1218. "ids": [
  1219. "assets.catalog",
  1220. "assets.model-double-click",
  1221. "assets.model-drop",
  1222. "search.tree",
  1223. "part.source",
  1224. "property.visible"
  1225. ],
  1226. "file": "evidence/published-model-assets.json",
  1227. "title": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开",
  1228. "details": "API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。",
  1229. "screenshots": [
  1230. "33-fox-placed-visible.png",
  1231. "34-truck-placed-part-restored.png"
  1232. ]
  1233. },
  1234. {
  1235. "status": "PASS",
  1236. "testTitle": "fresh skinned placement reaches the requested size and floor after authored scale/pose replay",
  1237. "kind": "unit",
  1238. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  1239. "ids": [
  1240. "assets.model-double-click",
  1241. "assets.model-drop"
  1242. ],
  1243. "file": "validation.json",
  1244. "title": "fresh skinned placement reaches the requested size and floor after authored scale/pose replay",
  1245. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  1246. "screenshots": []
  1247. }
  1248. ]
  1249. },
  1250. {
  1251. "id": "assets.model-drop",
  1252. "group": "左侧目录与资源放置",
  1253. "name": "拖入已发布模型放置",
  1254. "source": {
  1255. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1256. "symbol": "handleDrop(event)",
  1257. "line": 461
  1258. },
  1259. "implementation": "已有实现已完成验证",
  1260. "boundary": "拖放实际命中地平面;与双击共用受控资产链路。",
  1261. "acceptance": "真实指针拖放到不同位置,坐标/实例数/固定引用准确。",
  1262. "fix": "尚未关联本轮修复记录",
  1263. "fixIds": [],
  1264. "verification": "PASS",
  1265. "evidence": [
  1266. {
  1267. "status": "PASS",
  1268. "testTitle": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开",
  1269. "recordedAt": "2026-09-06T10:29:25.167Z",
  1270. "kind": "e2e",
  1271. "ids": [
  1272. "assets.catalog",
  1273. "assets.model-double-click",
  1274. "assets.model-drop",
  1275. "search.tree",
  1276. "part.source",
  1277. "property.visible"
  1278. ],
  1279. "file": "evidence/published-model-assets.json",
  1280. "title": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开",
  1281. "details": "API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。",
  1282. "screenshots": [
  1283. "33-fox-placed-visible.png",
  1284. "34-truck-placed-part-restored.png"
  1285. ]
  1286. },
  1287. {
  1288. "status": "PASS",
  1289. "testTitle": "fresh skinned placement reaches the requested size and floor after authored scale/pose replay",
  1290. "kind": "unit",
  1291. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  1292. "ids": [
  1293. "assets.model-double-click",
  1294. "assets.model-drop"
  1295. ],
  1296. "file": "validation.json",
  1297. "title": "fresh skinned placement reaches the requested size and floor after authored scale/pose replay",
  1298. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  1299. "screenshots": []
  1300. }
  1301. ]
  1302. },
  1303. {
  1304. "id": "assets.basic-double-click",
  1305. "group": "左侧目录与资源放置",
  1306. "name": "双击基础资源放置",
  1307. "source": {
  1308. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1309. "symbol": "onRootDblClick",
  1310. "line": 429
  1311. },
  1312. "implementation": "本轮修复已完成验证",
  1313. "boundary": "以当前轨道目标落地;每次生成独立对象身份。",
  1314. "acceptance": "双击生成对象,变换、保存后仍可见。",
  1315. "fix": "恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。",
  1316. "fixIds": [
  1317. "SCENE-F06"
  1318. ],
  1319. "verification": "PASS",
  1320. "evidence": [
  1321. {
  1322. "status": "PASS",
  1323. "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1324. "recordedAt": "2026-09-06T10:28:51.941Z",
  1325. "kind": "e2e",
  1326. "ids": [
  1327. "asset.diagnostic",
  1328. "asset.equipment",
  1329. "asset.workbench",
  1330. "asset.shelf",
  1331. "asset.safety-zone",
  1332. "asset.camera",
  1333. "asset.worker",
  1334. "asset.light",
  1335. "assets.basic-double-click",
  1336. "assets.basic-drop",
  1337. "search.assets",
  1338. "panel.objects"
  1339. ],
  1340. "file": "evidence/basic-assets.json",
  1341. "title": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1342. "details": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。",
  1343. "screenshots": [
  1344. "30-eight-basic-assets-reopened.png"
  1345. ]
  1346. }
  1347. ]
  1348. },
  1349. {
  1350. "id": "assets.basic-drop",
  1351. "group": "左侧目录与资源放置",
  1352. "name": "基础资源拖入与拖放提示",
  1353. "source": {
  1354. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1355. "symbol": "handleDrop(event)",
  1356. "line": 461
  1357. },
  1358. "implementation": "已有实现已完成验证",
  1359. "boundary": "MIME 和 text/plain 回退协议一致;离开视口清提示。",
  1360. "acceptance": "真实拖放命中位置与 0.5m 吸附、dragleave/drop 提示复位。",
  1361. "fix": "尚未关联本轮修复记录",
  1362. "fixIds": [],
  1363. "verification": "PASS",
  1364. "evidence": [
  1365. {
  1366. "status": "PASS",
  1367. "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1368. "recordedAt": "2026-09-06T10:28:51.941Z",
  1369. "kind": "e2e",
  1370. "ids": [
  1371. "asset.diagnostic",
  1372. "asset.equipment",
  1373. "asset.workbench",
  1374. "asset.shelf",
  1375. "asset.safety-zone",
  1376. "asset.camera",
  1377. "asset.worker",
  1378. "asset.light",
  1379. "assets.basic-double-click",
  1380. "assets.basic-drop",
  1381. "search.assets",
  1382. "panel.objects"
  1383. ],
  1384. "file": "evidence/basic-assets.json",
  1385. "title": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1386. "details": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。",
  1387. "screenshots": [
  1388. "30-eight-basic-assets-reopened.png"
  1389. ]
  1390. }
  1391. ]
  1392. },
  1393. {
  1394. "id": "assets.model-link",
  1395. "group": "左侧目录与资源放置",
  1396. "name": "打开/返回模型编辑器入口",
  1397. "source": {
  1398. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1399. "symbol": "open-model-editor",
  1400. "line": 590
  1401. },
  1402. "implementation": "本轮修复已完成验证",
  1403. "boundary": "当前基线只有跳模型列表,来源按钮不得冒称直达正确源项目。",
  1404. "acceptance": "空资源库和选中模型来源两入口,跳转/未保存保护正确。",
  1405. "fix": "模型来源按钮有来源权限时导航正确项目;无来源页面权限回到可访问列表,不将模型列表误称为来源工程编辑。",
  1406. "fixIds": [
  1407. "SCENE-F11"
  1408. ],
  1409. "verification": "PASS",
  1410. "evidence": [
  1411. {
  1412. "status": "PASS",
  1413. "testTitle": "model source navigation locates the published owner and falls back without source permission",
  1414. "kind": "unit",
  1415. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  1416. "ids": [
  1417. "assets.model-link"
  1418. ],
  1419. "file": "validation.json",
  1420. "title": "model source navigation locates the published owner and falls back without source permission",
  1421. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  1422. "screenshots": []
  1423. }
  1424. ]
  1425. },
  1426. {
  1427. "id": "asset.diagnostic",
  1428. "group": "左侧目录与资源放置",
  1429. "name": "基础资源:液压诊断工位",
  1430. "source": {
  1431. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1432. "symbol": "id: 'diagnostic'",
  1433. "line": 123
  1434. },
  1435. "implementation": "已有实现已完成验证",
  1436. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  1437. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  1438. "fix": "尚未关联本轮修复记录",
  1439. "fixIds": [],
  1440. "verification": "PASS",
  1441. "evidence": [
  1442. {
  1443. "status": "PASS",
  1444. "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1445. "recordedAt": "2026-09-06T10:28:51.941Z",
  1446. "kind": "e2e",
  1447. "ids": [
  1448. "asset.diagnostic",
  1449. "asset.equipment",
  1450. "asset.workbench",
  1451. "asset.shelf",
  1452. "asset.safety-zone",
  1453. "asset.camera",
  1454. "asset.worker",
  1455. "asset.light",
  1456. "assets.basic-double-click",
  1457. "assets.basic-drop",
  1458. "search.assets",
  1459. "panel.objects"
  1460. ],
  1461. "file": "evidence/basic-assets.json",
  1462. "title": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1463. "details": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。",
  1464. "screenshots": [
  1465. "30-eight-basic-assets-reopened.png"
  1466. ]
  1467. }
  1468. ]
  1469. },
  1470. {
  1471. "id": "asset.equipment",
  1472. "group": "左侧目录与资源放置",
  1473. "name": "基础资源:维修装备主体",
  1474. "source": {
  1475. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1476. "symbol": "id: 'equipment'",
  1477. "line": 124
  1478. },
  1479. "implementation": "已有实现已完成验证",
  1480. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  1481. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  1482. "fix": "尚未关联本轮修复记录",
  1483. "fixIds": [],
  1484. "verification": "PASS",
  1485. "evidence": [
  1486. {
  1487. "status": "PASS",
  1488. "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1489. "recordedAt": "2026-09-06T10:28:51.941Z",
  1490. "kind": "e2e",
  1491. "ids": [
  1492. "asset.diagnostic",
  1493. "asset.equipment",
  1494. "asset.workbench",
  1495. "asset.shelf",
  1496. "asset.safety-zone",
  1497. "asset.camera",
  1498. "asset.worker",
  1499. "asset.light",
  1500. "assets.basic-double-click",
  1501. "assets.basic-drop",
  1502. "search.assets",
  1503. "panel.objects"
  1504. ],
  1505. "file": "evidence/basic-assets.json",
  1506. "title": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1507. "details": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。",
  1508. "screenshots": [
  1509. "30-eight-basic-assets-reopened.png"
  1510. ]
  1511. }
  1512. ]
  1513. },
  1514. {
  1515. "id": "asset.workbench",
  1516. "group": "左侧目录与资源放置",
  1517. "name": "基础资源:检修工作台",
  1518. "source": {
  1519. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1520. "symbol": "id: 'workbench'",
  1521. "line": 125
  1522. },
  1523. "implementation": "已有实现已完成验证",
  1524. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  1525. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  1526. "fix": "尚未关联本轮修复记录",
  1527. "fixIds": [],
  1528. "verification": "PASS",
  1529. "evidence": [
  1530. {
  1531. "status": "PASS",
  1532. "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1533. "recordedAt": "2026-09-06T10:28:51.941Z",
  1534. "kind": "e2e",
  1535. "ids": [
  1536. "asset.diagnostic",
  1537. "asset.equipment",
  1538. "asset.workbench",
  1539. "asset.shelf",
  1540. "asset.safety-zone",
  1541. "asset.camera",
  1542. "asset.worker",
  1543. "asset.light",
  1544. "assets.basic-double-click",
  1545. "assets.basic-drop",
  1546. "search.assets",
  1547. "panel.objects"
  1548. ],
  1549. "file": "evidence/basic-assets.json",
  1550. "title": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1551. "details": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。",
  1552. "screenshots": [
  1553. "30-eight-basic-assets-reopened.png"
  1554. ]
  1555. }
  1556. ]
  1557. },
  1558. {
  1559. "id": "asset.shelf",
  1560. "group": "左侧目录与资源放置",
  1561. "name": "基础资源:器材存放架",
  1562. "source": {
  1563. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1564. "symbol": "id: 'shelf'",
  1565. "line": 126
  1566. },
  1567. "implementation": "已有实现已完成验证",
  1568. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  1569. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  1570. "fix": "尚未关联本轮修复记录",
  1571. "fixIds": [],
  1572. "verification": "PASS",
  1573. "evidence": [
  1574. {
  1575. "status": "PASS",
  1576. "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1577. "recordedAt": "2026-09-06T10:28:51.941Z",
  1578. "kind": "e2e",
  1579. "ids": [
  1580. "asset.diagnostic",
  1581. "asset.equipment",
  1582. "asset.workbench",
  1583. "asset.shelf",
  1584. "asset.safety-zone",
  1585. "asset.camera",
  1586. "asset.worker",
  1587. "asset.light",
  1588. "assets.basic-double-click",
  1589. "assets.basic-drop",
  1590. "search.assets",
  1591. "panel.objects"
  1592. ],
  1593. "file": "evidence/basic-assets.json",
  1594. "title": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1595. "details": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。",
  1596. "screenshots": [
  1597. "30-eight-basic-assets-reopened.png"
  1598. ]
  1599. }
  1600. ]
  1601. },
  1602. {
  1603. "id": "asset.safety-zone",
  1604. "group": "左侧目录与资源放置",
  1605. "name": "基础资源:安全作业区域",
  1606. "source": {
  1607. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1608. "symbol": "id: 'safety-zone'",
  1609. "line": 127
  1610. },
  1611. "implementation": "已有实现已完成验证",
  1612. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  1613. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  1614. "fix": "尚未关联本轮修复记录",
  1615. "fixIds": [],
  1616. "verification": "PASS",
  1617. "evidence": [
  1618. {
  1619. "status": "PASS",
  1620. "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1621. "recordedAt": "2026-09-06T10:28:51.941Z",
  1622. "kind": "e2e",
  1623. "ids": [
  1624. "asset.diagnostic",
  1625. "asset.equipment",
  1626. "asset.workbench",
  1627. "asset.shelf",
  1628. "asset.safety-zone",
  1629. "asset.camera",
  1630. "asset.worker",
  1631. "asset.light",
  1632. "assets.basic-double-click",
  1633. "assets.basic-drop",
  1634. "search.assets",
  1635. "panel.objects"
  1636. ],
  1637. "file": "evidence/basic-assets.json",
  1638. "title": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1639. "details": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。",
  1640. "screenshots": [
  1641. "30-eight-basic-assets-reopened.png"
  1642. ]
  1643. }
  1644. ]
  1645. },
  1646. {
  1647. "id": "asset.camera",
  1648. "group": "左侧目录与资源放置",
  1649. "name": "基础资源:视觉采集设备",
  1650. "source": {
  1651. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1652. "symbol": "id: 'camera'",
  1653. "line": 128
  1654. },
  1655. "implementation": "已有实现已完成验证",
  1656. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  1657. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  1658. "fix": "尚未关联本轮修复记录",
  1659. "fixIds": [],
  1660. "verification": "PASS",
  1661. "evidence": [
  1662. {
  1663. "status": "PASS",
  1664. "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1665. "recordedAt": "2026-09-06T10:28:51.941Z",
  1666. "kind": "e2e",
  1667. "ids": [
  1668. "asset.diagnostic",
  1669. "asset.equipment",
  1670. "asset.workbench",
  1671. "asset.shelf",
  1672. "asset.safety-zone",
  1673. "asset.camera",
  1674. "asset.worker",
  1675. "asset.light",
  1676. "assets.basic-double-click",
  1677. "assets.basic-drop",
  1678. "search.assets",
  1679. "panel.objects"
  1680. ],
  1681. "file": "evidence/basic-assets.json",
  1682. "title": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1683. "details": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。",
  1684. "screenshots": [
  1685. "30-eight-basic-assets-reopened.png"
  1686. ]
  1687. }
  1688. ]
  1689. },
  1690. {
  1691. "id": "asset.worker",
  1692. "group": "左侧目录与资源放置",
  1693. "name": "基础资源:训练人员占位",
  1694. "source": {
  1695. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1696. "symbol": "id: 'worker'",
  1697. "line": 129
  1698. },
  1699. "implementation": "已有实现已完成验证",
  1700. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  1701. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  1702. "fix": "尚未关联本轮修复记录",
  1703. "fixIds": [],
  1704. "verification": "PASS",
  1705. "evidence": [
  1706. {
  1707. "status": "PASS",
  1708. "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1709. "recordedAt": "2026-09-06T10:28:51.941Z",
  1710. "kind": "e2e",
  1711. "ids": [
  1712. "asset.diagnostic",
  1713. "asset.equipment",
  1714. "asset.workbench",
  1715. "asset.shelf",
  1716. "asset.safety-zone",
  1717. "asset.camera",
  1718. "asset.worker",
  1719. "asset.light",
  1720. "assets.basic-double-click",
  1721. "assets.basic-drop",
  1722. "search.assets",
  1723. "panel.objects"
  1724. ],
  1725. "file": "evidence/basic-assets.json",
  1726. "title": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1727. "details": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。",
  1728. "screenshots": [
  1729. "30-eight-basic-assets-reopened.png"
  1730. ]
  1731. }
  1732. ]
  1733. },
  1734. {
  1735. "id": "asset.light",
  1736. "group": "左侧目录与资源放置",
  1737. "name": "基础资源:区域照明",
  1738. "source": {
  1739. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1740. "symbol": "id: 'light'",
  1741. "line": 130
  1742. },
  1743. "implementation": "已有实现已完成验证",
  1744. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  1745. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  1746. "fix": "尚未关联本轮修复记录",
  1747. "fixIds": [],
  1748. "verification": "PASS",
  1749. "evidence": [
  1750. {
  1751. "status": "PASS",
  1752. "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1753. "recordedAt": "2026-09-06T10:28:51.941Z",
  1754. "kind": "e2e",
  1755. "ids": [
  1756. "asset.diagnostic",
  1757. "asset.equipment",
  1758. "asset.workbench",
  1759. "asset.shelf",
  1760. "asset.safety-zone",
  1761. "asset.camera",
  1762. "asset.worker",
  1763. "asset.light",
  1764. "assets.basic-double-click",
  1765. "assets.basic-drop",
  1766. "search.assets",
  1767. "panel.objects"
  1768. ],
  1769. "file": "evidence/basic-assets.json",
  1770. "title": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  1771. "details": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。",
  1772. "screenshots": [
  1773. "30-eight-basic-assets-reopened.png"
  1774. ]
  1775. }
  1776. ]
  1777. },
  1778. {
  1779. "id": "asset.vehicle-depot",
  1780. "group": "左侧目录与资源放置",
  1781. "name": "场地资源:真实装备车库",
  1782. "source": {
  1783. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1784. "symbol": "id: 'vehicle-depot'",
  1785. "line": 121
  1786. },
  1787. "implementation": "已有实现已完成验证",
  1788. "boundary": "整体场地 GLB 与维修车间分开;重复放置按既有规则处理。",
  1789. "acceptance": "资源拖放或双击加载、比例/落地正常、重复放置不产生错误重叠。",
  1790. "fix": "尚未关联本轮修复记录",
  1791. "fixIds": [],
  1792. "verification": "PASS",
  1793. "evidence": [
  1794. {
  1795. "status": "PASS",
  1796. "testTitle": "两种整体场地加载、重复放置阻止与显式删除后替换",
  1797. "recordedAt": "2026-09-06T10:29:06.315Z",
  1798. "kind": "e2e",
  1799. "ids": [
  1800. "asset.vehicle-depot",
  1801. "asset.field-terrain",
  1802. "object.delete"
  1803. ],
  1804. "file": "evidence/venue-assets.json",
  1805. "title": "两种整体场地加载、重复放置阻止与显式删除后替换",
  1806. "details": "车库和起伏地形真实加载并分别保存重开;已有整体场地时阻止叠加,显式删除旧场地后才能替换。",
  1807. "screenshots": [
  1808. "31-venue-depot-reopened.png",
  1809. "32-venue-terrain-reopened.png"
  1810. ]
  1811. }
  1812. ]
  1813. },
  1814. {
  1815. "id": "asset.field-terrain",
  1816. "group": "左侧目录与资源放置",
  1817. "name": "场地资源:真实野外地形",
  1818. "source": {
  1819. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1820. "symbol": "id: 'field-terrain'",
  1821. "line": 122
  1822. },
  1823. "implementation": "已有实现已完成验证",
  1824. "boundary": "真实地形资源和指定落地基准;不能以程序地板代替。",
  1825. "acceptance": "加载后真实起伏地形可见,保存重开资源、地面高度一致。",
  1826. "fix": "尚未关联本轮修复记录",
  1827. "fixIds": [],
  1828. "verification": "PASS",
  1829. "evidence": [
  1830. {
  1831. "status": "PASS",
  1832. "testTitle": "两种整体场地加载、重复放置阻止与显式删除后替换",
  1833. "recordedAt": "2026-09-06T10:29:06.315Z",
  1834. "kind": "e2e",
  1835. "ids": [
  1836. "asset.vehicle-depot",
  1837. "asset.field-terrain",
  1838. "object.delete"
  1839. ],
  1840. "file": "evidence/venue-assets.json",
  1841. "title": "两种整体场地加载、重复放置阻止与显式删除后替换",
  1842. "details": "车库和起伏地形真实加载并分别保存重开;已有整体场地时阻止叠加,显式删除旧场地后才能替换。",
  1843. "screenshots": [
  1844. "31-venue-depot-reopened.png",
  1845. "32-venue-terrain-reopened.png"
  1846. ]
  1847. }
  1848. ]
  1849. },
  1850. {
  1851. "id": "template.depot-1",
  1852. "group": "全部可达场景模板",
  1853. "name": "真实装备车库",
  1854. "source": {
  1855. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1856. "symbol": "id: 'depot-1'",
  1857. "line": 86
  1858. },
  1859. "implementation": "本轮修复已完成验证",
  1860. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  1861. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  1862. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  1863. "fixIds": [
  1864. "SCENE-F03"
  1865. ],
  1866. "verification": "PASS",
  1867. "evidence": [
  1868. {
  1869. "status": "PASS",
  1870. "testTitle": "场景模板实际加载、保存重开:真实装备车库",
  1871. "recordedAt": "2026-09-06T10:27:14.151Z",
  1872. "kind": "e2e",
  1873. "ids": [
  1874. "template.depot-1"
  1875. ],
  1876. "file": "evidence/template-depot-1.json",
  1877. "title": "场景模板实际加载、保存重开:真实装备车库",
  1878. "details": "真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。",
  1879. "screenshots": [
  1880. "20-template-depot-1.png"
  1881. ]
  1882. }
  1883. ]
  1884. },
  1885. {
  1886. "id": "template.terrain-1",
  1887. "group": "全部可达场景模板",
  1888. "name": "真实野外训练场",
  1889. "source": {
  1890. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1891. "symbol": "id: 'terrain-1'",
  1892. "line": 87
  1893. },
  1894. "implementation": "本轮修复已完成验证",
  1895. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  1896. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  1897. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  1898. "fixIds": [
  1899. "SCENE-F03"
  1900. ],
  1901. "verification": "PASS",
  1902. "evidence": [
  1903. {
  1904. "status": "PASS",
  1905. "testTitle": "场景模板实际加载、保存重开:真实野外训练场",
  1906. "recordedAt": "2026-09-06T10:27:24.419Z",
  1907. "kind": "e2e",
  1908. "ids": [
  1909. "template.terrain-1"
  1910. ],
  1911. "file": "evidence/template-terrain-1.json",
  1912. "title": "场景模板实际加载、保存重开:真实野外训练场",
  1913. "details": "真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。",
  1914. "screenshots": [
  1915. "21-template-terrain-1.png"
  1916. ]
  1917. }
  1918. ]
  1919. },
  1920. {
  1921. "id": "template.workshop-1",
  1922. "group": "全部可达场景模板",
  1923. "name": "综合检验车间",
  1924. "source": {
  1925. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1926. "symbol": "id: 'workshop-1'",
  1927. "line": 88
  1928. },
  1929. "implementation": "本轮修复已完成验证",
  1930. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  1931. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  1932. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  1933. "fixIds": [
  1934. "SCENE-F03"
  1935. ],
  1936. "verification": "PASS",
  1937. "evidence": [
  1938. {
  1939. "status": "PASS",
  1940. "testTitle": "场景模板实际加载、保存重开:综合检验车间",
  1941. "recordedAt": "2026-09-06T10:27:33.434Z",
  1942. "kind": "e2e",
  1943. "ids": [
  1944. "template.workshop-1"
  1945. ],
  1946. "file": "evidence/template-workshop-1.json",
  1947. "title": "场景模板实际加载、保存重开:综合检验车间",
  1948. "details": "真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。",
  1949. "screenshots": [
  1950. "22-template-workshop-1.png"
  1951. ]
  1952. }
  1953. ]
  1954. },
  1955. {
  1956. "id": "template.workshop-real",
  1957. "group": "全部可达场景模板",
  1958. "name": "演示维修车间(可拆分)",
  1959. "source": {
  1960. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1961. "symbol": "id: 'workshop-real'",
  1962. "line": 89
  1963. },
  1964. "implementation": "本轮修复已完成验证",
  1965. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  1966. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  1967. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  1968. "fixIds": [
  1969. "SCENE-F03"
  1970. ],
  1971. "verification": "PASS",
  1972. "evidence": [
  1973. {
  1974. "status": "PASS",
  1975. "testTitle": "场景模板实际加载、保存重开:演示维修车间(可拆分)",
  1976. "recordedAt": "2026-09-06T10:27:50.202Z",
  1977. "kind": "e2e",
  1978. "ids": [
  1979. "template.workshop-real"
  1980. ],
  1981. "file": "evidence/template-workshop-real.json",
  1982. "title": "场景模板实际加载、保存重开:演示维修车间(可拆分)",
  1983. "details": "真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。",
  1984. "screenshots": [
  1985. "23-template-workshop-real.png"
  1986. ]
  1987. }
  1988. ]
  1989. },
  1990. {
  1991. "id": "template.workshop-2",
  1992. "group": "全部可达场景模板",
  1993. "name": "总成拆卸车间",
  1994. "source": {
  1995. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1996. "symbol": "id: 'workshop-2'",
  1997. "line": 90
  1998. },
  1999. "implementation": "本轮修复已完成验证",
  2000. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  2001. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  2002. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  2003. "fixIds": [
  2004. "SCENE-F03"
  2005. ],
  2006. "verification": "PASS",
  2007. "evidence": [
  2008. {
  2009. "status": "PASS",
  2010. "testTitle": "场景模板实际加载、保存重开:总成拆卸车间",
  2011. "recordedAt": "2026-09-06T10:27:59.059Z",
  2012. "kind": "e2e",
  2013. "ids": [
  2014. "template.workshop-2"
  2015. ],
  2016. "file": "evidence/template-workshop-2.json",
  2017. "title": "场景模板实际加载、保存重开:总成拆卸车间",
  2018. "details": "真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。",
  2019. "screenshots": [
  2020. "24-template-workshop-2.png"
  2021. ]
  2022. }
  2023. ]
  2024. },
  2025. {
  2026. "id": "template.workshop-3",
  2027. "group": "全部可达场景模板",
  2028. "name": "部件分解车间",
  2029. "source": {
  2030. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2031. "symbol": "id: 'workshop-3'",
  2032. "line": 91
  2033. },
  2034. "implementation": "本轮修复已完成验证",
  2035. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  2036. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  2037. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  2038. "fixIds": [
  2039. "SCENE-F03"
  2040. ],
  2041. "verification": "PASS",
  2042. "evidence": [
  2043. {
  2044. "status": "PASS",
  2045. "testTitle": "场景模板实际加载、保存重开:部件分解车间",
  2046. "recordedAt": "2026-09-06T10:28:07.821Z",
  2047. "kind": "e2e",
  2048. "ids": [
  2049. "template.workshop-3"
  2050. ],
  2051. "file": "evidence/template-workshop-3.json",
  2052. "title": "场景模板实际加载、保存重开:部件分解车间",
  2053. "details": "真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。",
  2054. "screenshots": [
  2055. "25-template-workshop-3.png"
  2056. ]
  2057. }
  2058. ]
  2059. },
  2060. {
  2061. "id": "template.workshop-4",
  2062. "group": "全部可达场景模板",
  2063. "name": "清洗检测车间",
  2064. "source": {
  2065. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2066. "symbol": "id: 'workshop-4'",
  2067. "line": 92
  2068. },
  2069. "implementation": "本轮修复已完成验证",
  2070. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  2071. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  2072. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  2073. "fixIds": [
  2074. "SCENE-F03"
  2075. ],
  2076. "verification": "PASS",
  2077. "evidence": [
  2078. {
  2079. "status": "PASS",
  2080. "testTitle": "场景模板实际加载、保存重开:清洗检测车间",
  2081. "recordedAt": "2026-09-06T10:28:16.504Z",
  2082. "kind": "e2e",
  2083. "ids": [
  2084. "template.workshop-4"
  2085. ],
  2086. "file": "evidence/template-workshop-4.json",
  2087. "title": "场景模板实际加载、保存重开:清洗检测车间",
  2088. "details": "真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。",
  2089. "screenshots": [
  2090. "26-template-workshop-4.png"
  2091. ]
  2092. }
  2093. ]
  2094. },
  2095. {
  2096. "id": "template.workshop-5",
  2097. "group": "全部可达场景模板",
  2098. "name": "复装调试车间",
  2099. "source": {
  2100. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2101. "symbol": "id: 'workshop-5'",
  2102. "line": 93
  2103. },
  2104. "implementation": "本轮修复已完成验证",
  2105. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  2106. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  2107. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  2108. "fixIds": [
  2109. "SCENE-F03"
  2110. ],
  2111. "verification": "PASS",
  2112. "evidence": [
  2113. {
  2114. "status": "PASS",
  2115. "testTitle": "场景模板实际加载、保存重开:复装调试车间",
  2116. "recordedAt": "2026-09-06T10:28:25.537Z",
  2117. "kind": "e2e",
  2118. "ids": [
  2119. "template.workshop-5"
  2120. ],
  2121. "file": "evidence/template-workshop-5.json",
  2122. "title": "场景模板实际加载、保存重开:复装调试车间",
  2123. "details": "真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。",
  2124. "screenshots": [
  2125. "27-template-workshop-5.png"
  2126. ]
  2127. }
  2128. ]
  2129. },
  2130. {
  2131. "id": "template.outdoor-1",
  2132. "group": "全部可达场景模板",
  2133. "name": "室外综合训练场",
  2134. "source": {
  2135. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2136. "symbol": "id: 'outdoor-1'",
  2137. "line": 94
  2138. },
  2139. "implementation": "本轮修复已完成验证",
  2140. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  2141. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  2142. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  2143. "fixIds": [
  2144. "SCENE-F03"
  2145. ],
  2146. "verification": "PASS",
  2147. "evidence": [
  2148. {
  2149. "status": "PASS",
  2150. "testTitle": "场景模板实际加载、保存重开:室外综合训练场",
  2151. "recordedAt": "2026-09-06T10:28:34.148Z",
  2152. "kind": "e2e",
  2153. "ids": [
  2154. "template.outdoor-1"
  2155. ],
  2156. "file": "evidence/template-outdoor-1.json",
  2157. "title": "场景模板实际加载、保存重开:室外综合训练场",
  2158. "details": "真实模板按钮、选中标签、环境字段、种子对象、PUT 后刷新重开;截图验证对应模板实际画面。",
  2159. "screenshots": [
  2160. "28-template-outdoor-1.png"
  2161. ]
  2162. }
  2163. ]
  2164. },
  2165. {
  2166. "id": "template.switch-cancel",
  2167. "group": "全部可达场景模板",
  2168. "name": "未保存模板切换取消",
  2169. "source": {
  2170. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2171. "symbol": "async loadPreset",
  2172. "line": 765
  2173. },
  2174. "implementation": "本轮修复已完成验证",
  2175. "boundary": "取消保留原场景、选择与 dirty;请求中不能切换半场景。",
  2176. "acceptance": "有未存修改时取消/确认分别验证,取消零对象和服务端变更。",
  2177. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  2178. "fixIds": [
  2179. "SCENE-F03"
  2180. ],
  2181. "verification": "PASS",
  2182. "evidence": [
  2183. {
  2184. "status": "PASS",
  2185. "testTitle": "模板搜索与未保存切换确认保留和放弃",
  2186. "recordedAt": "2026-09-06T10:28:42.077Z",
  2187. "kind": "e2e",
  2188. "ids": [
  2189. "panel.left-tabs",
  2190. "search.templates",
  2191. "template.switch-cancel"
  2192. ],
  2193. "file": "evidence/template-confirm.json",
  2194. "title": "模板搜索与未保存切换确认保留和放弃",
  2195. "details": "中文/无匹配/清空搜索;真实取消保留对象,真实确认放弃并切换空白模板后保存。",
  2196. "screenshots": [
  2197. "29-template-confirm-empty.png"
  2198. ]
  2199. }
  2200. ]
  2201. },
  2202. {
  2203. "id": "view.orbit",
  2204. "group": "三维视口、选择与变换",
  2205. "name": "鼠标旋转相机",
  2206. "source": {
  2207. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2208. "symbol": "new OrbitControls",
  2209. "line": 379
  2210. },
  2211. "implementation": "已有实现已完成验证",
  2212. "boundary": "相机轨道操作不应误选、拖动物体。",
  2213. "acceptance": "实际鼠标拖动,相机变化且对象姿态不变。",
  2214. "fix": "尚未关联本轮修复记录",
  2215. "fixIds": [],
  2216. "verification": "PASS",
  2217. "evidence": [
  2218. {
  2219. "status": "PASS",
  2220. "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2221. "recordedAt": "2026-09-06T10:29:44.118Z",
  2222. "kind": "真实UI+只读投影",
  2223. "ids": [
  2224. "view.orbit",
  2225. "view.pan",
  2226. "view.zoom",
  2227. "view.top",
  2228. "view.perspective",
  2229. "view.grid",
  2230. "view.focus",
  2231. "selection.viewport",
  2232. "selection.highlight",
  2233. "preview.enter",
  2234. "preview.exit",
  2235. "preview.lock",
  2236. "lifecycle.resize-theme"
  2237. ],
  2238. "file": "evidence/viewport-camera-theme.json",
  2239. "title": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2240. "details": "",
  2241. "screenshots": [
  2242. "40-viewport-dark-1920",
  2243. "41-viewport-light-1440",
  2244. "42-fox-preview-original-material"
  2245. ]
  2246. }
  2247. ]
  2248. },
  2249. {
  2250. "id": "view.pan",
  2251. "group": "三维视口、选择与变换",
  2252. "name": "鼠标平移相机",
  2253. "source": {
  2254. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2255. "symbol": "new OrbitControls",
  2256. "line": 379
  2257. },
  2258. "implementation": "已有实现已完成验证",
  2259. "boundary": "轨道目标平移与物体位置分开。",
  2260. "acceptance": "实际右键/约定鼠标平移,目标变化且对象数据不变。",
  2261. "fix": "尚未关联本轮修复记录",
  2262. "fixIds": [],
  2263. "verification": "PASS",
  2264. "evidence": [
  2265. {
  2266. "status": "PASS",
  2267. "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2268. "recordedAt": "2026-09-06T10:29:44.118Z",
  2269. "kind": "真实UI+只读投影",
  2270. "ids": [
  2271. "view.orbit",
  2272. "view.pan",
  2273. "view.zoom",
  2274. "view.top",
  2275. "view.perspective",
  2276. "view.grid",
  2277. "view.focus",
  2278. "selection.viewport",
  2279. "selection.highlight",
  2280. "preview.enter",
  2281. "preview.exit",
  2282. "preview.lock",
  2283. "lifecycle.resize-theme"
  2284. ],
  2285. "file": "evidence/viewport-camera-theme.json",
  2286. "title": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2287. "details": "",
  2288. "screenshots": [
  2289. "40-viewport-dark-1920",
  2290. "41-viewport-light-1440",
  2291. "42-fox-preview-original-material"
  2292. ]
  2293. }
  2294. ]
  2295. },
  2296. {
  2297. "id": "view.zoom",
  2298. "group": "三维视口、选择与变换",
  2299. "name": "滚轮缩放相机",
  2300. "source": {
  2301. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2302. "symbol": "new OrbitControls",
  2303. "line": 379
  2304. },
  2305. "implementation": "已有实现已完成验证",
  2306. "boundary": "改变观察距离,不改对象 scale。",
  2307. "acceptance": "滚轮前后模型可见且对象 scale 不变。",
  2308. "fix": "尚未关联本轮修复记录",
  2309. "fixIds": [],
  2310. "verification": "PASS",
  2311. "evidence": [
  2312. {
  2313. "status": "PASS",
  2314. "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2315. "recordedAt": "2026-09-06T10:29:44.118Z",
  2316. "kind": "真实UI+只读投影",
  2317. "ids": [
  2318. "view.orbit",
  2319. "view.pan",
  2320. "view.zoom",
  2321. "view.top",
  2322. "view.perspective",
  2323. "view.grid",
  2324. "view.focus",
  2325. "selection.viewport",
  2326. "selection.highlight",
  2327. "preview.enter",
  2328. "preview.exit",
  2329. "preview.lock",
  2330. "lifecycle.resize-theme"
  2331. ],
  2332. "file": "evidence/viewport-camera-theme.json",
  2333. "title": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2334. "details": "",
  2335. "screenshots": [
  2336. "40-viewport-dark-1920",
  2337. "41-viewport-light-1440",
  2338. "42-fox-preview-original-material"
  2339. ]
  2340. }
  2341. ]
  2342. },
  2343. {
  2344. "id": "view.perspective",
  2345. "group": "三维视口、选择与变换",
  2346. "name": "透视按钮",
  2347. "source": {
  2348. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2349. "symbol": "data-camera=\"perspective\"",
  2350. "line": 259
  2351. },
  2352. "implementation": "本轮修复已完成验证",
  2353. "boundary": "基线按钮无处理分支;需明确恢复相机视角,不静默无效。",
  2354. "acceptance": "顶视切回透视,实际相机位置与激活样式变化。",
  2355. "fix": "透视按钮实际恢复先前观察位置;导入、加载和历史恢复存在已保存相机时不再被车辆自动聚焦覆盖。",
  2356. "fixIds": [
  2357. "SCENE-F04"
  2358. ],
  2359. "verification": "PASS",
  2360. "evidence": [
  2361. {
  2362. "status": "PASS",
  2363. "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2364. "recordedAt": "2026-09-06T10:29:44.118Z",
  2365. "kind": "真实UI+只读投影",
  2366. "ids": [
  2367. "view.orbit",
  2368. "view.pan",
  2369. "view.zoom",
  2370. "view.top",
  2371. "view.perspective",
  2372. "view.grid",
  2373. "view.focus",
  2374. "selection.viewport",
  2375. "selection.highlight",
  2376. "preview.enter",
  2377. "preview.exit",
  2378. "preview.lock",
  2379. "lifecycle.resize-theme"
  2380. ],
  2381. "file": "evidence/viewport-camera-theme.json",
  2382. "title": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2383. "details": "",
  2384. "screenshots": [
  2385. "40-viewport-dark-1920",
  2386. "41-viewport-light-1440",
  2387. "42-fox-preview-original-material"
  2388. ]
  2389. }
  2390. ]
  2391. },
  2392. {
  2393. "id": "view.top",
  2394. "group": "三维视口、选择与变换",
  2395. "name": "顶视图按钮",
  2396. "source": {
  2397. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2398. "symbol": "setTopView()",
  2399. "line": 585
  2400. },
  2401. "implementation": "本轮修复已完成验证",
  2402. "boundary": "仍为透视相机顶视位置,不冒称正交投影。",
  2403. "acceptance": "实际点击后顶视方向与目标一致。",
  2404. "fix": "透视按钮实际恢复先前观察位置;导入、加载和历史恢复存在已保存相机时不再被车辆自动聚焦覆盖。",
  2405. "fixIds": [
  2406. "SCENE-F04"
  2407. ],
  2408. "verification": "PASS",
  2409. "evidence": [
  2410. {
  2411. "status": "PASS",
  2412. "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2413. "recordedAt": "2026-09-06T10:29:44.118Z",
  2414. "kind": "真实UI+只读投影",
  2415. "ids": [
  2416. "view.orbit",
  2417. "view.pan",
  2418. "view.zoom",
  2419. "view.top",
  2420. "view.perspective",
  2421. "view.grid",
  2422. "view.focus",
  2423. "selection.viewport",
  2424. "selection.highlight",
  2425. "preview.enter",
  2426. "preview.exit",
  2427. "preview.lock",
  2428. "lifecycle.resize-theme"
  2429. ],
  2430. "file": "evidence/viewport-camera-theme.json",
  2431. "title": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2432. "details": "",
  2433. "screenshots": [
  2434. "40-viewport-dark-1920",
  2435. "41-viewport-light-1440",
  2436. "42-fox-preview-original-material"
  2437. ]
  2438. }
  2439. ]
  2440. },
  2441. {
  2442. "id": "view.focus",
  2443. "group": "三维视口、选择与变换",
  2444. "name": "聚焦选中对象",
  2445. "source": {
  2446. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2447. "symbol": "focusSelected()",
  2448. "line": 586
  2449. },
  2450. "implementation": "已有实现已完成验证",
  2451. "boundary": "按对象真实 bounds 调整相机;无选中应提示。",
  2452. "acceptance": "狐狸/卡车/环境分别聚焦可见;无选中提示不异常。",
  2453. "fix": "尚未关联本轮修复记录",
  2454. "fixIds": [],
  2455. "verification": "PASS",
  2456. "evidence": [
  2457. {
  2458. "status": "PASS",
  2459. "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2460. "recordedAt": "2026-09-06T10:29:44.118Z",
  2461. "kind": "真实UI+只读投影",
  2462. "ids": [
  2463. "view.orbit",
  2464. "view.pan",
  2465. "view.zoom",
  2466. "view.top",
  2467. "view.perspective",
  2468. "view.grid",
  2469. "view.focus",
  2470. "selection.viewport",
  2471. "selection.highlight",
  2472. "preview.enter",
  2473. "preview.exit",
  2474. "preview.lock",
  2475. "lifecycle.resize-theme"
  2476. ],
  2477. "file": "evidence/viewport-camera-theme.json",
  2478. "title": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2479. "details": "",
  2480. "screenshots": [
  2481. "40-viewport-dark-1920",
  2482. "41-viewport-light-1440",
  2483. "42-fox-preview-original-material"
  2484. ]
  2485. }
  2486. ]
  2487. },
  2488. {
  2489. "id": "view.grid",
  2490. "group": "三维视口、选择与变换",
  2491. "name": "网格显隐",
  2492. "source": {
  2493. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2494. "symbol": "toggleGrid(button)",
  2495. "line": 1643
  2496. },
  2497. "implementation": "已有实现已完成验证",
  2498. "boundary": "当前视图辅助选项;不默认要求跨重开持久化。",
  2499. "acceptance": "真实网格出现/消失、状态同步、截图封面不含网格。",
  2500. "fix": "尚未关联本轮修复记录",
  2501. "fixIds": [],
  2502. "verification": "PASS",
  2503. "evidence": [
  2504. {
  2505. "status": "PASS",
  2506. "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2507. "recordedAt": "2026-09-06T10:29:44.118Z",
  2508. "kind": "真实UI+只读投影",
  2509. "ids": [
  2510. "view.orbit",
  2511. "view.pan",
  2512. "view.zoom",
  2513. "view.top",
  2514. "view.perspective",
  2515. "view.grid",
  2516. "view.focus",
  2517. "selection.viewport",
  2518. "selection.highlight",
  2519. "preview.enter",
  2520. "preview.exit",
  2521. "preview.lock",
  2522. "lifecycle.resize-theme"
  2523. ],
  2524. "file": "evidence/viewport-camera-theme.json",
  2525. "title": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2526. "details": "",
  2527. "screenshots": [
  2528. "40-viewport-dark-1920",
  2529. "41-viewport-light-1440",
  2530. "42-fox-preview-original-material"
  2531. ]
  2532. },
  2533. {
  2534. "status": "PASS",
  2535. "testTitle": "copies synchronously without bounds, gizmo, grid or selection glow, then restores before JPEG encoding",
  2536. "kind": "unit",
  2537. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  2538. "ids": [
  2539. "cover.capture",
  2540. "selection.highlight",
  2541. "view.grid"
  2542. ],
  2543. "file": "validation.json",
  2544. "title": "copies synchronously without bounds, gizmo, grid or selection glow, then restores before JPEG encoding",
  2545. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  2546. "screenshots": []
  2547. }
  2548. ]
  2549. },
  2550. {
  2551. "id": "view.enclosure-full",
  2552. "group": "三维视口、选择与变换",
  2553. "name": "车库外壳完整显示",
  2554. "source": {
  2555. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/garage-enclosure.js",
  2556. "symbol": "createGarageEnclosureControls",
  2557. "line": 377
  2558. },
  2559. "implementation": "已有实现已完成验证",
  2560. "boundary": "完整显示屋顶/墙体/玻璃;仅车库资源存在时出现控制。",
  2561. "acceptance": "实际点击、对象材料和显示恢复,状态与画面一致。",
  2562. "fix": "尚未关联本轮修复记录",
  2563. "fixIds": [],
  2564. "verification": "PASS",
  2565. "evidence": [
  2566. {
  2567. "status": "PASS",
  2568. "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  2569. "recordedAt": "2026-09-06T10:30:32.596Z",
  2570. "kind": "browser",
  2571. "ids": [
  2572. "project.save-key",
  2573. "part.transform",
  2574. "part.soft-delete",
  2575. "history.undo",
  2576. "history.redo",
  2577. "property.name",
  2578. "view.enclosure-full",
  2579. "view.enclosure-xray",
  2580. "view.enclosure-hidden"
  2581. ],
  2582. "file": "evidence/truck-part-history.json",
  2583. "title": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  2584. "details": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。",
  2585. "screenshots": []
  2586. }
  2587. ]
  2588. },
  2589. {
  2590. "id": "view.enclosure-xray",
  2591. "group": "三维视口、选择与变换",
  2592. "name": "车库外壳透明查看",
  2593. "source": {
  2594. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/garage-enclosure.js",
  2595. "symbol": "createGarageEnclosureControls",
  2596. "line": 377
  2597. },
  2598. "implementation": "已有实现已完成验证",
  2599. "boundary": "车库多种围护材料联动;不等于普通相机透视。",
  2600. "acceptance": "实际外壳透明且内部模型可辨,材质无串改。",
  2601. "fix": "尚未关联本轮修复记录",
  2602. "fixIds": [],
  2603. "verification": "PASS",
  2604. "evidence": [
  2605. {
  2606. "status": "PASS",
  2607. "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  2608. "recordedAt": "2026-09-06T10:30:32.596Z",
  2609. "kind": "browser",
  2610. "ids": [
  2611. "project.save-key",
  2612. "part.transform",
  2613. "part.soft-delete",
  2614. "history.undo",
  2615. "history.redo",
  2616. "property.name",
  2617. "view.enclosure-full",
  2618. "view.enclosure-xray",
  2619. "view.enclosure-hidden"
  2620. ],
  2621. "file": "evidence/truck-part-history.json",
  2622. "title": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  2623. "details": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。",
  2624. "screenshots": []
  2625. }
  2626. ]
  2627. },
  2628. {
  2629. "id": "view.enclosure-hidden",
  2630. "group": "三维视口、选择与变换",
  2631. "name": "隐藏车库外壳",
  2632. "source": {
  2633. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/garage-enclosure.js",
  2634. "symbol": "createGarageEnclosureControls",
  2635. "line": 377
  2636. },
  2637. "implementation": "已有实现已完成验证",
  2638. "boundary": "隐藏围护后保留内部及地面;序列化 enclosureMode 与 dirty 契约须核对。",
  2639. "acceptance": "隐藏/还原、保存重开和只读浏览行为准确。",
  2640. "fix": "尚未关联本轮修复记录",
  2641. "fixIds": [],
  2642. "verification": "PASS",
  2643. "evidence": [
  2644. {
  2645. "status": "PASS",
  2646. "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  2647. "recordedAt": "2026-09-06T10:30:32.596Z",
  2648. "kind": "browser",
  2649. "ids": [
  2650. "project.save-key",
  2651. "part.transform",
  2652. "part.soft-delete",
  2653. "history.undo",
  2654. "history.redo",
  2655. "property.name",
  2656. "view.enclosure-full",
  2657. "view.enclosure-xray",
  2658. "view.enclosure-hidden"
  2659. ],
  2660. "file": "evidence/truck-part-history.json",
  2661. "title": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  2662. "details": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。",
  2663. "screenshots": []
  2664. }
  2665. ]
  2666. },
  2667. {
  2668. "id": "selection.viewport",
  2669. "group": "三维视口、选择与变换",
  2670. "name": "点击视口选中根对象/部件",
  2671. "source": {
  2672. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2673. "symbol": "selectFromViewport(event)",
  2674. "line": 456
  2675. },
  2676. "implementation": "本轮修复已完成验证",
  2677. "boundary": "只命中真实可选择可见对象;拖相机超过阈值不误选。",
  2678. "acceptance": "真实像素点击目标、树/属性/高亮一致,点击空白清选择。",
  2679. "fix": "新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。",
  2680. "fixIds": [
  2681. "SCENE-F18"
  2682. ],
  2683. "verification": "PASS",
  2684. "evidence": [
  2685. {
  2686. "status": "PASS",
  2687. "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2688. "recordedAt": "2026-09-06T10:29:44.118Z",
  2689. "kind": "真实UI+只读投影",
  2690. "ids": [
  2691. "view.orbit",
  2692. "view.pan",
  2693. "view.zoom",
  2694. "view.top",
  2695. "view.perspective",
  2696. "view.grid",
  2697. "view.focus",
  2698. "selection.viewport",
  2699. "selection.highlight",
  2700. "preview.enter",
  2701. "preview.exit",
  2702. "preview.lock",
  2703. "lifecycle.resize-theme"
  2704. ],
  2705. "file": "evidence/viewport-camera-theme.json",
  2706. "title": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2707. "details": "",
  2708. "screenshots": [
  2709. "40-viewport-dark-1920",
  2710. "41-viewport-light-1440",
  2711. "42-fox-preview-original-material"
  2712. ]
  2713. }
  2714. ]
  2715. },
  2716. {
  2717. "id": "selection.tree",
  2718. "group": "三维视口、选择与变换",
  2719. "name": "大纲根对象与部件选中",
  2720. "source": {
  2721. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2722. "symbol": "const treeItem =",
  2723. "line": 546
  2724. },
  2725. "implementation": "本轮修复已完成验证",
  2726. "boundary": "大纲显示所有可编辑实例和部件;环境锁定提示不是折叠控件。",
  2727. "acceptance": "树选中与视口高亮/属性联动、筛选后仍可选。",
  2728. "fix": "新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。",
  2729. "fixIds": [
  2730. "SCENE-F18"
  2731. ],
  2732. "verification": "PASS",
  2733. "evidence": [
  2734. {
  2735. "status": "PASS",
  2736. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  2737. "recordedAt": "2026-09-06T10:30:14.385Z",
  2738. "kind": "browser",
  2739. "ids": [
  2740. "project.load",
  2741. "project.title",
  2742. "project.save",
  2743. "selection.tree",
  2744. "property.name",
  2745. "property.visible",
  2746. "property.operable",
  2747. "property.position",
  2748. "property.rotation",
  2749. "property.scale",
  2750. "property.device-id",
  2751. "property.model-id",
  2752. "property.semantic",
  2753. "part.source",
  2754. "panel.binding",
  2755. "cover.capture",
  2756. "cover.atomic"
  2757. ],
  2758. "file": "evidence/fox-properties-cover.json",
  2759. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  2760. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  2761. "screenshots": []
  2762. },
  2763. {
  2764. "status": "PASS",
  2765. "testTitle": "two published instances have unique tree part IDs and editing the second persists independently after reopen",
  2766. "kind": "unit",
  2767. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  2768. "ids": [
  2769. "part.transform",
  2770. "selection.tree"
  2771. ],
  2772. "file": "validation.json",
  2773. "title": "two published instances have unique tree part IDs and editing the second persists independently after reopen",
  2774. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  2775. "screenshots": []
  2776. },
  2777. {
  2778. "status": "PASS",
  2779. "testTitle": "successful parallel restores retain document order after delayed GLBs and split-object batches finish out of order",
  2780. "kind": "unit",
  2781. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  2782. "ids": [
  2783. "project.load",
  2784. "selection.tree"
  2785. ],
  2786. "file": "validation.json",
  2787. "title": "successful parallel restores retain document order after delayed GLBs and split-object batches finish out of order",
  2788. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  2789. "screenshots": []
  2790. }
  2791. ]
  2792. },
  2793. {
  2794. "id": "selection.hidden",
  2795. "group": "三维视口、选择与变换",
  2796. "name": "隐藏祖先与软删除部件不可误拾取",
  2797. "source": {
  2798. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-selection.js",
  2799. "symbol": "chooseSceneSelection",
  2800. "line": 41
  2801. },
  2802. "implementation": "本轮修复已完成验证",
  2803. "boundary": "父隐藏/子隐藏/软删除状态不能被射线重新命中。",
  2804. "acceptance": "用重叠模型/部件实测,命中应落可见有效对象。",
  2805. "fix": "射线候选逐级检查父级可见性和软删除;删除根对象先恢复高亮材质再释放几何/材质,避免错误拾取及 GPU 资源残留。",
  2806. "fixIds": [
  2807. "SCENE-F09"
  2808. ],
  2809. "verification": "PASS",
  2810. "evidence": [
  2811. {
  2812. "status": "PASS",
  2813. "testTitle": "real Three ray hits on hidden descendants are excluded before selecting a root or part",
  2814. "kind": "unit",
  2815. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  2816. "ids": [
  2817. "selection.hidden"
  2818. ],
  2819. "file": "validation.json",
  2820. "title": "real Three ray hits on hidden descendants are excluded before selecting a root or part",
  2821. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  2822. "screenshots": []
  2823. }
  2824. ]
  2825. },
  2826. {
  2827. "id": "selection.highlight",
  2828. "group": "三维视口、选择与变换",
  2829. "name": "选中高亮与恢复原材质",
  2830. "source": {
  2831. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2832. "symbol": "updateSelectionHighlight()",
  2833. "line": 627
  2834. },
  2835. "implementation": "本轮修复已完成验证",
  2836. "boundary": "高亮是暂态,不写入模型/场景材质,不进入封面。",
  2837. "acceptance": "切换对象/清选择/预览/保存截图后材质原值恢复。",
  2838. "fix": "射线候选逐级检查父级可见性和软删除;删除根对象先恢复高亮材质再释放几何/材质,避免错误拾取及 GPU 资源残留。",
  2839. "fixIds": [
  2840. "SCENE-F09"
  2841. ],
  2842. "verification": "PASS",
  2843. "evidence": [
  2844. {
  2845. "status": "PASS",
  2846. "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2847. "recordedAt": "2026-09-06T10:29:44.118Z",
  2848. "kind": "真实UI+只读投影",
  2849. "ids": [
  2850. "view.orbit",
  2851. "view.pan",
  2852. "view.zoom",
  2853. "view.top",
  2854. "view.perspective",
  2855. "view.grid",
  2856. "view.focus",
  2857. "selection.viewport",
  2858. "selection.highlight",
  2859. "preview.enter",
  2860. "preview.exit",
  2861. "preview.lock",
  2862. "lifecycle.resize-theme"
  2863. ],
  2864. "file": "evidence/viewport-camera-theme.json",
  2865. "title": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  2866. "details": "",
  2867. "screenshots": [
  2868. "40-viewport-dark-1920",
  2869. "41-viewport-light-1440",
  2870. "42-fox-preview-original-material"
  2871. ]
  2872. },
  2873. {
  2874. "status": "PASS",
  2875. "testTitle": "selection highlight cleanup restores source materials and releases its own GPU helper",
  2876. "kind": "unit",
  2877. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  2878. "ids": [
  2879. "selection.highlight",
  2880. "lifecycle.destroy"
  2881. ],
  2882. "file": "validation.json",
  2883. "title": "selection highlight cleanup restores source materials and releases its own GPU helper",
  2884. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  2885. "screenshots": []
  2886. },
  2887. {
  2888. "status": "PASS",
  2889. "testTitle": "copies synchronously without bounds, gizmo, grid or selection glow, then restores before JPEG encoding",
  2890. "kind": "unit",
  2891. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  2892. "ids": [
  2893. "cover.capture",
  2894. "selection.highlight",
  2895. "view.grid"
  2896. ],
  2897. "file": "validation.json",
  2898. "title": "copies synchronously without bounds, gizmo, grid or selection glow, then restores before JPEG encoding",
  2899. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  2900. "screenshots": []
  2901. }
  2902. ]
  2903. },
  2904. {
  2905. "id": "transform.translate",
  2906. "group": "三维视口、选择与变换",
  2907. "name": "移动工具及真实 XYZ 手柄",
  2908. "source": {
  2909. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2910. "symbol": "setTransform(mode)",
  2911. "line": 1627
  2912. },
  2913. "implementation": "已有实现已完成验证",
  2914. "boundary": "对象实例位置;部件按发布能力限制。",
  2915. "acceptance": "真实拖动平移手柄,属性联动、撤销重做、保存重开一致。",
  2916. "fix": "尚未关联本轮修复记录",
  2917. "fixIds": [],
  2918. "verification": "PASS",
  2919. "evidence": [
  2920. {
  2921. "status": "PASS",
  2922. "testTitle": "真实变换手柄移动旋转缩放、吸附与保存重开",
  2923. "recordedAt": "2026-09-06T10:29:55.869Z",
  2924. "kind": "真实UI手柄+只读几何投影定位",
  2925. "ids": [
  2926. "transform.translate",
  2927. "transform.rotate",
  2928. "transform.scale",
  2929. "transform.keys",
  2930. "transform.snap"
  2931. ],
  2932. "file": "evidence/viewport-transform.json",
  2933. "title": "真实变换手柄移动旋转缩放、吸附与保存重开",
  2934. "details": "",
  2935. "screenshots": [
  2936. "43-real-transform-gizmo"
  2937. ]
  2938. }
  2939. ]
  2940. },
  2941. {
  2942. "id": "transform.rotate",
  2943. "group": "三维视口、选择与变换",
  2944. "name": "旋转工具及真实旋转手柄",
  2945. "source": {
  2946. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2947. "symbol": "setTransform(mode)",
  2948. "line": 1627
  2949. },
  2950. "implementation": "已有实现已完成验证",
  2951. "boundary": "UI 度数与保存弧度转换;不能仅用脚本改姿态代替拖动。",
  2952. "acceptance": "实际旋转手柄改变姿态并重开一致。",
  2953. "fix": "尚未关联本轮修复记录",
  2954. "fixIds": [],
  2955. "verification": "PASS",
  2956. "evidence": [
  2957. {
  2958. "status": "PASS",
  2959. "testTitle": "真实变换手柄移动旋转缩放、吸附与保存重开",
  2960. "recordedAt": "2026-09-06T10:29:55.869Z",
  2961. "kind": "真实UI手柄+只读几何投影定位",
  2962. "ids": [
  2963. "transform.translate",
  2964. "transform.rotate",
  2965. "transform.scale",
  2966. "transform.keys",
  2967. "transform.snap"
  2968. ],
  2969. "file": "evidence/viewport-transform.json",
  2970. "title": "真实变换手柄移动旋转缩放、吸附与保存重开",
  2971. "details": "",
  2972. "screenshots": [
  2973. "43-real-transform-gizmo"
  2974. ]
  2975. }
  2976. ]
  2977. },
  2978. {
  2979. "id": "transform.scale",
  2980. "group": "三维视口、选择与变换",
  2981. "name": "缩放工具及真实缩放手柄",
  2982. "source": {
  2983. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2984. "symbol": "setTransform(mode)",
  2985. "line": 1627
  2986. },
  2987. "implementation": "本轮修复已完成验证",
  2988. "boundary": "归一化模型已有 scale 必须保留,负/零/小值合同明确。",
  2989. "acceptance": "真实缩放与属性数值一致;狐狸不突然放成超大或消失。",
  2990. "fix": "实际手柄跨越枢轴时按既有严格正尺度合同限制,避免产生负或零尺度导致模型翻转或消失;未新增镜像建模功能。",
  2991. "fixIds": [
  2992. "SCENE-F17"
  2993. ],
  2994. "verification": "PASS",
  2995. "evidence": [
  2996. {
  2997. "status": "PASS",
  2998. "testTitle": "真实变换手柄移动旋转缩放、吸附与保存重开",
  2999. "recordedAt": "2026-09-06T10:29:55.869Z",
  3000. "kind": "真实UI手柄+只读几何投影定位",
  3001. "ids": [
  3002. "transform.translate",
  3003. "transform.rotate",
  3004. "transform.scale",
  3005. "transform.keys",
  3006. "transform.snap"
  3007. ],
  3008. "file": "evidence/viewport-transform.json",
  3009. "title": "真实变换手柄移动旋转缩放、吸附与保存重开",
  3010. "details": "",
  3011. "screenshots": [
  3012. "43-real-transform-gizmo"
  3013. ]
  3014. },
  3015. {
  3016. "status": "PASS",
  3017. "testTitle": "gizmo scaling across its pivot follows the same strictly positive scale contract as inspector edits",
  3018. "kind": "unit",
  3019. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  3020. "ids": [
  3021. "transform.scale",
  3022. "property.scale"
  3023. ],
  3024. "file": "validation.json",
  3025. "title": "gizmo scaling across its pivot follows the same strictly positive scale contract as inspector edits",
  3026. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  3027. "screenshots": []
  3028. }
  3029. ]
  3030. },
  3031. {
  3032. "id": "transform.keys",
  3033. "group": "三维视口、选择与变换",
  3034. "name": "W/E/R 快捷键",
  3035. "source": {
  3036. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3037. "symbol": "handleKeyboard(event)",
  3038. "line": 469
  3039. },
  3040. "implementation": "本轮修复已完成验证",
  3041. "boundary": "键盘焦点在表单时不切工具,失活缓存页不能抢键。",
  3042. "acceptance": "视口按键切工具;名称输入包含 w/e/r 正常;只读不改。",
  3043. "fix": "预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。",
  3044. "fixIds": [
  3045. "SCENE-F05"
  3046. ],
  3047. "verification": "PASS",
  3048. "evidence": [
  3049. {
  3050. "status": "PASS",
  3051. "testTitle": "真实变换手柄移动旋转缩放、吸附与保存重开",
  3052. "recordedAt": "2026-09-06T10:29:55.869Z",
  3053. "kind": "真实UI手柄+只读几何投影定位",
  3054. "ids": [
  3055. "transform.translate",
  3056. "transform.rotate",
  3057. "transform.scale",
  3058. "transform.keys",
  3059. "transform.snap"
  3060. ],
  3061. "file": "evidence/viewport-transform.json",
  3062. "title": "真实变换手柄移动旋转缩放、吸附与保存重开",
  3063. "details": "",
  3064. "screenshots": [
  3065. "43-real-transform-gizmo"
  3066. ]
  3067. },
  3068. {
  3069. "status": "PASS",
  3070. "testTitle": "typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts",
  3071. "kind": "unit",
  3072. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  3073. "ids": [
  3074. "history.undo",
  3075. "history.redo",
  3076. "transform.keys",
  3077. "lifecycle.cache"
  3078. ],
  3079. "file": "validation.json",
  3080. "title": "typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts",
  3081. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  3082. "screenshots": []
  3083. }
  3084. ]
  3085. },
  3086. {
  3087. "id": "transform.snap",
  3088. "group": "三维视口、选择与变换",
  3089. "name": "吸附 0.5m 与旋转 15° 开关",
  3090. "source": {
  3091. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3092. "symbol": "toggleSnap()",
  3093. "line": 581
  3094. },
  3095. "implementation": "已有实现已完成验证",
  3096. "boundary": "开关同时控制拖放/变换吸附;当前视图工具参数与业务值区分。",
  3097. "acceptance": "开/关实际拖动位置、旋转角度,按钮/页脚状态一致。",
  3098. "fix": "尚未关联本轮修复记录",
  3099. "fixIds": [],
  3100. "verification": "PASS",
  3101. "evidence": [
  3102. {
  3103. "status": "PASS",
  3104. "testTitle": "真实变换手柄移动旋转缩放、吸附与保存重开",
  3105. "recordedAt": "2026-09-06T10:29:55.869Z",
  3106. "kind": "真实UI手柄+只读几何投影定位",
  3107. "ids": [
  3108. "transform.translate",
  3109. "transform.rotate",
  3110. "transform.scale",
  3111. "transform.keys",
  3112. "transform.snap"
  3113. ],
  3114. "file": "evidence/viewport-transform.json",
  3115. "title": "真实变换手柄移动旋转缩放、吸附与保存重开",
  3116. "details": "",
  3117. "screenshots": [
  3118. "43-real-transform-gizmo"
  3119. ]
  3120. }
  3121. ]
  3122. },
  3123. {
  3124. "id": "property.name",
  3125. "group": "对象属性、部件与底部面板",
  3126. "name": "显示名称",
  3127. "source": {
  3128. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3129. "symbol": "handleInput(event)",
  3130. "line": 437
  3131. },
  3132. "implementation": "本轮修复已完成验证",
  3133. "boundary": "对象/部件 displayName 与项目名称分开。",
  3134. "acceptance": "修改名称,树/对象条/属性同步,保存重开保留。",
  3135. "fix": "恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。",
  3136. "fixIds": [
  3137. "SCENE-F06"
  3138. ],
  3139. "verification": "PASS",
  3140. "evidence": [
  3141. {
  3142. "status": "PASS",
  3143. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3144. "recordedAt": "2026-09-06T10:30:14.385Z",
  3145. "kind": "browser",
  3146. "ids": [
  3147. "project.load",
  3148. "project.title",
  3149. "project.save",
  3150. "selection.tree",
  3151. "property.name",
  3152. "property.visible",
  3153. "property.operable",
  3154. "property.position",
  3155. "property.rotation",
  3156. "property.scale",
  3157. "property.device-id",
  3158. "property.model-id",
  3159. "property.semantic",
  3160. "part.source",
  3161. "panel.binding",
  3162. "cover.capture",
  3163. "cover.atomic"
  3164. ],
  3165. "file": "evidence/fox-properties-cover.json",
  3166. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3167. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  3168. "screenshots": []
  3169. },
  3170. {
  3171. "status": "PASS",
  3172. "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  3173. "recordedAt": "2026-09-06T10:30:32.596Z",
  3174. "kind": "browser",
  3175. "ids": [
  3176. "project.save-key",
  3177. "part.transform",
  3178. "part.soft-delete",
  3179. "history.undo",
  3180. "history.redo",
  3181. "property.name",
  3182. "view.enclosure-full",
  3183. "view.enclosure-xray",
  3184. "view.enclosure-hidden"
  3185. ],
  3186. "file": "evidence/truck-part-history.json",
  3187. "title": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  3188. "details": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。",
  3189. "screenshots": []
  3190. }
  3191. ]
  3192. },
  3193. {
  3194. "id": "property.visible",
  3195. "group": "对象属性、部件与底部面板",
  3196. "name": "在场景中可见",
  3197. "source": {
  3198. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3199. "symbol": "handleChange(event)",
  3200. "line": 438
  3201. },
  3202. "implementation": "已有实现已完成验证",
  3203. "boundary": "实例显隐可保存;受保护蒙皮部件不得独立隐藏。",
  3204. "acceptance": "开/关可见性、恢复、保存重开,视口与树状态准确。",
  3205. "fix": "尚未关联本轮修复记录",
  3206. "fixIds": [],
  3207. "verification": "PASS",
  3208. "evidence": [
  3209. {
  3210. "status": "PASS",
  3211. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3212. "recordedAt": "2026-09-06T10:30:14.385Z",
  3213. "kind": "browser",
  3214. "ids": [
  3215. "project.load",
  3216. "project.title",
  3217. "project.save",
  3218. "selection.tree",
  3219. "property.name",
  3220. "property.visible",
  3221. "property.operable",
  3222. "property.position",
  3223. "property.rotation",
  3224. "property.scale",
  3225. "property.device-id",
  3226. "property.model-id",
  3227. "property.semantic",
  3228. "part.source",
  3229. "panel.binding",
  3230. "cover.capture",
  3231. "cover.atomic"
  3232. ],
  3233. "file": "evidence/fox-properties-cover.json",
  3234. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3235. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  3236. "screenshots": []
  3237. },
  3238. {
  3239. "status": "PASS",
  3240. "testTitle": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开",
  3241. "recordedAt": "2026-09-06T10:29:25.167Z",
  3242. "kind": "e2e",
  3243. "ids": [
  3244. "assets.catalog",
  3245. "assets.model-double-click",
  3246. "assets.model-drop",
  3247. "search.tree",
  3248. "part.source",
  3249. "property.visible"
  3250. ],
  3251. "file": "evidence/published-model-assets.json",
  3252. "title": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开",
  3253. "details": "API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。",
  3254. "screenshots": [
  3255. "33-fox-placed-visible.png",
  3256. "34-truck-placed-part-restored.png"
  3257. ]
  3258. }
  3259. ]
  3260. },
  3261. {
  3262. "id": "property.operable",
  3263. "group": "对象属性、部件与底部面板",
  3264. "name": "可作为实训目标",
  3265. "source": {
  3266. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3267. "symbol": "handleChange(event)",
  3268. "line": 438
  3269. },
  3270. "implementation": "已有实现已完成验证",
  3271. "boundary": "operable/capabilities 进入场景定义;不能扩大平台操作权限。",
  3272. "acceptance": "开/关并保存重开,发布数据的目标能力一致。",
  3273. "fix": "尚未关联本轮修复记录",
  3274. "fixIds": [],
  3275. "verification": "PASS",
  3276. "evidence": [
  3277. {
  3278. "status": "PASS",
  3279. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3280. "recordedAt": "2026-09-06T10:30:14.385Z",
  3281. "kind": "browser",
  3282. "ids": [
  3283. "project.load",
  3284. "project.title",
  3285. "project.save",
  3286. "selection.tree",
  3287. "property.name",
  3288. "property.visible",
  3289. "property.operable",
  3290. "property.position",
  3291. "property.rotation",
  3292. "property.scale",
  3293. "property.device-id",
  3294. "property.model-id",
  3295. "property.semantic",
  3296. "part.source",
  3297. "panel.binding",
  3298. "cover.capture",
  3299. "cover.atomic"
  3300. ],
  3301. "file": "evidence/fox-properties-cover.json",
  3302. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3303. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  3304. "screenshots": []
  3305. }
  3306. ]
  3307. },
  3308. {
  3309. "id": "property.position",
  3310. "group": "对象属性、部件与底部面板",
  3311. "name": "位置 X/Y/Z 数值",
  3312. "source": {
  3313. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3314. "symbol": "handleInput(event)",
  3315. "line": 437
  3316. },
  3317. "implementation": "已有实现已完成验证",
  3318. "boundary": "三个输入回写局部 position;不使用纯展示假字段。",
  3319. "acceptance": "三个轴独立输入与手柄联动、失焦/history/重开准确。",
  3320. "fix": "尚未关联本轮修复记录",
  3321. "fixIds": [],
  3322. "verification": "PASS",
  3323. "evidence": [
  3324. {
  3325. "status": "PASS",
  3326. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3327. "recordedAt": "2026-09-06T10:30:14.385Z",
  3328. "kind": "browser",
  3329. "ids": [
  3330. "project.load",
  3331. "project.title",
  3332. "project.save",
  3333. "selection.tree",
  3334. "property.name",
  3335. "property.visible",
  3336. "property.operable",
  3337. "property.position",
  3338. "property.rotation",
  3339. "property.scale",
  3340. "property.device-id",
  3341. "property.model-id",
  3342. "property.semantic",
  3343. "part.source",
  3344. "panel.binding",
  3345. "cover.capture",
  3346. "cover.atomic"
  3347. ],
  3348. "file": "evidence/fox-properties-cover.json",
  3349. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3350. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  3351. "screenshots": []
  3352. }
  3353. ]
  3354. },
  3355. {
  3356. "id": "property.rotation",
  3357. "group": "对象属性、部件与底部面板",
  3358. "name": "旋转 X/Y/Z 数值",
  3359. "source": {
  3360. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3361. "symbol": "handleInput(event)",
  3362. "line": 437
  3363. },
  3364. "implementation": "已有实现已完成验证",
  3365. "boundary": "UI 为角度,文档为弧度。",
  3366. "acceptance": "非整角/负角输入、实际姿态与 JSON/重开一致。",
  3367. "fix": "尚未关联本轮修复记录",
  3368. "fixIds": [],
  3369. "verification": "PASS",
  3370. "evidence": [
  3371. {
  3372. "status": "PASS",
  3373. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3374. "recordedAt": "2026-09-06T10:30:14.385Z",
  3375. "kind": "browser",
  3376. "ids": [
  3377. "project.load",
  3378. "project.title",
  3379. "project.save",
  3380. "selection.tree",
  3381. "property.name",
  3382. "property.visible",
  3383. "property.operable",
  3384. "property.position",
  3385. "property.rotation",
  3386. "property.scale",
  3387. "property.device-id",
  3388. "property.model-id",
  3389. "property.semantic",
  3390. "part.source",
  3391. "panel.binding",
  3392. "cover.capture",
  3393. "cover.atomic"
  3394. ],
  3395. "file": "evidence/fox-properties-cover.json",
  3396. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3397. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  3398. "screenshots": []
  3399. }
  3400. ]
  3401. },
  3402. {
  3403. "id": "property.scale",
  3404. "group": "对象属性、部件与底部面板",
  3405. "name": "缩放 X/Y/Z 数值及有效值",
  3406. "source": {
  3407. "file": "../../../unreal_tran_web/src/features/scene-legacy/modelPlacement.ts",
  3408. "symbol": "parseSceneScale",
  3409. "line": 36
  3410. },
  3411. "implementation": "本轮修复已完成验证",
  3412. "boundary": "支持小数归一化 scale,避免小值格式化成零;非法值不得破坏模型。",
  3413. "acceptance": "小正数、负数/零/清空按合同处理,三轴保存往返正常。",
  3414. "fix": "实际手柄跨越枢轴时按既有严格正尺度合同限制,避免产生负或零尺度导致模型翻转或消失;未新增镜像建模功能。",
  3415. "fixIds": [
  3416. "SCENE-F17"
  3417. ],
  3418. "verification": "PASS",
  3419. "evidence": [
  3420. {
  3421. "status": "PASS",
  3422. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3423. "recordedAt": "2026-09-06T10:30:14.385Z",
  3424. "kind": "browser",
  3425. "ids": [
  3426. "project.load",
  3427. "project.title",
  3428. "project.save",
  3429. "selection.tree",
  3430. "property.name",
  3431. "property.visible",
  3432. "property.operable",
  3433. "property.position",
  3434. "property.rotation",
  3435. "property.scale",
  3436. "property.device-id",
  3437. "property.model-id",
  3438. "property.semantic",
  3439. "part.source",
  3440. "panel.binding",
  3441. "cover.capture",
  3442. "cover.atomic"
  3443. ],
  3444. "file": "evidence/fox-properties-cover.json",
  3445. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3446. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  3447. "screenshots": []
  3448. },
  3449. {
  3450. "status": "PASS",
  3451. "testTitle": "gizmo scaling across its pivot follows the same strictly positive scale contract as inspector edits",
  3452. "kind": "unit",
  3453. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  3454. "ids": [
  3455. "transform.scale",
  3456. "property.scale"
  3457. ],
  3458. "file": "validation.json",
  3459. "title": "gizmo scaling across its pivot follows the same strictly positive scale contract as inspector edits",
  3460. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  3461. "screenshots": []
  3462. },
  3463. {
  3464. "status": "PASS",
  3465. "testTitle": "scale input accepts real GLTF normalization factors below 0.05",
  3466. "kind": "unit",
  3467. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  3468. "ids": [
  3469. "property.scale"
  3470. ],
  3471. "file": "validation.json",
  3472. "title": "scale input accepts real GLTF normalization factors below 0.05",
  3473. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  3474. "screenshots": []
  3475. }
  3476. ]
  3477. },
  3478. {
  3479. "id": "property.device-id",
  3480. "group": "对象属性、部件与底部面板",
  3481. "name": "设备编号",
  3482. "source": {
  3483. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3484. "symbol": "handleInput(event)",
  3485. "line": 437
  3486. },
  3487. "implementation": "本轮修复已完成验证",
  3488. "boundary": "根对象绑定字符串;重复/空值由预检与后端核查。",
  3489. "acceptance": "修改后绑定表同步、保存重开,重复值能被阻断。",
  3490. "fix": "恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。",
  3491. "fixIds": [
  3492. "SCENE-F06"
  3493. ],
  3494. "verification": "PASS",
  3495. "evidence": [
  3496. {
  3497. "status": "PASS",
  3498. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3499. "recordedAt": "2026-09-06T10:30:14.385Z",
  3500. "kind": "browser",
  3501. "ids": [
  3502. "project.load",
  3503. "project.title",
  3504. "project.save",
  3505. "selection.tree",
  3506. "property.name",
  3507. "property.visible",
  3508. "property.operable",
  3509. "property.position",
  3510. "property.rotation",
  3511. "property.scale",
  3512. "property.device-id",
  3513. "property.model-id",
  3514. "property.semantic",
  3515. "part.source",
  3516. "panel.binding",
  3517. "cover.capture",
  3518. "cover.atomic"
  3519. ],
  3520. "file": "evidence/fox-properties-cover.json",
  3521. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3522. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  3523. "screenshots": []
  3524. }
  3525. ]
  3526. },
  3527. {
  3528. "id": "property.model-id",
  3529. "group": "对象属性、部件与底部面板",
  3530. "name": "物模型编号",
  3531. "source": {
  3532. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3533. "symbol": "handleInput(event)",
  3534. "line": 437
  3535. },
  3536. "implementation": "本轮修复已完成验证",
  3537. "boundary": "与受控 assetCode、来源项目 ID 分开。",
  3538. "acceptance": "修改后只改业务编号,源 GLB 仍加载正确。",
  3539. "fix": "恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。",
  3540. "fixIds": [
  3541. "SCENE-F06"
  3542. ],
  3543. "verification": "PASS",
  3544. "evidence": [
  3545. {
  3546. "status": "PASS",
  3547. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3548. "recordedAt": "2026-09-06T10:30:14.385Z",
  3549. "kind": "browser",
  3550. "ids": [
  3551. "project.load",
  3552. "project.title",
  3553. "project.save",
  3554. "selection.tree",
  3555. "property.name",
  3556. "property.visible",
  3557. "property.operable",
  3558. "property.position",
  3559. "property.rotation",
  3560. "property.scale",
  3561. "property.device-id",
  3562. "property.model-id",
  3563. "property.semantic",
  3564. "part.source",
  3565. "panel.binding",
  3566. "cover.capture",
  3567. "cover.atomic"
  3568. ],
  3569. "file": "evidence/fox-properties-cover.json",
  3570. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3571. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  3572. "screenshots": []
  3573. }
  3574. ]
  3575. },
  3576. {
  3577. "id": "property.semantic",
  3578. "group": "对象属性、部件与底部面板",
  3579. "name": "语义类型六个选项",
  3580. "source": {
  3581. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3582. "symbol": "handleChange(event)",
  3583. "line": 438
  3584. },
  3585. "implementation": "已有实现已完成验证",
  3586. "boundary": "实训装备/工位设施/安全区域/采集设备/训练人员/环境设施。",
  3587. "acceptance": "逐项可选且保存重开保留;绑定表显示实际类型。",
  3588. "fix": "尚未关联本轮修复记录",
  3589. "fixIds": [],
  3590. "verification": "PASS",
  3591. "evidence": [
  3592. {
  3593. "status": "PASS",
  3594. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3595. "recordedAt": "2026-09-06T10:30:14.385Z",
  3596. "kind": "browser",
  3597. "ids": [
  3598. "project.load",
  3599. "project.title",
  3600. "project.save",
  3601. "selection.tree",
  3602. "property.name",
  3603. "property.visible",
  3604. "property.operable",
  3605. "property.position",
  3606. "property.rotation",
  3607. "property.scale",
  3608. "property.device-id",
  3609. "property.model-id",
  3610. "property.semantic",
  3611. "part.source",
  3612. "panel.binding",
  3613. "cover.capture",
  3614. "cover.atomic"
  3615. ],
  3616. "file": "evidence/fox-properties-cover.json",
  3617. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3618. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  3619. "screenshots": []
  3620. }
  3621. ]
  3622. },
  3623. {
  3624. "id": "part.source",
  3625. "group": "对象属性、部件与底部面板",
  3626. "name": "模型来源与部件权限说明",
  3627. "source": {
  3628. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3629. "symbol": "renderInspector()",
  3630. "line": 1520
  3631. },
  3632. "implementation": "本轮修复已完成验证",
  3633. "boundary": "固定模型版本/源节点;蒙皮仅查看高亮,非骨骼独立变换。",
  3634. "acceptance": "狐狸蒙皮与卡车刚性部件说明/禁用态准确。",
  3635. "fix": "模型来源按钮有来源权限时导航正确项目;无来源页面权限回到可访问列表,不将模型列表误称为来源工程编辑。",
  3636. "fixIds": [
  3637. "SCENE-F11"
  3638. ],
  3639. "verification": "PASS",
  3640. "evidence": [
  3641. {
  3642. "status": "PASS",
  3643. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3644. "recordedAt": "2026-09-06T10:30:14.385Z",
  3645. "kind": "browser",
  3646. "ids": [
  3647. "project.load",
  3648. "project.title",
  3649. "project.save",
  3650. "selection.tree",
  3651. "property.name",
  3652. "property.visible",
  3653. "property.operable",
  3654. "property.position",
  3655. "property.rotation",
  3656. "property.scale",
  3657. "property.device-id",
  3658. "property.model-id",
  3659. "property.semantic",
  3660. "part.source",
  3661. "panel.binding",
  3662. "cover.capture",
  3663. "cover.atomic"
  3664. ],
  3665. "file": "evidence/fox-properties-cover.json",
  3666. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3667. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  3668. "screenshots": []
  3669. },
  3670. {
  3671. "status": "PASS",
  3672. "testTitle": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开",
  3673. "recordedAt": "2026-09-06T10:29:25.167Z",
  3674. "kind": "e2e",
  3675. "ids": [
  3676. "assets.catalog",
  3677. "assets.model-double-click",
  3678. "assets.model-drop",
  3679. "search.tree",
  3680. "part.source",
  3681. "property.visible"
  3682. ],
  3683. "file": "evidence/published-model-assets.json",
  3684. "title": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开",
  3685. "details": "API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。",
  3686. "screenshots": [
  3687. "33-fox-placed-visible.png",
  3688. "34-truck-placed-part-restored.png"
  3689. ]
  3690. }
  3691. ]
  3692. },
  3693. {
  3694. "id": "part.transform",
  3695. "group": "对象属性、部件与底部面板",
  3696. "name": "刚性部件独立变换并保存覆盖",
  3697. "source": {
  3698. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3699. "symbol": "captureModelPartOverrides(root)",
  3700. "line": 1123
  3701. },
  3702. "implementation": "本轮修复已完成验证",
  3703. "boundary": "partOverrides 与稳定 interactionId;多个实例互不串改。",
  3704. "acceptance": "两卡车实例改单部件,保存重开另一实例不受影响。",
  3705. "fix": "新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。",
  3706. "fixIds": [
  3707. "SCENE-F18"
  3708. ],
  3709. "verification": "PASS",
  3710. "evidence": [
  3711. {
  3712. "status": "PASS",
  3713. "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  3714. "recordedAt": "2026-09-06T10:30:32.596Z",
  3715. "kind": "browser",
  3716. "ids": [
  3717. "project.save-key",
  3718. "part.transform",
  3719. "part.soft-delete",
  3720. "history.undo",
  3721. "history.redo",
  3722. "property.name",
  3723. "view.enclosure-full",
  3724. "view.enclosure-xray",
  3725. "view.enclosure-hidden"
  3726. ],
  3727. "file": "evidence/truck-part-history.json",
  3728. "title": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  3729. "details": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。",
  3730. "screenshots": []
  3731. },
  3732. {
  3733. "status": "PASS",
  3734. "testTitle": "two published instances have unique tree part IDs and editing the second persists independently after reopen",
  3735. "kind": "unit",
  3736. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  3737. "ids": [
  3738. "part.transform",
  3739. "selection.tree"
  3740. ],
  3741. "file": "validation.json",
  3742. "title": "two published instances have unique tree part IDs and editing the second persists independently after reopen",
  3743. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  3744. "screenshots": []
  3745. },
  3746. {
  3747. "status": "PASS",
  3748. "testTitle": "legacy duplicate instance IDs migrate only later owners in document order despite reversed GLB completion",
  3749. "kind": "unit",
  3750. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  3751. "ids": [
  3752. "part.transform",
  3753. "publish.fixed-model"
  3754. ],
  3755. "file": "validation.json",
  3756. "title": "legacy duplicate instance IDs migrate only later owners in document order despite reversed GLB completion",
  3757. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  3758. "screenshots": []
  3759. }
  3760. ]
  3761. },
  3762. {
  3763. "id": "part.soft-delete",
  3764. "group": "对象属性、部件与底部面板",
  3765. "name": "部件软删除与恢复",
  3766. "source": {
  3767. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3768. "symbol": "deleteSelected()",
  3769. "line": 588
  3770. },
  3771. "implementation": "本轮修复已完成验证",
  3772. "boundary": "被允许的部件 sceneDeleted/visible 持久化;可撤销恢复。",
  3773. "acceptance": "实际删除、撤销、保存重开均一致;蒙皮不允许破坏骨架。",
  3774. "fix": "新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。",
  3775. "fixIds": [
  3776. "SCENE-F18"
  3777. ],
  3778. "verification": "PASS",
  3779. "evidence": [
  3780. {
  3781. "status": "PASS",
  3782. "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  3783. "recordedAt": "2026-09-06T10:30:32.596Z",
  3784. "kind": "browser",
  3785. "ids": [
  3786. "project.save-key",
  3787. "part.transform",
  3788. "part.soft-delete",
  3789. "history.undo",
  3790. "history.redo",
  3791. "property.name",
  3792. "view.enclosure-full",
  3793. "view.enclosure-xray",
  3794. "view.enclosure-hidden"
  3795. ],
  3796. "file": "evidence/truck-part-history.json",
  3797. "title": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  3798. "details": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。",
  3799. "screenshots": []
  3800. }
  3801. ]
  3802. },
  3803. {
  3804. "id": "object.delete",
  3805. "group": "对象属性、部件与底部面板",
  3806. "name": "删除根对象按钮 / Delete",
  3807. "source": {
  3808. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3809. "symbol": "deleteSelected()",
  3810. "line": 588
  3811. },
  3812. "implementation": "本轮修复已完成验证",
  3813. "boundary": "移除当前场景实例,不删除源模型项目/固定发布版本。",
  3814. "acceptance": "按钮和键盘各验证;源项目不变,撤销和重开正确。",
  3815. "fix": "射线候选逐级检查父级可见性和软删除;删除根对象先恢复高亮材质再释放几何/材质,避免错误拾取及 GPU 资源残留。",
  3816. "fixIds": [
  3817. "SCENE-F09"
  3818. ],
  3819. "verification": "PASS",
  3820. "evidence": [
  3821. {
  3822. "status": "PASS",
  3823. "testTitle": "两种整体场地加载、重复放置阻止与显式删除后替换",
  3824. "recordedAt": "2026-09-06T10:29:06.315Z",
  3825. "kind": "e2e",
  3826. "ids": [
  3827. "asset.vehicle-depot",
  3828. "asset.field-terrain",
  3829. "object.delete"
  3830. ],
  3831. "file": "evidence/venue-assets.json",
  3832. "title": "两种整体场地加载、重复放置阻止与显式删除后替换",
  3833. "details": "车库和起伏地形真实加载并分别保存重开;已有整体场地时阻止叠加,显式删除旧场地后才能替换。",
  3834. "screenshots": [
  3835. "31-venue-depot-reopened.png",
  3836. "32-venue-terrain-reopened.png"
  3837. ]
  3838. },
  3839. {
  3840. "status": "PASS",
  3841. "testTitle": "deleting a root disposes its geometry and materials after clearing selection",
  3842. "kind": "unit",
  3843. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  3844. "ids": [
  3845. "object.delete",
  3846. "lifecycle.destroy"
  3847. ],
  3848. "file": "validation.json",
  3849. "title": "deleting a root disposes its geometry and materials after clearing selection",
  3850. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  3851. "screenshots": []
  3852. }
  3853. ]
  3854. },
  3855. {
  3856. "id": "panel.objects",
  3857. "group": "对象属性、部件与底部面板",
  3858. "name": "底部对象列表与选中",
  3859. "source": {
  3860. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3861. "symbol": "renderBottom(mode",
  3862. "line": 1619
  3863. },
  3864. "implementation": "本轮修复已完成验证",
  3865. "boundary": "基线显示前 6 个摘要,完整对象仍在大纲;需明确截断。",
  3866. "acceptance": "大于 6 个对象时列表说明准确,摘要点击选择正确。",
  3867. "fix": "设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。",
  3868. "fixIds": [
  3869. "SCENE-F10"
  3870. ],
  3871. "verification": "PASS",
  3872. "evidence": [
  3873. {
  3874. "status": "PASS",
  3875. "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  3876. "recordedAt": "2026-09-06T10:28:51.941Z",
  3877. "kind": "e2e",
  3878. "ids": [
  3879. "asset.diagnostic",
  3880. "asset.equipment",
  3881. "asset.workbench",
  3882. "asset.shelf",
  3883. "asset.safety-zone",
  3884. "asset.camera",
  3885. "asset.worker",
  3886. "asset.light",
  3887. "assets.basic-double-click",
  3888. "assets.basic-drop",
  3889. "search.assets",
  3890. "panel.objects"
  3891. ],
  3892. "file": "evidence/basic-assets.json",
  3893. "title": "八种基础资源逐项放置、真实拖放、搜索和保存重开",
  3894. "details": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。",
  3895. "screenshots": [
  3896. "30-eight-basic-assets-reopened.png"
  3897. ]
  3898. }
  3899. ]
  3900. },
  3901. {
  3902. "id": "panel.binding",
  3903. "group": "对象属性、部件与底部面板",
  3904. "name": "设备绑定总表",
  3905. "source": {
  3906. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3907. "symbol": "renderBottom(mode",
  3908. "line": 1619
  3909. },
  3910. "implementation": "本轮修复已完成验证",
  3911. "boundary": "基线语义列恒写已绑定;需要真实类型/缺失/冲突反馈。",
  3912. "acceptance": "编辑字段即时同步,空/重复数据不得假标已绑定。",
  3913. "fix": "设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。",
  3914. "fixIds": [
  3915. "SCENE-F10"
  3916. ],
  3917. "verification": "PASS",
  3918. "evidence": [
  3919. {
  3920. "status": "PASS",
  3921. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3922. "recordedAt": "2026-09-06T10:30:14.385Z",
  3923. "kind": "browser",
  3924. "ids": [
  3925. "project.load",
  3926. "project.title",
  3927. "project.save",
  3928. "selection.tree",
  3929. "property.name",
  3930. "property.visible",
  3931. "property.operable",
  3932. "property.position",
  3933. "property.rotation",
  3934. "property.scale",
  3935. "property.device-id",
  3936. "property.model-id",
  3937. "property.semantic",
  3938. "part.source",
  3939. "panel.binding",
  3940. "cover.capture",
  3941. "cover.atomic"
  3942. ],
  3943. "file": "evidence/fox-properties-cover.json",
  3944. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  3945. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  3946. "screenshots": []
  3947. }
  3948. ]
  3949. },
  3950. {
  3951. "id": "panel.validation",
  3952. "group": "对象属性、部件与底部面板",
  3953. "name": "底部发布检查面板",
  3954. "source": {
  3955. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  3956. "symbol": "renderBottom(mode",
  3957. "line": 1619
  3958. },
  3959. "implementation": "本轮修复已完成验证",
  3960. "boundary": "显示当前逐项检查,不等于已发布。",
  3961. "acceptance": "顶部校验/发布失败可定位检查面板,内容随修改更新。",
  3962. "fix": "设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。",
  3963. "fixIds": [
  3964. "SCENE-F10"
  3965. ],
  3966. "verification": "PASS",
  3967. "evidence": [
  3968. {
  3969. "status": "PASS",
  3970. "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  3971. "recordedAt": "2026-09-06T10:27:04.782Z",
  3972. "kind": "browser",
  3973. "ids": [
  3974. "validation.complete",
  3975. "validation.bindings",
  3976. "panel.validation",
  3977. "publish.saved",
  3978. "publish.failure",
  3979. "publish.fixed-model",
  3980. "cover.atomic",
  3981. "project.back"
  3982. ],
  3983. "file": "evidence/publish-fixed-version.json",
  3984. "title": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  3985. "details": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。",
  3986. "screenshots": []
  3987. },
  3988. {
  3989. "status": "PASS",
  3990. "testTitle": "verify opens live validation and whitespace binding edits immediately invalidate the active tab",
  3991. "kind": "unit",
  3992. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  3993. "ids": [
  3994. "panel.validation",
  3995. "validation.bindings"
  3996. ],
  3997. "file": "validation.json",
  3998. "title": "verify opens live validation and whitespace binding edits immediately invalidate the active tab",
  3999. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4000. "screenshots": []
  4001. }
  4002. ]
  4003. },
  4004. {
  4005. "id": "panel.logs",
  4006. "group": "对象属性、部件与底部面板",
  4007. "name": "操作日志",
  4008. "source": {
  4009. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  4010. "symbol": "renderBottom(mode",
  4011. "line": 1619
  4012. },
  4013. "implementation": "本轮修复已完成验证",
  4014. "boundary": "基线为静态示例且误称本地存储;本轮只需真实本次运行日志,不扩展服务端审计。",
  4015. "acceptance": "实际操作产生对应时间/结果;API 模式不显示本地存储为真值。",
  4016. "fix": "设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。",
  4017. "fixIds": [
  4018. "SCENE-F10"
  4019. ],
  4020. "verification": "PASS",
  4021. "evidence": [
  4022. {
  4023. "status": "PASS",
  4024. "testTitle": "activity log reflects actual session events and keeps API error details transient",
  4025. "kind": "unit",
  4026. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4027. "ids": [
  4028. "panel.logs"
  4029. ],
  4030. "file": "validation.json",
  4031. "title": "activity log reflects actual session events and keeps API error details transient",
  4032. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4033. "screenshots": []
  4034. }
  4035. ]
  4036. },
  4037. {
  4038. "id": "history.undo",
  4039. "group": "历史与预览",
  4040. "name": "回退按钮 / Ctrl+Z",
  4041. "source": {
  4042. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  4043. "symbol": "async undo()",
  4044. "line": 2417
  4045. },
  4046. "implementation": "本轮修复已完成验证",
  4047. "boundary": "输入连续修改合并成合理历史步;恢复对象/模板/选择。",
  4048. "acceptance": "属性、添加、删除、模板分别撤销,真实画面与文档一致。",
  4049. "fix": "透视按钮实际恢复先前观察位置;导入、加载和历史恢复存在已保存相机时不再被车辆自动聚焦覆盖。;预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。;文档签名忽略更新时间和对象键顺序;保存后的 undo/redo 根据真实已保存文档判断 dirty;异步恢复失败保留现场并回滚历史索引。",
  4050. "fixIds": [
  4051. "SCENE-F04",
  4052. "SCENE-F05",
  4053. "SCENE-F07"
  4054. ],
  4055. "verification": "PASS",
  4056. "evidence": [
  4057. {
  4058. "status": "PASS",
  4059. "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  4060. "recordedAt": "2026-09-06T10:30:32.596Z",
  4061. "kind": "browser",
  4062. "ids": [
  4063. "project.save-key",
  4064. "part.transform",
  4065. "part.soft-delete",
  4066. "history.undo",
  4067. "history.redo",
  4068. "property.name",
  4069. "view.enclosure-full",
  4070. "view.enclosure-xray",
  4071. "view.enclosure-hidden"
  4072. ],
  4073. "file": "evidence/truck-part-history.json",
  4074. "title": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  4075. "details": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。",
  4076. "screenshots": []
  4077. },
  4078. {
  4079. "status": "PASS",
  4080. "testTitle": "typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts",
  4081. "kind": "unit",
  4082. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4083. "ids": [
  4084. "history.undo",
  4085. "history.redo",
  4086. "transform.keys",
  4087. "lifecycle.cache"
  4088. ],
  4089. "file": "validation.json",
  4090. "title": "typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts",
  4091. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4092. "screenshots": []
  4093. },
  4094. {
  4095. "status": "PASS",
  4096. "testTitle": "loading and history restoration preserve an authored camera rather than auto-focusing a vehicle",
  4097. "kind": "unit",
  4098. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4099. "ids": [
  4100. "json.rendering",
  4101. "history.undo"
  4102. ],
  4103. "file": "validation.json",
  4104. "title": "loading and history restoration preserve an authored camera rather than auto-focusing a vehicle",
  4105. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4106. "screenshots": []
  4107. },
  4108. {
  4109. "status": "PASS",
  4110. "testTitle": "save B then undo A stays dirty, and redo B returns to the actual saved baseline",
  4111. "kind": "unit",
  4112. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4113. "ids": [
  4114. "history.undo",
  4115. "history.redo"
  4116. ],
  4117. "file": "validation.json",
  4118. "title": "save B then undo A stays dirty, and redo B returns to the actual saved baseline",
  4119. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4120. "screenshots": []
  4121. },
  4122. {
  4123. "status": "PASS",
  4124. "testTitle": "default history caps at 60 snapshots, stops at either edge and discards redo only after a new branch",
  4125. "kind": "unit",
  4126. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4127. "ids": [
  4128. "history.capacity",
  4129. "history.undo",
  4130. "history.redo"
  4131. ],
  4132. "file": "validation.json",
  4133. "title": "default history caps at 60 snapshots, stops at either edge and discards redo only after a new branch",
  4134. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4135. "screenshots": []
  4136. }
  4137. ]
  4138. },
  4139. {
  4140. "id": "history.redo",
  4141. "group": "历史与预览",
  4142. "name": "前进按钮 / Ctrl+Y / Ctrl+Shift+Z",
  4143. "source": {
  4144. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  4145. "symbol": "async redo()",
  4146. "line": 2437
  4147. },
  4148. "implementation": "本轮修复已完成验证",
  4149. "boundary": "撤销后重做,分叉编辑清 redo。",
  4150. "acceptance": "按钮与两种快捷键各执行;新编辑后旧 redo 不可用。",
  4151. "fix": "预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。;文档签名忽略更新时间和对象键顺序;保存后的 undo/redo 根据真实已保存文档判断 dirty;异步恢复失败保留现场并回滚历史索引。",
  4152. "fixIds": [
  4153. "SCENE-F05",
  4154. "SCENE-F07"
  4155. ],
  4156. "verification": "PASS",
  4157. "evidence": [
  4158. {
  4159. "status": "PASS",
  4160. "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  4161. "recordedAt": "2026-09-06T10:30:32.596Z",
  4162. "kind": "browser",
  4163. "ids": [
  4164. "project.save-key",
  4165. "part.transform",
  4166. "part.soft-delete",
  4167. "history.undo",
  4168. "history.redo",
  4169. "property.name",
  4170. "view.enclosure-full",
  4171. "view.enclosure-xray",
  4172. "view.enclosure-hidden"
  4173. ],
  4174. "file": "evidence/truck-part-history.json",
  4175. "title": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致",
  4176. "details": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。",
  4177. "screenshots": []
  4178. },
  4179. {
  4180. "status": "PASS",
  4181. "testTitle": "typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts",
  4182. "kind": "unit",
  4183. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4184. "ids": [
  4185. "history.undo",
  4186. "history.redo",
  4187. "transform.keys",
  4188. "lifecycle.cache"
  4189. ],
  4190. "file": "validation.json",
  4191. "title": "typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts",
  4192. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4193. "screenshots": []
  4194. },
  4195. {
  4196. "status": "PASS",
  4197. "testTitle": "save B then undo A stays dirty, and redo B returns to the actual saved baseline",
  4198. "kind": "unit",
  4199. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4200. "ids": [
  4201. "history.undo",
  4202. "history.redo"
  4203. ],
  4204. "file": "validation.json",
  4205. "title": "save B then undo A stays dirty, and redo B returns to the actual saved baseline",
  4206. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4207. "screenshots": []
  4208. },
  4209. {
  4210. "status": "PASS",
  4211. "testTitle": "default history caps at 60 snapshots, stops at either edge and discards redo only after a new branch",
  4212. "kind": "unit",
  4213. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4214. "ids": [
  4215. "history.capacity",
  4216. "history.undo",
  4217. "history.redo"
  4218. ],
  4219. "file": "validation.json",
  4220. "title": "default history caps at 60 snapshots, stops at either edge and discards redo only after a new branch",
  4221. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4222. "screenshots": []
  4223. }
  4224. ]
  4225. },
  4226. {
  4227. "id": "history.capacity",
  4228. "group": "历史与预览",
  4229. "name": "60 步历史上限与边界",
  4230. "source": {
  4231. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  4232. "symbol": "new SceneHistory(60)",
  4233. "line": 180
  4234. },
  4235. "implementation": "已有实现已完成验证",
  4236. "boundary": "历史属于本次编辑会话;不宣称服务端版本历史。",
  4237. "acceptance": "聚焦测试验证 60 步边界、空 undo/redo 与失焦快照。",
  4238. "fix": "尚未关联本轮修复记录",
  4239. "fixIds": [],
  4240. "verification": "PASS",
  4241. "evidence": [
  4242. {
  4243. "status": "PASS",
  4244. "testTitle": "default history caps at 60 snapshots, stops at either edge and discards redo only after a new branch",
  4245. "kind": "unit",
  4246. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4247. "ids": [
  4248. "history.capacity",
  4249. "history.undo",
  4250. "history.redo"
  4251. ],
  4252. "file": "validation.json",
  4253. "title": "default history caps at 60 snapshots, stops at either edge and discards redo only after a new branch",
  4254. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4255. "screenshots": []
  4256. }
  4257. ]
  4258. },
  4259. {
  4260. "id": "history.failure",
  4261. "group": "历史与预览",
  4262. "name": "异步历史恢复失败/互斥",
  4263. "source": {
  4264. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  4265. "symbol": "async restoreHistoryState",
  4266. "line": 2328
  4267. },
  4268. "implementation": "本轮修复已完成验证",
  4269. "boundary": "失败不能推进索引或丢当前有效场景;忙碌时写操作需一致。",
  4270. "acceptance": "GLB 恢复失败、并发 undo/redo、保存混入均不半提交。",
  4271. "fix": "文档签名忽略更新时间和对象键顺序;保存后的 undo/redo 根据真实已保存文档判断 dirty;异步恢复失败保留现场并回滚历史索引。",
  4272. "fixIds": [
  4273. "SCENE-F07"
  4274. ],
  4275. "verification": "PASS",
  4276. "evidence": [
  4277. {
  4278. "status": "PASS",
  4279. "testTitle": "failed undo restoration retains live objects and keeps the undo target available for retry",
  4280. "kind": "unit",
  4281. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4282. "ids": [
  4283. "history.failure"
  4284. ],
  4285. "file": "validation.json",
  4286. "title": "failed undo restoration retains live objects and keeps the undo target available for retry",
  4287. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4288. "screenshots": []
  4289. },
  4290. {
  4291. "status": "PASS",
  4292. "testTitle": "replacement failure waits for other started loads before restoring the original scene",
  4293. "kind": "unit",
  4294. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4295. "ids": [
  4296. "history.failure",
  4297. "glb.pending"
  4298. ],
  4299. "file": "validation.json",
  4300. "title": "replacement failure waits for other started loads before restoring the original scene",
  4301. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4302. "screenshots": []
  4303. }
  4304. ]
  4305. },
  4306. {
  4307. "id": "preview.enter",
  4308. "group": "历史与预览",
  4309. "name": "进入运行预览",
  4310. "source": {
  4311. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  4312. "symbol": "togglePreview()",
  4313. "line": 583
  4314. },
  4315. "implementation": "本轮修复已完成验证",
  4316. "boundary": "当前默认预览只展示场景,未接模型 timeline/blueprint 自动执行。",
  4317. "acceptance": "实际进入,辅助选择/手柄状态正常,模型可见。",
  4318. "fix": "预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。",
  4319. "fixIds": [
  4320. "SCENE-F05"
  4321. ],
  4322. "verification": "PASS",
  4323. "evidence": [
  4324. {
  4325. "status": "PASS",
  4326. "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  4327. "recordedAt": "2026-09-06T10:31:05.221Z",
  4328. "kind": "browser",
  4329. "ids": [
  4330. "permission.readonly",
  4331. "permission.update",
  4332. "permission.publish",
  4333. "preview.enter",
  4334. "preview.exit",
  4335. "preview.lock",
  4336. "json.export"
  4337. ],
  4338. "file": "evidence/readonly.json",
  4339. "title": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  4340. "details": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。",
  4341. "screenshots": []
  4342. },
  4343. {
  4344. "status": "PASS",
  4345. "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  4346. "recordedAt": "2026-09-06T10:29:44.118Z",
  4347. "kind": "真实UI+只读投影",
  4348. "ids": [
  4349. "view.orbit",
  4350. "view.pan",
  4351. "view.zoom",
  4352. "view.top",
  4353. "view.perspective",
  4354. "view.grid",
  4355. "view.focus",
  4356. "selection.viewport",
  4357. "selection.highlight",
  4358. "preview.enter",
  4359. "preview.exit",
  4360. "preview.lock",
  4361. "lifecycle.resize-theme"
  4362. ],
  4363. "file": "evidence/viewport-camera-theme.json",
  4364. "title": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  4365. "details": "",
  4366. "screenshots": [
  4367. "40-viewport-dark-1920",
  4368. "41-viewport-light-1440",
  4369. "42-fox-preview-original-material"
  4370. ]
  4371. }
  4372. ]
  4373. },
  4374. {
  4375. "id": "preview.exit",
  4376. "group": "历史与预览",
  4377. "name": "按钮 / Escape 退出预览",
  4378. "source": {
  4379. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  4380. "symbol": "handleKeyboard(event)",
  4381. "line": 469
  4382. },
  4383. "implementation": "本轮修复已完成验证",
  4384. "boundary": "退出后恢复编辑选择与状态;不得丢未存变换。",
  4385. "acceptance": "两种退出方式均有效,输入焦点与缓存激活行为正确。",
  4386. "fix": "预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。",
  4387. "fixIds": [
  4388. "SCENE-F05"
  4389. ],
  4390. "verification": "PASS",
  4391. "evidence": [
  4392. {
  4393. "status": "PASS",
  4394. "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  4395. "recordedAt": "2026-09-06T10:31:05.221Z",
  4396. "kind": "browser",
  4397. "ids": [
  4398. "permission.readonly",
  4399. "permission.update",
  4400. "permission.publish",
  4401. "preview.enter",
  4402. "preview.exit",
  4403. "preview.lock",
  4404. "json.export"
  4405. ],
  4406. "file": "evidence/readonly.json",
  4407. "title": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  4408. "details": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。",
  4409. "screenshots": []
  4410. },
  4411. {
  4412. "status": "PASS",
  4413. "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  4414. "recordedAt": "2026-09-06T10:29:44.118Z",
  4415. "kind": "真实UI+只读投影",
  4416. "ids": [
  4417. "view.orbit",
  4418. "view.pan",
  4419. "view.zoom",
  4420. "view.top",
  4421. "view.perspective",
  4422. "view.grid",
  4423. "view.focus",
  4424. "selection.viewport",
  4425. "selection.highlight",
  4426. "preview.enter",
  4427. "preview.exit",
  4428. "preview.lock",
  4429. "lifecycle.resize-theme"
  4430. ],
  4431. "file": "evidence/viewport-camera-theme.json",
  4432. "title": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  4433. "details": "",
  4434. "screenshots": [
  4435. "40-viewport-dark-1920",
  4436. "41-viewport-light-1440",
  4437. "42-fox-preview-original-material"
  4438. ]
  4439. },
  4440. {
  4441. "status": "PASS",
  4442. "testTitle": "preview locks mutation controls and Delete while Escape restores editing",
  4443. "kind": "unit",
  4444. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4445. "ids": [
  4446. "preview.lock",
  4447. "preview.exit"
  4448. ],
  4449. "file": "validation.json",
  4450. "title": "preview locks mutation controls and Delete while Escape restores editing",
  4451. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4452. "screenshots": []
  4453. }
  4454. ]
  4455. },
  4456. {
  4457. "id": "preview.lock",
  4458. "group": "历史与预览",
  4459. "name": "预览中禁止编辑",
  4460. "source": {
  4461. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  4462. "symbol": "togglePreview()",
  4463. "line": 583
  4464. },
  4465. "implementation": "本轮修复已完成验证",
  4466. "boundary": "显示“场景编辑锁定”必须覆盖属性、删除、模板、导入和快捷键。",
  4467. "acceptance": "尝试所有写入口,预览时文档不改变;退出后正常。",
  4468. "fix": "预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。",
  4469. "fixIds": [
  4470. "SCENE-F05"
  4471. ],
  4472. "verification": "PASS",
  4473. "evidence": [
  4474. {
  4475. "status": "PASS",
  4476. "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  4477. "recordedAt": "2026-09-06T10:31:05.221Z",
  4478. "kind": "browser",
  4479. "ids": [
  4480. "permission.readonly",
  4481. "permission.update",
  4482. "permission.publish",
  4483. "preview.enter",
  4484. "preview.exit",
  4485. "preview.lock",
  4486. "json.export"
  4487. ],
  4488. "file": "evidence/readonly.json",
  4489. "title": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  4490. "details": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。",
  4491. "screenshots": []
  4492. },
  4493. {
  4494. "status": "PASS",
  4495. "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  4496. "recordedAt": "2026-09-06T10:29:44.118Z",
  4497. "kind": "真实UI+只读投影",
  4498. "ids": [
  4499. "view.orbit",
  4500. "view.pan",
  4501. "view.zoom",
  4502. "view.top",
  4503. "view.perspective",
  4504. "view.grid",
  4505. "view.focus",
  4506. "selection.viewport",
  4507. "selection.highlight",
  4508. "preview.enter",
  4509. "preview.exit",
  4510. "preview.lock",
  4511. "lifecycle.resize-theme"
  4512. ],
  4513. "file": "evidence/viewport-camera-theme.json",
  4514. "title": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  4515. "details": "",
  4516. "screenshots": [
  4517. "40-viewport-dark-1920",
  4518. "41-viewport-light-1440",
  4519. "42-fox-preview-original-material"
  4520. ]
  4521. },
  4522. {
  4523. "status": "PASS",
  4524. "testTitle": "preview locks mutation controls and Delete while Escape restores editing",
  4525. "kind": "unit",
  4526. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4527. "ids": [
  4528. "preview.lock",
  4529. "preview.exit"
  4530. ],
  4531. "file": "validation.json",
  4532. "title": "preview locks mutation controls and Delete while Escape restores editing",
  4533. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4534. "screenshots": []
  4535. }
  4536. ]
  4537. },
  4538. {
  4539. "id": "cover.capture",
  4540. "group": "保存封面、发布与依赖",
  4541. "name": "保存时截取当前三维场景封面",
  4542. "source": {
  4543. "file": "../../../unreal_tran_web/src/features/scene-legacy/sceneCoverCapture.ts",
  4544. "symbol": "export async function captureSceneCover",
  4545. "line": 26
  4546. },
  4547. "implementation": "已有实现已完成验证",
  4548. "boundary": "JPEG 最大边 640、当前相机;隐藏手柄/网格/高亮且恢复现场。",
  4549. "acceptance": "截图与服务端图片可辨一致,像素实际有模型,UI 状态不被破坏。",
  4550. "fix": "尚未关联本轮修复记录",
  4551. "fixIds": [],
  4552. "verification": "PASS",
  4553. "evidence": [
  4554. {
  4555. "status": "PASS",
  4556. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  4557. "recordedAt": "2026-09-06T10:30:14.385Z",
  4558. "kind": "browser",
  4559. "ids": [
  4560. "project.load",
  4561. "project.title",
  4562. "project.save",
  4563. "selection.tree",
  4564. "property.name",
  4565. "property.visible",
  4566. "property.operable",
  4567. "property.position",
  4568. "property.rotation",
  4569. "property.scale",
  4570. "property.device-id",
  4571. "property.model-id",
  4572. "property.semantic",
  4573. "part.source",
  4574. "panel.binding",
  4575. "cover.capture",
  4576. "cover.atomic"
  4577. ],
  4578. "file": "evidence/fox-properties-cover.json",
  4579. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  4580. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  4581. "screenshots": []
  4582. },
  4583. {
  4584. "status": "PASS",
  4585. "testTitle": "copies synchronously without bounds, gizmo, grid or selection glow, then restores before JPEG encoding",
  4586. "kind": "unit",
  4587. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4588. "ids": [
  4589. "cover.capture",
  4590. "selection.highlight",
  4591. "view.grid"
  4592. ],
  4593. "file": "validation.json",
  4594. "title": "copies synchronously without bounds, gizmo, grid or selection glow, then restores before JPEG encoding",
  4595. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4596. "screenshots": []
  4597. }
  4598. ]
  4599. },
  4600. {
  4601. "id": "cover.atomic",
  4602. "group": "保存封面、发布与依赖",
  4603. "name": "封面资产与文档同次保存",
  4604. "source": {
  4605. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  4606. "symbol": "saveSceneDocumentWithCover",
  4607. "line": 47
  4608. },
  4609. "implementation": "已有实现已完成验证",
  4610. "boundary": "封面 upload ticket 与 version 同一次 PUT 消费,不另存过期文档。",
  4611. "acceptance": "检查资产/封面字段/当前版本相同,并真实列表加载图片。",
  4612. "fix": "尚未关联本轮修复记录",
  4613. "fixIds": [],
  4614. "verification": "PASS",
  4615. "evidence": [
  4616. {
  4617. "status": "PASS",
  4618. "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  4619. "recordedAt": "2026-09-06T10:30:14.385Z",
  4620. "kind": "browser",
  4621. "ids": [
  4622. "project.load",
  4623. "project.title",
  4624. "project.save",
  4625. "selection.tree",
  4626. "property.name",
  4627. "property.visible",
  4628. "property.operable",
  4629. "property.position",
  4630. "property.rotation",
  4631. "property.scale",
  4632. "property.device-id",
  4633. "property.model-id",
  4634. "property.semantic",
  4635. "part.source",
  4636. "panel.binding",
  4637. "cover.capture",
  4638. "cover.atomic"
  4639. ],
  4640. "file": "evidence/fox-properties-cover.json",
  4641. "title": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开",
  4642. "details": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。",
  4643. "screenshots": []
  4644. },
  4645. {
  4646. "status": "PASS",
  4647. "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  4648. "recordedAt": "2026-09-06T10:27:04.782Z",
  4649. "kind": "browser",
  4650. "ids": [
  4651. "validation.complete",
  4652. "validation.bindings",
  4653. "panel.validation",
  4654. "publish.saved",
  4655. "publish.failure",
  4656. "publish.fixed-model",
  4657. "cover.atomic",
  4658. "project.back"
  4659. ],
  4660. "file": "evidence/publish-fixed-version.json",
  4661. "title": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  4662. "details": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。",
  4663. "screenshots": []
  4664. },
  4665. {
  4666. "status": "PASS",
  4667. "testTitle": "scene image ticket, fixed asset replacement, dependencies and coverUri commit in one versioned PUT",
  4668. "kind": "unit",
  4669. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4670. "ids": [
  4671. "cover.atomic"
  4672. ],
  4673. "file": "validation.json",
  4674. "title": "scene image ticket, fixed asset replacement, dependencies and coverUri commit in one versioned PUT",
  4675. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4676. "screenshots": []
  4677. }
  4678. ]
  4679. },
  4680. {
  4681. "id": "cover.failure",
  4682. "group": "保存封面、发布与依赖",
  4683. "name": "截图/封面上传失败保留原封面",
  4684. "source": {
  4685. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  4686. "symbol": "coverFailed",
  4687. "line": 390
  4688. },
  4689. "implementation": "已有实现已完成验证",
  4690. "boundary": "正文可保存时给真实 warning;409 必须阻断且不得覆盖。",
  4691. "acceptance": "截图失败、上传503、PUT409各自核对保留/提示/零错误发布。",
  4692. "fix": "尚未关联本轮修复记录",
  4693. "fixIds": [],
  4694. "verification": "PASS",
  4695. "evidence": [
  4696. {
  4697. "status": "PASS",
  4698. "testTitle": "保存失败与封面降级:503 保留草稿,封面上传失败保留旧图,恢复后可重试",
  4699. "recordedAt": "2026-09-06T10:26:33.388Z",
  4700. "kind": "browser",
  4701. "ids": [
  4702. "project.save-failure",
  4703. "cover.failure"
  4704. ],
  4705. "file": "evidence/save-cover-failure.json",
  4706. "title": "保存失败与封面降级:503 保留草稿,封面上传失败保留旧图,恢复后可重试",
  4707. "details": "正文PUT503不清草稿;封面上传503保留旧图但正文可保存;恢复服务后保存刷新。截图异常和409另由聚焦合同验证。",
  4708. "screenshots": []
  4709. },
  4710. {
  4711. "status": "PASS",
  4712. "testTitle": "capture failure saves content with the previous cover and reports a warning result",
  4713. "kind": "unit",
  4714. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4715. "ids": [
  4716. "cover.failure"
  4717. ],
  4718. "file": "validation.json",
  4719. "title": "capture failure saves content with the previous cover and reports a warning result",
  4720. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4721. "screenshots": []
  4722. },
  4723. {
  4724. "status": "PASS",
  4725. "testTitle": "upload conflict propagates without any content PUT",
  4726. "kind": "unit",
  4727. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4728. "ids": [
  4729. "project.conflict",
  4730. "cover.failure"
  4731. ],
  4732. "file": "validation.json",
  4733. "title": "upload conflict propagates without any content PUT",
  4734. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4735. "screenshots": []
  4736. }
  4737. ]
  4738. },
  4739. {
  4740. "id": "validation.complete",
  4741. "group": "保存封面、发布与依赖",
  4742. "name": "环境、对象用途、模型加载检查",
  4743. "source": {
  4744. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  4745. "symbol": "verifyScene(showToast",
  4746. "line": 1715
  4747. },
  4748. "implementation": "已有实现已完成验证",
  4749. "boundary": "纯环境允许;模型未完成解析必须阻断。",
  4750. "acceptance": "空地板/纯环境/带模型和加载中分别核对检查结果。",
  4751. "fix": "尚未关联本轮修复记录",
  4752. "fixIds": [],
  4753. "verification": "PASS",
  4754. "evidence": [
  4755. {
  4756. "status": "PASS",
  4757. "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  4758. "recordedAt": "2026-09-06T10:27:04.782Z",
  4759. "kind": "browser",
  4760. "ids": [
  4761. "validation.complete",
  4762. "validation.bindings",
  4763. "panel.validation",
  4764. "publish.saved",
  4765. "publish.failure",
  4766. "publish.fixed-model",
  4767. "cover.atomic",
  4768. "project.back"
  4769. ],
  4770. "file": "evidence/publish-fixed-version.json",
  4771. "title": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  4772. "details": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。",
  4773. "screenshots": []
  4774. }
  4775. ]
  4776. },
  4777. {
  4778. "id": "validation.bindings",
  4779. "group": "保存封面、发布与依赖",
  4780. "name": "设备/物模型编号完整与唯一",
  4781. "source": {
  4782. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  4783. "symbol": "verifyScene(showToast",
  4784. "line": 1715
  4785. },
  4786. "implementation": "本轮修复已完成验证",
  4787. "boundary": "空白、重复编号按前后端合同处理,不自动替用户分配新业务身份。",
  4788. "acceptance": "空、空格、重复与合法编号;错误项可见,发布被阻断。",
  4789. "fix": "恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。;设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。",
  4790. "fixIds": [
  4791. "SCENE-F06",
  4792. "SCENE-F10"
  4793. ],
  4794. "verification": "PASS",
  4795. "evidence": [
  4796. {
  4797. "status": "PASS",
  4798. "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  4799. "recordedAt": "2026-09-06T10:27:04.782Z",
  4800. "kind": "browser",
  4801. "ids": [
  4802. "validation.complete",
  4803. "validation.bindings",
  4804. "panel.validation",
  4805. "publish.saved",
  4806. "publish.failure",
  4807. "publish.fixed-model",
  4808. "cover.atomic",
  4809. "project.back"
  4810. ],
  4811. "file": "evidence/publish-fixed-version.json",
  4812. "title": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  4813. "details": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。",
  4814. "screenshots": []
  4815. },
  4816. {
  4817. "status": "PASS",
  4818. "testTitle": "new resource bindings do not reuse a saved serial after earlier objects were deleted",
  4819. "kind": "unit",
  4820. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4821. "ids": [
  4822. "validation.bindings"
  4823. ],
  4824. "file": "validation.json",
  4825. "title": "new resource bindings do not reuse a saved serial after earlier objects were deleted",
  4826. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4827. "screenshots": []
  4828. },
  4829. {
  4830. "status": "PASS",
  4831. "testTitle": "verify opens live validation and whitespace binding edits immediately invalidate the active tab",
  4832. "kind": "unit",
  4833. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4834. "ids": [
  4835. "panel.validation",
  4836. "validation.bindings"
  4837. ],
  4838. "file": "validation.json",
  4839. "title": "verify opens live validation and whitespace binding edits immediately invalidate the active tab",
  4840. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4841. "screenshots": []
  4842. }
  4843. ]
  4844. },
  4845. {
  4846. "id": "validation.references",
  4847. "group": "保存封面、发布与依赖",
  4848. "name": "受控资源引用完整性",
  4849. "source": {
  4850. "file": "../../../unreal_tran_web/src/features/scene-legacy/serverAssetStore.ts",
  4851. "symbol": "hasReferenceSync",
  4852. "line": 18
  4853. },
  4854. "implementation": "本轮修复已完成验证",
  4855. "boundary": "project/version/assetCode/sourceAssetId 必须指向实际固定资产,不能只测有字段。",
  4856. "acceptance": "不存在编码/错误资产类型/跨项目引用显式拒绝;正确依赖通过。",
  4857. "fix": "前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。;新增 SceneResourceReferenceValidator 检查 objects 和递归 splitParts;自有/固定版本资源的所有显式引用必须指向同一 READY 模型文件,错误引用在发布/提交前阻断,保留受控的内置资源和旧引用兼容。",
  4858. "fixIds": [
  4859. "SCENE-F12",
  4860. "SCENE-F13"
  4861. ],
  4862. "verification": "PASS",
  4863. "evidence": [
  4864. {
  4865. "status": "PASS",
  4866. "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  4867. "recordedAt": "2026-09-06T10:26:19.703Z",
  4868. "kind": "browser",
  4869. "ids": [
  4870. "json.export",
  4871. "json.import",
  4872. "json.invalid",
  4873. "json.missing-resource",
  4874. "json.rendering",
  4875. "glb.import",
  4876. "glb.invalid",
  4877. "glb.references",
  4878. "validation.references"
  4879. ],
  4880. "file": "evidence/json-glb-roundtrip.json",
  4881. "title": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返",
  4882. "details": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。",
  4883. "screenshots": []
  4884. },
  4885. {
  4886. "status": "PASS",
  4887. "testTitle": "an explicit missing code cannot fall back to the first READY asset",
  4888. "kind": "unit",
  4889. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  4890. "ids": [
  4891. "validation.references",
  4892. "json.missing-resource"
  4893. ],
  4894. "file": "validation.json",
  4895. "title": "an explicit missing code cannot fall back to the first READY asset",
  4896. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  4897. "screenshots": []
  4898. }
  4899. ]
  4900. },
  4901. {
  4902. "id": "publish.saved",
  4903. "group": "保存封面、发布与依赖",
  4904. "name": "发布场景按钮的真实 API 闭环",
  4905. "source": {
  4906. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  4907. "symbol": "async publishScene()",
  4908. "line": 2213
  4909. },
  4910. "implementation": "已有实现已完成验证",
  4911. "boundary": "有编辑权时先保存含封面再发布;两步均成功才显示已发布。",
  4912. "acceptance": "POST 真正发布当前版本,列表状态与下游目录一致。",
  4913. "fix": "尚未关联本轮修复记录",
  4914. "fixIds": [],
  4915. "verification": "PASS",
  4916. "evidence": [
  4917. {
  4918. "status": "PASS",
  4919. "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  4920. "recordedAt": "2026-09-06T10:27:04.782Z",
  4921. "kind": "browser",
  4922. "ids": [
  4923. "validation.complete",
  4924. "validation.bindings",
  4925. "panel.validation",
  4926. "publish.saved",
  4927. "publish.failure",
  4928. "publish.fixed-model",
  4929. "cover.atomic",
  4930. "project.back"
  4931. ],
  4932. "file": "evidence/publish-fixed-version.json",
  4933. "title": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  4934. "details": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。",
  4935. "screenshots": []
  4936. }
  4937. ]
  4938. },
  4939. {
  4940. "id": "publish.only",
  4941. "group": "保存封面、发布与依赖",
  4942. "name": "只有发布权限时发布已存版本",
  4943. "source": {
  4944. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  4945. "symbol": "if (this.readOnly)",
  4946. "line": 335
  4947. },
  4948. "implementation": "已有实现已完成验证",
  4949. "boundary": "publish-only 不先 PUT、不上传封面、不要求 update;服务器校验真值。",
  4950. "acceptance": "隔离权限会话发布已存有效版本,零 update/upload 请求。",
  4951. "fix": "尚未关联本轮修复记录",
  4952. "fixIds": [],
  4953. "verification": "PASS",
  4954. "evidence": [
  4955. {
  4956. "status": "PASS",
  4957. "testTitle": "仅场景发布权限:浏览器发布已存副本,不发送保存或上传请求",
  4958. "recordedAt": "2026-09-06T10:25:19.519Z",
  4959. "kind": "browser",
  4960. "ids": [
  4961. "permission.publish",
  4962. "publish.only",
  4963. "publish.fixed-model"
  4964. ],
  4965. "file": "evidence/scene-publish-only.json",
  4966. "title": "仅场景发布权限:浏览器发布已存副本,不发送保存或上传请求",
  4967. "details": "",
  4968. "screenshots": []
  4969. }
  4970. ]
  4971. },
  4972. {
  4973. "id": "publish.failure",
  4974. "group": "保存封面、发布与依赖",
  4975. "name": "预检/保存/发布失败阻断",
  4976. "source": {
  4977. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  4978. "symbol": "async publishScene()",
  4979. "line": 2213
  4980. },
  4981. "implementation": "本轮修复已完成验证",
  4982. "boundary": "保存失败不 POST 发布;发布失败不假标已发布;保持错误恢复能力。",
  4983. "acceptance": "预检错误、PUT409/503、POST失败及重试,版本/状态准确。",
  4984. "fix": "新增 SceneResourceReferenceValidator 检查 objects 和递归 splitParts;自有/固定版本资源的所有显式引用必须指向同一 READY 模型文件,错误引用在发布/提交前阻断,保留受控的内置资源和旧引用兼容。",
  4985. "fixIds": [
  4986. "SCENE-F13"
  4987. ],
  4988. "verification": "PASS",
  4989. "evidence": [
  4990. {
  4991. "status": "PASS",
  4992. "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  4993. "recordedAt": "2026-09-06T10:27:04.782Z",
  4994. "kind": "browser",
  4995. "ids": [
  4996. "validation.complete",
  4997. "validation.bindings",
  4998. "panel.validation",
  4999. "publish.saved",
  5000. "publish.failure",
  5001. "publish.fixed-model",
  5002. "cover.atomic",
  5003. "project.back"
  5004. ],
  5005. "file": "evidence/publish-fixed-version.json",
  5006. "title": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  5007. "details": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。",
  5008. "screenshots": []
  5009. }
  5010. ]
  5011. },
  5012. {
  5013. "id": "publish.concurrent",
  5014. "group": "保存封面、发布与依赖",
  5015. "name": "重复发布与上传/保存队列",
  5016. "source": {
  5017. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  5018. "symbol": "publishDocument:",
  5019. "line": 509
  5020. },
  5021. "implementation": "已有实现已完成验证",
  5022. "boundary": "整条 POST 完成前仍占 FIFO;重复操作不串版本。",
  5023. "acceptance": "延迟上传/保存/发布并触发竞争,服务端只有完整合法版本。",
  5024. "fix": "尚未关联本轮修复记录",
  5025. "fixIds": [],
  5026. "verification": "PASS",
  5027. "evidence": [
  5028. {
  5029. "status": "PASS",
  5030. "testTitle": "role switch waits through validation, save, and the later queued publish after dirty clears",
  5031. "kind": "unit",
  5032. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5033. "ids": [
  5034. "publish.concurrent",
  5035. "leave.busy",
  5036. "leave.role-switch"
  5037. ],
  5038. "file": "validation.json",
  5039. "title": "role switch waits through validation, save, and the later queued publish after dirty clears",
  5040. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5041. "screenshots": []
  5042. },
  5043. {
  5044. "status": "PASS",
  5045. "testTitle": "project operation queue serializes upload, save and publish including failures",
  5046. "kind": "unit",
  5047. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5048. "ids": [
  5049. "publish.concurrent"
  5050. ],
  5051. "file": "validation.json",
  5052. "title": "project operation queue serializes upload, save and publish including failures",
  5053. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5054. "screenshots": []
  5055. }
  5056. ]
  5057. },
  5058. {
  5059. "id": "publish.fixed-model",
  5060. "group": "保存封面、发布与依赖",
  5061. "name": "固定 SCENE_MODEL 版本与多个实例",
  5062. "source": {
  5063. "file": "../../../unreal_tran_web/src/features/scene-legacy/contentApiClient.ts",
  5064. "symbol": "collectSceneModelDependencies",
  5065. "line": 938
  5066. },
  5067. "implementation": "本轮修复已完成验证",
  5068. "boundary": "去重精确模型版本,不能随模型新发布静默换源版本。",
  5069. "acceptance": "同模型多实例及另模型新版本,场景重开仍使用所存固定版本。",
  5070. "fix": "前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。;新增 SceneResourceReferenceValidator 检查 objects 和递归 splitParts;自有/固定版本资源的所有显式引用必须指向同一 READY 模型文件,错误引用在发布/提交前阻断,保留受控的内置资源和旧引用兼容。;完整 PUT 回写原有相同 SCENE_MODEL 三元组时沿用场景授权边界;新增或改版依赖仍要求来源模型可见及范围权限,不扩大模型页面访问权。;新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。",
  5071. "fixIds": [
  5072. "SCENE-F12",
  5073. "SCENE-F13",
  5074. "SCENE-F14",
  5075. "SCENE-F18"
  5076. ],
  5077. "verification": "PASS",
  5078. "evidence": [
  5079. {
  5080. "status": "PASS",
  5081. "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  5082. "recordedAt": "2026-09-06T10:27:04.782Z",
  5083. "kind": "browser",
  5084. "ids": [
  5085. "validation.complete",
  5086. "validation.bindings",
  5087. "panel.validation",
  5088. "publish.saved",
  5089. "publish.failure",
  5090. "publish.fixed-model",
  5091. "cover.atomic",
  5092. "project.back"
  5093. ],
  5094. "file": "evidence/publish-fixed-version.json",
  5095. "title": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用",
  5096. "details": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。",
  5097. "screenshots": []
  5098. },
  5099. {
  5100. "status": "PASS",
  5101. "testTitle": "仅场景发布权限:浏览器发布已存副本,不发送保存或上传请求",
  5102. "recordedAt": "2026-09-06T10:25:19.519Z",
  5103. "kind": "browser",
  5104. "ids": [
  5105. "permission.publish",
  5106. "publish.only",
  5107. "publish.fixed-model"
  5108. ],
  5109. "file": "evidence/scene-publish-only.json",
  5110. "title": "仅场景发布权限:浏览器发布已存副本,不发送保存或上传请求",
  5111. "details": "",
  5112. "screenshots": []
  5113. },
  5114. {
  5115. "status": "PASS",
  5116. "testTitle": "仅场景编辑权限:固定模型可加载和保存,不能发布或访问模型页面",
  5117. "recordedAt": "2026-09-06T10:25:11.741Z",
  5118. "kind": "browser",
  5119. "ids": [
  5120. "permission.update",
  5121. "permission.publish",
  5122. "publish.fixed-model"
  5123. ],
  5124. "file": "evidence/scene-update-only.json",
  5125. "title": "仅场景编辑权限:固定模型可加载和保存,不能发布或访问模型页面",
  5126. "details": "",
  5127. "screenshots": []
  5128. },
  5129. {
  5130. "status": "PASS",
  5131. "testTitle": "legacy duplicate instance IDs migrate only later owners in document order despite reversed GLB completion",
  5132. "kind": "unit",
  5133. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5134. "ids": [
  5135. "part.transform",
  5136. "publish.fixed-model"
  5137. ],
  5138. "file": "validation.json",
  5139. "title": "legacy duplicate instance IDs migrate only later owners in document order despite reversed GLB completion",
  5140. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5141. "screenshots": []
  5142. },
  5143. {
  5144. "status": "PASS",
  5145. "testTitle": "fixed model reads the exact version and downloads through its visible scene dependency",
  5146. "kind": "unit",
  5147. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5148. "ids": [
  5149. "publish.fixed-model",
  5150. "permission.update"
  5151. ],
  5152. "file": "validation.json",
  5153. "title": "fixed model reads the exact version and downloads through its visible scene dependency",
  5154. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5155. "screenshots": []
  5156. },
  5157. {
  5158. "status": "PASS",
  5159. "testTitle": "fixed model dependencies are recursively collected, exact and de-duplicated",
  5160. "kind": "unit",
  5161. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5162. "ids": [
  5163. "publish.fixed-model"
  5164. ],
  5165. "file": "validation.json",
  5166. "title": "fixed model dependencies are recursively collected, exact and de-duplicated",
  5167. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5168. "screenshots": []
  5169. }
  5170. ]
  5171. },
  5172. {
  5173. "id": "publish.downstream",
  5174. "group": "保存封面、发布与依赖",
  5175. "name": "发布场景供训练选择和静态还原",
  5176. "source": {
  5177. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  5178. "symbol": "场景已发布,训练编排可以引用",
  5179. "line": 2227
  5180. },
  5181. "implementation": "已有实现已完成验证",
  5182. "boundary": "本轮只验证版本/目标/静态可见性;不承诺模型蓝图或原生动画自动执行。",
  5183. "acceptance": "新场景出现在正式训练目录,绑定后狐狸/卡车可见且目标身份一致。",
  5184. "fix": "尚未关联本轮修复记录",
  5185. "fixIds": [],
  5186. "verification": "PASS",
  5187. "evidence": [
  5188. {
  5189. "status": "PASS",
  5190. "testTitle": "fox:场景发布后在真实训练编排选择、保存并重开静态模型",
  5191. "recordedAt": "2026-09-06T10:24:43.055Z",
  5192. "kind": "browser",
  5193. "ids": [
  5194. "publish.downstream"
  5195. ],
  5196. "file": "evidence/downstream-fox.json",
  5197. "title": "fox:场景发布后在真实训练编排选择、保存并重开静态模型",
  5198. "details": "",
  5199. "screenshots": []
  5200. },
  5201. {
  5202. "status": "PASS",
  5203. "testTitle": "truck:场景发布后在真实训练编排选择、保存并重开静态模型",
  5204. "recordedAt": "2026-09-06T10:25:01.457Z",
  5205. "kind": "browser",
  5206. "ids": [
  5207. "publish.downstream"
  5208. ],
  5209. "file": "evidence/downstream-truck.json",
  5210. "title": "truck:场景发布后在真实训练编排选择、保存并重开静态模型",
  5211. "details": "",
  5212. "screenshots": []
  5213. }
  5214. ]
  5215. },
  5216. {
  5217. "id": "permission.update",
  5218. "group": "权限、缓存与未保存恢复",
  5219. "name": "场景细分编辑权限",
  5220. "source": {
  5221. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  5222. "symbol": "this.readOnly =",
  5223. "line": 149
  5224. },
  5225. "implementation": "本轮修复已完成验证",
  5226. "boundary": "只按 content.scene.update;基线残留 content.update 需修,不由角色名推断。",
  5227. "acceptance": "具更新权会话可编辑;无更新权的写入口和接口全部拒绝。",
  5228. "fix": "移除 runtime 旧 content.update 门槛,独立计算新建、更新和发布;无模型页面权限时不加载新模型目录,但既有固定依赖仍可按场景授权读取。;完整 PUT 回写原有相同 SCENE_MODEL 三元组时沿用场景授权边界;新增或改版依赖仍要求来源模型可见及范围权限,不扩大模型页面访问权。",
  5229. "fixIds": [
  5230. "SCENE-F01",
  5231. "SCENE-F14"
  5232. ],
  5233. "verification": "PASS",
  5234. "evidence": [
  5235. {
  5236. "status": "PASS",
  5237. "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  5238. "recordedAt": "2026-09-06T10:31:05.221Z",
  5239. "kind": "browser",
  5240. "ids": [
  5241. "permission.readonly",
  5242. "permission.update",
  5243. "permission.publish",
  5244. "preview.enter",
  5245. "preview.exit",
  5246. "preview.lock",
  5247. "json.export"
  5248. ],
  5249. "file": "evidence/readonly.json",
  5250. "title": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  5251. "details": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。",
  5252. "screenshots": []
  5253. },
  5254. {
  5255. "status": "PASS",
  5256. "testTitle": "仅场景编辑权限:固定模型可加载和保存,不能发布或访问模型页面",
  5257. "recordedAt": "2026-09-06T10:25:11.741Z",
  5258. "kind": "browser",
  5259. "ids": [
  5260. "permission.update",
  5261. "permission.publish",
  5262. "publish.fixed-model"
  5263. ],
  5264. "file": "evidence/scene-update-only.json",
  5265. "title": "仅场景编辑权限:固定模型可加载和保存,不能发布或访问模型页面",
  5266. "details": "",
  5267. "screenshots": []
  5268. },
  5269. {
  5270. "status": "PASS",
  5271. "testTitle": "scene granular update permission enables editing without the retired shared code",
  5272. "kind": "unit",
  5273. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5274. "ids": [
  5275. "permission.update"
  5276. ],
  5277. "file": "validation.json",
  5278. "title": "scene granular update permission enables editing without the retired shared code",
  5279. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5280. "screenshots": []
  5281. },
  5282. {
  5283. "status": "PASS",
  5284. "testTitle": "fixed model reads the exact version and downloads through its visible scene dependency",
  5285. "kind": "unit",
  5286. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5287. "ids": [
  5288. "publish.fixed-model",
  5289. "permission.update"
  5290. ],
  5291. "file": "validation.json",
  5292. "title": "fixed model reads the exact version and downloads through its visible scene dependency",
  5293. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5294. "screenshots": []
  5295. }
  5296. ]
  5297. },
  5298. {
  5299. "id": "permission.publish",
  5300. "group": "权限、缓存与未保存恢复",
  5301. "name": "场景细分发布权限",
  5302. "source": {
  5303. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  5304. "symbol": "this.canPublish =",
  5305. "line": 152
  5306. },
  5307. "implementation": "本轮修复已完成验证",
  5308. "boundary": "页面 content.scene 与 publish 动作分开;更新权不隐含发布。",
  5309. "acceptance": "只更新不能发布;仅发布可发布已存版本;无页面权不可访问。",
  5310. "fix": "移除 runtime 旧 content.update 门槛,独立计算新建、更新和发布;无模型页面权限时不加载新模型目录,但既有固定依赖仍可按场景授权读取。",
  5311. "fixIds": [
  5312. "SCENE-F01"
  5313. ],
  5314. "verification": "PASS",
  5315. "evidence": [
  5316. {
  5317. "status": "PASS",
  5318. "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  5319. "recordedAt": "2026-09-06T10:31:05.221Z",
  5320. "kind": "browser",
  5321. "ids": [
  5322. "permission.readonly",
  5323. "permission.update",
  5324. "permission.publish",
  5325. "preview.enter",
  5326. "preview.exit",
  5327. "preview.lock",
  5328. "json.export"
  5329. ],
  5330. "file": "evidence/readonly.json",
  5331. "title": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  5332. "details": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。",
  5333. "screenshots": []
  5334. },
  5335. {
  5336. "status": "PASS",
  5337. "testTitle": "无场景页面权限:编辑路由和直接内容接口均拒绝访问",
  5338. "recordedAt": "2026-09-06T10:25:24.402Z",
  5339. "kind": "browser",
  5340. "ids": [
  5341. "permission.publish"
  5342. ],
  5343. "file": "evidence/scene-no-page-permission.json",
  5344. "title": "无场景页面权限:编辑路由和直接内容接口均拒绝访问",
  5345. "details": "",
  5346. "screenshots": []
  5347. },
  5348. {
  5349. "status": "PASS",
  5350. "testTitle": "仅场景发布权限:浏览器发布已存副本,不发送保存或上传请求",
  5351. "recordedAt": "2026-09-06T10:25:19.519Z",
  5352. "kind": "browser",
  5353. "ids": [
  5354. "permission.publish",
  5355. "publish.only",
  5356. "publish.fixed-model"
  5357. ],
  5358. "file": "evidence/scene-publish-only.json",
  5359. "title": "仅场景发布权限:浏览器发布已存副本,不发送保存或上传请求",
  5360. "details": "",
  5361. "screenshots": []
  5362. },
  5363. {
  5364. "status": "PASS",
  5365. "testTitle": "仅场景编辑权限:固定模型可加载和保存,不能发布或访问模型页面",
  5366. "recordedAt": "2026-09-06T10:25:11.741Z",
  5367. "kind": "browser",
  5368. "ids": [
  5369. "permission.update",
  5370. "permission.publish",
  5371. "publish.fixed-model"
  5372. ],
  5373. "file": "evidence/scene-update-only.json",
  5374. "title": "仅场景编辑权限:固定模型可加载和保存,不能发布或访问模型页面",
  5375. "details": "",
  5376. "screenshots": []
  5377. }
  5378. ]
  5379. },
  5380. {
  5381. "id": "permission.readonly",
  5382. "group": "权限、缓存与未保存恢复",
  5383. "name": "只读仍可查看、搜索、选中和预览",
  5384. "source": {
  5385. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  5386. "symbol": "applyAccessMode()",
  5387. "line": 198
  5388. },
  5389. "implementation": "本轮修复已完成验证",
  5390. "boundary": "禁写不应误禁观察控件;临时视图不保存到服务器。",
  5391. "acceptance": "真实键盘搜索、选择、相机、预览,零内容写请求。",
  5392. "fix": "移除 runtime 旧 content.update 门槛,独立计算新建、更新和发布;无模型页面权限时不加载新模型目录,但既有固定依赖仍可按场景授权读取。",
  5393. "fixIds": [
  5394. "SCENE-F01"
  5395. ],
  5396. "verification": "PASS",
  5397. "evidence": [
  5398. {
  5399. "status": "PASS",
  5400. "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  5401. "recordedAt": "2026-09-06T10:31:05.221Z",
  5402. "kind": "browser",
  5403. "ids": [
  5404. "permission.readonly",
  5405. "permission.update",
  5406. "permission.publish",
  5407. "preview.enter",
  5408. "preview.exit",
  5409. "preview.lock",
  5410. "json.export"
  5411. ],
  5412. "file": "evidence/readonly.json",
  5413. "title": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景",
  5414. "details": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。",
  5415. "screenshots": []
  5416. },
  5417. {
  5418. "status": "PASS",
  5419. "testTitle": "后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限",
  5420. "recordedAt": "2026-09-06T10:25:39.438Z",
  5421. "kind": "browser",
  5422. "ids": [
  5423. "leave.role-switch",
  5424. "leave.cancel",
  5425. "leave.save",
  5426. "permission.readonly"
  5427. ],
  5428. "file": "evidence/scene-role-switch.json",
  5429. "title": "后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限",
  5430. "details": "",
  5431. "screenshots": []
  5432. }
  5433. ]
  5434. },
  5435. {
  5436. "id": "recovery.autobuffer",
  5437. "group": "权限、缓存与未保存恢复",
  5438. "name": "800ms 未保存恢复缓冲",
  5439. "source": {
  5440. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  5441. "symbol": "markDirty(label",
  5442. "line": 654
  5443. },
  5444. "implementation": "本轮修复已完成验证",
  5445. "boundary": "仅写隔离浏览器恢复稿,不伪称自动入库。",
  5446. "acceptance": "实际修改后等待,恢复稿存在但无自动 PUT;手动保存后入库。",
  5447. "fix": "顶部新建委托宿主命名与创建 API,先确认未保存内容。选择放弃也要等创建及导航成功后才清除原 dirty/恢复稿;创建503仍保留原稿。成功后刷新原缓存页,避免再次打开时将已放弃修改冒称已保存。取消、失败不清原场景,成功导航到新项目 ID,并有创建并发守卫。;开始保存时取消之前安排的恢复稿定时器,避免它覆盖宿主保存快照 nonce;保存中的后续编辑仍单独保留。",
  5448. "fixIds": [
  5449. "SCENE-F02",
  5450. "SCENE-F08"
  5451. ],
  5452. "verification": "PASS",
  5453. "evidence": [
  5454. {
  5455. "status": "PASS",
  5456. "testTitle": "同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载",
  5457. "recordedAt": "2026-09-06T10:26:49.585Z",
  5458. "kind": "browser",
  5459. "ids": [
  5460. "project.conflict",
  5461. "recovery.autobuffer",
  5462. "recovery.same-version",
  5463. "recovery.stale-version"
  5464. ],
  5465. "file": "evidence/real-recovery-conflict.json",
  5466. "title": "同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载",
  5467. "details": "真实未存输入产生恢复稿,同版本恢复不自动入库;另一版本先保存后409拒绝覆盖,旧稿隔离下载。",
  5468. "screenshots": []
  5469. },
  5470. {
  5471. "status": "PASS",
  5472. "testTitle": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突",
  5473. "recordedAt": "2026-09-06T10:24:27.147Z",
  5474. "kind": "browser",
  5475. "ids": [
  5476. "project.concurrent-save",
  5477. "project.save",
  5478. "project.save-key",
  5479. "recovery.autobuffer",
  5480. "recovery.same-version"
  5481. ],
  5482. "file": "evidence/save-concurrency.json",
  5483. "title": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突",
  5484. "details": "延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。",
  5485. "screenshots": []
  5486. },
  5487. {
  5488. "status": "PASS",
  5489. "testTitle": "双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿",
  5490. "recordedAt": "2026-09-06T10:25:56.822Z",
  5491. "kind": "browser",
  5492. "ids": [
  5493. "recovery.multi-session",
  5494. "recovery.autobuffer",
  5495. "recovery.discard",
  5496. "project.save"
  5497. ],
  5498. "file": "evidence/scene-multi-session.json",
  5499. "title": "双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿",
  5500. "details": "",
  5501. "screenshots": []
  5502. }
  5503. ]
  5504. },
  5505. {
  5506. "id": "recovery.same-version",
  5507. "group": "权限、缓存与未保存恢复",
  5508. "name": "同版本真实未保存恢复",
  5509. "source": {
  5510. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  5511. "symbol": "sceneRecoveryMatchesProjectVersion",
  5512. "line": 46
  5513. },
  5514. "implementation": "本轮修复已完成验证",
  5515. "boundary": "先回到视口,须显式保存才入库;相同文档不应产生假恢复。",
  5516. "acceptance": "真实修改后刷新,恢复/保存/再刷新;无注入假 localStorage 代替。",
  5517. "fix": "文档签名忽略更新时间和对象键顺序;保存后的 undo/redo 根据真实已保存文档判断 dirty;异步恢复失败保留现场并回滚历史索引。;开始保存时取消之前安排的恢复稿定时器,避免它覆盖宿主保存快照 nonce;保存中的后续编辑仍单独保留。",
  5518. "fixIds": [
  5519. "SCENE-F07",
  5520. "SCENE-F08"
  5521. ],
  5522. "verification": "PASS",
  5523. "evidence": [
  5524. {
  5525. "status": "PASS",
  5526. "testTitle": "同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载",
  5527. "recordedAt": "2026-09-06T10:26:49.585Z",
  5528. "kind": "browser",
  5529. "ids": [
  5530. "project.conflict",
  5531. "recovery.autobuffer",
  5532. "recovery.same-version",
  5533. "recovery.stale-version"
  5534. ],
  5535. "file": "evidence/real-recovery-conflict.json",
  5536. "title": "同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载",
  5537. "details": "真实未存输入产生恢复稿,同版本恢复不自动入库;另一版本先保存后409拒绝覆盖,旧稿隔离下载。",
  5538. "screenshots": []
  5539. },
  5540. {
  5541. "status": "PASS",
  5542. "testTitle": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突",
  5543. "recordedAt": "2026-09-06T10:24:27.147Z",
  5544. "kind": "browser",
  5545. "ids": [
  5546. "project.concurrent-save",
  5547. "project.save",
  5548. "project.save-key",
  5549. "recovery.autobuffer",
  5550. "recovery.same-version"
  5551. ],
  5552. "file": "evidence/save-concurrency.json",
  5553. "title": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突",
  5554. "details": "延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。",
  5555. "screenshots": []
  5556. }
  5557. ]
  5558. },
  5559. {
  5560. "id": "recovery.stale-version",
  5561. "group": "权限、缓存与未保存恢复",
  5562. "name": "不同版本恢复稿隔离",
  5563. "source": {
  5564. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  5565. "symbol": "sceneRecoveryMatchesProjectVersion",
  5566. "line": 46
  5567. },
  5568. "implementation": "已有实现已完成验证",
  5569. "boundary": "旧稿不能自动覆盖新服务器版本;下载供人工合并。",
  5570. "acceptance": "另一会话先保存,新会话面对旧稿只能下载/隔离/明确丢弃。",
  5571. "fix": "尚未关联本轮修复记录",
  5572. "fixIds": [],
  5573. "verification": "PASS",
  5574. "evidence": [
  5575. {
  5576. "status": "PASS",
  5577. "testTitle": "同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载",
  5578. "recordedAt": "2026-09-06T10:26:49.585Z",
  5579. "kind": "browser",
  5580. "ids": [
  5581. "project.conflict",
  5582. "recovery.autobuffer",
  5583. "recovery.same-version",
  5584. "recovery.stale-version"
  5585. ],
  5586. "file": "evidence/real-recovery-conflict.json",
  5587. "title": "同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载",
  5588. "details": "真实未存输入产生恢复稿,同版本恢复不自动入库;另一版本先保存后409拒绝覆盖,旧稿隔离下载。",
  5589. "screenshots": []
  5590. }
  5591. ]
  5592. },
  5593. {
  5594. "id": "recovery.discard",
  5595. "group": "权限、缓存与未保存恢复",
  5596. "name": "下载、保留、丢弃恢复稿",
  5597. "source": {
  5598. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  5599. "symbol": "async function quarantineRecovery",
  5600. "line": 223
  5601. },
  5602. "implementation": "已有实现已完成验证",
  5603. "boundary": "关闭/Escape 不算明确丢弃;他会话新写入稿不得被误删。",
  5604. "acceptance": "按钮逐项核对本地隔离键、下载文件与服务器无意外写入。",
  5605. "fix": "尚未关联本轮修复记录",
  5606. "fixIds": [],
  5607. "verification": "PASS",
  5608. "evidence": [
  5609. {
  5610. "status": "PASS",
  5611. "testTitle": "双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿",
  5612. "recordedAt": "2026-09-06T10:25:56.822Z",
  5613. "kind": "browser",
  5614. "ids": [
  5615. "recovery.multi-session",
  5616. "recovery.autobuffer",
  5617. "recovery.discard",
  5618. "project.save"
  5619. ],
  5620. "file": "evidence/scene-multi-session.json",
  5621. "title": "双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿",
  5622. "details": "",
  5623. "screenshots": []
  5624. },
  5625. {
  5626. "status": "PASS",
  5627. "testTitle": "recovery conflict defaults to preserve and only explicit discard may remove it",
  5628. "kind": "unit",
  5629. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5630. "ids": [
  5631. "recovery.discard"
  5632. ],
  5633. "file": "validation.json",
  5634. "title": "recovery conflict defaults to preserve and only explicit discard may remove it",
  5635. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5636. "screenshots": []
  5637. }
  5638. ]
  5639. },
  5640. {
  5641. "id": "recovery.multi-session",
  5642. "group": "权限、缓存与未保存恢复",
  5643. "name": "多标签/多会话恢复所有权",
  5644. "source": {
  5645. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  5646. "symbol": "recoveryStoragePrefix",
  5647. "line": 104
  5648. },
  5649. "implementation": "已有实现已完成验证",
  5650. "boundary": "会话键/nonce/锁避免覆盖别的未存稿;本地缓冲不冒充权限。",
  5651. "acceptance": "两个编辑会话产生不同草稿,保存/丢弃一份不删另一份。",
  5652. "fix": "尚未关联本轮修复记录",
  5653. "fixIds": [],
  5654. "verification": "PASS",
  5655. "evidence": [
  5656. {
  5657. "status": "PASS",
  5658. "testTitle": "双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿",
  5659. "recordedAt": "2026-09-06T10:25:56.822Z",
  5660. "kind": "browser",
  5661. "ids": [
  5662. "recovery.multi-session",
  5663. "recovery.autobuffer",
  5664. "recovery.discard",
  5665. "project.save"
  5666. ],
  5667. "file": "evidence/scene-multi-session.json",
  5668. "title": "双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿",
  5669. "details": "",
  5670. "screenshots": []
  5671. },
  5672. {
  5673. "status": "PASS",
  5674. "testTitle": "per-page recovery keys prevent copied tabs from deleting each other checkpoints",
  5675. "kind": "unit",
  5676. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5677. "ids": [
  5678. "recovery.multi-session"
  5679. ],
  5680. "file": "validation.json",
  5681. "title": "per-page recovery keys prevent copied tabs from deleting each other checkpoints",
  5682. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5683. "screenshots": []
  5684. }
  5685. ]
  5686. },
  5687. {
  5688. "id": "leave.cancel",
  5689. "group": "权限、缓存与未保存恢复",
  5690. "name": "关闭场景标签时取消离开",
  5691. "source": {
  5692. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  5693. "symbol": "async function confirmLeave",
  5694. "line": 704
  5695. },
  5696. "implementation": "本轮修复已完成验证",
  5697. "boundary": "关闭确认保留当前 dirty 与恢复副本;返回列表或切普通标签不应提示。",
  5698. "acceptance": "真实关闭确认的关闭/Escape、继续编辑,数据未丢;不把返回列表当关闭。",
  5699. "fix": "关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。",
  5700. "fixIds": [
  5701. "SCENE-F16"
  5702. ],
  5703. "verification": "PASS",
  5704. "evidence": [
  5705. {
  5706. "status": "PASS",
  5707. "testTitle": "后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限",
  5708. "recordedAt": "2026-09-06T10:25:39.438Z",
  5709. "kind": "browser",
  5710. "ids": [
  5711. "leave.role-switch",
  5712. "leave.cancel",
  5713. "leave.save",
  5714. "permission.readonly"
  5715. ],
  5716. "file": "evidence/scene-role-switch.json",
  5717. "title": "后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限",
  5718. "details": "",
  5719. "screenshots": []
  5720. },
  5721. {
  5722. "status": "PASS",
  5723. "testTitle": "closing one selected scene checks its cached guard, leaves unrelated workspaces alone",
  5724. "kind": "unit",
  5725. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5726. "ids": [
  5727. "leave.cancel",
  5728. "lifecycle.cache"
  5729. ],
  5730. "file": "validation.json",
  5731. "title": "closing one selected scene checks its cached guard, leaves unrelated workspaces alone",
  5732. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5733. "screenshots": []
  5734. },
  5735. {
  5736. "status": "PASS",
  5737. "testTitle": "cancel or failed save in a later tab never commits earlier draft discard",
  5738. "kind": "unit",
  5739. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5740. "ids": [
  5741. "leave.cancel",
  5742. "leave.save",
  5743. "leave.role-switch"
  5744. ],
  5745. "file": "validation.json",
  5746. "title": "cancel or failed save in a later tab never commits earlier draft discard",
  5747. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5748. "screenshots": []
  5749. }
  5750. ]
  5751. },
  5752. {
  5753. "id": "leave.save",
  5754. "group": "权限、缓存与未保存恢复",
  5755. "name": "保存并离开 / 放弃修改",
  5756. "source": {
  5757. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  5758. "symbol": "async function confirmLeave",
  5759. "line": 704
  5760. },
  5761. "implementation": "本轮修复已完成验证",
  5762. "boundary": "等待保存完成并确认最终 dirty;明确放弃只影响当前工程会话。",
  5763. "acceptance": "保存成功才离开;503/409留原页;放弃按确认执行。",
  5764. "fix": "关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。",
  5765. "fixIds": [
  5766. "SCENE-F16"
  5767. ],
  5768. "verification": "PASS",
  5769. "evidence": [
  5770. {
  5771. "status": "PASS",
  5772. "testTitle": "后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限",
  5773. "recordedAt": "2026-09-06T10:25:39.438Z",
  5774. "kind": "browser",
  5775. "ids": [
  5776. "leave.role-switch",
  5777. "leave.cancel",
  5778. "leave.save",
  5779. "permission.readonly"
  5780. ],
  5781. "file": "evidence/scene-role-switch.json",
  5782. "title": "后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限",
  5783. "details": "",
  5784. "screenshots": []
  5785. },
  5786. {
  5787. "status": "PASS",
  5788. "testTitle": "cancel or failed save in a later tab never commits earlier draft discard",
  5789. "kind": "unit",
  5790. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5791. "ids": [
  5792. "leave.cancel",
  5793. "leave.save",
  5794. "leave.role-switch"
  5795. ],
  5796. "file": "validation.json",
  5797. "title": "cancel or failed save in a later tab never commits earlier draft discard",
  5798. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5799. "screenshots": []
  5800. },
  5801. {
  5802. "status": "PASS",
  5803. "testTitle": "all successful confirmations commit together and unmounted guards are removed",
  5804. "kind": "unit",
  5805. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5806. "ids": [
  5807. "leave.save",
  5808. "lifecycle.destroy"
  5809. ],
  5810. "file": "validation.json",
  5811. "title": "all successful confirmations commit together and unmounted guards are removed",
  5812. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5813. "screenshots": []
  5814. }
  5815. ]
  5816. },
  5817. {
  5818. "id": "leave.busy",
  5819. "group": "权限、缓存与未保存恢复",
  5820. "name": "加载/上传/发布途中离开",
  5821. "source": {
  5822. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  5823. "symbol": "const resourcesBusy =",
  5824. "line": 708
  5825. },
  5826. "implementation": "已有实现已完成验证",
  5827. "boundary": "资源未就绪阻止离开;进行中的保存/发布须等待最终结果。",
  5828. "acceptance": "延迟资源与提交各验证取消/等待,旧请求不污染新项目。",
  5829. "fix": "尚未关联本轮修复记录",
  5830. "fixIds": [],
  5831. "verification": "PASS",
  5832. "evidence": [
  5833. {
  5834. "status": "PASS",
  5835. "testTitle": "加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载",
  5836. "recordedAt": "2026-09-06T10:24:14.518Z",
  5837. "kind": "browser",
  5838. "ids": [
  5839. "project.retry",
  5840. "glb.pending",
  5841. "leave.busy"
  5842. ],
  5843. "file": "evidence/loading-retry.json",
  5844. "title": "加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载",
  5845. "details": "GET503只留中性失败和重试;延迟受控下载时禁用写入/导出/预览并阻止关闭,释放后真实狐狸加载。",
  5846. "screenshots": []
  5847. },
  5848. {
  5849. "status": "PASS",
  5850. "testTitle": "role switch waits through validation, save, and the later queued publish after dirty clears",
  5851. "kind": "unit",
  5852. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5853. "ids": [
  5854. "publish.concurrent",
  5855. "leave.busy",
  5856. "leave.role-switch"
  5857. ],
  5858. "file": "validation.json",
  5859. "title": "role switch waits through validation, save, and the later queued publish after dirty clears",
  5860. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5861. "screenshots": []
  5862. },
  5863. {
  5864. "status": "PASS",
  5865. "testTitle": "role switch rechecks resource uploads started while the save was finishing",
  5866. "kind": "unit",
  5867. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5868. "ids": [
  5869. "leave.busy"
  5870. ],
  5871. "file": "validation.json",
  5872. "title": "role switch rechecks resource uploads started while the save was finishing",
  5873. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5874. "screenshots": []
  5875. }
  5876. ]
  5877. },
  5878. {
  5879. "id": "leave.role-switch",
  5880. "group": "权限、缓存与未保存恢复",
  5881. "name": "角色切换覆盖后台场景未存稿",
  5882. "source": {
  5883. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  5884. "symbol": "registerWorkspaceLeaveGuard",
  5885. "line": 2
  5886. },
  5887. "implementation": "本轮修复已完成验证",
  5888. "boundary": "全体守卫确认后才切角色;后一页取消不能抹掉前页 dirty。",
  5889. "acceptance": "含后台场景的切角色确认取消/保存失败/成功后权限重建。",
  5890. "fix": "关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。",
  5891. "fixIds": [
  5892. "SCENE-F16"
  5893. ],
  5894. "verification": "PASS",
  5895. "evidence": [
  5896. {
  5897. "status": "PASS",
  5898. "testTitle": "后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限",
  5899. "recordedAt": "2026-09-06T10:25:39.438Z",
  5900. "kind": "browser",
  5901. "ids": [
  5902. "leave.role-switch",
  5903. "leave.cancel",
  5904. "leave.save",
  5905. "permission.readonly"
  5906. ],
  5907. "file": "evidence/scene-role-switch.json",
  5908. "title": "后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限",
  5909. "details": "",
  5910. "screenshots": []
  5911. },
  5912. {
  5913. "status": "PASS",
  5914. "testTitle": "cancel or failed save in a later tab never commits earlier draft discard",
  5915. "kind": "unit",
  5916. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5917. "ids": [
  5918. "leave.cancel",
  5919. "leave.save",
  5920. "leave.role-switch"
  5921. ],
  5922. "file": "validation.json",
  5923. "title": "cancel or failed save in a later tab never commits earlier draft discard",
  5924. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5925. "screenshots": []
  5926. },
  5927. {
  5928. "status": "PASS",
  5929. "testTitle": "role switch waits through validation, save, and the later queued publish after dirty clears",
  5930. "kind": "unit",
  5931. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5932. "ids": [
  5933. "publish.concurrent",
  5934. "leave.busy",
  5935. "leave.role-switch"
  5936. ],
  5937. "file": "validation.json",
  5938. "title": "role switch waits through validation, save, and the later queued publish after dirty clears",
  5939. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5940. "screenshots": []
  5941. }
  5942. ]
  5943. },
  5944. {
  5945. "id": "lifecycle.cache",
  5946. "group": "权限、缓存与未保存恢复",
  5947. "name": "标签失活 pause / 激活 resume",
  5948. "source": {
  5949. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  5950. "symbol": "pause()",
  5951. "line": 523
  5952. },
  5953. "implementation": "本轮修复已完成验证",
  5954. "boundary": "停止后台 RAF、恢复时重算视口;后台实例不能抢当前页键盘。",
  5955. "acceptance": "两场景标签切换、选择和未存值保留、后台无写/快捷键误动作。",
  5956. "fix": "顶部新建委托宿主命名与创建 API,先确认未保存内容。选择放弃也要等创建及导航成功后才清除原 dirty/恢复稿;创建503仍保留原稿。成功后刷新原缓存页,避免再次打开时将已放弃修改冒称已保存。取消、失败不清原场景,成功导航到新项目 ID,并有创建并发守卫。;预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。;关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。",
  5957. "fixIds": [
  5958. "SCENE-F02",
  5959. "SCENE-F05",
  5960. "SCENE-F16"
  5961. ],
  5962. "verification": "PASS",
  5963. "evidence": [
  5964. {
  5965. "status": "PASS",
  5966. "testTitle": "缓存标签暂停键盘、草稿恢复以及关闭取消和保存失败留页",
  5967. "recordedAt": "2026-09-06T10:30:03.089Z",
  5968. "kind": "真实UI缓存/关闭+浏览器模拟503拒绝写入",
  5969. "ids": [
  5970. "lifecycle.cache"
  5971. ],
  5972. "file": "evidence/viewport-cache-close.json",
  5973. "title": "缓存标签暂停键盘、草稿恢复以及关闭取消和保存失败留页",
  5974. "details": "",
  5975. "screenshots": []
  5976. },
  5977. {
  5978. "status": "PASS",
  5979. "testTitle": "typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts",
  5980. "kind": "unit",
  5981. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5982. "ids": [
  5983. "history.undo",
  5984. "history.redo",
  5985. "transform.keys",
  5986. "lifecycle.cache"
  5987. ],
  5988. "file": "validation.json",
  5989. "title": "typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts",
  5990. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  5991. "screenshots": []
  5992. },
  5993. {
  5994. "status": "PASS",
  5995. "testTitle": "closing one selected scene checks its cached guard, leaves unrelated workspaces alone",
  5996. "kind": "unit",
  5997. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  5998. "ids": [
  5999. "leave.cancel",
  6000. "lifecycle.cache"
  6001. ],
  6002. "file": "validation.json",
  6003. "title": "closing one selected scene checks its cached guard, leaves unrelated workspaces alone",
  6004. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  6005. "screenshots": []
  6006. }
  6007. ]
  6008. },
  6009. {
  6010. "id": "lifecycle.destroy",
  6011. "group": "权限、缓存与未保存恢复",
  6012. "name": "关闭释放 WebGL/监听/资源",
  6013. "source": {
  6014. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  6015. "symbol": "destroy()",
  6016. "line": 421
  6017. },
  6018. "implementation": "本轮修复已完成验证",
  6019. "boundary": "销毁后的异步回调无 DOM 写入,无残留全局事件和资产 URL。",
  6020. "acceptance": "反复打开/关闭、加载中关闭边界,控制台无异常/泄漏事件。",
  6021. "fix": "射线候选逐级检查父级可见性和软删除;删除根对象先恢复高亮材质再释放几何/材质,避免错误拾取及 GPU 资源残留。;关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。",
  6022. "fixIds": [
  6023. "SCENE-F09",
  6024. "SCENE-F16"
  6025. ],
  6026. "verification": "PASS",
  6027. "evidence": [
  6028. {
  6029. "status": "PASS",
  6030. "testTitle": "deleting a root disposes its geometry and materials after clearing selection",
  6031. "kind": "unit",
  6032. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  6033. "ids": [
  6034. "object.delete",
  6035. "lifecycle.destroy"
  6036. ],
  6037. "file": "validation.json",
  6038. "title": "deleting a root disposes its geometry and materials after clearing selection",
  6039. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  6040. "screenshots": []
  6041. },
  6042. {
  6043. "status": "PASS",
  6044. "testTitle": "selection highlight cleanup restores source materials and releases its own GPU helper",
  6045. "kind": "unit",
  6046. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  6047. "ids": [
  6048. "selection.highlight",
  6049. "lifecycle.destroy"
  6050. ],
  6051. "file": "validation.json",
  6052. "title": "selection highlight cleanup restores source materials and releases its own GPU helper",
  6053. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  6054. "screenshots": []
  6055. },
  6056. {
  6057. "status": "PASS",
  6058. "testTitle": "all successful confirmations commit together and unmounted guards are removed",
  6059. "kind": "unit",
  6060. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  6061. "ids": [
  6062. "leave.save",
  6063. "lifecycle.destroy"
  6064. ],
  6065. "file": "validation.json",
  6066. "title": "all successful confirmations commit together and unmounted guards are removed",
  6067. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  6068. "screenshots": []
  6069. },
  6070. {
  6071. "status": "PASS",
  6072. "testTitle": "an upload finishing after a project switch cannot register into the new session",
  6073. "kind": "unit",
  6074. "runId": "scene-editor-2026-09-06T10:24:04.121Z",
  6075. "ids": [
  6076. "glb.pending",
  6077. "lifecycle.destroy"
  6078. ],
  6079. "file": "validation.json",
  6080. "title": "an upload finishing after a project switch cannot register into the new session",
  6081. "details": "实际执行真实方法/纯函数合同,未冒称浏览器操作",
  6082. "screenshots": []
  6083. }
  6084. ]
  6085. },
  6086. {
  6087. "id": "lifecycle.resize-theme",
  6088. "group": "权限、缓存与未保存恢复",
  6089. "name": "桌面尺寸与明亮/暗黑可读性",
  6090. "source": {
  6091. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  6092. "symbol": "resize()",
  6093. "line": 414
  6094. },
  6095. "implementation": "本轮修复已完成验证",
  6096. "boundary": "继承正式主题;所有可达控件可读、无截断遮挡。",
  6097. "acceptance": "1920/1440 下工具栏、属性、模板与弹窗截图,主题切换无低对比。",
  6098. "fix": "原型 CSS 全局重置收敛到场景作用域,降低按钮重置优先级;侧栏、输入、模板、属性和摘要使用正式主题变量,修复白字白底;修复 1440 宽时长工具栏/画布撑开网格覆盖属性栏。",
  6099. "fixIds": [
  6100. "SCENE-F15"
  6101. ],
  6102. "verification": "PASS",
  6103. "evidence": [
  6104. {
  6105. "status": "PASS",
  6106. "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  6107. "recordedAt": "2026-09-06T10:29:44.118Z",
  6108. "kind": "真实UI+只读投影",
  6109. "ids": [
  6110. "view.orbit",
  6111. "view.pan",
  6112. "view.zoom",
  6113. "view.top",
  6114. "view.perspective",
  6115. "view.grid",
  6116. "view.focus",
  6117. "selection.viewport",
  6118. "selection.highlight",
  6119. "preview.enter",
  6120. "preview.exit",
  6121. "preview.lock",
  6122. "lifecycle.resize-theme"
  6123. ],
  6124. "file": "evidence/viewport-camera-theme.json",
  6125. "title": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性",
  6126. "details": "",
  6127. "screenshots": [
  6128. "40-viewport-dark-1920",
  6129. "41-viewport-light-1440",
  6130. "42-fox-preview-original-material"
  6131. ]
  6132. }
  6133. ]
  6134. }
  6135. ]
  6136. }