Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 

4578 Zeilen
175 KiB

  1. {
  2. "generatedAt": "2026-09-06T08:34:35.367Z",
  3. "overall": "PASS",
  4. "featureCount": {
  5. "total": 103,
  6. "pass": 103,
  7. "fail": 0,
  8. "pending": 0
  9. },
  10. "browserCount": {
  11. "total": 19,
  12. "pass": 19,
  13. "fail": 0,
  14. "pending": 0
  15. },
  16. "finalRun": true,
  17. "finalArtifactsVerified": true,
  18. "features": [
  19. {
  20. "id": "project.new",
  21. "group": "工程与数据",
  22. "name": "新建工程",
  23. "source": {
  24. "file": "../../../unreal_tran_web/src/views/content/LegacyModelEditorView.vue",
  25. "line": 118,
  26. "symbol": "createNewProject"
  27. },
  28. "implementation": "本轮修复",
  29. "boundary": "宿主创建新项目 ID 并跳转;新建不是清空并覆盖当前工程。",
  30. "fix": "新建复用正式 create API;创建失败或取消保留原工程。",
  31. "acceptance": "新建前后 ID 不同,原工程内容/版本不被覆盖;取消不发创建请求。",
  32. "verification": "PASS",
  33. "evidence": [
  34. {
  35. "ids": [
  36. "project.new"
  37. ],
  38. "file": "evidence/new-project.json",
  39. "status": "PASS",
  40. "testTitle": "新建工程取消及失败保留输入;成功创建新ID且不覆盖当前模型",
  41. "recordedAt": "2026-09-06T08:22:24.723Z",
  42. "kind": "e2e+api",
  43. "title": "新建工程取消及失败保留输入;成功创建新ID且不覆盖当前模型",
  44. "screenshots": [],
  45. "details": ""
  46. }
  47. ]
  48. },
  49. {
  50. "id": "project.import-glb",
  51. "group": "工程与数据",
  52. "name": "导入装备 GLB",
  53. "source": {
  54. "file": "../../../unreal_tran/src/main.js",
  55. "line": 1264,
  56. "symbol": "importModelFile"
  57. },
  58. "implementation": "已有实现",
  59. "boundary": "只支持单文件 GLB;上传→登记→解析→最终保存。",
  60. "fix": "延续导入 busy/失败阻断及稳定资产校验。",
  61. "acceptance": "选择轻量 GLB,真实模型可见;刷新仍加载同一资产。",
  62. "verification": "PASS",
  63. "evidence": [
  64. {
  65. "ids": [
  66. "project.import-glb",
  67. "environment.external",
  68. "project.import-json",
  69. "project.export-json",
  70. "project.save"
  71. ],
  72. "file": "evidence/30-assets-roundtrip.json",
  73. "status": "PASS",
  74. "testTitle": "受控模型与外部环境 GLB 上传、JSON 往返和刷新重开",
  75. "recordedAt": "2026-09-06T08:20:27.495Z",
  76. "kind": "e2e+api",
  77. "title": "受控模型与外部环境 GLB 上传、JSON 往返和刷新重开",
  78. "screenshots": [],
  79. "details": "真实上传、注册、保存、JSON重导入、刷新后的实际网格和原生动画目录;未断言下游场景执行动画。"
  80. }
  81. ]
  82. },
  83. {
  84. "id": "project.import-json",
  85. "group": "工程与数据",
  86. "name": "导入工程 JSON",
  87. "source": {
  88. "file": "../../../unreal_tran/src/main.js",
  89. "line": 2863,
  90. "symbol": "importProjectFile"
  91. },
  92. "implementation": "本轮修复",
  93. "boundary": "导入到当前工程,不创建副本;受控引用必须属于当前可用资产。JSON 不含 GLB 字节。",
  94. "fix": "导入前 materialize 稳定资产引用。",
  95. "acceptance": "同项目导出后再导入,材质/动画/环境不丢;无效或跨项目缺失引用报错。",
  96. "verification": "PASS",
  97. "evidence": [
  98. {
  99. "ids": [
  100. "project.import-glb",
  101. "environment.external",
  102. "project.import-json",
  103. "project.export-json",
  104. "project.save"
  105. ],
  106. "file": "evidence/30-assets-roundtrip.json",
  107. "status": "PASS",
  108. "testTitle": "受控模型与外部环境 GLB 上传、JSON 往返和刷新重开",
  109. "recordedAt": "2026-09-06T08:20:27.495Z",
  110. "kind": "e2e+api",
  111. "title": "受控模型与外部环境 GLB 上传、JSON 往返和刷新重开",
  112. "screenshots": [],
  113. "details": "真实上传、注册、保存、JSON重导入、刷新后的实际网格和原生动画目录;未断言下游场景执行动画。"
  114. },
  115. {
  116. "ids": [
  117. "project.import-json"
  118. ],
  119. "file": "evidence/31-invalid-import.json",
  120. "status": "PASS",
  121. "testTitle": "非法 JSON 与未登记 blob 引用导入失败时保留当前文档",
  122. "recordedAt": "2026-09-06T08:20:33.535Z",
  123. "kind": "e2e+api",
  124. "title": "非法 JSON 与未登记 blob 引用导入失败时保留当前文档",
  125. "screenshots": [],
  126. "details": ""
  127. }
  128. ]
  129. },
  130. {
  131. "id": "project.save",
  132. "group": "工程与数据",
  133. "name": "手动保存 / Ctrl+S",
  134. "source": {
  135. "file": "../../../unreal_tran/src/main.js",
  136. "line": 2748,
  137. "symbol": "saveProject"
  138. },
  139. "implementation": "已有实现",
  140. "boundary": "同一工程保存内容和当前视口封面;成功以 API 响应为准。",
  141. "fix": "保留队列、版本保护和封面失败回退。",
  142. "acceptance": "保存真实 PUT 成功,刷新字段不丢;重复点击不交错。",
  143. "verification": "PASS",
  144. "evidence": [
  145. {
  146. "ids": [
  147. "project.import-glb",
  148. "environment.external",
  149. "project.import-json",
  150. "project.export-json",
  151. "project.save"
  152. ],
  153. "file": "evidence/30-assets-roundtrip.json",
  154. "status": "PASS",
  155. "testTitle": "受控模型与外部环境 GLB 上传、JSON 往返和刷新重开",
  156. "recordedAt": "2026-09-06T08:20:27.495Z",
  157. "kind": "e2e+api",
  158. "title": "受控模型与外部环境 GLB 上传、JSON 往返和刷新重开",
  159. "screenshots": [],
  160. "details": "真实上传、注册、保存、JSON重导入、刷新后的实际网格和原生动画目录;未断言下游场景执行动画。"
  161. },
  162. {
  163. "ids": [
  164. "project.conflict",
  165. "project.save",
  166. "feedback.toast"
  167. ],
  168. "file": "evidence/32-save-failure-recovery.json",
  169. "status": "PASS",
  170. "testTitle": "保存请求超时和 409 保留恢复副本,解除故障后可重试",
  171. "recordedAt": "2026-09-06T08:20:43.214Z",
  172. "kind": "e2e+api",
  173. "title": "保存请求超时和 409 保留恢复副本,解除故障后可重试",
  174. "screenshots": [],
  175. "details": "真实页面保存及真实服务端重试;失败由浏览器定向注入 timedout/409,非宣称自然发生的服务故障。"
  176. },
  177. {
  178. "ids": [
  179. "property.name",
  180. "property.position",
  181. "property.rotation",
  182. "property.scale",
  183. "property.color",
  184. "property.metalness",
  185. "property.roughness",
  186. "property.opacity",
  187. "property.code",
  188. "property.status",
  189. "component.tag",
  190. "project.undo",
  191. "project.redo",
  192. "project.save"
  193. ],
  194. "file": "evidence/properties.json",
  195. "status": "PASS",
  196. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  197. "recordedAt": "2026-09-06T08:21:58.738Z",
  198. "kind": "e2e+api",
  199. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  200. "screenshots": [],
  201. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  202. }
  203. ]
  204. },
  205. {
  206. "id": "project.autosave",
  207. "group": "工程与数据",
  208. "name": "30 秒自动保存",
  209. "source": {
  210. "file": "../../../unreal_tran/src/main.js",
  211. "line": 2122,
  212. "symbol": "bindShellEvents"
  213. },
  214. "implementation": "已有实现",
  215. "boundary": "自动保存工程内容;不反复截图更新封面,恢复稿待确认期间暂停。",
  216. "fix": "导入/封面保存期间阻断重入。",
  217. "acceptance": "修改后等待自动保存并刷新;忙碌时不提交半成品。",
  218. "verification": "PASS",
  219. "evidence": [
  220. {
  221. "ids": [
  222. "project.name",
  223. "project.autosave",
  224. "view.orbit",
  225. "view.focus",
  226. "view.panels",
  227. "view.preview-step",
  228. "feedback.log",
  229. "feedback.stats",
  230. "property.identity",
  231. "property.binding",
  232. "selection.scope",
  233. "component.inspect"
  234. ],
  235. "file": "evidence/46-navigation-panels-autosave.json",
  236. "status": "PASS",
  237. "testTitle": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  238. "recordedAt": "2026-09-06T08:23:54.656Z",
  239. "kind": "e2e+api",
  240. "title": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  241. "screenshots": [],
  242. "details": "真实鼠标镜头操作;聚焦只验证相机目标;真实30秒自动保存,无测试加速定时器;统计内存估值未当作性能结论。"
  243. }
  244. ]
  245. },
  246. {
  247. "id": "project.name",
  248. "group": "工程与数据",
  249. "name": "修改工程名",
  250. "source": {
  251. "file": "../../../unreal_tran/src/main.js",
  252. "line": 457,
  253. "symbol": "projectNameInput"
  254. },
  255. "implementation": "已有实现",
  256. "boundary": "输入→失焦/Enter→保存;当前模型工程名。",
  257. "fix": "无本轮专门改动。",
  258. "acceptance": "改名保存后列表和重新打开一致。",
  259. "verification": "PASS",
  260. "evidence": [
  261. {
  262. "ids": [
  263. "project.name",
  264. "project.autosave",
  265. "view.orbit",
  266. "view.focus",
  267. "view.panels",
  268. "view.preview-step",
  269. "feedback.log",
  270. "feedback.stats",
  271. "property.identity",
  272. "property.binding",
  273. "selection.scope",
  274. "component.inspect"
  275. ],
  276. "file": "evidence/46-navigation-panels-autosave.json",
  277. "status": "PASS",
  278. "testTitle": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  279. "recordedAt": "2026-09-06T08:23:54.656Z",
  280. "kind": "e2e+api",
  281. "title": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  282. "screenshots": [],
  283. "details": "真实鼠标镜头操作;聚焦只验证相机目标;真实30秒自动保存,无测试加速定时器;统计内存估值未当作性能结论。"
  284. }
  285. ]
  286. },
  287. {
  288. "id": "project.export-json",
  289. "group": "工程与数据",
  290. "name": "另存项目 JSON",
  291. "source": {
  292. "file": "../../../unreal_tran/src/main.js",
  293. "line": 2883,
  294. "symbol": "saveProjectAs"
  295. },
  296. "implementation": "已有实现",
  297. "boundary": "下载工程 JSON;不是另建服务端项目,也不内嵌 GLB 文件。",
  298. "fix": "稳定资产引用保留,临时 blob 地址清除。",
  299. "acceptance": "下载文件可解析,包含轨道/蓝图/自定义字段,配套资源可重新解析。",
  300. "verification": "PASS",
  301. "evidence": [
  302. {
  303. "ids": [
  304. "project.import-glb",
  305. "environment.external",
  306. "project.import-json",
  307. "project.export-json",
  308. "project.save"
  309. ],
  310. "file": "evidence/30-assets-roundtrip.json",
  311. "status": "PASS",
  312. "testTitle": "受控模型与外部环境 GLB 上传、JSON 往返和刷新重开",
  313. "recordedAt": "2026-09-06T08:20:27.495Z",
  314. "kind": "e2e+api",
  315. "title": "受控模型与外部环境 GLB 上传、JSON 往返和刷新重开",
  316. "screenshots": [],
  317. "details": "真实上传、注册、保存、JSON重导入、刷新后的实际网格和原生动画目录;未断言下游场景执行动画。"
  318. }
  319. ]
  320. },
  321. {
  322. "id": "project.undo",
  323. "group": "工程与数据",
  324. "name": "撤销 / Ctrl+Z",
  325. "source": {
  326. "file": "../../../unreal_tran/src/main.js",
  327. "line": 160,
  328. "symbol": "class HistoryStack"
  329. },
  330. "implementation": "本轮修复",
  331. "boundary": "最多 60 个历史快照;不是数据库版本回滚。",
  332. "fix": "异步互斥,失败不移动索引,托管 GLB 快照重新解析。",
  333. "acceptance": "属性/曲线修改撤销;连续点击不并发;下载失败索引与修改保留。",
  334. "verification": "PASS",
  335. "evidence": [
  336. {
  337. "ids": [
  338. "property.name",
  339. "property.position",
  340. "property.rotation",
  341. "property.scale",
  342. "property.color",
  343. "property.metalness",
  344. "property.roughness",
  345. "property.opacity",
  346. "property.code",
  347. "property.status",
  348. "component.tag",
  349. "project.undo",
  350. "project.redo",
  351. "project.save"
  352. ],
  353. "file": "evidence/properties.json",
  354. "status": "PASS",
  355. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  356. "recordedAt": "2026-09-06T08:21:58.738Z",
  357. "kind": "e2e+api",
  358. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  359. "screenshots": [],
  360. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  361. },
  362. {
  363. "ids": [
  364. "blueprint.parameters",
  365. "blueprint.move",
  366. "blueprint.connect",
  367. "blueprint.delete",
  368. "blueprint.copy",
  369. "blueprint.run",
  370. "blueprint.stop",
  371. "blueprint.reset",
  372. "blueprint.timeline",
  373. "blueprint.wait",
  374. "blueprint.highlight",
  375. "blueprint.message",
  376. "blueprint.finish",
  377. "project.undo",
  378. "project.redo"
  379. ],
  380. "file": "evidence/truck-blueprint-ui.json",
  381. "status": "PASS",
  382. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  383. "recordedAt": "2026-09-06T08:21:37.144Z",
  384. "kind": "e2e+runtime-read",
  385. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  386. "screenshots": [],
  387. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  388. },
  389. {
  390. "ids": [
  391. "project.undo",
  392. "project.redo"
  393. ],
  394. "file": "validation.json",
  395. "status": "PASS",
  396. "kind": "unit",
  397. "title": "history retains 60 states, truncates redo after edits and ignores duplicate snapshots",
  398. "screenshots": [],
  399. "details": "60 个快照上限、重复状态忽略及新编辑截断 redo 分支。"
  400. },
  401. {
  402. "ids": [
  403. "project.undo",
  404. "project.redo"
  405. ],
  406. "file": "validation.json",
  407. "status": "PASS",
  408. "kind": "unit",
  409. "title": "history serializes async restores and leaves index unchanged when restoration fails",
  410. "screenshots": [],
  411. "details": "异步互斥、下载失败不移动索引,解除锁后可继续操作。"
  412. },
  413. {
  414. "ids": [
  415. "project.undo",
  416. "project.redo"
  417. ],
  418. "file": "validation.json",
  419. "status": "PASS",
  420. "kind": "unit",
  421. "title": "managed-GLB history downloads the snapshot stable reference before restoring, without rewriting it",
  422. "screenshots": [],
  423. "details": "受控 GLB 快照先物化再恢复,不把临时 URL 写回快照。"
  424. }
  425. ]
  426. },
  427. {
  428. "id": "project.redo",
  429. "group": "工程与数据",
  430. "name": "重做 / Ctrl+Y",
  431. "source": {
  432. "file": "../../../unreal_tran/src/main.js",
  433. "line": 160,
  434. "symbol": "class HistoryStack"
  435. },
  436. "implementation": "本轮修复",
  437. "boundary": "撤销后重做;产生新编辑时清掉旧 redo 分支。",
  438. "fix": "与撤销共用异步恢复保护。",
  439. "acceptance": "重做恢复相同字段及姿态,不回放无效分支。",
  440. "verification": "PASS",
  441. "evidence": [
  442. {
  443. "ids": [
  444. "property.name",
  445. "property.position",
  446. "property.rotation",
  447. "property.scale",
  448. "property.color",
  449. "property.metalness",
  450. "property.roughness",
  451. "property.opacity",
  452. "property.code",
  453. "property.status",
  454. "component.tag",
  455. "project.undo",
  456. "project.redo",
  457. "project.save"
  458. ],
  459. "file": "evidence/properties.json",
  460. "status": "PASS",
  461. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  462. "recordedAt": "2026-09-06T08:21:58.738Z",
  463. "kind": "e2e+api",
  464. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  465. "screenshots": [],
  466. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  467. },
  468. {
  469. "ids": [
  470. "blueprint.parameters",
  471. "blueprint.move",
  472. "blueprint.connect",
  473. "blueprint.delete",
  474. "blueprint.copy",
  475. "blueprint.run",
  476. "blueprint.stop",
  477. "blueprint.reset",
  478. "blueprint.timeline",
  479. "blueprint.wait",
  480. "blueprint.highlight",
  481. "blueprint.message",
  482. "blueprint.finish",
  483. "project.undo",
  484. "project.redo"
  485. ],
  486. "file": "evidence/truck-blueprint-ui.json",
  487. "status": "PASS",
  488. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  489. "recordedAt": "2026-09-06T08:21:37.144Z",
  490. "kind": "e2e+runtime-read",
  491. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  492. "screenshots": [],
  493. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  494. },
  495. {
  496. "ids": [
  497. "project.undo",
  498. "project.redo"
  499. ],
  500. "file": "validation.json",
  501. "status": "PASS",
  502. "kind": "unit",
  503. "title": "history retains 60 states, truncates redo after edits and ignores duplicate snapshots",
  504. "screenshots": [],
  505. "details": "60 个快照上限、重复状态忽略及新编辑截断 redo 分支。"
  506. },
  507. {
  508. "ids": [
  509. "project.undo",
  510. "project.redo"
  511. ],
  512. "file": "validation.json",
  513. "status": "PASS",
  514. "kind": "unit",
  515. "title": "history serializes async restores and leaves index unchanged when restoration fails",
  516. "screenshots": [],
  517. "details": "异步互斥、下载失败不移动索引,解除锁后可继续操作。"
  518. },
  519. {
  520. "ids": [
  521. "project.undo",
  522. "project.redo"
  523. ],
  524. "file": "validation.json",
  525. "status": "PASS",
  526. "kind": "unit",
  527. "title": "managed-GLB history downloads the snapshot stable reference before restoring, without rewriting it",
  528. "screenshots": [],
  529. "details": "受控 GLB 快照先物化再恢复,不把临时 URL 写回快照。"
  530. }
  531. ]
  532. },
  533. {
  534. "id": "project.recovery",
  535. "group": "工程与数据",
  536. "name": "异常恢复副本",
  537. "source": {
  538. "file": "../../../unreal_tran/src/main.js",
  539. "line": 2554,
  540. "symbol": "reconcileApiRecovery"
  541. },
  542. "implementation": "本轮修复",
  543. "boundary": "同版本恢复稿需用户确认;旧版本隔离/下载,不静默覆盖服务器。",
  544. "fix": "恢复稿重新解析受控资源;指纹忽略对象键顺序,避免已保存页面刷新误生恢复稿。",
  545. "acceptance": "同版本恢复可见;旧版本保留/下载;主动保存前不自动 PUT。",
  546. "verification": "PASS",
  547. "evidence": [
  548. {
  549. "ids": [
  550. "project.recovery"
  551. ],
  552. "file": "evidence/60-project-recovery.json",
  553. "status": "PASS",
  554. "testTitle": "真实未保存稿同版本恢复并显式保存;旧版本恢复稿下载隔离保留",
  555. "recordedAt": "2026-09-06T08:24:07.184Z",
  556. "kind": "e2e+api",
  557. "title": "真实未保存稿同版本恢复并显式保存;旧版本恢复稿下载隔离保留",
  558. "screenshots": [],
  559. "details": "通过真实beforeunload创建未保存稿;同版恢复后仅显式保存落库;旧版只下载隔离,不自动覆盖服务端。丢弃/跨标签竞态另由既有恢复合同测试覆盖。"
  560. },
  561. {
  562. "ids": [
  563. "project.recovery"
  564. ],
  565. "file": "validation.json",
  566. "status": "PASS",
  567. "kind": "unit",
  568. "title": "beforeunload recovery does not create a draft for key order alone, but preserves real unsaved changes",
  569. "screenshots": [],
  570. "details": "同语义对象键顺序不产生假恢复稿;真正修改仍保留。不包含全部恢复/隔离/下载 UI 分支。"
  571. }
  572. ]
  573. },
  574. {
  575. "id": "project.conflict",
  576. "group": "工程与数据",
  577. "name": "保存/发布版本冲突",
  578. "source": {
  579. "file": "../../../unreal_tran/src/model-content-api.js",
  580. "line": 1025,
  581. "symbol": "queueSave"
  582. },
  583. "implementation": "已有实现",
  584. "boundary": "409 阻断;恢复稿保留。",
  585. "fix": "发布封面队列同样遵守冲突保护。",
  586. "acceptance": "定向模拟 409,无后续发布请求,不误报成功。",
  587. "verification": "PASS",
  588. "evidence": [
  589. {
  590. "ids": [
  591. "project.conflict",
  592. "project.save",
  593. "feedback.toast"
  594. ],
  595. "file": "evidence/32-save-failure-recovery.json",
  596. "status": "PASS",
  597. "testTitle": "保存请求超时和 409 保留恢复副本,解除故障后可重试",
  598. "recordedAt": "2026-09-06T08:20:43.214Z",
  599. "kind": "e2e+api",
  600. "title": "保存请求超时和 409 保留恢复副本,解除故障后可重试",
  601. "screenshots": [],
  602. "details": "真实页面保存及真实服务端重试;失败由浏览器定向注入 timedout/409,非宣称自然发生的服务故障。"
  603. },
  604. {
  605. "ids": [
  606. "project.conflict",
  607. "publish.api",
  608. "publish.cover"
  609. ],
  610. "file": "validation.json",
  611. "status": "PASS",
  612. "kind": "unit",
  613. "title": "API conflict leaves publication failed and releases the cover guard",
  614. "screenshots": [],
  615. "details": "409 分支不误报已发布并释放 busy 标记;模拟 API。"
  616. }
  617. ]
  618. },
  619. {
  620. "id": "project.permissions",
  621. "group": "工程与数据",
  622. "name": "查看/编辑/新增/发布权限",
  623. "source": {
  624. "file": "../../../unreal_tran_web/src/features/editors/model/legacy-iframe-permissions.ts",
  625. "line": 32,
  626. "symbol": "installLegacyModelPermissions"
  627. },
  628. "implementation": "本轮修复",
  629. "boundary": "按 content.model.* 权限,不按 teacher/admin 身份推断写权限;只读仍能搜索、选择原生动画和键盘激活预览。",
  630. "fix": "新建接真实 create 能力;只发布可发布已保存版本;修复查看控件键盘事件误拦截。",
  631. "acceptance": "只读查看操作可用且无内容写请求;不可编辑/保存;publisher 不上传/PUT,正常发布已有版本。",
  632. "verification": "PASS",
  633. "evidence": [
  634. {
  635. "ids": [
  636. "project.permissions"
  637. ],
  638. "file": "evidence/permissions.json",
  639. "status": "PASS",
  640. "testTitle": "管理员只读权限:编辑、新建、导入、保存发布均不可越权",
  641. "recordedAt": "2026-09-06T08:22:29.489Z",
  642. "kind": "e2e+api",
  643. "title": "管理员只读权限:编辑、新建、导入、保存发布均不可越权",
  644. "screenshots": [],
  645. "details": "管理员只读UI、真实键盘搜索、原生片段切换与Enter播放/暂停、预览无内容写请求及创建403;纯publisher无需update的发布流程由独立权限合同回归补充。"
  646. }
  647. ]
  648. },
  649. {
  650. "id": "project.leave",
  651. "group": "工程与数据",
  652. "name": "离开/切角色未保存确认",
  653. "source": {
  654. "file": "../../../unreal_tran_web/src/views/content/LegacyModelEditorView.vue",
  655. "line": 147,
  656. "symbol": "confirmLeave"
  657. },
  658. "implementation": "已有实现",
  659. "boundary": "取消留在当前页;保存失败不得离开;上传/保存/发布忙时保留状态。",
  660. "fix": "新建也复用现有未保存确认。",
  661. "acceptance": "取消、放弃、保存失败与 busy 分别验证,没有误清 dirty。",
  662. "verification": "PASS",
  663. "evidence": [
  664. {
  665. "ids": [
  666. "environment.builtin",
  667. "tree.browse",
  668. "tree.expand",
  669. "project.leave"
  670. ],
  671. "file": "evidence/43-builtin-environments-tree.json",
  672. "status": "PASS",
  673. "testTitle": "补充环境与树:内置三环境保存重开、节点计数与折叠展开",
  674. "recordedAt": "2026-09-06T08:23:19.759Z",
  675. "kind": "e2e+api",
  676. "title": "补充环境与树:内置三环境保存重开、节点计数与折叠展开",
  677. "screenshots": [],
  678. "details": "真实切换、保存和刷新三种环境;树计数与展开折叠;装备车库保存后返回列表不误报未保存。树220行上限仍属已说明边界。"
  679. },
  680. {
  681. "ids": [
  682. "project.leave"
  683. ],
  684. "file": "evidence/52-leave.json",
  685. "status": "PASS",
  686. "testTitle": "未保存离开:关闭确认保留工作、保存失败留在原页、重试保存后离开",
  687. "recordedAt": "2026-09-06T08:22:48.155Z",
  688. "kind": "e2e+api",
  689. "title": "未保存离开:关闭确认保留工作、保存失败留在原页、重试保存后离开",
  690. "screenshots": [],
  691. "details": ""
  692. }
  693. ]
  694. },
  695. {
  696. "id": "resource.catalog",
  697. "group": "资源库与场景树",
  698. "name": "资源库浏览 / 选择装备",
  699. "source": {
  700. "file": "../../../unreal_tran/src/main.js",
  701. "line": 1383,
  702. "symbol": "renderAssets"
  703. },
  704. "implementation": "本轮修复",
  705. "boundary": "切换装备可能应用其基准时间轴/蓝图;不是把第二个主装备追加进当前模型。",
  706. "fix": "修复单节点选择器误用导致启动报错;忙碌期间禁止切换资源。",
  707. "acceptance": "完整资源库 DOM 初始化、卡片事件、空目录启动正常;切换实际几何可见,保存后资源一致。",
  708. "verification": "PASS",
  709. "evidence": [
  710. {
  711. "ids": [
  712. "resource.search",
  713. "resource.catalog"
  714. ],
  715. "file": "evidence/41-resource-search-switch.json",
  716. "status": "PASS",
  717. "testTitle": "补充资源库:搜索清空、真实卡片切换与刷新保留",
  718. "recordedAt": "2026-09-06T08:22:56.960Z",
  719. "kind": "e2e+api",
  720. "title": "补充资源库:搜索清空、真实卡片切换与刷新保留",
  721. "screenshots": [],
  722. "details": "真实搜索与资源卡片点击、服务端保存、刷新后原模型网格;副本独立登记待清理。"
  723. },
  724. {
  725. "ids": [
  726. "resource.catalog"
  727. ],
  728. "file": "validation.json",
  729. "status": "PASS",
  730. "kind": "unit",
  731. "title": "resource catalog startup renders all model/environment cards and binds every action with a real DOM",
  732. "screenshots": [],
  733. "details": "真实 DOM 渲染、卡片绑定、空目录及 busy 保护;不包含 GLB 网络加载。"
  734. }
  735. ]
  736. },
  737. {
  738. "id": "resource.search",
  739. "group": "资源库与场景树",
  740. "name": "资源搜索",
  741. "source": {
  742. "file": "../../../unreal_tran/src/main.js",
  743. "line": 1467,
  744. "symbol": "applyAssetSearch"
  745. },
  746. "implementation": "已有实现",
  747. "boundary": "按资源名称/关键词过滤现有目录,不搜索服务器全站。",
  748. "fix": "无本轮专门改动。",
  749. "acceptance": "关键字命中、空结果与清空恢复。",
  750. "verification": "PASS",
  751. "evidence": [
  752. {
  753. "ids": [
  754. "resource.search",
  755. "resource.catalog"
  756. ],
  757. "file": "evidence/41-resource-search-switch.json",
  758. "status": "PASS",
  759. "testTitle": "补充资源库:搜索清空、真实卡片切换与刷新保留",
  760. "recordedAt": "2026-09-06T08:22:56.960Z",
  761. "kind": "e2e+api",
  762. "title": "补充资源库:搜索清空、真实卡片切换与刷新保留",
  763. "screenshots": [],
  764. "details": "真实搜索与资源卡片点击、服务端保存、刷新后原模型网格;副本独立登记待清理。"
  765. }
  766. ]
  767. },
  768. {
  769. "id": "environment.builtin",
  770. "group": "资源库与场景树",
  771. "name": "内置车间 / 野外 / 装备车库",
  772. "source": {
  773. "file": "../../../unreal_tran/src/main.js",
  774. "line": 789,
  775. "symbol": "resetEnvironmentPlaceholder"
  776. },
  777. "implementation": "已有实现",
  778. "boundary": "车间/野外为程序化环境;车库为随包 GLB。",
  779. "fix": "保留真实 GLB 和占位环境来源区别。",
  780. "acceptance": "三种切换与重新打开可重现相应环境。",
  781. "verification": "PASS",
  782. "evidence": [
  783. {
  784. "ids": [
  785. "environment.builtin",
  786. "tree.browse",
  787. "tree.expand",
  788. "project.leave"
  789. ],
  790. "file": "evidence/43-builtin-environments-tree.json",
  791. "status": "PASS",
  792. "testTitle": "补充环境与树:内置三环境保存重开、节点计数与折叠展开",
  793. "recordedAt": "2026-09-06T08:23:19.759Z",
  794. "kind": "e2e+api",
  795. "title": "补充环境与树:内置三环境保存重开、节点计数与折叠展开",
  796. "screenshots": [],
  797. "details": "真实切换、保存和刷新三种环境;树计数与展开折叠;装备车库保存后返回列表不误报未保存。树220行上限仍属已说明边界。"
  798. }
  799. ]
  800. },
  801. {
  802. "id": "environment.external",
  803. "group": "资源库与场景树",
  804. "name": "导入外部车间 / 野外 GLB",
  805. "source": {
  806. "file": "../../../unreal_tran/src/main.js",
  807. "line": 1028,
  808. "symbol": "loadEnvironmentSceneFile"
  809. },
  810. "implementation": "本轮修复",
  811. "boundary": "一个环境根;受控 MODEL_FILE 资产 metadata.usage=environment,与主装备独立。",
  812. "fix": "上传、最终保存、JSON 与刷新恢复稳定引用;失败阻断半提交。",
  813. "acceptance": "小 GLB 上传后主装备不被替换;环境刷新仍可见且资产引用一致。",
  814. "verification": "PASS",
  815. "evidence": [
  816. {
  817. "ids": [
  818. "project.import-glb",
  819. "environment.external",
  820. "project.import-json",
  821. "project.export-json",
  822. "project.save"
  823. ],
  824. "file": "evidence/30-assets-roundtrip.json",
  825. "status": "PASS",
  826. "testTitle": "受控模型与外部环境 GLB 上传、JSON 往返和刷新重开",
  827. "recordedAt": "2026-09-06T08:20:27.495Z",
  828. "kind": "e2e+api",
  829. "title": "受控模型与外部环境 GLB 上传、JSON 往返和刷新重开",
  830. "screenshots": [],
  831. "details": "真实上传、注册、保存、JSON重导入、刷新后的实际网格和原生动画目录;未断言下游场景执行动画。"
  832. }
  833. ]
  834. },
  835. {
  836. "id": "resource.loading",
  837. "group": "资源库与场景树",
  838. "name": "模型加载进度 / 失败 / 重试",
  839. "source": {
  840. "file": "../../../unreal_tran_web/src/views/content/LegacyModelEditorView.vue",
  841. "line": 33,
  842. "symbol": "installLegacyModelIframeLoadingScope"
  843. },
  844. "implementation": "已有实现",
  845. "boundary": "局部加载状态;错误短提示,中性失败状态可重试。",
  846. "fix": "复用前轮加载范围与错误消息修复。",
  847. "acceptance": "资源失败不无限转圈;重试恢复;无凭据泄露。",
  848. "verification": "PASS",
  849. "evidence": [
  850. {
  851. "ids": [
  852. "resource.loading",
  853. "publish.preflight"
  854. ],
  855. "file": "evidence/63-loading-publish-preflight.json",
  856. "status": "PASS",
  857. "testTitle": "受控 GLB 下载失败阻止编辑,重试成功;发布预检开关无写入且拒绝错误资源 JSON",
  858. "recordedAt": "2026-09-06T08:24:17.025Z",
  859. "kind": "e2e+api",
  860. "title": "受控 GLB 下载失败阻止编辑,重试成功;发布预检开关无写入且拒绝错误资源 JSON",
  861. "screenshots": [],
  862. "details": "真实受控下载定向503→中性失败与禁止编辑→解除故障后UI重试成功;预检面板开关不写项目,错误资源JSON在替换当前模型之前被拒绝。服务端发布时code/URI一致性拒绝由ContentProjectServiceTest合同回归覆盖,未把面板绿标代替服务端校验。"
  863. }
  864. ]
  865. },
  866. {
  867. "id": "tree.browse",
  868. "group": "资源库与场景树",
  869. "name": "场景树节点与计数",
  870. "source": {
  871. "file": "../../../unreal_tran/src/main.js",
  872. "line": 1925,
  873. "symbol": "buildSceneTree"
  874. },
  875. "implementation": "现有边界",
  876. "boundary": "树行上限 220;统计节点总数不等于当前展开行数。",
  877. "fix": "无本轮容量重构。",
  878. "acceptance": "模型/环境节点可达,计数说明不当作全部节点已经逐项验收。",
  879. "verification": "PASS",
  880. "evidence": [
  881. {
  882. "ids": [
  883. "environment.builtin",
  884. "tree.browse",
  885. "tree.expand",
  886. "project.leave"
  887. ],
  888. "file": "evidence/43-builtin-environments-tree.json",
  889. "status": "PASS",
  890. "testTitle": "补充环境与树:内置三环境保存重开、节点计数与折叠展开",
  891. "recordedAt": "2026-09-06T08:23:19.759Z",
  892. "kind": "e2e+api",
  893. "title": "补充环境与树:内置三环境保存重开、节点计数与折叠展开",
  894. "screenshots": [],
  895. "details": "真实切换、保存和刷新三种环境;树计数与展开折叠;装备车库保存后返回列表不误报未保存。树220行上限仍属已说明边界。"
  896. }
  897. ]
  898. },
  899. {
  900. "id": "tree.expand",
  901. "group": "资源库与场景树",
  902. "name": "节点展开 / 折叠",
  903. "source": {
  904. "file": "../../../unreal_tran/src/main.js",
  905. "line": 1925,
  906. "symbol": "buildSceneTree"
  907. },
  908. "implementation": "已有实现",
  909. "boundary": "当前界面浏览状态;无须持久化展开布局。",
  910. "fix": "无本轮专门改动。",
  911. "acceptance": "展开和折叠子级不修改模型对象。",
  912. "verification": "PASS",
  913. "evidence": [
  914. {
  915. "ids": [
  916. "environment.builtin",
  917. "tree.browse",
  918. "tree.expand",
  919. "project.leave"
  920. ],
  921. "file": "evidence/43-builtin-environments-tree.json",
  922. "status": "PASS",
  923. "testTitle": "补充环境与树:内置三环境保存重开、节点计数与折叠展开",
  924. "recordedAt": "2026-09-06T08:23:19.759Z",
  925. "kind": "e2e+api",
  926. "title": "补充环境与树:内置三环境保存重开、节点计数与折叠展开",
  927. "screenshots": [],
  928. "details": "真实切换、保存和刷新三种环境;树计数与展开折叠;装备车库保存后返回列表不误报未保存。树220行上限仍属已说明边界。"
  929. }
  930. ]
  931. },
  932. {
  933. "id": "tree.search",
  934. "group": "资源库与场景树",
  935. "name": "场景树搜索",
  936. "source": {
  937. "file": "../../../unreal_tran/src/main.js",
  938. "line": 1925,
  939. "symbol": "buildSceneTree"
  940. },
  941. "implementation": "已有实现",
  942. "boundary": "搜索当前载入对象,不新增/删除对象。",
  943. "fix": "无本轮专门改动。",
  944. "acceptance": "搜索节点后选中正确对象,清空恢复树。",
  945. "verification": "PASS",
  946. "evidence": [
  947. {
  948. "ids": [
  949. "tree.search",
  950. "tree.visibility",
  951. "selection.sync",
  952. "view.grid",
  953. "view.pbr",
  954. "view.wireframe",
  955. "view.outline",
  956. "view.perspective",
  957. "view.preview",
  958. "view.snapshot",
  959. "timeline.native"
  960. ],
  961. "file": "evidence/viewport.json",
  962. "status": "PASS",
  963. "testTitle": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  964. "recordedAt": "2026-09-06T08:22:14.169Z",
  965. "kind": "e2e",
  966. "title": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  967. "screenshots": [],
  968. "details": "树搜索、对象隐藏刷新、轮廓及视图开关、原生动画和PNG下载。移动/旋转/缩放只切换模式,真实gizmo拖动仍需补验;聚焦未做几何断言。"
  969. }
  970. ]
  971. },
  972. {
  973. "id": "tree.visibility",
  974. "group": "资源库与场景树",
  975. "name": "显示 / 隐藏对象",
  976. "source": {
  977. "file": "../../../unreal_tran/src/main.js",
  978. "line": 1925,
  979. "symbol": "buildSceneTree"
  980. },
  981. "implementation": "本轮修复",
  982. "boundary": "对象 visible 保存;隐藏祖先的子对象不接受射线拾取。",
  983. "fix": "拾取与高亮统一检查祖先可见性。",
  984. "acceptance": "隐藏父级后不能点到子级,保存重开仍隐藏。",
  985. "verification": "PASS",
  986. "evidence": [
  987. {
  988. "ids": [
  989. "tree.search",
  990. "tree.visibility",
  991. "selection.sync",
  992. "view.grid",
  993. "view.pbr",
  994. "view.wireframe",
  995. "view.outline",
  996. "view.perspective",
  997. "view.preview",
  998. "view.snapshot",
  999. "timeline.native"
  1000. ],
  1001. "file": "evidence/viewport.json",
  1002. "status": "PASS",
  1003. "testTitle": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1004. "recordedAt": "2026-09-06T08:22:14.169Z",
  1005. "kind": "e2e",
  1006. "title": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1007. "screenshots": [],
  1008. "details": "树搜索、对象隐藏刷新、轮廓及视图开关、原生动画和PNG下载。移动/旋转/缩放只切换模式,真实gizmo拖动仍需补验;聚焦未做几何断言。"
  1009. },
  1010. {
  1011. "ids": [
  1012. "tree.visibility",
  1013. "blueprint.highlight"
  1014. ],
  1015. "file": "validation.json",
  1016. "status": "PASS",
  1017. "kind": "unit",
  1018. "title": "visible child under a hidden ancestor cannot be picked or highlighted; trigger aliases include ancestors",
  1019. "screenshots": [],
  1020. "details": "共用可见性和祖先别名函数;鼠标事件另由 E2E 验证。"
  1021. }
  1022. ]
  1023. },
  1024. {
  1025. "id": "selection.scope",
  1026. "group": "资源库与场景树",
  1027. "name": "整体 / 部件级选择",
  1028. "source": {
  1029. "file": "../../../unreal_tran/src/main.js",
  1030. "line": 1938,
  1031. "symbol": "setSelectionScope"
  1032. },
  1033. "implementation": "已有实现",
  1034. "boundary": "整体作用主装备根;部件作用实际节点。",
  1035. "fix": "保留当前选择层级合同。",
  1036. "acceptance": "点击可见 mesh,整体/部件切换选择目标不同。",
  1037. "verification": "PASS",
  1038. "evidence": [
  1039. {
  1040. "ids": [
  1041. "project.name",
  1042. "project.autosave",
  1043. "view.orbit",
  1044. "view.focus",
  1045. "view.panels",
  1046. "view.preview-step",
  1047. "feedback.log",
  1048. "feedback.stats",
  1049. "property.identity",
  1050. "property.binding",
  1051. "selection.scope",
  1052. "component.inspect"
  1053. ],
  1054. "file": "evidence/46-navigation-panels-autosave.json",
  1055. "status": "PASS",
  1056. "testTitle": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  1057. "recordedAt": "2026-09-06T08:23:54.656Z",
  1058. "kind": "e2e+api",
  1059. "title": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  1060. "screenshots": [],
  1061. "details": "真实鼠标镜头操作;聚焦只验证相机目标;真实30秒自动保存,无测试加速定时器;统计内存估值未当作性能结论。"
  1062. }
  1063. ]
  1064. },
  1065. {
  1066. "id": "selection.sync",
  1067. "group": "资源库与场景树",
  1068. "name": "树 / 视口 / 属性选择联动",
  1069. "source": {
  1070. "file": "../../../unreal_tran/src/main.js",
  1071. "line": 1947,
  1072. "symbol": "selectObject"
  1073. },
  1074. "implementation": "本轮修复",
  1075. "boundary": "显示实际对象并更新辅助框;环境也是可编辑对象。",
  1076. "fix": "关闭轮廓后重选不恢复辅助框。",
  1077. "acceptance": "三处名称/对象 ID 一致,重选后轮廓状态保持。",
  1078. "verification": "PASS",
  1079. "evidence": [
  1080. {
  1081. "ids": [
  1082. "tree.search",
  1083. "tree.visibility",
  1084. "selection.sync",
  1085. "view.grid",
  1086. "view.pbr",
  1087. "view.wireframe",
  1088. "view.outline",
  1089. "view.perspective",
  1090. "view.preview",
  1091. "view.snapshot",
  1092. "timeline.native"
  1093. ],
  1094. "file": "evidence/viewport.json",
  1095. "status": "PASS",
  1096. "testTitle": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1097. "recordedAt": "2026-09-06T08:22:14.169Z",
  1098. "kind": "e2e",
  1099. "title": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1100. "screenshots": [],
  1101. "details": "树搜索、对象隐藏刷新、轮廓及视图开关、原生动画和PNG下载。移动/旋转/缩放只切换模式,真实gizmo拖动仍需补验;聚焦未做几何断言。"
  1102. }
  1103. ]
  1104. },
  1105. {
  1106. "id": "view.orbit",
  1107. "group": "三维视图与操作",
  1108. "name": "鼠标旋转 / 平移 / 缩放视角",
  1109. "source": {
  1110. "file": "../../../unreal_tran/src/main.js",
  1111. "line": 2,
  1112. "symbol": "OrbitControls"
  1113. },
  1114. "implementation": "已有实现",
  1115. "boundary": "当前三维相机;不是模型变换。",
  1116. "fix": "无本轮专门改动。",
  1117. "acceptance": "鼠标操作改变镜头但不改变对象局部坐标。",
  1118. "verification": "PASS",
  1119. "evidence": [
  1120. {
  1121. "ids": [
  1122. "project.name",
  1123. "project.autosave",
  1124. "view.orbit",
  1125. "view.focus",
  1126. "view.panels",
  1127. "view.preview-step",
  1128. "feedback.log",
  1129. "feedback.stats",
  1130. "property.identity",
  1131. "property.binding",
  1132. "selection.scope",
  1133. "component.inspect"
  1134. ],
  1135. "file": "evidence/46-navigation-panels-autosave.json",
  1136. "status": "PASS",
  1137. "testTitle": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  1138. "recordedAt": "2026-09-06T08:23:54.656Z",
  1139. "kind": "e2e+api",
  1140. "title": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  1141. "screenshots": [],
  1142. "details": "真实鼠标镜头操作;聚焦只验证相机目标;真实30秒自动保存,无测试加速定时器;统计内存估值未当作性能结论。"
  1143. }
  1144. ]
  1145. },
  1146. {
  1147. "id": "view.focus",
  1148. "group": "三维视图与操作",
  1149. "name": "聚焦选中 / F",
  1150. "source": {
  1151. "file": "../../../unreal_tran/src/main.js",
  1152. "line": 2272,
  1153. "symbol": "fitCamera"
  1154. },
  1155. "implementation": "已有实现",
  1156. "boundary": "按当前对象包围盒定位相机。",
  1157. "fix": "无本轮专门改动。",
  1158. "acceptance": "小模型/部件聚焦后仍可见,不被裁剪。",
  1159. "verification": "PASS",
  1160. "evidence": [
  1161. {
  1162. "ids": [
  1163. "project.name",
  1164. "project.autosave",
  1165. "view.orbit",
  1166. "view.focus",
  1167. "view.panels",
  1168. "view.preview-step",
  1169. "feedback.log",
  1170. "feedback.stats",
  1171. "property.identity",
  1172. "property.binding",
  1173. "selection.scope",
  1174. "component.inspect"
  1175. ],
  1176. "file": "evidence/46-navigation-panels-autosave.json",
  1177. "status": "PASS",
  1178. "testTitle": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  1179. "recordedAt": "2026-09-06T08:23:54.656Z",
  1180. "kind": "e2e+api",
  1181. "title": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  1182. "screenshots": [],
  1183. "details": "真实鼠标镜头操作;聚焦只验证相机目标;真实30秒自动保存,无测试加速定时器;统计内存估值未当作性能结论。"
  1184. }
  1185. ]
  1186. },
  1187. {
  1188. "id": "view.move",
  1189. "group": "三维视图与操作",
  1190. "name": "移动工具 / W",
  1191. "source": {
  1192. "file": "../../../unreal_tran/src/main.js",
  1193. "line": 2234,
  1194. "symbol": "setTransformMode"
  1195. },
  1196. "implementation": "本轮修复",
  1197. "boundary": "拖拽编辑对象局部位置,保存后重开一致。",
  1198. "fix": "动画姿态下更新基值只扣实际偏移。",
  1199. "acceptance": "移动后保存、刷新及动画再播放不漂移。",
  1200. "verification": "PASS",
  1201. "evidence": [
  1202. {
  1203. "ids": [
  1204. "view.move",
  1205. "view.rotate",
  1206. "view.scale"
  1207. ],
  1208. "file": "evidence/51-gizmos.json",
  1209. "status": "PASS",
  1210. "testTitle": "真实三维移动、旋转、缩放手柄拖动及撤销重做保存重开",
  1211. "recordedAt": "2026-09-06T08:22:38.815Z",
  1212. "kind": "e2e+runtime-readback",
  1213. "title": "真实三维移动、旋转、缩放手柄拖动及撤销重做保存重开",
  1214. "screenshots": [],
  1215. "details": ""
  1216. }
  1217. ]
  1218. },
  1219. {
  1220. "id": "view.rotate",
  1221. "group": "三维视图与操作",
  1222. "name": "旋转工具 / E",
  1223. "source": {
  1224. "file": "../../../unreal_tran/src/main.js",
  1225. "line": 2234,
  1226. "symbol": "setTransformMode"
  1227. },
  1228. "implementation": "本轮修复",
  1229. "boundary": "对象旋转;与当前时间轴旋转叠加需要一致。",
  1230. "fix": "统一动画基值处理。",
  1231. "acceptance": "旋转后保存/撤销/重做姿态一致。",
  1232. "verification": "PASS",
  1233. "evidence": [
  1234. {
  1235. "ids": [
  1236. "view.move",
  1237. "view.rotate",
  1238. "view.scale"
  1239. ],
  1240. "file": "evidence/51-gizmos.json",
  1241. "status": "PASS",
  1242. "testTitle": "真实三维移动、旋转、缩放手柄拖动及撤销重做保存重开",
  1243. "recordedAt": "2026-09-06T08:22:38.815Z",
  1244. "kind": "e2e+runtime-readback",
  1245. "title": "真实三维移动、旋转、缩放手柄拖动及撤销重做保存重开",
  1246. "screenshots": [],
  1247. "details": ""
  1248. }
  1249. ]
  1250. },
  1251. {
  1252. "id": "view.scale",
  1253. "group": "三维视图与操作",
  1254. "name": "缩放工具 / R",
  1255. "source": {
  1256. "file": "../../../unreal_tran/src/main.js",
  1257. "line": 2234,
  1258. "symbol": "setTransformMode"
  1259. },
  1260. "implementation": "已有实现",
  1261. "boundary": "对象缩放持久化;时间轴没有缩放轨道 UI。",
  1262. "fix": "无新增缩放动画能力。",
  1263. "acceptance": "对象缩放保存和重开正确。",
  1264. "verification": "PASS",
  1265. "evidence": [
  1266. {
  1267. "ids": [
  1268. "view.move",
  1269. "view.rotate",
  1270. "view.scale"
  1271. ],
  1272. "file": "evidence/51-gizmos.json",
  1273. "status": "PASS",
  1274. "testTitle": "真实三维移动、旋转、缩放手柄拖动及撤销重做保存重开",
  1275. "recordedAt": "2026-09-06T08:22:38.815Z",
  1276. "kind": "e2e+runtime-readback",
  1277. "title": "真实三维移动、旋转、缩放手柄拖动及撤销重做保存重开",
  1278. "screenshots": [],
  1279. "details": ""
  1280. }
  1281. ]
  1282. },
  1283. {
  1284. "id": "view.grid",
  1285. "group": "三维视图与操作",
  1286. "name": "网格开关",
  1287. "source": {
  1288. "file": "../../../unreal_tran/src/main.js",
  1289. "line": 2283,
  1290. "symbol": "toggleGrid"
  1291. },
  1292. "implementation": "已有实现",
  1293. "boundary": "临时视图选项,不要求写入工程。",
  1294. "fix": "非持久化不计保存缺陷。",
  1295. "acceptance": "开关只影响辅助网格,不改变模型。",
  1296. "verification": "PASS",
  1297. "evidence": [
  1298. {
  1299. "ids": [
  1300. "tree.search",
  1301. "tree.visibility",
  1302. "selection.sync",
  1303. "view.grid",
  1304. "view.pbr",
  1305. "view.wireframe",
  1306. "view.outline",
  1307. "view.perspective",
  1308. "view.preview",
  1309. "view.snapshot",
  1310. "timeline.native"
  1311. ],
  1312. "file": "evidence/viewport.json",
  1313. "status": "PASS",
  1314. "testTitle": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1315. "recordedAt": "2026-09-06T08:22:14.169Z",
  1316. "kind": "e2e",
  1317. "title": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1318. "screenshots": [],
  1319. "details": "树搜索、对象隐藏刷新、轮廓及视图开关、原生动画和PNG下载。移动/旋转/缩放只切换模式,真实gizmo拖动仍需补验;聚焦未做几何断言。"
  1320. }
  1321. ]
  1322. },
  1323. {
  1324. "id": "view.pbr",
  1325. "group": "三维视图与操作",
  1326. "name": "PBR 光照开关",
  1327. "source": {
  1328. "file": "../../../unreal_tran/src/main.js",
  1329. "line": 2236,
  1330. "symbol": "handleView"
  1331. },
  1332. "implementation": "已有实现",
  1333. "boundary": "当前照明预览选项;不是批量材质编辑。",
  1334. "fix": "非持久化不计保存缺陷。",
  1335. "acceptance": "开关改变显示,物体材质字段不被覆盖。",
  1336. "verification": "PASS",
  1337. "evidence": [
  1338. {
  1339. "ids": [
  1340. "tree.search",
  1341. "tree.visibility",
  1342. "selection.sync",
  1343. "view.grid",
  1344. "view.pbr",
  1345. "view.wireframe",
  1346. "view.outline",
  1347. "view.perspective",
  1348. "view.preview",
  1349. "view.snapshot",
  1350. "timeline.native"
  1351. ],
  1352. "file": "evidence/viewport.json",
  1353. "status": "PASS",
  1354. "testTitle": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1355. "recordedAt": "2026-09-06T08:22:14.169Z",
  1356. "kind": "e2e",
  1357. "title": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1358. "screenshots": [],
  1359. "details": "树搜索、对象隐藏刷新、轮廓及视图开关、原生动画和PNG下载。移动/旋转/缩放只切换模式,真实gizmo拖动仍需补验;聚焦未做几何断言。"
  1360. }
  1361. ]
  1362. },
  1363. {
  1364. "id": "view.wireframe",
  1365. "group": "三维视图与操作",
  1366. "name": "线框开关",
  1367. "source": {
  1368. "file": "../../../unreal_tran/src/main.js",
  1369. "line": 2236,
  1370. "symbol": "handleView"
  1371. },
  1372. "implementation": "已有实现",
  1373. "boundary": "当前视图选项;不承诺保存到工程。",
  1374. "fix": "非持久化不计保存缺陷。",
  1375. "acceptance": "线框开关恢复正常着色。",
  1376. "verification": "PASS",
  1377. "evidence": [
  1378. {
  1379. "ids": [
  1380. "tree.search",
  1381. "tree.visibility",
  1382. "selection.sync",
  1383. "view.grid",
  1384. "view.pbr",
  1385. "view.wireframe",
  1386. "view.outline",
  1387. "view.perspective",
  1388. "view.preview",
  1389. "view.snapshot",
  1390. "timeline.native"
  1391. ],
  1392. "file": "evidence/viewport.json",
  1393. "status": "PASS",
  1394. "testTitle": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1395. "recordedAt": "2026-09-06T08:22:14.169Z",
  1396. "kind": "e2e",
  1397. "title": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1398. "screenshots": [],
  1399. "details": "树搜索、对象隐藏刷新、轮廓及视图开关、原生动画和PNG下载。移动/旋转/缩放只切换模式,真实gizmo拖动仍需补验;聚焦未做几何断言。"
  1400. }
  1401. ]
  1402. },
  1403. {
  1404. "id": "view.outline",
  1405. "group": "三维视图与操作",
  1406. "name": "选中轮廓开关",
  1407. "source": {
  1408. "file": "../../../unreal_tran/src/main.js",
  1409. "line": 2236,
  1410. "symbol": "handleView"
  1411. },
  1412. "implementation": "本轮修复",
  1413. "boundary": "当前会话偏好,进出预览后保持;不要求跨重载存储。",
  1414. "fix": "重选时不重新泄露轮廓。",
  1415. "acceptance": "关闭→重选→预览→退出,轮廓仍关闭。",
  1416. "verification": "PASS",
  1417. "evidence": [
  1418. {
  1419. "ids": [
  1420. "tree.search",
  1421. "tree.visibility",
  1422. "selection.sync",
  1423. "view.grid",
  1424. "view.pbr",
  1425. "view.wireframe",
  1426. "view.outline",
  1427. "view.perspective",
  1428. "view.preview",
  1429. "view.snapshot",
  1430. "timeline.native"
  1431. ],
  1432. "file": "evidence/viewport.json",
  1433. "status": "PASS",
  1434. "testTitle": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1435. "recordedAt": "2026-09-06T08:22:14.169Z",
  1436. "kind": "e2e",
  1437. "title": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1438. "screenshots": [],
  1439. "details": "树搜索、对象隐藏刷新、轮廓及视图开关、原生动画和PNG下载。移动/旋转/缩放只切换模式,真实gizmo拖动仍需补验;聚焦未做几何断言。"
  1440. }
  1441. ]
  1442. },
  1443. {
  1444. "id": "view.perspective",
  1445. "group": "三维视图与操作",
  1446. "name": "透视视角按钮",
  1447. "source": {
  1448. "file": "../../../unreal_tran/src/main.js",
  1449. "line": 2236,
  1450. "symbol": "handleView"
  1451. },
  1452. "implementation": "现有边界",
  1453. "boundary": "重置透视观察角度;当前没有正交视角菜单。",
  1454. "fix": "不把临时视图状态当作保存缺陷。",
  1455. "acceptance": "点击后相机和聚焦目标正常。",
  1456. "verification": "PASS",
  1457. "evidence": [
  1458. {
  1459. "ids": [
  1460. "tree.search",
  1461. "tree.visibility",
  1462. "selection.sync",
  1463. "view.grid",
  1464. "view.pbr",
  1465. "view.wireframe",
  1466. "view.outline",
  1467. "view.perspective",
  1468. "view.preview",
  1469. "view.snapshot",
  1470. "timeline.native"
  1471. ],
  1472. "file": "evidence/viewport.json",
  1473. "status": "PASS",
  1474. "testTitle": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1475. "recordedAt": "2026-09-06T08:22:14.169Z",
  1476. "kind": "e2e",
  1477. "title": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1478. "screenshots": [],
  1479. "details": "树搜索、对象隐藏刷新、轮廓及视图开关、原生动画和PNG下载。移动/旋转/缩放只切换模式,真实gizmo拖动仍需补验;聚焦未做几何断言。"
  1480. }
  1481. ]
  1482. },
  1483. {
  1484. "id": "view.snapshot",
  1485. "group": "三维视图与操作",
  1486. "name": "下载视口截图",
  1487. "source": {
  1488. "file": "../../../unreal_tran/src/main.js",
  1489. "line": 3092,
  1490. "symbol": "downloadSnapshot"
  1491. },
  1492. "implementation": "已有实现",
  1493. "boundary": "当前 canvas PNG,可包含编辑辅助元素;保存封面是独立截图流程。",
  1494. "fix": "无本轮专门改动。",
  1495. "acceptance": "PNG 下载可打开,内容与当前视口对应。",
  1496. "verification": "PASS",
  1497. "evidence": [
  1498. {
  1499. "ids": [
  1500. "tree.search",
  1501. "tree.visibility",
  1502. "selection.sync",
  1503. "view.grid",
  1504. "view.pbr",
  1505. "view.wireframe",
  1506. "view.outline",
  1507. "view.perspective",
  1508. "view.preview",
  1509. "view.snapshot",
  1510. "timeline.native"
  1511. ],
  1512. "file": "evidence/viewport.json",
  1513. "status": "PASS",
  1514. "testTitle": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1515. "recordedAt": "2026-09-06T08:22:14.169Z",
  1516. "kind": "e2e",
  1517. "title": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1518. "screenshots": [],
  1519. "details": "树搜索、对象隐藏刷新、轮廓及视图开关、原生动画和PNG下载。移动/旋转/缩放只切换模式,真实gizmo拖动仍需补验;聚焦未做几何断言。"
  1520. }
  1521. ]
  1522. },
  1523. {
  1524. "id": "view.panels",
  1525. "group": "三维视图与操作",
  1526. "name": "底部页签 / Tab / 面板高度",
  1527. "source": {
  1528. "file": "../../../unreal_tran/src/main.js",
  1529. "line": 2215,
  1530. "symbol": "switchBottomMode"
  1531. },
  1532. "implementation": "已有实现",
  1533. "boundary": "时间轴、蓝图、曲线、日志切换;拖分割条只调整当前工作区。",
  1534. "fix": "曲线入口接真实数据。",
  1535. "acceptance": "各页签显示正确内容,调整高度后画布正确 resize。",
  1536. "verification": "PASS",
  1537. "evidence": [
  1538. {
  1539. "ids": [
  1540. "project.name",
  1541. "project.autosave",
  1542. "view.orbit",
  1543. "view.focus",
  1544. "view.panels",
  1545. "view.preview-step",
  1546. "feedback.log",
  1547. "feedback.stats",
  1548. "property.identity",
  1549. "property.binding",
  1550. "selection.scope",
  1551. "component.inspect"
  1552. ],
  1553. "file": "evidence/46-navigation-panels-autosave.json",
  1554. "status": "PASS",
  1555. "testTitle": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  1556. "recordedAt": "2026-09-06T08:23:54.656Z",
  1557. "kind": "e2e+api",
  1558. "title": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  1559. "screenshots": [],
  1560. "details": "真实鼠标镜头操作;聚焦只验证相机目标;真实30秒自动保存,无测试加速定时器;统计内存估值未当作性能结论。"
  1561. }
  1562. ]
  1563. },
  1564. {
  1565. "id": "view.preview",
  1566. "group": "三维视图与操作",
  1567. "name": "进入 / 退出运行预览",
  1568. "source": {
  1569. "file": "../../../unreal_tran/src/main.js",
  1570. "line": 2284,
  1571. "symbol": "togglePreview"
  1572. },
  1573. "implementation": "本轮修复",
  1574. "boundary": "真实当前三维场景;隐藏辅助工具,退出不丢编辑状态。",
  1575. "fix": "进入显式派发 auto;退出停止运行并恢复轮廓策略。",
  1576. "acceptance": "进入/退出与 Esc,三维仍可见,无辅助框泄漏。",
  1577. "verification": "PASS",
  1578. "evidence": [
  1579. {
  1580. "ids": [
  1581. "blueprint.click",
  1582. "blueprint.double-click",
  1583. "blueprint.auto",
  1584. "view.preview"
  1585. ],
  1586. "file": "evidence/truck-blueprint-events.json",
  1587. "status": "PASS",
  1588. "testTitle": "已保存蓝图:条件出口与目标匹配 runtime 检查,真实模型单击/双击/进入预览自动触发",
  1589. "recordedAt": "2026-09-06T08:21:50.227Z",
  1590. "kind": "e2e",
  1591. "title": "已保存蓝图:条件出口与目标匹配 runtime 检查,真实模型单击/双击/进入预览自动触发",
  1592. "screenshots": [],
  1593. "details": "执行使用正式模型编辑器的真实模型/时间轴/高亮/提示 handler;不等同于学员端任务下发。"
  1594. },
  1595. {
  1596. "ids": [
  1597. "tree.search",
  1598. "tree.visibility",
  1599. "selection.sync",
  1600. "view.grid",
  1601. "view.pbr",
  1602. "view.wireframe",
  1603. "view.outline",
  1604. "view.perspective",
  1605. "view.preview",
  1606. "view.snapshot",
  1607. "timeline.native"
  1608. ],
  1609. "file": "evidence/viewport.json",
  1610. "status": "PASS",
  1611. "testTitle": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1612. "recordedAt": "2026-09-06T08:22:14.169Z",
  1613. "kind": "e2e",
  1614. "title": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  1615. "screenshots": [],
  1616. "details": "树搜索、对象隐藏刷新、轮廓及视图开关、原生动画和PNG下载。移动/旋转/缩放只切换模式,真实gizmo拖动仍需补验;聚焦未做几何断言。"
  1617. }
  1618. ]
  1619. },
  1620. {
  1621. "id": "view.preview-step",
  1622. "group": "三维视图与操作",
  1623. "name": "预览播放 / 前后导航",
  1624. "source": {
  1625. "file": "../../../unreal_tran/src/main.js",
  1626. "line": 2122,
  1627. "symbol": "bindShellEvents"
  1628. },
  1629. "implementation": "现有边界",
  1630. "boundary": "播放运行蓝图;前后按钮当前按时间轴 ±2 秒,不是按业务工序跳转。",
  1631. "fix": "无新增业务工序导航。",
  1632. "acceptance": "播放触发真实流程;前后跳时与时间轴一致。",
  1633. "verification": "PASS",
  1634. "evidence": [
  1635. {
  1636. "ids": [
  1637. "project.name",
  1638. "project.autosave",
  1639. "view.orbit",
  1640. "view.focus",
  1641. "view.panels",
  1642. "view.preview-step",
  1643. "feedback.log",
  1644. "feedback.stats",
  1645. "property.identity",
  1646. "property.binding",
  1647. "selection.scope",
  1648. "component.inspect"
  1649. ],
  1650. "file": "evidence/46-navigation-panels-autosave.json",
  1651. "status": "PASS",
  1652. "testTitle": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  1653. "recordedAt": "2026-09-06T08:23:54.656Z",
  1654. "kind": "e2e+api",
  1655. "title": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  1656. "screenshots": [],
  1657. "details": "真实鼠标镜头操作;聚焦只验证相机目标;真实30秒自动保存,无测试加速定时器;统计内存估值未当作性能结论。"
  1658. }
  1659. ]
  1660. },
  1661. {
  1662. "id": "property.name",
  1663. "group": "对象属性与扩展标记",
  1664. "name": "对象名称",
  1665. "source": {
  1666. "file": "../../../unreal_tran/src/main.js",
  1667. "line": 1996,
  1668. "symbol": "bindInspectorEvents"
  1669. },
  1670. "implementation": "已有实现",
  1671. "boundary": "修改当前节点名,标识保持稳定。",
  1672. "fix": "无本轮专门改动。",
  1673. "acceptance": "树和属性同步,保存重开名称保留。",
  1674. "verification": "PASS",
  1675. "evidence": [
  1676. {
  1677. "ids": [
  1678. "property.name",
  1679. "property.position",
  1680. "property.rotation",
  1681. "property.scale",
  1682. "property.color",
  1683. "property.metalness",
  1684. "property.roughness",
  1685. "property.opacity",
  1686. "property.code",
  1687. "property.status",
  1688. "component.tag",
  1689. "project.undo",
  1690. "project.redo",
  1691. "project.save"
  1692. ],
  1693. "file": "evidence/properties.json",
  1694. "status": "PASS",
  1695. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  1696. "recordedAt": "2026-09-06T08:21:58.738Z",
  1697. "kind": "e2e+api",
  1698. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  1699. "screenshots": [],
  1700. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  1701. }
  1702. ]
  1703. },
  1704. {
  1705. "id": "property.identity",
  1706. "group": "对象属性与扩展标记",
  1707. "name": "对象标识 / 状态说明",
  1708. "source": {
  1709. "file": "../../../unreal_tran/src/main.js",
  1710. "line": 1958,
  1711. "symbol": "renderInspector"
  1712. },
  1713. "implementation": "本轮修复",
  1714. "boundary": "标识只读;可见性含祖先状态,阴影取实际castShadow;编辑能力由宿主权限注入。",
  1715. "fix": "不再固定显示“可见/投射阴影”,补宿主可编辑状态钩子。",
  1716. "acceptance": "标识不可编辑;选中对象、隐藏状态、阴影及只读权限标签一致。",
  1717. "verification": "PASS",
  1718. "evidence": [
  1719. {
  1720. "ids": [
  1721. "project.name",
  1722. "project.autosave",
  1723. "view.orbit",
  1724. "view.focus",
  1725. "view.panels",
  1726. "view.preview-step",
  1727. "feedback.log",
  1728. "feedback.stats",
  1729. "property.identity",
  1730. "property.binding",
  1731. "selection.scope",
  1732. "component.inspect"
  1733. ],
  1734. "file": "evidence/46-navigation-panels-autosave.json",
  1735. "status": "PASS",
  1736. "testTitle": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  1737. "recordedAt": "2026-09-06T08:23:54.656Z",
  1738. "kind": "e2e+api",
  1739. "title": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  1740. "screenshots": [],
  1741. "details": "真实鼠标镜头操作;聚焦只验证相机目标;真实30秒自动保存,无测试加速定时器;统计内存估值未当作性能结论。"
  1742. },
  1743. {
  1744. "ids": [
  1745. "property.identity"
  1746. ],
  1747. "file": "validation.json",
  1748. "status": "PASS",
  1749. "kind": "unit",
  1750. "title": "inspector state tags reflect ancestor visibility and actual shadow flags, with a host editability hook",
  1751. "screenshots": [],
  1752. "details": "真实属性 DOM 显示隐藏/阴影状态,并提供宿主权限标签 hook;不伪称此单测完成会话鉴权。"
  1753. }
  1754. ]
  1755. },
  1756. {
  1757. "id": "property.position",
  1758. "group": "对象属性与扩展标记",
  1759. "name": "位置 XYZ 数值",
  1760. "source": {
  1761. "file": "../../../unreal_tran/src/main.js",
  1762. "line": 1996,
  1763. "symbol": "bindInspectorEvents"
  1764. },
  1765. "implementation": "本轮修复",
  1766. "boundary": "局部坐标;动画当前帧下编辑也能生成正确基值。",
  1767. "fix": "中性姿态与实际应用偏移统一。",
  1768. "acceptance": "三个轴编辑、保存重开、动画回放一致。",
  1769. "verification": "PASS",
  1770. "evidence": [
  1771. {
  1772. "ids": [
  1773. "property.name",
  1774. "property.position",
  1775. "property.rotation",
  1776. "property.scale",
  1777. "property.color",
  1778. "property.metalness",
  1779. "property.roughness",
  1780. "property.opacity",
  1781. "property.code",
  1782. "property.status",
  1783. "component.tag",
  1784. "project.undo",
  1785. "project.redo",
  1786. "project.save"
  1787. ],
  1788. "file": "evidence/properties.json",
  1789. "status": "PASS",
  1790. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  1791. "recordedAt": "2026-09-06T08:21:58.738Z",
  1792. "kind": "e2e+api",
  1793. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  1794. "screenshots": [],
  1795. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  1796. }
  1797. ]
  1798. },
  1799. {
  1800. "id": "property.rotation",
  1801. "group": "对象属性与扩展标记",
  1802. "name": "旋转 XYZ 数值",
  1803. "source": {
  1804. "file": "../../../unreal_tran/src/main.js",
  1805. "line": 1996,
  1806. "symbol": "bindInspectorEvents"
  1807. },
  1808. "implementation": "本轮修复",
  1809. "boundary": "输入角度转弧度存储,显示角度。",
  1810. "fix": "多轨旋转基值不重复扣除。",
  1811. "acceptance": "度数显示与存储/播放的弧度一致。",
  1812. "verification": "PASS",
  1813. "evidence": [
  1814. {
  1815. "ids": [
  1816. "property.name",
  1817. "property.position",
  1818. "property.rotation",
  1819. "property.scale",
  1820. "property.color",
  1821. "property.metalness",
  1822. "property.roughness",
  1823. "property.opacity",
  1824. "property.code",
  1825. "property.status",
  1826. "component.tag",
  1827. "project.undo",
  1828. "project.redo",
  1829. "project.save"
  1830. ],
  1831. "file": "evidence/properties.json",
  1832. "status": "PASS",
  1833. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  1834. "recordedAt": "2026-09-06T08:21:58.738Z",
  1835. "kind": "e2e+api",
  1836. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  1837. "screenshots": [],
  1838. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  1839. }
  1840. ]
  1841. },
  1842. {
  1843. "id": "property.scale",
  1844. "group": "对象属性与扩展标记",
  1845. "name": "缩放 XYZ 数值",
  1846. "source": {
  1847. "file": "../../../unreal_tran/src/main.js",
  1848. "line": 1996,
  1849. "symbol": "bindInspectorEvents"
  1850. },
  1851. "implementation": "已有实现",
  1852. "boundary": "对象当前缩放,不添加新的缩放轨道。",
  1853. "fix": "无本轮专门改动。",
  1854. "acceptance": "非均匀缩放可保存和重开。",
  1855. "verification": "PASS",
  1856. "evidence": [
  1857. {
  1858. "ids": [
  1859. "property.name",
  1860. "property.position",
  1861. "property.rotation",
  1862. "property.scale",
  1863. "property.color",
  1864. "property.metalness",
  1865. "property.roughness",
  1866. "property.opacity",
  1867. "property.code",
  1868. "property.status",
  1869. "component.tag",
  1870. "project.undo",
  1871. "project.redo",
  1872. "project.save"
  1873. ],
  1874. "file": "evidence/properties.json",
  1875. "status": "PASS",
  1876. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  1877. "recordedAt": "2026-09-06T08:21:58.738Z",
  1878. "kind": "e2e+api",
  1879. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  1880. "screenshots": [],
  1881. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  1882. }
  1883. ]
  1884. },
  1885. {
  1886. "id": "property.color",
  1887. "group": "对象属性与扩展标记",
  1888. "name": "材质基础色",
  1889. "source": {
  1890. "file": "../../../unreal_tran/src/main.js",
  1891. "line": 1996,
  1892. "symbol": "bindInspectorEvents"
  1893. },
  1894. "implementation": "现有边界",
  1895. "boundary": "只编辑当前对象第一个材质槽;共享材质可能影响共享该实例的网格。",
  1896. "fix": "界面明确材质槽 1/N。",
  1897. "acceptance": "颜色修改、保存重开对应当前槽;不宣称所有槽可编辑。",
  1898. "verification": "PASS",
  1899. "evidence": [
  1900. {
  1901. "ids": [
  1902. "property.name",
  1903. "property.position",
  1904. "property.rotation",
  1905. "property.scale",
  1906. "property.color",
  1907. "property.metalness",
  1908. "property.roughness",
  1909. "property.opacity",
  1910. "property.code",
  1911. "property.status",
  1912. "component.tag",
  1913. "project.undo",
  1914. "project.redo",
  1915. "project.save"
  1916. ],
  1917. "file": "evidence/properties.json",
  1918. "status": "PASS",
  1919. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  1920. "recordedAt": "2026-09-06T08:21:58.738Z",
  1921. "kind": "e2e+api",
  1922. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  1923. "screenshots": [],
  1924. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  1925. }
  1926. ]
  1927. },
  1928. {
  1929. "id": "property.metalness",
  1930. "group": "对象属性与扩展标记",
  1931. "name": "材质金属度",
  1932. "source": {
  1933. "file": "../../../unreal_tran/src/main.js",
  1934. "line": 1996,
  1935. "symbol": "bindInspectorEvents"
  1936. },
  1937. "implementation": "现有边界",
  1938. "boundary": "当前首槽 PBR 参数 0~1。",
  1939. "fix": "标明材质槽范围。",
  1940. "acceptance": "拖动参数有效,保存重开值一致。",
  1941. "verification": "PASS",
  1942. "evidence": [
  1943. {
  1944. "ids": [
  1945. "property.name",
  1946. "property.position",
  1947. "property.rotation",
  1948. "property.scale",
  1949. "property.color",
  1950. "property.metalness",
  1951. "property.roughness",
  1952. "property.opacity",
  1953. "property.code",
  1954. "property.status",
  1955. "component.tag",
  1956. "project.undo",
  1957. "project.redo",
  1958. "project.save"
  1959. ],
  1960. "file": "evidence/properties.json",
  1961. "status": "PASS",
  1962. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  1963. "recordedAt": "2026-09-06T08:21:58.738Z",
  1964. "kind": "e2e+api",
  1965. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  1966. "screenshots": [],
  1967. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  1968. }
  1969. ]
  1970. },
  1971. {
  1972. "id": "property.roughness",
  1973. "group": "对象属性与扩展标记",
  1974. "name": "材质粗糙度",
  1975. "source": {
  1976. "file": "../../../unreal_tran/src/main.js",
  1977. "line": 1996,
  1978. "symbol": "bindInspectorEvents"
  1979. },
  1980. "implementation": "现有边界",
  1981. "boundary": "当前首槽 PBR 参数 0~1。",
  1982. "fix": "标明材质槽范围。",
  1983. "acceptance": "参数与当前槽持久化一致。",
  1984. "verification": "PASS",
  1985. "evidence": [
  1986. {
  1987. "ids": [
  1988. "property.name",
  1989. "property.position",
  1990. "property.rotation",
  1991. "property.scale",
  1992. "property.color",
  1993. "property.metalness",
  1994. "property.roughness",
  1995. "property.opacity",
  1996. "property.code",
  1997. "property.status",
  1998. "component.tag",
  1999. "project.undo",
  2000. "project.redo",
  2001. "project.save"
  2002. ],
  2003. "file": "evidence/properties.json",
  2004. "status": "PASS",
  2005. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  2006. "recordedAt": "2026-09-06T08:21:58.738Z",
  2007. "kind": "e2e+api",
  2008. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  2009. "screenshots": [],
  2010. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  2011. }
  2012. ]
  2013. },
  2014. {
  2015. "id": "property.opacity",
  2016. "group": "对象属性与扩展标记",
  2017. "name": "材质透明度",
  2018. "source": {
  2019. "file": "../../../unreal_tran/src/main.js",
  2020. "line": 1996,
  2021. "symbol": "bindInspectorEvents"
  2022. },
  2023. "implementation": "现有边界",
  2024. "boundary": "当前首槽;联动 transparent/depthWrite。",
  2025. "fix": "保留实际透明度保存字段。",
  2026. "acceptance": "透明效果与重开结果一致。",
  2027. "verification": "PASS",
  2028. "evidence": [
  2029. {
  2030. "ids": [
  2031. "property.name",
  2032. "property.position",
  2033. "property.rotation",
  2034. "property.scale",
  2035. "property.color",
  2036. "property.metalness",
  2037. "property.roughness",
  2038. "property.opacity",
  2039. "property.code",
  2040. "property.status",
  2041. "component.tag",
  2042. "project.undo",
  2043. "project.redo",
  2044. "project.save"
  2045. ],
  2046. "file": "evidence/properties.json",
  2047. "status": "PASS",
  2048. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  2049. "recordedAt": "2026-09-06T08:21:58.738Z",
  2050. "kind": "e2e+api",
  2051. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  2052. "screenshots": [],
  2053. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  2054. }
  2055. ]
  2056. },
  2057. {
  2058. "id": "property.code",
  2059. "group": "对象属性与扩展标记",
  2060. "name": "自定义资源编码",
  2061. "source": {
  2062. "file": "../../../unreal_tran/src/main.js",
  2063. "line": 1996,
  2064. "symbol": "bindInspectorEvents"
  2065. },
  2066. "implementation": "本轮修复",
  2067. "boundary": "对象 customProperties.resourceCode,不是服务器资产主键。",
  2068. "fix": "输入真正回写、保存、恢复及撤销。",
  2069. "acceptance": "编辑、清空、重选、JSON 往返、刷新均一致。",
  2070. "verification": "PASS",
  2071. "evidence": [
  2072. {
  2073. "ids": [
  2074. "property.name",
  2075. "property.position",
  2076. "property.rotation",
  2077. "property.scale",
  2078. "property.color",
  2079. "property.metalness",
  2080. "property.roughness",
  2081. "property.opacity",
  2082. "property.code",
  2083. "property.status",
  2084. "component.tag",
  2085. "project.undo",
  2086. "project.redo",
  2087. "project.save"
  2088. ],
  2089. "file": "evidence/properties.json",
  2090. "status": "PASS",
  2091. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  2092. "recordedAt": "2026-09-06T08:21:58.738Z",
  2093. "kind": "e2e+api",
  2094. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  2095. "screenshots": [],
  2096. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  2097. },
  2098. {
  2099. "ids": [
  2100. "property.code",
  2101. "property.status",
  2102. "component.tag"
  2103. ],
  2104. "file": "validation.json",
  2105. "status": "PASS",
  2106. "kind": "unit",
  2107. "title": "custom properties and extension labels survive actual capture, project JSON and object restore",
  2108. "screenshots": [],
  2109. "details": "真实对象 capture、normalization、JSON 与 restore 往返;清空和撤销到未存在字段状态。"
  2110. }
  2111. ]
  2112. },
  2113. {
  2114. "id": "property.status",
  2115. "group": "对象属性与扩展标记",
  2116. "name": "自定义运行状态",
  2117. "source": {
  2118. "file": "../../../unreal_tran/src/main.js",
  2119. "line": 1996,
  2120. "symbol": "bindInspectorEvents"
  2121. },
  2122. "implementation": "本轮修复",
  2123. "boundary": "NORMAL/SERVICE 标签,不会发起真实设备控制。",
  2124. "fix": "真正写回对象,首次变更可撤销。",
  2125. "acceptance": "两状态切换及刷新保留。",
  2126. "verification": "PASS",
  2127. "evidence": [
  2128. {
  2129. "ids": [
  2130. "property.name",
  2131. "property.position",
  2132. "property.rotation",
  2133. "property.scale",
  2134. "property.color",
  2135. "property.metalness",
  2136. "property.roughness",
  2137. "property.opacity",
  2138. "property.code",
  2139. "property.status",
  2140. "component.tag",
  2141. "project.undo",
  2142. "project.redo",
  2143. "project.save"
  2144. ],
  2145. "file": "evidence/properties.json",
  2146. "status": "PASS",
  2147. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  2148. "recordedAt": "2026-09-06T08:21:58.738Z",
  2149. "kind": "e2e+api",
  2150. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  2151. "screenshots": [],
  2152. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  2153. },
  2154. {
  2155. "ids": [
  2156. "property.code",
  2157. "property.status",
  2158. "component.tag"
  2159. ],
  2160. "file": "validation.json",
  2161. "status": "PASS",
  2162. "kind": "unit",
  2163. "title": "custom properties and extension labels survive actual capture, project JSON and object restore",
  2164. "screenshots": [],
  2165. "details": "真实对象 capture、normalization、JSON 与 restore 往返;清空和撤销到未存在字段状态。"
  2166. }
  2167. ]
  2168. },
  2169. {
  2170. "id": "property.binding",
  2171. "group": "对象属性与扩展标记",
  2172. "name": "流程绑定说明",
  2173. "source": {
  2174. "file": "../../../unreal_tran/src/main.js",
  2175. "line": 1958,
  2176. "symbol": "renderInspector"
  2177. },
  2178. "implementation": "现有边界",
  2179. "boundary": "只读显示模板/时间轴名称,不是教学任务的设备或物联网绑定。",
  2180. "fix": "无本轮业务绑定改造。",
  2181. "acceptance": "只读,不将其当作任务绑定操作验收。",
  2182. "verification": "PASS",
  2183. "evidence": [
  2184. {
  2185. "ids": [
  2186. "project.name",
  2187. "project.autosave",
  2188. "view.orbit",
  2189. "view.focus",
  2190. "view.panels",
  2191. "view.preview-step",
  2192. "feedback.log",
  2193. "feedback.stats",
  2194. "property.identity",
  2195. "property.binding",
  2196. "selection.scope",
  2197. "component.inspect"
  2198. ],
  2199. "file": "evidence/46-navigation-panels-autosave.json",
  2200. "status": "PASS",
  2201. "testTitle": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  2202. "recordedAt": "2026-09-06T08:23:54.656Z",
  2203. "kind": "e2e+api",
  2204. "title": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  2205. "screenshots": [],
  2206. "details": "真实鼠标镜头操作;聚焦只验证相机目标;真实30秒自动保存,无测试加速定时器;统计内存估值未当作性能结论。"
  2207. }
  2208. ]
  2209. },
  2210. {
  2211. "id": "component.inspect",
  2212. "group": "对象属性与扩展标记",
  2213. "name": "组件页内置能力说明",
  2214. "source": {
  2215. "file": "../../../unreal_tran/src/main.js",
  2216. "line": 1975,
  2217. "symbol": "renderComponents"
  2218. },
  2219. "implementation": "现有边界",
  2220. "boundary": "变换、场景节点、渲染等派生说明,没有通用组件启停系统。",
  2221. "fix": "区分内置说明与自定义标记。",
  2222. "acceptance": "显示与对象类型一致,不虚报可执行组件配置。",
  2223. "verification": "PASS",
  2224. "evidence": [
  2225. {
  2226. "ids": [
  2227. "project.name",
  2228. "project.autosave",
  2229. "view.orbit",
  2230. "view.focus",
  2231. "view.panels",
  2232. "view.preview-step",
  2233. "feedback.log",
  2234. "feedback.stats",
  2235. "property.identity",
  2236. "property.binding",
  2237. "selection.scope",
  2238. "component.inspect"
  2239. ],
  2240. "file": "evidence/46-navigation-panels-autosave.json",
  2241. "status": "PASS",
  2242. "testTitle": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  2243. "recordedAt": "2026-09-06T08:23:54.656Z",
  2244. "kind": "e2e+api",
  2245. "title": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  2246. "screenshots": [],
  2247. "details": "真实鼠标镜头操作;聚焦只验证相机目标;真实30秒自动保存,无测试加速定时器;统计内存估值未当作性能结论。"
  2248. }
  2249. ]
  2250. },
  2251. {
  2252. "id": "component.tag",
  2253. "group": "对象属性与扩展标记",
  2254. "name": "添加扩展标记",
  2255. "source": {
  2256. "file": "../../../unreal_tran/src/main.js",
  2257. "line": 1975,
  2258. "symbol": "renderComponents"
  2259. },
  2260. "implementation": "本轮澄清",
  2261. "boundary": "只保存名称标签;没有脚本、启停、运行时行为。",
  2262. "fix": "从“添加组件”改为“扩展标记,仅保存标签”。",
  2263. "acceptance": "新增标签保存/重开;不得声称已启用新行为。",
  2264. "verification": "PASS",
  2265. "evidence": [
  2266. {
  2267. "ids": [
  2268. "property.name",
  2269. "property.position",
  2270. "property.rotation",
  2271. "property.scale",
  2272. "property.color",
  2273. "property.metalness",
  2274. "property.roughness",
  2275. "property.opacity",
  2276. "property.code",
  2277. "property.status",
  2278. "component.tag",
  2279. "project.undo",
  2280. "project.redo",
  2281. "project.save"
  2282. ],
  2283. "file": "evidence/properties.json",
  2284. "status": "PASS",
  2285. "testTitle": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  2286. "recordedAt": "2026-09-06T08:21:58.738Z",
  2287. "kind": "e2e+api",
  2288. "title": "对象名称、变换、PBR、属性与扩展标记保存重开;撤销重做",
  2289. "screenshots": [],
  2290. "details": "真实属性输入/材质参数/标签、保存与刷新;变换只验数值输入,不代替三维 gizmo 拖动。"
  2291. },
  2292. {
  2293. "ids": [
  2294. "property.code",
  2295. "property.status",
  2296. "component.tag"
  2297. ],
  2298. "file": "validation.json",
  2299. "status": "PASS",
  2300. "kind": "unit",
  2301. "title": "custom properties and extension labels survive actual capture, project JSON and object restore",
  2302. "screenshots": [],
  2303. "details": "真实对象 capture、normalization、JSON 与 restore 往返;清空和撤销到未存在字段状态。"
  2304. }
  2305. ]
  2306. },
  2307. {
  2308. "id": "timeline.play",
  2309. "group": "时间轴与曲线",
  2310. "name": "播放 / 暂停 / Space",
  2311. "source": {
  2312. "file": "../../../unreal_tran/src/timeline.js",
  2313. "line": 393,
  2314. "symbol": "play()"
  2315. },
  2316. "implementation": "已有实现",
  2317. "boundary": "播放当前编辑时间轴;原生 GLB 动画单独控制。",
  2318. "fix": "停止清理与时间同步由本轮补强。",
  2319. "acceptance": "播放进度/真实对象姿态变化,暂停停在当前帧。",
  2320. "verification": "PASS",
  2321. "evidence": [
  2322. {
  2323. "ids": [
  2324. "timeline.play",
  2325. "timeline.stop",
  2326. "timeline.loop",
  2327. "timeline.key-nav",
  2328. "timeline.add-track",
  2329. "timeline.remove-track",
  2330. "timeline.target",
  2331. "timeline.property",
  2332. "timeline.mute",
  2333. "timeline.add-key",
  2334. "timeline.delete-key",
  2335. "timeline.drag-key",
  2336. "timeline.zoom",
  2337. "timeline.curve",
  2338. "curve.time",
  2339. "curve.value",
  2340. "curve.easing"
  2341. ],
  2342. "file": "evidence/truck-timeline-curve.json",
  2343. "status": "PASS",
  2344. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2345. "recordedAt": "2026-09-06T08:21:02.898Z",
  2346. "kind": "e2e+runtime-read",
  2347. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2348. "screenshots": [],
  2349. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  2350. }
  2351. ]
  2352. },
  2353. {
  2354. "id": "timeline.stop",
  2355. "group": "时间轴与曲线",
  2356. "name": "停止",
  2357. "source": {
  2358. "file": "../../../unreal_tran/src/timeline.js",
  2359. "line": 429,
  2360. "symbol": "stop()"
  2361. },
  2362. "implementation": "已有实现",
  2363. "boundary": "停止并回到起始时间,按起始帧应用动画。",
  2364. "fix": "无本轮语义扩展。",
  2365. "acceptance": "按钮停止后不再自行前进。",
  2366. "verification": "PASS",
  2367. "evidence": [
  2368. {
  2369. "ids": [
  2370. "timeline.play",
  2371. "timeline.stop",
  2372. "timeline.loop",
  2373. "timeline.key-nav",
  2374. "timeline.add-track",
  2375. "timeline.remove-track",
  2376. "timeline.target",
  2377. "timeline.property",
  2378. "timeline.mute",
  2379. "timeline.add-key",
  2380. "timeline.delete-key",
  2381. "timeline.drag-key",
  2382. "timeline.zoom",
  2383. "timeline.curve",
  2384. "curve.time",
  2385. "curve.value",
  2386. "curve.easing"
  2387. ],
  2388. "file": "evidence/truck-timeline-curve.json",
  2389. "status": "PASS",
  2390. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2391. "recordedAt": "2026-09-06T08:21:02.898Z",
  2392. "kind": "e2e+runtime-read",
  2393. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2394. "screenshots": [],
  2395. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  2396. }
  2397. ]
  2398. },
  2399. {
  2400. "id": "timeline.loop",
  2401. "group": "时间轴与曲线",
  2402. "name": "循环开关",
  2403. "source": {
  2404. "file": "../../../unreal_tran/src/timeline.js",
  2405. "line": 198,
  2406. "symbol": "#bindEvents"
  2407. },
  2408. "implementation": "本轮修复",
  2409. "boundary": "循环设置随 timeline 保存;不循环到达终点只完成一次。",
  2410. "fix": "循环变更进入历史/dirty。",
  2411. "acceptance": "开关、保存重开、到末尾/循环边界正确。",
  2412. "verification": "PASS",
  2413. "evidence": [
  2414. {
  2415. "ids": [
  2416. "timeline.play",
  2417. "timeline.stop",
  2418. "timeline.loop",
  2419. "timeline.key-nav",
  2420. "timeline.add-track",
  2421. "timeline.remove-track",
  2422. "timeline.target",
  2423. "timeline.property",
  2424. "timeline.mute",
  2425. "timeline.add-key",
  2426. "timeline.delete-key",
  2427. "timeline.drag-key",
  2428. "timeline.zoom",
  2429. "timeline.curve",
  2430. "curve.time",
  2431. "curve.value",
  2432. "curve.easing"
  2433. ],
  2434. "file": "evidence/truck-timeline-curve.json",
  2435. "status": "PASS",
  2436. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2437. "recordedAt": "2026-09-06T08:21:02.898Z",
  2438. "kind": "e2e+runtime-read",
  2439. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2440. "screenshots": [],
  2441. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  2442. }
  2443. ]
  2444. },
  2445. {
  2446. "id": "timeline.key-nav",
  2447. "group": "时间轴与曲线",
  2448. "name": "上一 / 下一关键帧",
  2449. "source": {
  2450. "file": "../../../unreal_tran/src/timeline.js",
  2451. "line": 232,
  2452. "symbol": "#onClick"
  2453. },
  2454. "implementation": "已有实现",
  2455. "boundary": "按时间轴关键帧时间定位。",
  2456. "fix": "无本轮专门改动。",
  2457. "acceptance": "多个轨道时跳到正确相邻关键时刻。",
  2458. "verification": "PASS",
  2459. "evidence": [
  2460. {
  2461. "ids": [
  2462. "timeline.play",
  2463. "timeline.stop",
  2464. "timeline.loop",
  2465. "timeline.key-nav",
  2466. "timeline.add-track",
  2467. "timeline.remove-track",
  2468. "timeline.target",
  2469. "timeline.property",
  2470. "timeline.mute",
  2471. "timeline.add-key",
  2472. "timeline.delete-key",
  2473. "timeline.drag-key",
  2474. "timeline.zoom",
  2475. "timeline.curve",
  2476. "curve.time",
  2477. "curve.value",
  2478. "curve.easing"
  2479. ],
  2480. "file": "evidence/truck-timeline-curve.json",
  2481. "status": "PASS",
  2482. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2483. "recordedAt": "2026-09-06T08:21:02.898Z",
  2484. "kind": "e2e+runtime-read",
  2485. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2486. "screenshots": [],
  2487. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  2488. }
  2489. ]
  2490. },
  2491. {
  2492. "id": "timeline.seek",
  2493. "group": "时间轴与曲线",
  2494. "name": "拖播放头 / 点击刻度",
  2495. "source": {
  2496. "file": "../../../unreal_tran/src/timeline.js",
  2497. "line": 263,
  2498. "symbol": "#onPointerDown"
  2499. },
  2500. "implementation": "本轮修复",
  2501. "boundary": "实时求值当前帧;键盘左右移动一帧,Shift 移动一秒。",
  2502. "fix": "拖动补发 timechange,解绑指针监听。",
  2503. "acceptance": "时间码、曲线和视口姿态同步。",
  2504. "verification": "PASS",
  2505. "evidence": [
  2506. {
  2507. "ids": [
  2508. "timeline.seek",
  2509. "timeline.record",
  2510. "timeline.baseline",
  2511. "curve.axis",
  2512. "blueprint.palette",
  2513. "blueprint.add",
  2514. "blueprint.canvas"
  2515. ],
  2516. "file": "evidence/truck-blueprint-tool-supplement.json",
  2517. "status": "PASS",
  2518. "testTitle": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  2519. "recordedAt": "2026-09-06T08:21:23.003Z",
  2520. "kind": "e2e+runtime-read",
  2521. "title": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  2522. "screenshots": [],
  2523. "details": "真实模型编辑参数/基准轨道生成验收,不构成装备操作或维修指导。桥梁原工程94仅GET和copy。"
  2524. }
  2525. ]
  2526. },
  2527. {
  2528. "id": "timeline.add-track",
  2529. "group": "时间轴与曲线",
  2530. "name": "添加轨道",
  2531. "source": {
  2532. "file": "../../../unreal_tran/src/timeline.js",
  2533. "line": 471,
  2534. "symbol": "addTrack("
  2535. },
  2536. "implementation": "已有实现",
  2537. "boundary": "当前主装备节点的变换轨道。",
  2538. "fix": "无新增轨道类型。",
  2539. "acceptance": "增加后可绑定节点并保存。",
  2540. "verification": "PASS",
  2541. "evidence": [
  2542. {
  2543. "ids": [
  2544. "timeline.play",
  2545. "timeline.stop",
  2546. "timeline.loop",
  2547. "timeline.key-nav",
  2548. "timeline.add-track",
  2549. "timeline.remove-track",
  2550. "timeline.target",
  2551. "timeline.property",
  2552. "timeline.mute",
  2553. "timeline.add-key",
  2554. "timeline.delete-key",
  2555. "timeline.drag-key",
  2556. "timeline.zoom",
  2557. "timeline.curve",
  2558. "curve.time",
  2559. "curve.value",
  2560. "curve.easing"
  2561. ],
  2562. "file": "evidence/truck-timeline-curve.json",
  2563. "status": "PASS",
  2564. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2565. "recordedAt": "2026-09-06T08:21:02.898Z",
  2566. "kind": "e2e+runtime-read",
  2567. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2568. "screenshots": [],
  2569. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  2570. }
  2571. ]
  2572. },
  2573. {
  2574. "id": "timeline.remove-track",
  2575. "group": "时间轴与曲线",
  2576. "name": "删除轨道",
  2577. "source": {
  2578. "file": "../../../unreal_tran/src/timeline.js",
  2579. "line": 495,
  2580. "symbol": "removeTrack("
  2581. },
  2582. "implementation": "本轮修复",
  2583. "boundary": "删除后不再保留该轨道施加的旧姿态。",
  2584. "fix": "宿主恢复此前作用的属性基值。",
  2585. "acceptance": "删除即时复原,再保存/重开一致。",
  2586. "verification": "PASS",
  2587. "evidence": [
  2588. {
  2589. "ids": [
  2590. "timeline.play",
  2591. "timeline.stop",
  2592. "timeline.loop",
  2593. "timeline.key-nav",
  2594. "timeline.add-track",
  2595. "timeline.remove-track",
  2596. "timeline.target",
  2597. "timeline.property",
  2598. "timeline.mute",
  2599. "timeline.add-key",
  2600. "timeline.delete-key",
  2601. "timeline.drag-key",
  2602. "timeline.zoom",
  2603. "timeline.curve",
  2604. "curve.time",
  2605. "curve.value",
  2606. "curve.easing"
  2607. ],
  2608. "file": "evidence/truck-timeline-curve.json",
  2609. "status": "PASS",
  2610. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2611. "recordedAt": "2026-09-06T08:21:02.898Z",
  2612. "kind": "e2e+runtime-read",
  2613. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2614. "screenshots": [],
  2615. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  2616. }
  2617. ]
  2618. },
  2619. {
  2620. "id": "timeline.target",
  2621. "group": "时间轴与曲线",
  2622. "name": "修改轨道目标节点",
  2623. "source": {
  2624. "file": "../../../unreal_tran/src/timeline.js",
  2625. "line": 506,
  2626. "symbol": "updateSelectedTrack"
  2627. },
  2628. "implementation": "本轮修复",
  2629. "boundary": "用稳定对象标识绑定,不靠同名第一项。",
  2630. "fix": "重绑清理旧目标的应用姿态。",
  2631. "acceptance": "从 A 改为 B,A 复原,B 播放。",
  2632. "verification": "PASS",
  2633. "evidence": [
  2634. {
  2635. "ids": [
  2636. "timeline.play",
  2637. "timeline.stop",
  2638. "timeline.loop",
  2639. "timeline.key-nav",
  2640. "timeline.add-track",
  2641. "timeline.remove-track",
  2642. "timeline.target",
  2643. "timeline.property",
  2644. "timeline.mute",
  2645. "timeline.add-key",
  2646. "timeline.delete-key",
  2647. "timeline.drag-key",
  2648. "timeline.zoom",
  2649. "timeline.curve",
  2650. "curve.time",
  2651. "curve.value",
  2652. "curve.easing"
  2653. ],
  2654. "file": "evidence/truck-timeline-curve.json",
  2655. "status": "PASS",
  2656. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2657. "recordedAt": "2026-09-06T08:21:02.898Z",
  2658. "kind": "e2e+runtime-read",
  2659. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2660. "screenshots": [],
  2661. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  2662. },
  2663. {
  2664. "ids": [
  2665. "timeline.multitrack",
  2666. "timeline.target"
  2667. ],
  2668. "file": "validation.json",
  2669. "status": "PASS",
  2670. "kind": "unit",
  2671. "title": "changing a binding resets the former target and keeps manual transform edits as base",
  2672. "screenshots": [],
  2673. "details": "轨道重绑后旧目标复位,手动变换成为新基值;不假称鼠标拖动已验。"
  2674. }
  2675. ]
  2676. },
  2677. {
  2678. "id": "timeline.property",
  2679. "group": "时间轴与曲线",
  2680. "name": "选择位置 / 旋转属性",
  2681. "source": {
  2682. "file": "../../../unreal_tran/src/timeline.js",
  2683. "line": 506,
  2684. "symbol": "updateSelectedTrack"
  2685. },
  2686. "implementation": "已有实现",
  2687. "boundary": "位置 XYZ 向量、旋转 X/Y/Z;没有缩放轨道 UI。",
  2688. "fix": "保留当前实际能力。",
  2689. "acceptance": "属性切换后关键帧类型和播放一致。",
  2690. "verification": "PASS",
  2691. "evidence": [
  2692. {
  2693. "ids": [
  2694. "timeline.play",
  2695. "timeline.stop",
  2696. "timeline.loop",
  2697. "timeline.key-nav",
  2698. "timeline.add-track",
  2699. "timeline.remove-track",
  2700. "timeline.target",
  2701. "timeline.property",
  2702. "timeline.mute",
  2703. "timeline.add-key",
  2704. "timeline.delete-key",
  2705. "timeline.drag-key",
  2706. "timeline.zoom",
  2707. "timeline.curve",
  2708. "curve.time",
  2709. "curve.value",
  2710. "curve.easing"
  2711. ],
  2712. "file": "evidence/truck-timeline-curve.json",
  2713. "status": "PASS",
  2714. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2715. "recordedAt": "2026-09-06T08:21:02.898Z",
  2716. "kind": "e2e+runtime-read",
  2717. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2718. "screenshots": [],
  2719. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  2720. }
  2721. ]
  2722. },
  2723. {
  2724. "id": "timeline.mute",
  2725. "group": "时间轴与曲线",
  2726. "name": "轨道静音",
  2727. "source": {
  2728. "file": "../../../unreal_tran/src/timeline.js",
  2729. "line": 232,
  2730. "symbol": "#onClick"
  2731. },
  2732. "implementation": "本轮修复",
  2733. "boundary": "仅忽略当前轨道,不关闭其他轨道。",
  2734. "fix": "不再停留旧姿态或保存时重复扣值。",
  2735. "acceptance": "静音/恢复后实际姿态与重开一致。",
  2736. "verification": "PASS",
  2737. "evidence": [
  2738. {
  2739. "ids": [
  2740. "timeline.play",
  2741. "timeline.stop",
  2742. "timeline.loop",
  2743. "timeline.key-nav",
  2744. "timeline.add-track",
  2745. "timeline.remove-track",
  2746. "timeline.target",
  2747. "timeline.property",
  2748. "timeline.mute",
  2749. "timeline.add-key",
  2750. "timeline.delete-key",
  2751. "timeline.drag-key",
  2752. "timeline.zoom",
  2753. "timeline.curve",
  2754. "curve.time",
  2755. "curve.value",
  2756. "curve.easing"
  2757. ],
  2758. "file": "evidence/truck-timeline-curve.json",
  2759. "status": "PASS",
  2760. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2761. "recordedAt": "2026-09-06T08:21:02.898Z",
  2762. "kind": "e2e+runtime-read",
  2763. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2764. "screenshots": [],
  2765. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  2766. }
  2767. ]
  2768. },
  2769. {
  2770. "id": "timeline.record",
  2771. "group": "时间轴与曲线",
  2772. "name": "记录当前姿态关键帧",
  2773. "source": {
  2774. "file": "../../../unreal_tran/src/main.js",
  2775. "line": 2276,
  2776. "symbol": "addKeyframeFromSelection"
  2777. },
  2778. "implementation": "本轮修复",
  2779. "boundary": "记录相对对象基值的当前值。",
  2780. "fix": "与多轨实际应用/保存采用同一基值。",
  2781. "acceptance": "操作对象后记录,回放命中相同姿态。",
  2782. "verification": "PASS",
  2783. "evidence": [
  2784. {
  2785. "ids": [
  2786. "timeline.seek",
  2787. "timeline.record",
  2788. "timeline.baseline",
  2789. "curve.axis",
  2790. "blueprint.palette",
  2791. "blueprint.add",
  2792. "blueprint.canvas"
  2793. ],
  2794. "file": "evidence/truck-blueprint-tool-supplement.json",
  2795. "status": "PASS",
  2796. "testTitle": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  2797. "recordedAt": "2026-09-06T08:21:23.003Z",
  2798. "kind": "e2e+runtime-read",
  2799. "title": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  2800. "screenshots": [],
  2801. "details": "真实模型编辑参数/基准轨道生成验收,不构成装备操作或维修指导。桥梁原工程94仅GET和copy。"
  2802. }
  2803. ]
  2804. },
  2805. {
  2806. "id": "timeline.add-key",
  2807. "group": "时间轴与曲线",
  2808. "name": "双击新增关键帧",
  2809. "source": {
  2810. "file": "../../../unreal_tran/src/timeline.js",
  2811. "line": 255,
  2812. "symbol": "#onDoubleClick"
  2813. },
  2814. "implementation": "已有实现",
  2815. "boundary": "在轨道对应时刻创建/更新关键帧。",
  2816. "fix": "时间碰撞保留当前编辑帧。",
  2817. "acceptance": "新增后节点可选,时间/数值可保存。",
  2818. "verification": "PASS",
  2819. "evidence": [
  2820. {
  2821. "ids": [
  2822. "timeline.play",
  2823. "timeline.stop",
  2824. "timeline.loop",
  2825. "timeline.key-nav",
  2826. "timeline.add-track",
  2827. "timeline.remove-track",
  2828. "timeline.target",
  2829. "timeline.property",
  2830. "timeline.mute",
  2831. "timeline.add-key",
  2832. "timeline.delete-key",
  2833. "timeline.drag-key",
  2834. "timeline.zoom",
  2835. "timeline.curve",
  2836. "curve.time",
  2837. "curve.value",
  2838. "curve.easing"
  2839. ],
  2840. "file": "evidence/truck-timeline-curve.json",
  2841. "status": "PASS",
  2842. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2843. "recordedAt": "2026-09-06T08:21:02.898Z",
  2844. "kind": "e2e+runtime-read",
  2845. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2846. "screenshots": [],
  2847. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  2848. }
  2849. ]
  2850. },
  2851. {
  2852. "id": "timeline.delete-key",
  2853. "group": "时间轴与曲线",
  2854. "name": "删除关键帧 / Delete",
  2855. "source": {
  2856. "file": "../../../unreal_tran/src/timeline.js",
  2857. "line": 584,
  2858. "symbol": "deleteSelected"
  2859. },
  2860. "implementation": "已有实现",
  2861. "boundary": "删除选中的关键帧;输入框编辑时不截获删除键。",
  2862. "fix": "删除和监听清理回归。",
  2863. "acceptance": "删除后曲线和播放变化,撤销可恢复。",
  2864. "verification": "PASS",
  2865. "evidence": [
  2866. {
  2867. "ids": [
  2868. "timeline.play",
  2869. "timeline.stop",
  2870. "timeline.loop",
  2871. "timeline.key-nav",
  2872. "timeline.add-track",
  2873. "timeline.remove-track",
  2874. "timeline.target",
  2875. "timeline.property",
  2876. "timeline.mute",
  2877. "timeline.add-key",
  2878. "timeline.delete-key",
  2879. "timeline.drag-key",
  2880. "timeline.zoom",
  2881. "timeline.curve",
  2882. "curve.time",
  2883. "curve.value",
  2884. "curve.easing"
  2885. ],
  2886. "file": "evidence/truck-timeline-curve.json",
  2887. "status": "PASS",
  2888. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2889. "recordedAt": "2026-09-06T08:21:02.898Z",
  2890. "kind": "e2e+runtime-read",
  2891. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2892. "screenshots": [],
  2893. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  2894. }
  2895. ]
  2896. },
  2897. {
  2898. "id": "timeline.drag-key",
  2899. "group": "时间轴与曲线",
  2900. "name": "关键帧拖动 / Alt 取消吸附",
  2901. "source": {
  2902. "file": "../../../unreal_tran/src/timeline.js",
  2903. "line": 263,
  2904. "symbol": "#onPointerDown"
  2905. },
  2906. "implementation": "本轮修复",
  2907. "boundary": "默认 1/30 秒吸附;重叠时合并,保留正在编辑帧。",
  2908. "fix": "拖动时间同步,碰撞处理确定。",
  2909. "acceptance": "拖动/重叠/Alt 行为和保存后时间正确。",
  2910. "verification": "PASS",
  2911. "evidence": [
  2912. {
  2913. "ids": [
  2914. "timeline.play",
  2915. "timeline.stop",
  2916. "timeline.loop",
  2917. "timeline.key-nav",
  2918. "timeline.add-track",
  2919. "timeline.remove-track",
  2920. "timeline.target",
  2921. "timeline.property",
  2922. "timeline.mute",
  2923. "timeline.add-key",
  2924. "timeline.delete-key",
  2925. "timeline.drag-key",
  2926. "timeline.zoom",
  2927. "timeline.curve",
  2928. "curve.time",
  2929. "curve.value",
  2930. "curve.easing"
  2931. ],
  2932. "file": "evidence/truck-timeline-curve.json",
  2933. "status": "PASS",
  2934. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2935. "recordedAt": "2026-09-06T08:21:02.898Z",
  2936. "kind": "e2e+runtime-read",
  2937. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2938. "screenshots": [],
  2939. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  2940. }
  2941. ]
  2942. },
  2943. {
  2944. "id": "timeline.zoom",
  2945. "group": "时间轴与曲线",
  2946. "name": "时间轴缩放",
  2947. "source": {
  2948. "file": "../../../unreal_tran/src/timeline.js",
  2949. "line": 451,
  2950. "symbol": "setZoom"
  2951. },
  2952. "implementation": "已有实现",
  2953. "boundary": "显示缩放随 timeline 记录;不改变时长/关键帧数值。",
  2954. "fix": "无本轮专门改动。",
  2955. "acceptance": "缩放不改变动作内容。",
  2956. "verification": "PASS",
  2957. "evidence": [
  2958. {
  2959. "ids": [
  2960. "timeline.play",
  2961. "timeline.stop",
  2962. "timeline.loop",
  2963. "timeline.key-nav",
  2964. "timeline.add-track",
  2965. "timeline.remove-track",
  2966. "timeline.target",
  2967. "timeline.property",
  2968. "timeline.mute",
  2969. "timeline.add-key",
  2970. "timeline.delete-key",
  2971. "timeline.drag-key",
  2972. "timeline.zoom",
  2973. "timeline.curve",
  2974. "curve.time",
  2975. "curve.value",
  2976. "curve.easing"
  2977. ],
  2978. "file": "evidence/truck-timeline-curve.json",
  2979. "status": "PASS",
  2980. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2981. "recordedAt": "2026-09-06T08:21:02.898Z",
  2982. "kind": "e2e+runtime-read",
  2983. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  2984. "screenshots": [],
  2985. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  2986. }
  2987. ]
  2988. },
  2989. {
  2990. "id": "timeline.multitrack",
  2991. "group": "时间轴与曲线",
  2992. "name": "多轨组合与保存基值",
  2993. "source": {
  2994. "file": "../../../unreal_tran/src/model-editor-state.js",
  2995. "line": 12,
  2996. "symbol": "applyEditorTimelinePose"
  2997. },
  2998. "implementation": "本轮修复",
  2999. "boundary": "不同属性组合;同对象同属性最后有效轨道生效。",
  3000. "fix": "求值、手工编辑基值、序列化一致。",
  3001. "acceptance": "两轨同属性、静音、删轨、重绑、重开无漂移。",
  3002. "verification": "PASS",
  3003. "evidence": [
  3004. {
  3005. "ids": [
  3006. "timeline.multitrack"
  3007. ],
  3008. "file": "validation.json",
  3009. "status": "PASS",
  3010. "kind": "unit",
  3011. "title": "multiple tracks on one property use last effective value; capture subtracts it only once",
  3012. "screenshots": [],
  3013. "details": "调用实际 apply/capture/update 基值方法;验证同属性最后有效轨道、静音/删除后中性姿态,偏移只扣一次。"
  3014. },
  3015. {
  3016. "ids": [
  3017. "timeline.multitrack",
  3018. "timeline.target"
  3019. ],
  3020. "file": "validation.json",
  3021. "status": "PASS",
  3022. "kind": "unit",
  3023. "title": "changing a binding resets the former target and keeps manual transform edits as base",
  3024. "screenshots": [],
  3025. "details": "轨道重绑后旧目标复位,手动变换成为新基值;不假称鼠标拖动已验。"
  3026. }
  3027. ]
  3028. },
  3029. {
  3030. "id": "timeline.baseline",
  3031. "group": "时间轴与曲线",
  3032. "name": "载入装备基准动作",
  3033. "source": {
  3034. "file": "../../../unreal_tran/src/main.js",
  3035. "line": 3058,
  3036. "symbol": "loadBaselineAnimation"
  3037. },
  3038. "implementation": "现有边界",
  3039. "boundary": "匹配部件后直接替换当前时间轴/蓝图;当前没有单独确认框,不是任意维修流程自动生成。",
  3040. "fix": "保持当前装备限定;无匹配只提示,不改工程。",
  3041. "acceptance": "匹配时载入/保存/重开;无匹配时保留原数据并给出提示。",
  3042. "verification": "PASS",
  3043. "evidence": [
  3044. {
  3045. "ids": [
  3046. "timeline.seek",
  3047. "timeline.record",
  3048. "timeline.baseline",
  3049. "curve.axis",
  3050. "blueprint.palette",
  3051. "blueprint.add",
  3052. "blueprint.canvas"
  3053. ],
  3054. "file": "evidence/truck-blueprint-tool-supplement.json",
  3055. "status": "PASS",
  3056. "testTitle": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  3057. "recordedAt": "2026-09-06T08:21:23.003Z",
  3058. "kind": "e2e+runtime-read",
  3059. "title": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  3060. "screenshots": [],
  3061. "details": "真实模型编辑参数/基准轨道生成验收,不构成装备操作或维修指导。桥梁原工程94仅GET和copy。"
  3062. }
  3063. ]
  3064. },
  3065. {
  3066. "id": "timeline.native",
  3067. "group": "时间轴与曲线",
  3068. "name": "GLB 原生动画选择 / 播放",
  3069. "source": {
  3070. "file": "../../../unreal_tran/src/main.js",
  3071. "line": 1715,
  3072. "symbol": "selectNativeAnimation"
  3073. },
  3074. "implementation": "已有实现",
  3075. "boundary": "真实 GLB 自带片段;保存选择索引,不是蓝图 clip 字段。",
  3076. "fix": "无片段时禁用。",
  3077. "acceptance": "狐狸实际动画播放/暂停,选择保存后重开一致。",
  3078. "verification": "PASS",
  3079. "evidence": [
  3080. {
  3081. "ids": [
  3082. "tree.search",
  3083. "tree.visibility",
  3084. "selection.sync",
  3085. "view.grid",
  3086. "view.pbr",
  3087. "view.wireframe",
  3088. "view.outline",
  3089. "view.perspective",
  3090. "view.preview",
  3091. "view.snapshot",
  3092. "timeline.native"
  3093. ],
  3094. "file": "evidence/viewport.json",
  3095. "status": "PASS",
  3096. "testTitle": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  3097. "recordedAt": "2026-09-06T08:22:14.169Z",
  3098. "kind": "e2e",
  3099. "title": "场景树搜索、可见性、选择、视口工具、原生动画与截图",
  3100. "screenshots": [],
  3101. "details": "树搜索、对象隐藏刷新、轮廓及视图开关、原生动画和PNG下载。移动/旋转/缩放只切换模式,真实gizmo拖动仍需补验;聚焦未做几何断言。"
  3102. }
  3103. ]
  3104. },
  3105. {
  3106. "id": "timeline.curve",
  3107. "group": "时间轴与曲线",
  3108. "name": "曲线选择轨道 / 关键帧",
  3109. "source": {
  3110. "file": "../../../unreal_tran/src/model-curve-editor.js",
  3111. "line": 5,
  3112. "symbol": "class ModelCurveEditor"
  3113. },
  3114. "implementation": "本轮修复",
  3115. "boundary": "曲线与时间轴共用一份轨道和关键帧数据。",
  3116. "fix": "移除固定 SVG 假数据。",
  3117. "acceptance": "实际轨道名和点数匹配时间轴,点击同步当前帧。",
  3118. "verification": "PASS",
  3119. "evidence": [
  3120. {
  3121. "ids": [
  3122. "timeline.play",
  3123. "timeline.stop",
  3124. "timeline.loop",
  3125. "timeline.key-nav",
  3126. "timeline.add-track",
  3127. "timeline.remove-track",
  3128. "timeline.target",
  3129. "timeline.property",
  3130. "timeline.mute",
  3131. "timeline.add-key",
  3132. "timeline.delete-key",
  3133. "timeline.drag-key",
  3134. "timeline.zoom",
  3135. "timeline.curve",
  3136. "curve.time",
  3137. "curve.value",
  3138. "curve.easing"
  3139. ],
  3140. "file": "evidence/truck-timeline-curve.json",
  3141. "status": "PASS",
  3142. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  3143. "recordedAt": "2026-09-06T08:21:02.898Z",
  3144. "kind": "e2e+runtime-read",
  3145. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  3146. "screenshots": [],
  3147. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  3148. },
  3149. {
  3150. "ids": [
  3151. "timeline.curve",
  3152. "curve.time",
  3153. "curve.value",
  3154. "curve.easing"
  3155. ],
  3156. "file": "validation.json",
  3157. "status": "PASS",
  3158. "kind": "unit",
  3159. "title": "curve edits real scalar key values, time and interpolation, persisting through document reload",
  3160. "screenshots": [],
  3161. "details": "真实曲线控件与 TimelineEditor,标量编辑与文档往返。"
  3162. }
  3163. ]
  3164. },
  3165. {
  3166. "id": "curve.time",
  3167. "group": "时间轴与曲线",
  3168. "name": "曲线编辑时间",
  3169. "source": {
  3170. "file": "../../../unreal_tran/src/model-curve-editor.js",
  3171. "line": 30,
  3172. "symbol": "change(input)"
  3173. },
  3174. "implementation": "本轮修复",
  3175. "boundary": "更新实际 key.time,约束在时间轴时长内。",
  3176. "fix": "调用 timeline.updateKeyframe 并保持编辑目标。",
  3177. "acceptance": "改时间后重排、撤销、JSON 往返一致。",
  3178. "verification": "PASS",
  3179. "evidence": [
  3180. {
  3181. "ids": [
  3182. "timeline.play",
  3183. "timeline.stop",
  3184. "timeline.loop",
  3185. "timeline.key-nav",
  3186. "timeline.add-track",
  3187. "timeline.remove-track",
  3188. "timeline.target",
  3189. "timeline.property",
  3190. "timeline.mute",
  3191. "timeline.add-key",
  3192. "timeline.delete-key",
  3193. "timeline.drag-key",
  3194. "timeline.zoom",
  3195. "timeline.curve",
  3196. "curve.time",
  3197. "curve.value",
  3198. "curve.easing"
  3199. ],
  3200. "file": "evidence/truck-timeline-curve.json",
  3201. "status": "PASS",
  3202. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  3203. "recordedAt": "2026-09-06T08:21:02.898Z",
  3204. "kind": "e2e+runtime-read",
  3205. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  3206. "screenshots": [],
  3207. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  3208. },
  3209. {
  3210. "ids": [
  3211. "timeline.curve",
  3212. "curve.time",
  3213. "curve.value",
  3214. "curve.easing"
  3215. ],
  3216. "file": "validation.json",
  3217. "status": "PASS",
  3218. "kind": "unit",
  3219. "title": "curve edits real scalar key values, time and interpolation, persisting through document reload",
  3220. "screenshots": [],
  3221. "details": "真实曲线控件与 TimelineEditor,标量编辑与文档往返。"
  3222. }
  3223. ]
  3224. },
  3225. {
  3226. "id": "curve.value",
  3227. "group": "时间轴与曲线",
  3228. "name": "曲线编辑标量 / XYZ 数值",
  3229. "source": {
  3230. "file": "../../../unreal_tran/src/model-curve-editor.js",
  3231. "line": 30,
  3232. "symbol": "change(input)"
  3233. },
  3234. "implementation": "本轮修复",
  3235. "boundary": "修改实际关键帧值,向量编辑保留其他分量。",
  3236. "fix": "无效空值拒绝提交。",
  3237. "acceptance": "标量和向量都驱动真实姿态并保存。",
  3238. "verification": "PASS",
  3239. "evidence": [
  3240. {
  3241. "ids": [
  3242. "timeline.play",
  3243. "timeline.stop",
  3244. "timeline.loop",
  3245. "timeline.key-nav",
  3246. "timeline.add-track",
  3247. "timeline.remove-track",
  3248. "timeline.target",
  3249. "timeline.property",
  3250. "timeline.mute",
  3251. "timeline.add-key",
  3252. "timeline.delete-key",
  3253. "timeline.drag-key",
  3254. "timeline.zoom",
  3255. "timeline.curve",
  3256. "curve.time",
  3257. "curve.value",
  3258. "curve.easing"
  3259. ],
  3260. "file": "evidence/truck-timeline-curve.json",
  3261. "status": "PASS",
  3262. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  3263. "recordedAt": "2026-09-06T08:21:02.898Z",
  3264. "kind": "e2e+runtime-read",
  3265. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  3266. "screenshots": [],
  3267. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  3268. },
  3269. {
  3270. "ids": [
  3271. "timeline.curve",
  3272. "curve.time",
  3273. "curve.value",
  3274. "curve.easing"
  3275. ],
  3276. "file": "validation.json",
  3277. "status": "PASS",
  3278. "kind": "unit",
  3279. "title": "curve edits real scalar key values, time and interpolation, persisting through document reload",
  3280. "screenshots": [],
  3281. "details": "真实曲线控件与 TimelineEditor,标量编辑与文档往返。"
  3282. },
  3283. {
  3284. "ids": [
  3285. "curve.value"
  3286. ],
  3287. "file": "validation.json",
  3288. "status": "PASS",
  3289. "kind": "unit",
  3290. "title": "curve vector editing preserves other components and selected track; invalid values do not mutate",
  3291. "screenshots": [],
  3292. "details": "向量其它分量保留,当前轨道、非法值保护;不包含显示轴切换或可视像素验收。"
  3293. }
  3294. ]
  3295. },
  3296. {
  3297. "id": "curve.easing",
  3298. "group": "时间轴与曲线",
  3299. "name": "曲线插值",
  3300. "source": {
  3301. "file": "../../../unreal_tran/src/model-curve-editor.js",
  3302. "line": 30,
  3303. "symbol": "change(input)"
  3304. },
  3305. "implementation": "本轮修复",
  3306. "boundary": "支持线性、平滑、缓入、缓出、阶梯;没有 Bezier 切线 UI。",
  3307. "fix": "阶梯插值与已有下游时间轴求值一致。",
  3308. "acceptance": "修改插值改变中间帧,重开保留。",
  3309. "verification": "PASS",
  3310. "evidence": [
  3311. {
  3312. "ids": [
  3313. "timeline.play",
  3314. "timeline.stop",
  3315. "timeline.loop",
  3316. "timeline.key-nav",
  3317. "timeline.add-track",
  3318. "timeline.remove-track",
  3319. "timeline.target",
  3320. "timeline.property",
  3321. "timeline.mute",
  3322. "timeline.add-key",
  3323. "timeline.delete-key",
  3324. "timeline.drag-key",
  3325. "timeline.zoom",
  3326. "timeline.curve",
  3327. "curve.time",
  3328. "curve.value",
  3329. "curve.easing"
  3330. ],
  3331. "file": "evidence/truck-timeline-curve.json",
  3332. "status": "PASS",
  3333. "testTitle": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  3334. "recordedAt": "2026-09-06T08:21:02.898Z",
  3335. "kind": "e2e+runtime-read",
  3336. "title": "时间轴真实控件:轨道/关键帧/播放与曲线 5 插值,保存后重新加载一致",
  3337. "screenshots": [],
  3338. "details": "真实控件和指针操作,运行时读取数值校验;curve.axis仅切换无数值独立断言,timeline.seek播放头与Alt吸附未在本例覆盖。"
  3339. },
  3340. {
  3341. "ids": [
  3342. "timeline.curve",
  3343. "curve.time",
  3344. "curve.value",
  3345. "curve.easing"
  3346. ],
  3347. "file": "validation.json",
  3348. "status": "PASS",
  3349. "kind": "unit",
  3350. "title": "curve edits real scalar key values, time and interpolation, persisting through document reload",
  3351. "screenshots": [],
  3352. "details": "真实曲线控件与 TimelineEditor,标量编辑与文档往返。"
  3353. }
  3354. ]
  3355. },
  3356. {
  3357. "id": "curve.axis",
  3358. "group": "时间轴与曲线",
  3359. "name": "曲线 XYZ 分量显示",
  3360. "source": {
  3361. "file": "../../../unreal_tran/src/model-curve-editor.js",
  3362. "line": 30,
  3363. "symbol": "change(input)"
  3364. },
  3365. "implementation": "已有实现",
  3366. "boundary": "改变图上显示分量,不改另外两轴的数据。",
  3367. "fix": "当前实际向量轨道才出现。",
  3368. "acceptance": "切分量显示不同曲线,数值不被改写。",
  3369. "verification": "PASS",
  3370. "evidence": [
  3371. {
  3372. "ids": [
  3373. "timeline.seek",
  3374. "timeline.record",
  3375. "timeline.baseline",
  3376. "curve.axis",
  3377. "blueprint.palette",
  3378. "blueprint.add",
  3379. "blueprint.canvas"
  3380. ],
  3381. "file": "evidence/truck-blueprint-tool-supplement.json",
  3382. "status": "PASS",
  3383. "testTitle": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  3384. "recordedAt": "2026-09-06T08:21:23.003Z",
  3385. "kind": "e2e+runtime-read",
  3386. "title": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  3387. "screenshots": [],
  3388. "details": "真实模型编辑参数/基准轨道生成验收,不构成装备操作或维修指导。桥梁原工程94仅GET和copy。"
  3389. }
  3390. ]
  3391. },
  3392. {
  3393. "id": "blueprint.palette",
  3394. "group": "蓝图与交互反馈",
  3395. "name": "节点库搜索 / 拖入节点",
  3396. "source": {
  3397. "file": "../../../unreal_tran/src/blueprint.js",
  3398. "line": 287,
  3399. "symbol": "_renderPalette"
  3400. },
  3401. "implementation": "已有实现",
  3402. "boundary": "当前七类节点:触发、时间轴、等待、高亮、提示、条件、完成。",
  3403. "fix": "不新增任意脚本节点。",
  3404. "acceptance": "搜索、拖入后节点类型和参数可保存。",
  3405. "verification": "PASS",
  3406. "evidence": [
  3407. {
  3408. "ids": [
  3409. "timeline.seek",
  3410. "timeline.record",
  3411. "timeline.baseline",
  3412. "curve.axis",
  3413. "blueprint.palette",
  3414. "blueprint.add",
  3415. "blueprint.canvas"
  3416. ],
  3417. "file": "evidence/truck-blueprint-tool-supplement.json",
  3418. "status": "PASS",
  3419. "testTitle": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  3420. "recordedAt": "2026-09-06T08:21:23.003Z",
  3421. "kind": "e2e+runtime-read",
  3422. "title": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  3423. "screenshots": [],
  3424. "details": "真实模型编辑参数/基准轨道生成验收,不构成装备操作或维修指导。桥梁原工程94仅GET和copy。"
  3425. }
  3426. ]
  3427. },
  3428. {
  3429. "id": "blueprint.add",
  3430. "group": "蓝图与交互反馈",
  3431. "name": "添加节点按钮",
  3432. "source": {
  3433. "file": "../../../unreal_tran/src/blueprint.js",
  3434. "line": 257,
  3435. "symbol": "_bind()"
  3436. },
  3437. "implementation": "已有实现",
  3438. "boundary": "工具栏默认添加提示节点;其他类型来自节点库。",
  3439. "fix": "无本轮专门改动。",
  3440. "acceptance": "新增进入画布、历史与 JSON。",
  3441. "verification": "PASS",
  3442. "evidence": [
  3443. {
  3444. "ids": [
  3445. "timeline.seek",
  3446. "timeline.record",
  3447. "timeline.baseline",
  3448. "curve.axis",
  3449. "blueprint.palette",
  3450. "blueprint.add",
  3451. "blueprint.canvas"
  3452. ],
  3453. "file": "evidence/truck-blueprint-tool-supplement.json",
  3454. "status": "PASS",
  3455. "testTitle": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  3456. "recordedAt": "2026-09-06T08:21:23.003Z",
  3457. "kind": "e2e+runtime-read",
  3458. "title": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  3459. "screenshots": [],
  3460. "details": "真实模型编辑参数/基准轨道生成验收,不构成装备操作或维修指导。桥梁原工程94仅GET和copy。"
  3461. }
  3462. ]
  3463. },
  3464. {
  3465. "id": "blueprint.parameters",
  3466. "group": "蓝图与交互反馈",
  3467. "name": "节点标题 / 参数编辑",
  3468. "source": {
  3469. "file": "../../../unreal_tran/src/blueprint.js",
  3470. "line": 431,
  3471. "symbol": "_renderInspector"
  3472. },
  3473. "implementation": "已有实现",
  3474. "boundary": "按节点类型提供数字、文字、枚举、复选框。",
  3475. "fix": "保留数值边界与真实数据写回。",
  3476. "acceptance": "改参数与标题后重开保留。",
  3477. "verification": "PASS",
  3478. "evidence": [
  3479. {
  3480. "ids": [
  3481. "blueprint.parameters",
  3482. "blueprint.move",
  3483. "blueprint.connect",
  3484. "blueprint.delete",
  3485. "blueprint.copy",
  3486. "blueprint.run",
  3487. "blueprint.stop",
  3488. "blueprint.reset",
  3489. "blueprint.timeline",
  3490. "blueprint.wait",
  3491. "blueprint.highlight",
  3492. "blueprint.message",
  3493. "blueprint.finish",
  3494. "project.undo",
  3495. "project.redo"
  3496. ],
  3497. "file": "evidence/truck-blueprint-ui.json",
  3498. "status": "PASS",
  3499. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3500. "recordedAt": "2026-09-06T08:21:37.144Z",
  3501. "kind": "e2e+runtime-read",
  3502. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3503. "screenshots": [],
  3504. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  3505. }
  3506. ]
  3507. },
  3508. {
  3509. "id": "blueprint.move",
  3510. "group": "蓝图与交互反馈",
  3511. "name": "节点拖动 / 多选框选",
  3512. "source": {
  3513. "file": "../../../unreal_tran/src/blueprint.js",
  3514. "line": 566,
  3515. "symbol": "_onViewportPointerDown"
  3516. },
  3517. "implementation": "已有实现",
  3518. "boundary": "节点布局随蓝图 JSON 保存。",
  3519. "fix": "无本轮专门改动。",
  3520. "acceptance": "多选移动位置正确,撤销恢复。",
  3521. "verification": "PASS",
  3522. "evidence": [
  3523. {
  3524. "ids": [
  3525. "blueprint.parameters",
  3526. "blueprint.move",
  3527. "blueprint.connect",
  3528. "blueprint.delete",
  3529. "blueprint.copy",
  3530. "blueprint.run",
  3531. "blueprint.stop",
  3532. "blueprint.reset",
  3533. "blueprint.timeline",
  3534. "blueprint.wait",
  3535. "blueprint.highlight",
  3536. "blueprint.message",
  3537. "blueprint.finish",
  3538. "project.undo",
  3539. "project.redo"
  3540. ],
  3541. "file": "evidence/truck-blueprint-ui.json",
  3542. "status": "PASS",
  3543. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3544. "recordedAt": "2026-09-06T08:21:37.144Z",
  3545. "kind": "e2e+runtime-read",
  3546. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3547. "screenshots": [],
  3548. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  3549. }
  3550. ]
  3551. },
  3552. {
  3553. "id": "blueprint.connect",
  3554. "group": "蓝图与交互反馈",
  3555. "name": "连接 / 替换 / 删除执行线",
  3556. "source": {
  3557. "file": "../../../unreal_tran/src/blueprint.js",
  3558. "line": 767,
  3559. "symbol": "connect("
  3560. },
  3561. "implementation": "本轮修复",
  3562. "boundary": "单输出重连替换;允许多个来源汇聚同一输入。",
  3563. "fix": "不再清掉同一输入的其他合法来源。",
  3564. "acceptance": "true/false 汇聚保留两条,替换输出只影响该线。",
  3565. "verification": "PASS",
  3566. "evidence": [
  3567. {
  3568. "ids": [
  3569. "blueprint.parameters",
  3570. "blueprint.move",
  3571. "blueprint.connect",
  3572. "blueprint.delete",
  3573. "blueprint.copy",
  3574. "blueprint.run",
  3575. "blueprint.stop",
  3576. "blueprint.reset",
  3577. "blueprint.timeline",
  3578. "blueprint.wait",
  3579. "blueprint.highlight",
  3580. "blueprint.message",
  3581. "blueprint.finish",
  3582. "project.undo",
  3583. "project.redo"
  3584. ],
  3585. "file": "evidence/truck-blueprint-ui.json",
  3586. "status": "PASS",
  3587. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3588. "recordedAt": "2026-09-06T08:21:37.144Z",
  3589. "kind": "e2e+runtime-read",
  3590. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3591. "screenshots": [],
  3592. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  3593. }
  3594. ]
  3595. },
  3596. {
  3597. "id": "blueprint.delete",
  3598. "group": "蓝图与交互反馈",
  3599. "name": "删除节点 / 连线",
  3600. "source": {
  3601. "file": "../../../unreal_tran/src/blueprint.js",
  3602. "line": 786,
  3603. "symbol": "deleteSelection"
  3604. },
  3605. "implementation": "已有实现",
  3606. "boundary": "删除节点一并清理相关边。",
  3607. "fix": "复制/剪切使用同一图数据合同。",
  3608. "acceptance": "无悬空边;撤销恢复完整图。",
  3609. "verification": "PASS",
  3610. "evidence": [
  3611. {
  3612. "ids": [
  3613. "blueprint.parameters",
  3614. "blueprint.move",
  3615. "blueprint.connect",
  3616. "blueprint.delete",
  3617. "blueprint.copy",
  3618. "blueprint.run",
  3619. "blueprint.stop",
  3620. "blueprint.reset",
  3621. "blueprint.timeline",
  3622. "blueprint.wait",
  3623. "blueprint.highlight",
  3624. "blueprint.message",
  3625. "blueprint.finish",
  3626. "project.undo",
  3627. "project.redo"
  3628. ],
  3629. "file": "evidence/truck-blueprint-ui.json",
  3630. "status": "PASS",
  3631. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3632. "recordedAt": "2026-09-06T08:21:37.144Z",
  3633. "kind": "e2e+runtime-read",
  3634. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3635. "screenshots": [],
  3636. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  3637. }
  3638. ]
  3639. },
  3640. {
  3641. "id": "blueprint.copy",
  3642. "group": "蓝图与交互反馈",
  3643. "name": "复制 / 剪切 / 粘贴",
  3644. "source": {
  3645. "file": "../../../unreal_tran/src/blueprint.js",
  3646. "line": 714,
  3647. "symbol": "copySelection"
  3648. },
  3649. "implementation": "本轮修复",
  3650. "boundary": "Ctrl/Cmd+C/X/V;复制选区内部边,不复制指向外部的边。",
  3651. "fix": "新节点 ID 和内部连线同步生成,阻止快捷键冒泡。",
  3652. "acceptance": "副本内部连接正确,不误删外部对象。",
  3653. "verification": "PASS",
  3654. "evidence": [
  3655. {
  3656. "ids": [
  3657. "blueprint.parameters",
  3658. "blueprint.move",
  3659. "blueprint.connect",
  3660. "blueprint.delete",
  3661. "blueprint.copy",
  3662. "blueprint.run",
  3663. "blueprint.stop",
  3664. "blueprint.reset",
  3665. "blueprint.timeline",
  3666. "blueprint.wait",
  3667. "blueprint.highlight",
  3668. "blueprint.message",
  3669. "blueprint.finish",
  3670. "project.undo",
  3671. "project.redo"
  3672. ],
  3673. "file": "evidence/truck-blueprint-ui.json",
  3674. "status": "PASS",
  3675. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3676. "recordedAt": "2026-09-06T08:21:37.144Z",
  3677. "kind": "e2e+runtime-read",
  3678. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3679. "screenshots": [],
  3680. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  3681. }
  3682. ]
  3683. },
  3684. {
  3685. "id": "blueprint.canvas",
  3686. "group": "蓝图与交互反馈",
  3687. "name": "平移 / 缩放 / 适应画布",
  3688. "source": {
  3689. "file": "../../../unreal_tran/src/blueprint.js",
  3690. "line": 801,
  3691. "symbol": "frameAll"
  3692. },
  3693. "implementation": "已有实现",
  3694. "boundary": "蓝图画布浏览;不是三维相机。",
  3695. "fix": "无本轮专门改动。",
  3696. "acceptance": "滚轮、Space 拖动和适应可见全部节点。",
  3697. "verification": "PASS",
  3698. "evidence": [
  3699. {
  3700. "ids": [
  3701. "timeline.seek",
  3702. "timeline.record",
  3703. "timeline.baseline",
  3704. "curve.axis",
  3705. "blueprint.palette",
  3706. "blueprint.add",
  3707. "blueprint.canvas"
  3708. ],
  3709. "file": "evidence/truck-blueprint-tool-supplement.json",
  3710. "status": "PASS",
  3711. "testTitle": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  3712. "recordedAt": "2026-09-06T08:21:23.003Z",
  3713. "kind": "e2e+runtime-read",
  3714. "title": "补充时间轴与蓝图工具:刻度/按键/记录/分量、基准匹配、节点搜索拖入与画布平移",
  3715. "screenshots": [],
  3716. "details": "真实模型编辑参数/基准轨道生成验收,不构成装备操作或维修指导。桥梁原工程94仅GET和copy。"
  3717. }
  3718. ]
  3719. },
  3720. {
  3721. "id": "blueprint.run",
  3722. "group": "蓝图与交互反馈",
  3723. "name": "运行 / F5",
  3724. "source": {
  3725. "file": "../../../unreal_tran/src/blueprint.js",
  3726. "line": 871,
  3727. "symbol": "async run("
  3728. },
  3729. "implementation": "本轮修复",
  3730. "boundary": "在当前模型编辑器驱动真实场景;有 200 步循环上限。",
  3731. "fix": "条件与等待流程回归。",
  3732. "acceptance": "执行高亮、动作、反馈;循环图可终止不挂死。",
  3733. "verification": "PASS",
  3734. "evidence": [
  3735. {
  3736. "ids": [
  3737. "blueprint.parameters",
  3738. "blueprint.move",
  3739. "blueprint.connect",
  3740. "blueprint.delete",
  3741. "blueprint.copy",
  3742. "blueprint.run",
  3743. "blueprint.stop",
  3744. "blueprint.reset",
  3745. "blueprint.timeline",
  3746. "blueprint.wait",
  3747. "blueprint.highlight",
  3748. "blueprint.message",
  3749. "blueprint.finish",
  3750. "project.undo",
  3751. "project.redo"
  3752. ],
  3753. "file": "evidence/truck-blueprint-ui.json",
  3754. "status": "PASS",
  3755. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3756. "recordedAt": "2026-09-06T08:21:37.144Z",
  3757. "kind": "e2e+runtime-read",
  3758. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3759. "screenshots": [],
  3760. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  3761. }
  3762. ]
  3763. },
  3764. {
  3765. "id": "blueprint.stop",
  3766. "group": "蓝图与交互反馈",
  3767. "name": "停止运行",
  3768. "source": {
  3769. "file": "../../../unreal_tran/src/blueprint.js",
  3770. "line": 997,
  3771. "symbol": "stop("
  3772. },
  3773. "implementation": "本轮修复",
  3774. "boundary": "停止中断挂起等待,旧运行不覆盖新运行状态。",
  3775. "fix": "AbortSignal 贯穿宿主动作与高亮清理。",
  3776. "acceptance": "等待/动画中停止及时退出,无迟到完成提示。",
  3777. "verification": "PASS",
  3778. "evidence": [
  3779. {
  3780. "ids": [
  3781. "blueprint.parameters",
  3782. "blueprint.move",
  3783. "blueprint.connect",
  3784. "blueprint.delete",
  3785. "blueprint.copy",
  3786. "blueprint.run",
  3787. "blueprint.stop",
  3788. "blueprint.reset",
  3789. "blueprint.timeline",
  3790. "blueprint.wait",
  3791. "blueprint.highlight",
  3792. "blueprint.message",
  3793. "blueprint.finish",
  3794. "project.undo",
  3795. "project.redo"
  3796. ],
  3797. "file": "evidence/truck-blueprint-ui.json",
  3798. "status": "PASS",
  3799. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3800. "recordedAt": "2026-09-06T08:21:37.144Z",
  3801. "kind": "e2e+runtime-read",
  3802. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3803. "screenshots": [],
  3804. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  3805. }
  3806. ]
  3807. },
  3808. {
  3809. "id": "blueprint.reset",
  3810. "group": "蓝图与交互反馈",
  3811. "name": "重置执行",
  3812. "source": {
  3813. "file": "../../../unreal_tran/src/blueprint.js",
  3814. "line": 1014,
  3815. "symbol": "resetExecution"
  3816. },
  3817. "implementation": "已有实现",
  3818. "boundary": "复位执行状态、时间轴和高亮;保留蓝图编辑内容。",
  3819. "fix": "高亮恢复原材质。",
  3820. "acceptance": "运行后重置,进度归零且节点图不丢。",
  3821. "verification": "PASS",
  3822. "evidence": [
  3823. {
  3824. "ids": [
  3825. "blueprint.parameters",
  3826. "blueprint.move",
  3827. "blueprint.connect",
  3828. "blueprint.delete",
  3829. "blueprint.copy",
  3830. "blueprint.run",
  3831. "blueprint.stop",
  3832. "blueprint.reset",
  3833. "blueprint.timeline",
  3834. "blueprint.wait",
  3835. "blueprint.highlight",
  3836. "blueprint.message",
  3837. "blueprint.finish",
  3838. "project.undo",
  3839. "project.redo"
  3840. ],
  3841. "file": "evidence/truck-blueprint-ui.json",
  3842. "status": "PASS",
  3843. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3844. "recordedAt": "2026-09-06T08:21:37.144Z",
  3845. "kind": "e2e+runtime-read",
  3846. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3847. "screenshots": [],
  3848. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  3849. }
  3850. ]
  3851. },
  3852. {
  3853. "id": "blueprint.click",
  3854. "group": "蓝图与交互反馈",
  3855. "name": "点击触发目标",
  3856. "source": {
  3857. "file": "../../../unreal_tran/src/blueprint.js",
  3858. "line": 933,
  3859. "symbol": "async trigger("
  3860. },
  3861. "implementation": "本轮修复",
  3862. "boundary": "匹配事件和目标 ID/名称/祖先别名;空目标可通配。",
  3863. "fix": "不再点击 B 触发 A。",
  3864. "acceptance": "两个不同目标分别点击,只运行匹配分支。",
  3865. "verification": "PASS",
  3866. "evidence": [
  3867. {
  3868. "ids": [
  3869. "blueprint.click",
  3870. "blueprint.double-click",
  3871. "blueprint.auto",
  3872. "view.preview"
  3873. ],
  3874. "file": "evidence/truck-blueprint-events.json",
  3875. "status": "PASS",
  3876. "testTitle": "已保存蓝图:条件出口与目标匹配 runtime 检查,真实模型单击/双击/进入预览自动触发",
  3877. "recordedAt": "2026-09-06T08:21:50.227Z",
  3878. "kind": "e2e",
  3879. "title": "已保存蓝图:条件出口与目标匹配 runtime 检查,真实模型单击/双击/进入预览自动触发",
  3880. "screenshots": [],
  3881. "details": "执行使用正式模型编辑器的真实模型/时间轴/高亮/提示 handler;不等同于学员端任务下发。"
  3882. }
  3883. ]
  3884. },
  3885. {
  3886. "id": "blueprint.double-click",
  3887. "group": "蓝图与交互反馈",
  3888. "name": "双击触发目标",
  3889. "source": {
  3890. "file": "../../../unreal_tran/src/main.js",
  3891. "line": 2256,
  3892. "symbol": "pickObject"
  3893. },
  3894. "implementation": "本轮修复",
  3895. "boundary": "双击独立派发 double-click,与单击区分。",
  3896. "fix": "增加真实视口双击派发并抑制待发单击。",
  3897. "acceptance": "双击只触发目标的双击分支。",
  3898. "verification": "PASS",
  3899. "evidence": [
  3900. {
  3901. "ids": [
  3902. "blueprint.click",
  3903. "blueprint.double-click",
  3904. "blueprint.auto",
  3905. "view.preview"
  3906. ],
  3907. "file": "evidence/truck-blueprint-events.json",
  3908. "status": "PASS",
  3909. "testTitle": "已保存蓝图:条件出口与目标匹配 runtime 检查,真实模型单击/双击/进入预览自动触发",
  3910. "recordedAt": "2026-09-06T08:21:50.227Z",
  3911. "kind": "e2e",
  3912. "title": "已保存蓝图:条件出口与目标匹配 runtime 检查,真实模型单击/双击/进入预览自动触发",
  3913. "screenshots": [],
  3914. "details": "执行使用正式模型编辑器的真实模型/时间轴/高亮/提示 handler;不等同于学员端任务下发。"
  3915. }
  3916. ]
  3917. },
  3918. {
  3919. "id": "blueprint.auto",
  3920. "group": "蓝图与交互反馈",
  3921. "name": "自动触发",
  3922. "source": {
  3923. "file": "../../../unreal_tran/src/main.js",
  3924. "line": 2284,
  3925. "symbol": "togglePreview"
  3926. },
  3927. "implementation": "本轮修复",
  3928. "boundary": "仅进入预览显式派发 auto,不把每次单击当 auto。",
  3929. "fix": "事件匹配与进入预览联动。",
  3930. "acceptance": "进入预览触发一次,普通点击不重放自动分支。",
  3931. "verification": "PASS",
  3932. "evidence": [
  3933. {
  3934. "ids": [
  3935. "blueprint.click",
  3936. "blueprint.double-click",
  3937. "blueprint.auto",
  3938. "view.preview"
  3939. ],
  3940. "file": "evidence/truck-blueprint-events.json",
  3941. "status": "PASS",
  3942. "testTitle": "已保存蓝图:条件出口与目标匹配 runtime 检查,真实模型单击/双击/进入预览自动触发",
  3943. "recordedAt": "2026-09-06T08:21:50.227Z",
  3944. "kind": "e2e",
  3945. "title": "已保存蓝图:条件出口与目标匹配 runtime 检查,真实模型单击/双击/进入预览自动触发",
  3946. "screenshots": [],
  3947. "details": "执行使用正式模型编辑器的真实模型/时间轴/高亮/提示 handler;不等同于学员端任务下发。"
  3948. }
  3949. ]
  3950. },
  3951. {
  3952. "id": "blueprint.timeline",
  3953. "group": "蓝图与交互反馈",
  3954. "name": "播放时间轴节点",
  3955. "source": {
  3956. "file": "../../../unreal_tran/src/main.js",
  3957. "line": 2024,
  3958. "symbol": "playTimelineForBlueprint"
  3959. },
  3960. "implementation": "本轮修复",
  3961. "boundary": "播放当前唯一时间轴,动作名称仅描述;支持起始时间、速度、等待。",
  3962. "fix": "起始末帧不反跳零,终止可取消。",
  3963. "acceptance": "起始时间和速度实际生效,等待与不等待分支正确。",
  3964. "verification": "PASS",
  3965. "evidence": [
  3966. {
  3967. "ids": [
  3968. "blueprint.parameters",
  3969. "blueprint.move",
  3970. "blueprint.connect",
  3971. "blueprint.delete",
  3972. "blueprint.copy",
  3973. "blueprint.run",
  3974. "blueprint.stop",
  3975. "blueprint.reset",
  3976. "blueprint.timeline",
  3977. "blueprint.wait",
  3978. "blueprint.highlight",
  3979. "blueprint.message",
  3980. "blueprint.finish",
  3981. "project.undo",
  3982. "project.redo"
  3983. ],
  3984. "file": "evidence/truck-blueprint-ui.json",
  3985. "status": "PASS",
  3986. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3987. "recordedAt": "2026-09-06T08:21:37.144Z",
  3988. "kind": "e2e+runtime-read",
  3989. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  3990. "screenshots": [],
  3991. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  3992. }
  3993. ]
  3994. },
  3995. {
  3996. "id": "blueprint.wait",
  3997. "group": "蓝图与交互反馈",
  3998. "name": "等待节点",
  3999. "source": {
  4000. "file": "../../../unreal_tran/src/blueprint.js",
  4001. "line": 1,
  4002. "symbol": "NODE_TYPES"
  4003. },
  4004. "implementation": "已有实现",
  4005. "boundary": "指定毫秒等待;可被停止取消。",
  4006. "fix": "异步停止及时结束。",
  4007. "acceptance": "等待期间停止不会继续执行后续节点。",
  4008. "verification": "PASS",
  4009. "evidence": [
  4010. {
  4011. "ids": [
  4012. "blueprint.parameters",
  4013. "blueprint.move",
  4014. "blueprint.connect",
  4015. "blueprint.delete",
  4016. "blueprint.copy",
  4017. "blueprint.run",
  4018. "blueprint.stop",
  4019. "blueprint.reset",
  4020. "blueprint.timeline",
  4021. "blueprint.wait",
  4022. "blueprint.highlight",
  4023. "blueprint.message",
  4024. "blueprint.finish",
  4025. "project.undo",
  4026. "project.redo"
  4027. ],
  4028. "file": "evidence/truck-blueprint-ui.json",
  4029. "status": "PASS",
  4030. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  4031. "recordedAt": "2026-09-06T08:21:37.144Z",
  4032. "kind": "e2e+runtime-read",
  4033. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  4034. "screenshots": [],
  4035. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  4036. }
  4037. ]
  4038. },
  4039. {
  4040. "id": "blueprint.highlight",
  4041. "group": "蓝图与交互反馈",
  4042. "name": "高亮节点 / 呼吸效果",
  4043. "source": {
  4044. "file": "../../../unreal_tran/src/main.js",
  4045. "line": 2052,
  4046. "symbol": "highlightPart"
  4047. },
  4048. "implementation": "本轮修复",
  4049. "boundary": "准确命中可见对象;同名歧义要求标识;没有可高亮材质则报错。",
  4050. "fix": "拒绝错误整机回退,真实呼吸效果,保存忽略临时高亮。",
  4051. "acceptance": "目标正确、找不到报错、结束恢复、保存不永久染色。",
  4052. "verification": "PASS",
  4053. "evidence": [
  4054. {
  4055. "ids": [
  4056. "blueprint.parameters",
  4057. "blueprint.move",
  4058. "blueprint.connect",
  4059. "blueprint.delete",
  4060. "blueprint.copy",
  4061. "blueprint.run",
  4062. "blueprint.stop",
  4063. "blueprint.reset",
  4064. "blueprint.timeline",
  4065. "blueprint.wait",
  4066. "blueprint.highlight",
  4067. "blueprint.message",
  4068. "blueprint.finish",
  4069. "project.undo",
  4070. "project.redo"
  4071. ],
  4072. "file": "evidence/truck-blueprint-ui.json",
  4073. "status": "PASS",
  4074. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  4075. "recordedAt": "2026-09-06T08:21:37.144Z",
  4076. "kind": "e2e+runtime-read",
  4077. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  4078. "screenshots": [],
  4079. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  4080. },
  4081. {
  4082. "ids": [
  4083. "tree.visibility",
  4084. "blueprint.highlight"
  4085. ],
  4086. "file": "validation.json",
  4087. "status": "PASS",
  4088. "kind": "unit",
  4089. "title": "visible child under a hidden ancestor cannot be picked or highlighted; trigger aliases include ancestors",
  4090. "screenshots": [],
  4091. "details": "共用可见性和祖先别名函数;鼠标事件另由 E2E 验证。"
  4092. },
  4093. {
  4094. "ids": [
  4095. "blueprint.highlight"
  4096. ],
  4097. "file": "validation.json",
  4098. "status": "PASS",
  4099. "kind": "unit",
  4100. "title": "highlight rejects missing/hidden targets and transient colors never enter a saved project",
  4101. "screenshots": [],
  4102. "details": "目标不存在/隐藏报错,执行时暂态发光颜色不进入保存文档,结束恢复原材质。"
  4103. }
  4104. ]
  4105. },
  4106. {
  4107. "id": "blueprint.message",
  4108. "group": "蓝图与交互反馈",
  4109. "name": "操作提示节点",
  4110. "source": {
  4111. "file": "../../../unreal_tran/src/main.js",
  4112. "line": 2099,
  4113. "symbol": "showTeachingMessage"
  4114. },
  4115. "implementation": "现有边界",
  4116. "boundary": "显示标题/文本,可点击关闭或约 1.8/2.5 秒自动继续;不是强制人员确认。",
  4117. "fix": "不将其当作业务审核/签名。",
  4118. "acceptance": "文本出现、关闭和停止不留弹层。",
  4119. "verification": "PASS",
  4120. "evidence": [
  4121. {
  4122. "ids": [
  4123. "blueprint.parameters",
  4124. "blueprint.move",
  4125. "blueprint.connect",
  4126. "blueprint.delete",
  4127. "blueprint.copy",
  4128. "blueprint.run",
  4129. "blueprint.stop",
  4130. "blueprint.reset",
  4131. "blueprint.timeline",
  4132. "blueprint.wait",
  4133. "blueprint.highlight",
  4134. "blueprint.message",
  4135. "blueprint.finish",
  4136. "project.undo",
  4137. "project.redo"
  4138. ],
  4139. "file": "evidence/truck-blueprint-ui.json",
  4140. "status": "PASS",
  4141. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  4142. "recordedAt": "2026-09-06T08:21:37.144Z",
  4143. "kind": "e2e+runtime-read",
  4144. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  4145. "screenshots": [],
  4146. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  4147. }
  4148. ]
  4149. },
  4150. {
  4151. "id": "blueprint.condition",
  4152. "group": "蓝图与交互反馈",
  4153. "name": "条件判断节点",
  4154. "source": {
  4155. "file": "../../../unreal_tran/src/main.js",
  4156. "line": 2095,
  4157. "symbol": "evaluateBlueprintCondition"
  4158. },
  4159. "implementation": "本轮修复",
  4160. "boundary": "当前运行变量、嵌套字段、truthy/布尔/数字比较。",
  4161. "fix": "false 没有出口不走 true,字符串布尔正确解析。",
  4162. "acceptance": "真假分支分别验证,缺出口不误执行。",
  4163. "verification": "PASS",
  4164. "evidence": [
  4165. {
  4166. "ids": [
  4167. "blueprint.condition"
  4168. ],
  4169. "file": "evidence/truck-blueprint-events.json",
  4170. "status": "PASS",
  4171. "testTitle": "已保存蓝图:条件出口与目标匹配 runtime 检查,真实模型单击/双击/进入预览自动触发",
  4172. "recordedAt": "2026-09-06T08:21:50.227Z",
  4173. "kind": "runtime",
  4174. "title": "已保存蓝图:条件出口与目标匹配 runtime 检查,真实模型单击/双击/进入预览自动触发",
  4175. "screenshots": [],
  4176. "details": ""
  4177. },
  4178. {
  4179. "ids": [
  4180. "blueprint.condition"
  4181. ],
  4182. "file": "validation.json",
  4183. "status": "PASS",
  4184. "kind": "unit",
  4185. "title": "boolean, numeric and nested blueprint conditions select their true/false branches",
  4186. "screenshots": [],
  4187. "details": "布尔、数字、truthy 与嵌套路径值解析。"
  4188. }
  4189. ]
  4190. },
  4191. {
  4192. "id": "blueprint.finish",
  4193. "group": "蓝图与交互反馈",
  4194. "name": "流程完成节点",
  4195. "source": {
  4196. "file": "../../../unreal_tran/src/main.js",
  4197. "line": 1075,
  4198. "symbol": "initEditors"
  4199. },
  4200. "implementation": "已有实现",
  4201. "boundary": "本次预览结果/进度提示,不写教学任务成绩。",
  4202. "fix": "保持本次运行反馈边界。",
  4203. "acceptance": "成功/完成提示与实际执行结果一致。",
  4204. "verification": "PASS",
  4205. "evidence": [
  4206. {
  4207. "ids": [
  4208. "blueprint.parameters",
  4209. "blueprint.move",
  4210. "blueprint.connect",
  4211. "blueprint.delete",
  4212. "blueprint.copy",
  4213. "blueprint.run",
  4214. "blueprint.stop",
  4215. "blueprint.reset",
  4216. "blueprint.timeline",
  4217. "blueprint.wait",
  4218. "blueprint.highlight",
  4219. "blueprint.message",
  4220. "blueprint.finish",
  4221. "project.undo",
  4222. "project.redo"
  4223. ],
  4224. "file": "evidence/truck-blueprint-ui.json",
  4225. "status": "PASS",
  4226. "testTitle": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  4227. "recordedAt": "2026-09-06T08:21:37.144Z",
  4228. "kind": "e2e+runtime-read",
  4229. "title": "蓝图真实节点库与端口拖线:七种参数、内部边复制/剪切、撤销重做及保存",
  4230. "screenshots": [],
  4231. "details": "节点库点选添加及实际拖动/接线/执行;不把点选当成节点拖入,不把适应画布当成鼠标平移缩放全部已验。"
  4232. }
  4233. ]
  4234. },
  4235. {
  4236. "id": "publish.preflight",
  4237. "group": "发布、交付与运行信息",
  4238. "name": "生成 / 发布检查面板",
  4239. "source": {
  4240. "file": "../../../unreal_tran/src/main.js",
  4241. "line": 2978,
  4242. "symbol": "togglePublishPanel"
  4243. },
  4244. "implementation": "现有边界",
  4245. "boundary": "本地主要检查资源引用存在及轨道/节点数量,不执行完整蓝图可达性、终止性或业务校验;服务端发布校验最终生效。",
  4246. "fix": "发布目标与离线交付能力明确。",
  4247. "acceptance": "可打开关闭;不完整工程不能凭界面绿标绕过服务端。",
  4248. "verification": "PASS",
  4249. "evidence": [
  4250. {
  4251. "ids": [
  4252. "resource.loading",
  4253. "publish.preflight"
  4254. ],
  4255. "file": "evidence/63-loading-publish-preflight.json",
  4256. "status": "PASS",
  4257. "testTitle": "受控 GLB 下载失败阻止编辑,重试成功;发布预检开关无写入且拒绝错误资源 JSON",
  4258. "recordedAt": "2026-09-06T08:24:17.025Z",
  4259. "kind": "e2e+api",
  4260. "title": "受控 GLB 下载失败阻止编辑,重试成功;发布预检开关无写入且拒绝错误资源 JSON",
  4261. "screenshots": [],
  4262. "details": "真实受控下载定向503→中性失败与禁止编辑→解除故障后UI重试成功;预检面板开关不写项目,错误资源JSON在替换当前模型之前被拒绝。服务端发布时code/URI一致性拒绝由ContentProjectServiceTest合同回归覆盖,未把面板绿标代替服务端校验。"
  4263. }
  4264. ]
  4265. },
  4266. {
  4267. "id": "publish.api",
  4268. "group": "发布、交付与运行信息",
  4269. "name": "发布到场景资源库",
  4270. "source": {
  4271. "file": "../../../unreal_tran/src/main.js",
  4272. "line": 2897,
  4273. "symbol": "publishToSceneLibrary"
  4274. },
  4275. "implementation": "本轮修复",
  4276. "boundary": "先保存当前工程再发布固定版本;纯 publisher 发布已保存版本。",
  4277. "fix": "整个保存/发布队列互斥,失败不发后续发布。",
  4278. "acceptance": "发布版本/模型资产/列表状态一致,保存失败不发布。",
  4279. "verification": "PASS",
  4280. "evidence": [
  4281. {
  4282. "ids": [
  4283. "publish.api",
  4284. "publish.cover",
  4285. "publish.html",
  4286. "publish.downstream"
  4287. ],
  4288. "file": "evidence/34-publish-fixed-version.json",
  4289. "status": "PASS",
  4290. "testTitle": "直接发布同步截图封面、固定版本目录与真实离线步骤 HTML",
  4291. "recordedAt": "2026-09-06T08:20:51.047Z",
  4292. "kind": "e2e+api",
  4293. "title": "直接发布同步截图封面、固定版本目录与真实离线步骤 HTML",
  4294. "screenshots": [],
  4295. "details": "目录可取得固定发布版本及同版封面;HTML已真实打开并确认演示边界,未声明下游动画执行或完整离线三维运行。"
  4296. },
  4297. {
  4298. "ids": [
  4299. "publish.api",
  4300. "publish.cover",
  4301. "feedback.toast"
  4302. ],
  4303. "file": "validation.json",
  4304. "status": "PASS",
  4305. "kind": "unit",
  4306. "title": "API publish supplies current cover, blocks duplicate publication and reports preserved old cover once",
  4307. "screenshots": [],
  4308. "details": "实际发布宿主方法传封面、重入阻断和上传失败只提示一次;模拟 API,不是实际服务响应。"
  4309. },
  4310. {
  4311. "ids": [
  4312. "project.conflict",
  4313. "publish.api",
  4314. "publish.cover"
  4315. ],
  4316. "file": "validation.json",
  4317. "status": "PASS",
  4318. "kind": "unit",
  4319. "title": "API conflict leaves publication failed and releases the cover guard",
  4320. "screenshots": [],
  4321. "details": "409 分支不误报已发布并释放 busy 标记;模拟 API。"
  4322. }
  4323. ]
  4324. },
  4325. {
  4326. "id": "publish.cover",
  4327. "group": "发布、交付与运行信息",
  4328. "name": "发布时当前三维截图封面",
  4329. "source": {
  4330. "file": "../../../unreal_tran/src/main.js",
  4331. "line": 2897,
  4332. "symbol": "publishToSceneLibrary"
  4333. },
  4334. "implementation": "本轮修复",
  4335. "boundary": "JPEG 当前视口;截图或上传失败可保留旧封面并明确提示。",
  4336. "fix": "与手动保存共用封面链路,409 阻断。",
  4337. "acceptance": "真实封面图对应当前模型;上传失败提示一次,旧图保留。",
  4338. "verification": "PASS",
  4339. "evidence": [
  4340. {
  4341. "ids": [
  4342. "publish.api",
  4343. "publish.cover",
  4344. "publish.html",
  4345. "publish.downstream"
  4346. ],
  4347. "file": "evidence/34-publish-fixed-version.json",
  4348. "status": "PASS",
  4349. "testTitle": "直接发布同步截图封面、固定版本目录与真实离线步骤 HTML",
  4350. "recordedAt": "2026-09-06T08:20:51.047Z",
  4351. "kind": "e2e+api",
  4352. "title": "直接发布同步截图封面、固定版本目录与真实离线步骤 HTML",
  4353. "screenshots": [],
  4354. "details": "目录可取得固定发布版本及同版封面;HTML已真实打开并确认演示边界,未声明下游动画执行或完整离线三维运行。"
  4355. },
  4356. {
  4357. "ids": [
  4358. "publish.api",
  4359. "publish.cover",
  4360. "feedback.toast"
  4361. ],
  4362. "file": "validation.json",
  4363. "status": "PASS",
  4364. "kind": "unit",
  4365. "title": "API publish supplies current cover, blocks duplicate publication and reports preserved old cover once",
  4366. "screenshots": [],
  4367. "details": "实际发布宿主方法传封面、重入阻断和上传失败只提示一次;模拟 API,不是实际服务响应。"
  4368. },
  4369. {
  4370. "ids": [
  4371. "project.conflict",
  4372. "publish.api",
  4373. "publish.cover"
  4374. ],
  4375. "file": "validation.json",
  4376. "status": "PASS",
  4377. "kind": "unit",
  4378. "title": "API conflict leaves publication failed and releases the cover guard",
  4379. "screenshots": [],
  4380. "details": "409 分支不误报已发布并释放 busy 标记;模拟 API。"
  4381. }
  4382. ]
  4383. },
  4384. {
  4385. "id": "publish.html",
  4386. "group": "发布、交付与运行信息",
  4387. "name": "导出步骤演示 HTML",
  4388. "source": {
  4389. "file": "../../../unreal_tran/src/main.js",
  4390. "line": 3011,
  4391. "symbol": "exportStandaloneHtml"
  4392. },
  4393. "implementation": "本轮澄清",
  4394. "boundary": "工程数据、静态截图和步骤演示;不包含 GLB、不执行真实三维交互。",
  4395. "fix": "生成面板和按钮移除完整离线运行的误导。",
  4396. "acceptance": "下载可打开、步骤导航可用,醒目标明不含三维模型。",
  4397. "verification": "PASS",
  4398. "evidence": [
  4399. {
  4400. "ids": [
  4401. "publish.api",
  4402. "publish.cover",
  4403. "publish.html",
  4404. "publish.downstream"
  4405. ],
  4406. "file": "evidence/34-publish-fixed-version.json",
  4407. "status": "PASS",
  4408. "testTitle": "直接发布同步截图封面、固定版本目录与真实离线步骤 HTML",
  4409. "recordedAt": "2026-09-06T08:20:51.047Z",
  4410. "kind": "e2e+api",
  4411. "title": "直接发布同步截图封面、固定版本目录与真实离线步骤 HTML",
  4412. "screenshots": [],
  4413. "details": "目录可取得固定发布版本及同版封面;HTML已真实打开并确认演示边界,未声明下游动画执行或完整离线三维运行。"
  4414. }
  4415. ]
  4416. },
  4417. {
  4418. "id": "publish.downstream",
  4419. "group": "发布、交付与运行信息",
  4420. "name": "下游读取模型固定版本",
  4421. "source": {
  4422. "file": "../../../unreal_tran/src/model-content-api.js",
  4423. "line": 1159,
  4424. "symbol": "publishDocument"
  4425. },
  4426. "implementation": "现有边界",
  4427. "boundary": "已发布模型作为资源引用;下游自动执行模型 timeline/blueprint 尚无统一运行桥接。",
  4428. "fix": "本轮不将资源加载成功等同动作自动运行成功。",
  4429. "acceptance": "固定引用/可见性单独测;自动动作执行列为待确认范围。",
  4430. "verification": "PASS",
  4431. "evidence": [
  4432. {
  4433. "ids": [
  4434. "publish.api",
  4435. "publish.cover",
  4436. "publish.html",
  4437. "publish.downstream"
  4438. ],
  4439. "file": "evidence/34-publish-fixed-version.json",
  4440. "status": "PASS",
  4441. "testTitle": "直接发布同步截图封面、固定版本目录与真实离线步骤 HTML",
  4442. "recordedAt": "2026-09-06T08:20:51.047Z",
  4443. "kind": "e2e+api",
  4444. "title": "直接发布同步截图封面、固定版本目录与真实离线步骤 HTML",
  4445. "screenshots": [],
  4446. "details": "目录可取得固定发布版本及同版封面;HTML已真实打开并确认演示边界,未声明下游动画执行或完整离线三维运行。"
  4447. }
  4448. ]
  4449. },
  4450. {
  4451. "id": "feedback.log",
  4452. "group": "发布、交付与运行信息",
  4453. "name": "运行日志",
  4454. "source": {
  4455. "file": "../../../unreal_tran/src/main.js",
  4456. "line": 3116,
  4457. "symbol": "log(message"
  4458. },
  4459. "implementation": "已有实现",
  4460. "boundary": "本次内存运行日志,最多 160 条;不是服务端审计日志。",
  4461. "fix": "错误信息转义,保留清晰运行结果。",
  4462. "acceptance": "选中/运行/保存产生相应日志,不要求刷新保留。",
  4463. "verification": "PASS",
  4464. "evidence": [
  4465. {
  4466. "ids": [
  4467. "project.name",
  4468. "project.autosave",
  4469. "view.orbit",
  4470. "view.focus",
  4471. "view.panels",
  4472. "view.preview-step",
  4473. "feedback.log",
  4474. "feedback.stats",
  4475. "property.identity",
  4476. "property.binding",
  4477. "selection.scope",
  4478. "component.inspect"
  4479. ],
  4480. "file": "evidence/46-navigation-panels-autosave.json",
  4481. "status": "PASS",
  4482. "testTitle": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  4483. "recordedAt": "2026-09-06T08:23:54.656Z",
  4484. "kind": "e2e+api",
  4485. "title": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  4486. "screenshots": [],
  4487. "details": "真实鼠标镜头操作;聚焦只验证相机目标;真实30秒自动保存,无测试加速定时器;统计内存估值未当作性能结论。"
  4488. }
  4489. ]
  4490. },
  4491. {
  4492. "id": "feedback.stats",
  4493. "group": "发布、交付与运行信息",
  4494. "name": "节点 / 三角面 / FPS 等状态",
  4495. "source": {
  4496. "file": "../../../unreal_tran/src/main.js",
  4497. "line": 3094,
  4498. "symbol": "updateStats"
  4499. },
  4500. "implementation": "现有边界",
  4501. "boundary": "节点与三角面统计、当前 FPS;内存为估算值,不是精确浏览器内存剖析。",
  4502. "fix": "无本轮性能仪表重构。",
  4503. "acceptance": "载入模型后统计有合理变化,状态不作为性能验收数据。",
  4504. "verification": "PASS",
  4505. "evidence": [
  4506. {
  4507. "ids": [
  4508. "project.name",
  4509. "project.autosave",
  4510. "view.orbit",
  4511. "view.focus",
  4512. "view.panels",
  4513. "view.preview-step",
  4514. "feedback.log",
  4515. "feedback.stats",
  4516. "property.identity",
  4517. "property.binding",
  4518. "selection.scope",
  4519. "component.inspect"
  4520. ],
  4521. "file": "evidence/46-navigation-panels-autosave.json",
  4522. "status": "PASS",
  4523. "testTitle": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  4524. "recordedAt": "2026-09-06T08:23:54.656Z",
  4525. "kind": "e2e+api",
  4526. "title": "补充视口与工作区:鼠标镜头、聚焦、面板、预览导航、日志与自动保存",
  4527. "screenshots": [],
  4528. "details": "真实鼠标镜头操作;聚焦只验证相机目标;真实30秒自动保存,无测试加速定时器;统计内存估值未当作性能结论。"
  4529. }
  4530. ]
  4531. },
  4532. {
  4533. "id": "feedback.toast",
  4534. "group": "发布、交付与运行信息",
  4535. "name": "成功 / 错误短消息",
  4536. "source": {
  4537. "file": "../../../unreal_tran/src/main.js",
  4538. "line": 3117,
  4539. "symbol": "toast(message"
  4540. },
  4541. "implementation": "已有实现",
  4542. "boundary": "瞬时反馈;保存/发布成功以接口完成为准。",
  4543. "fix": "封面失败不伪报全部成功。",
  4544. "acceptance": "失败出现一次明确提示,自动消失,不形成重复常驻错误条。",
  4545. "verification": "PASS",
  4546. "evidence": [
  4547. {
  4548. "ids": [
  4549. "project.conflict",
  4550. "project.save",
  4551. "feedback.toast"
  4552. ],
  4553. "file": "evidence/32-save-failure-recovery.json",
  4554. "status": "PASS",
  4555. "testTitle": "保存请求超时和 409 保留恢复副本,解除故障后可重试",
  4556. "recordedAt": "2026-09-06T08:20:43.214Z",
  4557. "kind": "e2e+api",
  4558. "title": "保存请求超时和 409 保留恢复副本,解除故障后可重试",
  4559. "screenshots": [],
  4560. "details": "真实页面保存及真实服务端重试;失败由浏览器定向注入 timedout/409,非宣称自然发生的服务故障。"
  4561. },
  4562. {
  4563. "ids": [
  4564. "publish.api",
  4565. "publish.cover",
  4566. "feedback.toast"
  4567. ],
  4568. "file": "validation.json",
  4569. "status": "PASS",
  4570. "kind": "unit",
  4571. "title": "API publish supplies current cover, blocks duplicate publication and reports preserved old cover once",
  4572. "screenshots": [],
  4573. "details": "实际发布宿主方法传封面、重入阻断和上传失败只提示一次;模拟 API,不是实际服务响应。"
  4574. }
  4575. ]
  4576. }
  4577. ]
  4578. }