Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

2052 строки
93 KiB

  1. [
  2. {
  3. "id": "project.load",
  4. "group": "工程入口与顶部命令",
  5. "name": "按真实项目 ID 打开已存场景",
  6. "source": {
  7. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  8. "symbol": "async function loadProject",
  9. "line": 547
  10. },
  11. "implementation": "本轮修复已完成验证",
  12. "boundary": "服务端 content 与版本是真值;不得以模板种子覆盖有效旧工程。",
  13. "acceptance": "独立新会话打开,真实模型可见、固定版本及对象字段一致。",
  14. "fix": "新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。",
  15. "fixIds": [
  16. "SCENE-F18"
  17. ],
  18. "verification": "PASS"
  19. },
  20. {
  21. "id": "project.retry",
  22. "group": "工程入口与顶部命令",
  23. "name": "项目或挂载加载失败后重新加载",
  24. "source": {
  25. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  26. "symbol": "mountError",
  27. "line": 76
  28. },
  29. "implementation": "本轮修复已完成验证",
  30. "boundary": "错误详情自动消退,保留中性失败状态与重试按钮。",
  31. "acceptance": "注入加载失败;无可写半场景;恢复网络后按钮重试成功。",
  32. "fix": "前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。",
  33. "fixIds": [
  34. "SCENE-F12"
  35. ],
  36. "verification": "PASS"
  37. },
  38. {
  39. "id": "project.title",
  40. "group": "工程入口与顶部命令",
  41. "name": "当前场景名称与项目说明按钮",
  42. "source": {
  43. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  44. "symbol": "project: () => this.toast",
  45. "line": 599
  46. },
  47. "implementation": "已有实现已完成验证",
  48. "boundary": "现有标题显示服务端名称;说明按钮不是重命名输入框。",
  49. "acceptance": "长名称完整 title 正确;点击说明反映内容 API 管理。",
  50. "fix": "尚未关联本轮修复记录",
  51. "fixIds": [],
  52. "verification": "PASS"
  53. },
  54. {
  55. "id": "project.new",
  56. "group": "工程入口与顶部命令",
  57. "name": "顶部新建独立工程",
  58. "source": {
  59. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  60. "symbol": "new: () =>",
  61. "line": 575
  62. },
  63. "implementation": "本轮修复已完成验证",
  64. "boundary": "基线代码重置当前模板;本轮由宿主接真实创建 API,必须保留原项目。",
  65. "acceptance": "取消/失败不清原工程;成功新 ID;保存重开与列表对应。",
  66. "fix": "顶部新建委托宿主命名与创建 API,先确认未保存内容。选择放弃也要等创建及导航成功后才清除原 dirty/恢复稿;创建503仍保留原稿。成功后刷新原缓存页,避免再次打开时将已放弃修改冒称已保存。取消、失败不清原场景,成功导航到新项目 ID,并有创建并发守卫。",
  67. "fixIds": [
  68. "SCENE-F02"
  69. ],
  70. "verification": "PASS"
  71. },
  72. {
  73. "id": "project.back",
  74. "group": "工程入口与顶部命令",
  75. "name": "返回场景制作列表并保留场景标签",
  76. "source": {
  77. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  78. "symbol": "back: () =>",
  79. "line": 598
  80. },
  81. "implementation": "已有实现已完成验证",
  82. "boundary": "平台约定返回列表等同切换标签,保留场景缓存和未存稿,不弹关闭确认;真正关闭标签才询问。",
  83. "acceptance": "未存状态返回列表不写服务器、不丢场景;重新点原标签恢复输入和选择。",
  84. "fix": "尚未关联本轮修复记录",
  85. "fixIds": [],
  86. "verification": "PASS"
  87. },
  88. {
  89. "id": "project.save",
  90. "group": "工程入口与顶部命令",
  91. "name": "保存草稿按钮",
  92. "source": {
  93. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  94. "symbol": "async saveProject()",
  95. "line": 1874
  96. },
  97. "implementation": "本轮修复已完成验证",
  98. "boundary": "只有服务器保存完成才显示成功;本地恢复缓冲不是自动入库。",
  99. "acceptance": "编辑后真实 PUT,刷新值一致,version 前进一次。",
  100. "fix": "完整 PUT 回写原有相同 SCENE_MODEL 三元组时沿用场景授权边界;新增或改版依赖仍要求来源模型可见及范围权限,不扩大模型页面访问权。",
  101. "fixIds": [
  102. "SCENE-F14"
  103. ],
  104. "verification": "PASS"
  105. },
  106. {
  107. "id": "project.save-key",
  108. "group": "工程入口与顶部命令",
  109. "name": "Ctrl/Meta+S 保存快捷键",
  110. "source": {
  111. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  112. "symbol": "handleKeyboard(event)",
  113. "line": 469
  114. },
  115. "implementation": "已有实现已完成验证",
  116. "boundary": "键盘与按钮走相同保存/权限/忙碌守卫。",
  117. "acceptance": "实际按键触发一次保存;表单内与非表单焦点分别核查。",
  118. "fix": "尚未关联本轮修复记录",
  119. "fixIds": [],
  120. "verification": "PASS"
  121. },
  122. {
  123. "id": "project.save-failure",
  124. "group": "工程入口与顶部命令",
  125. "name": "保存失败保留修改和恢复稿",
  126. "source": {
  127. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  128. "symbol": "async saveProject()",
  129. "line": 1874
  130. },
  131. "implementation": "已有实现已完成验证",
  132. "boundary": "网络失败或业务拒绝不能清 dirty;不弹虚假保存成功。",
  133. "acceptance": "定向 503 后对象/字段保留,恢复后重试与刷新成功。",
  134. "fix": "尚未关联本轮修复记录",
  135. "fixIds": [],
  136. "verification": "PASS"
  137. },
  138. {
  139. "id": "project.conflict",
  140. "group": "工程入口与顶部命令",
  141. "name": "409 乐观锁冲突保护",
  142. "source": {
  143. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  144. "symbol": "function describeSaveError",
  145. "line": 432
  146. },
  147. "implementation": "已有实现已完成验证",
  148. "boundary": "服务器最新版本不覆盖;恢复副本可下载/隔离。",
  149. "acceptance": "独立副本制造版本冲突;验证失败提示、旧版本不覆盖与本地稿保留。",
  150. "fix": "尚未关联本轮修复记录",
  151. "fixIds": [],
  152. "verification": "PASS"
  153. },
  154. {
  155. "id": "project.concurrent-save",
  156. "group": "工程入口与顶部命令",
  157. "name": "重复保存与保存中继续编辑",
  158. "source": {
  159. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  160. "symbol": "const saveRevision = this.changeRevision",
  161. "line": 1887
  162. },
  163. "implementation": "本轮修复已完成验证",
  164. "boundary": "提交快照与后续编辑分开;后续修改不能随早先请求完成清掉。",
  165. "acceptance": "延迟 PUT、连点保存并继续改值;一次旧提交、新修改仍 dirty。",
  166. "fix": "开始保存时取消之前安排的恢复稿定时器,避免它覆盖宿主保存快照 nonce;保存中的后续编辑仍单独保留。",
  167. "fixIds": [
  168. "SCENE-F08"
  169. ],
  170. "verification": "PASS"
  171. },
  172. {
  173. "id": "json.export",
  174. "group": "工程文件与资源导入",
  175. "name": "导出当前场景 JSON",
  176. "source": {
  177. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  178. "symbol": "exportProject()",
  179. "line": 578
  180. },
  181. "implementation": "已有实现已完成验证",
  182. "boundary": "导出 edit3dv4.scene、对象/部件覆盖、渲染和稳定资源引用;不冒称自包含 GLB 包。",
  183. "acceptance": "打开下载 JSON 核对内容、结构和无临时 blob 依赖。",
  184. "fix": "尚未关联本轮修复记录",
  185. "fixIds": [],
  186. "verification": "PASS"
  187. },
  188. {
  189. "id": "json.import",
  190. "group": "工程文件与资源导入",
  191. "name": "导入有效场景工程 JSON",
  192. "source": {
  193. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  194. "symbol": "importProject(event)",
  195. "line": 462
  196. },
  197. "implementation": "本轮修复已完成验证",
  198. "boundary": "替换当前编辑文档后仍需保存;不得写入另一个项目身份。",
  199. "acceptance": "导出后实际文件导入、保存、重开;对象与渲染参数往返一致。",
  200. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  201. "fixIds": [
  202. "SCENE-F03"
  203. ],
  204. "verification": "PASS"
  205. },
  206. {
  207. "id": "json.invalid",
  208. "group": "工程文件与资源导入",
  209. "name": "非法 JSON / 错误 schema 拒绝",
  210. "source": {
  211. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  212. "symbol": "importProject(event)",
  213. "line": 462
  214. },
  215. "implementation": "本轮修复已完成验证",
  216. "boundary": "解析或结构错误不得清空当前场景。",
  217. "acceptance": "非法 JSON 与非场景文档各一次,原工程和模型仍可编辑。",
  218. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  219. "fixIds": [
  220. "SCENE-F03"
  221. ],
  222. "verification": "PASS"
  223. },
  224. {
  225. "id": "json.missing-resource",
  226. "group": "工程文件与资源导入",
  227. "name": "JSON 缺失/错误受控引用拒绝与回滚",
  228. "source": {
  229. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  230. "symbol": "async restoreImportedObject",
  231. "line": 2016
  232. },
  233. "implementation": "本轮修复已完成验证",
  234. "boundary": "错误资产编码不能回退为另一个模型;恢复失败不半替换。",
  235. "acceptance": "导入显式不存在编码/版本;原对象保留或明确阻断,零错误发布。",
  236. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。;前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。",
  237. "fixIds": [
  238. "SCENE-F03",
  239. "SCENE-F12"
  240. ],
  241. "verification": "PASS"
  242. },
  243. {
  244. "id": "json.rendering",
  245. "group": "工程文件与资源导入",
  246. "name": "相机、灯光、雾和环境序列化往返",
  247. "source": {
  248. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  249. "symbol": "serializeRendering()",
  250. "line": 857
  251. },
  252. "implementation": "本轮修复已完成验证",
  253. "boundary": "当前默认 UI 不提供全部渲染编辑器;导入/保存仍须保留其文档参数。",
  254. "acceptance": "合法带渲染参数文档导入、实际画面比对、保存重开字段一致。",
  255. "fix": "透视按钮实际恢复先前观察位置;导入、加载和历史恢复存在已保存相机时不再被车辆自动聚焦覆盖。",
  256. "fixIds": [
  257. "SCENE-F04"
  258. ],
  259. "verification": "PASS"
  260. },
  261. {
  262. "id": "glb.import",
  263. "group": "工程文件与资源导入",
  264. "name": "本地 GLB 上传并加入当前场景",
  265. "source": {
  266. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  267. "symbol": "async importGLB(event)",
  268. "line": 2122
  269. },
  270. "implementation": "本轮修复已完成验证",
  271. "boundary": "上传到内容服务,消费票据后解析;对象加入不等于工程已保存。",
  272. "acceptance": "真实选择小 GLB,上传/登记/可见/保存重开均完成。",
  273. "fix": "恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。",
  274. "fixIds": [
  275. "SCENE-F06"
  276. ],
  277. "verification": "PASS"
  278. },
  279. {
  280. "id": "glb.invalid",
  281. "group": "工程文件与资源导入",
  282. "name": "非 GLB / 损坏 GLB / 上传失败处理",
  283. "source": {
  284. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  285. "symbol": "async importGLB(event)",
  286. "line": 2122
  287. },
  288. "implementation": "已有实现已完成验证",
  289. "boundary": "上传或解析失败不插入占位对象;原场景应保留,提示可重试。",
  290. "acceptance": "错误格式及损坏文件、上传 503;验证对象数/旧资产/后续成功导入。",
  291. "fix": "尚未关联本轮修复记录",
  292. "fixIds": [],
  293. "verification": "PASS"
  294. },
  295. {
  296. "id": "glb.pending",
  297. "group": "工程文件与资源导入",
  298. "name": "资源加载/上传期间操作互斥",
  299. "source": {
  300. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  301. "symbol": "setModelLoading(loading",
  302. "line": 1411
  303. },
  304. "implementation": "已有实现已完成验证",
  305. "boundary": "加载中的模型不能被半保存、导出或发布;不能离开造成旧请求污染新项目。",
  306. "acceptance": "延迟下载/上传,操作禁用与待完成状态一致,完成后恢复。",
  307. "fix": "尚未关联本轮修复记录",
  308. "fixIds": [],
  309. "verification": "PASS"
  310. },
  311. {
  312. "id": "glb.references",
  313. "group": "工程文件与资源导入",
  314. "name": "本项目 GLB 稳定资产引用",
  315. "source": {
  316. "file": "../../../unreal_tran_web/src/features/scene-legacy/serverAssetStore.ts",
  317. "symbol": "async put(blob",
  318. "line": 113
  319. },
  320. "implementation": "本轮修复已完成验证",
  321. "boundary": "自导入使用 content://asset/scene/{projectId}/{assetCode} 和 READY 资产;blob 只供运行。",
  322. "acceptance": "重新会话受控下载成功,主对象/资产身份一致,无本地缓存依赖。",
  323. "fix": "前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。;新增 SceneResourceReferenceValidator 检查 objects 和递归 splitParts;自有/固定版本资源的所有显式引用必须指向同一 READY 模型文件,错误引用在发布/提交前阻断,保留受控的内置资源和旧引用兼容。",
  324. "fixIds": [
  325. "SCENE-F12",
  326. "SCENE-F13"
  327. ],
  328. "verification": "PASS"
  329. },
  330. {
  331. "id": "panel.left-tabs",
  332. "group": "左侧目录与资源放置",
  333. "name": "场景大纲 / 资源库 / 场景模板切换",
  334. "source": {
  335. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  336. "symbol": "const leftTab =",
  337. "line": 540
  338. },
  339. "implementation": "已有实现已完成验证",
  340. "boundary": "切面板不写业务文档;筛选状态行为需一致。",
  341. "acceptance": "三页签均可达,无 DOM 异常或资源目录中断。",
  342. "fix": "尚未关联本轮修复记录",
  343. "fixIds": [],
  344. "verification": "PASS"
  345. },
  346. {
  347. "id": "search.tree",
  348. "group": "左侧目录与资源放置",
  349. "name": "对象/部件名称搜索与清空",
  350. "source": {
  351. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  352. "symbol": "renderTree()",
  353. "line": 627
  354. },
  355. "implementation": "已有实现已完成验证",
  356. "boundary": "根名与部件名可命中;无匹配状态应清楚,非删除对象。",
  357. "acceptance": "根名/部件名/无结果/清空分别核对行和真实对象数。",
  358. "fix": "尚未关联本轮修复记录",
  359. "fixIds": [],
  360. "verification": "PASS"
  361. },
  362. {
  363. "id": "search.assets",
  364. "group": "左侧目录与资源放置",
  365. "name": "资源搜索与异步刷新保留筛选",
  366. "source": {
  367. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  368. "symbol": "applyLeftFilter()",
  369. "line": 742
  370. },
  371. "implementation": "已有实现已完成验证",
  372. "boundary": "只筛当前目录;异步重绘不复活不匹配卡片。",
  373. "acceptance": "命中、无结果、清空,目录重绘后过滤仍正确。",
  374. "fix": "尚未关联本轮修复记录",
  375. "fixIds": [],
  376. "verification": "PASS"
  377. },
  378. {
  379. "id": "search.templates",
  380. "group": "左侧目录与资源放置",
  381. "name": "模板搜索与清空",
  382. "source": {
  383. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  384. "symbol": "filterLeft(query)",
  385. "line": 2278
  386. },
  387. "implementation": "已有实现已完成验证",
  388. "boundary": "模板卡片与同一搜索框联动。",
  389. "acceptance": "中文模板关键字过滤、无结果和清空。",
  390. "fix": "尚未关联本轮修复记录",
  391. "fixIds": [],
  392. "verification": "PASS"
  393. },
  394. {
  395. "id": "assets.catalog",
  396. "group": "左侧目录与资源放置",
  397. "name": "真实已发布模型成果目录",
  398. "source": {
  399. "file": "../../../unreal_tran_web/src/features/scene-legacy/contentApiClient.ts",
  400. "symbol": "async listPublishedModels",
  401. "line": 783
  402. },
  403. "implementation": "本轮修复已完成验证",
  404. "boundary": "目录由 API 预加载,当前默认不以 localStorage 发布清单为真值。",
  405. "acceptance": "显示发布模型名称/版本,草稿不冒充已发布,空态可操作。",
  406. "fix": "移除 runtime 旧 content.update 门槛,独立计算新建、更新和发布;无模型页面权限时不加载新模型目录,但既有固定依赖仍可按场景授权读取。",
  407. "fixIds": [
  408. "SCENE-F01"
  409. ],
  410. "verification": "PASS"
  411. },
  412. {
  413. "id": "assets.model-double-click",
  414. "group": "左侧目录与资源放置",
  415. "name": "双击已发布模型放置",
  416. "source": {
  417. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  418. "symbol": "async placeEditorAsset",
  419. "line": 1357
  420. },
  421. "implementation": "已有实现已完成验证",
  422. "boundary": "按固定 project/version/assetCode 导入当前实例,继承发布部件和材质。",
  423. "acceptance": "狐狸和卡车分别双击加入、真实可见、保存重开固定版本。",
  424. "fix": "尚未关联本轮修复记录",
  425. "fixIds": [],
  426. "verification": "PASS"
  427. },
  428. {
  429. "id": "assets.model-drop",
  430. "group": "左侧目录与资源放置",
  431. "name": "拖入已发布模型放置",
  432. "source": {
  433. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  434. "symbol": "handleDrop(event)",
  435. "line": 461
  436. },
  437. "implementation": "已有实现已完成验证",
  438. "boundary": "拖放实际命中地平面;与双击共用受控资产链路。",
  439. "acceptance": "真实指针拖放到不同位置,坐标/实例数/固定引用准确。",
  440. "fix": "尚未关联本轮修复记录",
  441. "fixIds": [],
  442. "verification": "PASS"
  443. },
  444. {
  445. "id": "assets.basic-double-click",
  446. "group": "左侧目录与资源放置",
  447. "name": "双击基础资源放置",
  448. "source": {
  449. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  450. "symbol": "onRootDblClick",
  451. "line": 429
  452. },
  453. "implementation": "本轮修复已完成验证",
  454. "boundary": "以当前轨道目标落地;每次生成独立对象身份。",
  455. "acceptance": "双击生成对象,变换、保存后仍可见。",
  456. "fix": "恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。",
  457. "fixIds": [
  458. "SCENE-F06"
  459. ],
  460. "verification": "PASS"
  461. },
  462. {
  463. "id": "assets.basic-drop",
  464. "group": "左侧目录与资源放置",
  465. "name": "基础资源拖入与拖放提示",
  466. "source": {
  467. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  468. "symbol": "handleDrop(event)",
  469. "line": 461
  470. },
  471. "implementation": "已有实现已完成验证",
  472. "boundary": "MIME 和 text/plain 回退协议一致;离开视口清提示。",
  473. "acceptance": "真实拖放命中位置与 0.5m 吸附、dragleave/drop 提示复位。",
  474. "fix": "尚未关联本轮修复记录",
  475. "fixIds": [],
  476. "verification": "PASS"
  477. },
  478. {
  479. "id": "assets.model-link",
  480. "group": "左侧目录与资源放置",
  481. "name": "打开/返回模型编辑器入口",
  482. "source": {
  483. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  484. "symbol": "open-model-editor",
  485. "line": 590
  486. },
  487. "implementation": "本轮修复已完成验证",
  488. "boundary": "当前基线只有跳模型列表,来源按钮不得冒称直达正确源项目。",
  489. "acceptance": "空资源库和选中模型来源两入口,跳转/未保存保护正确。",
  490. "fix": "模型来源按钮有来源权限时导航正确项目;无来源页面权限回到可访问列表,不将模型列表误称为来源工程编辑。",
  491. "fixIds": [
  492. "SCENE-F11"
  493. ],
  494. "verification": "PASS"
  495. },
  496. {
  497. "id": "asset.diagnostic",
  498. "group": "左侧目录与资源放置",
  499. "name": "基础资源:液压诊断工位",
  500. "source": {
  501. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  502. "symbol": "id: 'diagnostic'",
  503. "line": 123
  504. },
  505. "implementation": "已有实现已完成验证",
  506. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  507. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  508. "fix": "尚未关联本轮修复记录",
  509. "fixIds": [],
  510. "verification": "PASS"
  511. },
  512. {
  513. "id": "asset.equipment",
  514. "group": "左侧目录与资源放置",
  515. "name": "基础资源:维修装备主体",
  516. "source": {
  517. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  518. "symbol": "id: 'equipment'",
  519. "line": 124
  520. },
  521. "implementation": "已有实现已完成验证",
  522. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  523. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  524. "fix": "尚未关联本轮修复记录",
  525. "fixIds": [],
  526. "verification": "PASS"
  527. },
  528. {
  529. "id": "asset.workbench",
  530. "group": "左侧目录与资源放置",
  531. "name": "基础资源:检修工作台",
  532. "source": {
  533. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  534. "symbol": "id: 'workbench'",
  535. "line": 125
  536. },
  537. "implementation": "已有实现已完成验证",
  538. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  539. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  540. "fix": "尚未关联本轮修复记录",
  541. "fixIds": [],
  542. "verification": "PASS"
  543. },
  544. {
  545. "id": "asset.shelf",
  546. "group": "左侧目录与资源放置",
  547. "name": "基础资源:器材存放架",
  548. "source": {
  549. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  550. "symbol": "id: 'shelf'",
  551. "line": 126
  552. },
  553. "implementation": "已有实现已完成验证",
  554. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  555. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  556. "fix": "尚未关联本轮修复记录",
  557. "fixIds": [],
  558. "verification": "PASS"
  559. },
  560. {
  561. "id": "asset.safety-zone",
  562. "group": "左侧目录与资源放置",
  563. "name": "基础资源:安全作业区域",
  564. "source": {
  565. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  566. "symbol": "id: 'safety-zone'",
  567. "line": 127
  568. },
  569. "implementation": "已有实现已完成验证",
  570. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  571. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  572. "fix": "尚未关联本轮修复记录",
  573. "fixIds": [],
  574. "verification": "PASS"
  575. },
  576. {
  577. "id": "asset.camera",
  578. "group": "左侧目录与资源放置",
  579. "name": "基础资源:视觉采集设备",
  580. "source": {
  581. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  582. "symbol": "id: 'camera'",
  583. "line": 128
  584. },
  585. "implementation": "已有实现已完成验证",
  586. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  587. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  588. "fix": "尚未关联本轮修复记录",
  589. "fixIds": [],
  590. "verification": "PASS"
  591. },
  592. {
  593. "id": "asset.worker",
  594. "group": "左侧目录与资源放置",
  595. "name": "基础资源:训练人员占位",
  596. "source": {
  597. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  598. "symbol": "id: 'worker'",
  599. "line": 129
  600. },
  601. "implementation": "已有实现已完成验证",
  602. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  603. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  604. "fix": "尚未关联本轮修复记录",
  605. "fixIds": [],
  606. "verification": "PASS"
  607. },
  608. {
  609. "id": "asset.light",
  610. "group": "左侧目录与资源放置",
  611. "name": "基础资源:区域照明",
  612. "source": {
  613. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  614. "symbol": "id: 'light'",
  615. "line": 130
  616. },
  617. "implementation": "已有实现已完成验证",
  618. "boundary": "现有程序化场景资源;名称不代表已连接物理设备或真实人员。",
  619. "acceptance": "实际放置可见,独立编号、位置和保存重开一致;照明应区分灯具外观与光源效果。",
  620. "fix": "尚未关联本轮修复记录",
  621. "fixIds": [],
  622. "verification": "PASS"
  623. },
  624. {
  625. "id": "asset.vehicle-depot",
  626. "group": "左侧目录与资源放置",
  627. "name": "场地资源:真实装备车库",
  628. "source": {
  629. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  630. "symbol": "id: 'vehicle-depot'",
  631. "line": 121
  632. },
  633. "implementation": "已有实现已完成验证",
  634. "boundary": "整体场地 GLB 与维修车间分开;重复放置按既有规则处理。",
  635. "acceptance": "资源拖放或双击加载、比例/落地正常、重复放置不产生错误重叠。",
  636. "fix": "尚未关联本轮修复记录",
  637. "fixIds": [],
  638. "verification": "PASS"
  639. },
  640. {
  641. "id": "asset.field-terrain",
  642. "group": "左侧目录与资源放置",
  643. "name": "场地资源:真实野外地形",
  644. "source": {
  645. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  646. "symbol": "id: 'field-terrain'",
  647. "line": 122
  648. },
  649. "implementation": "已有实现已完成验证",
  650. "boundary": "真实地形资源和指定落地基准;不能以程序地板代替。",
  651. "acceptance": "加载后真实起伏地形可见,保存重开资源、地面高度一致。",
  652. "fix": "尚未关联本轮修复记录",
  653. "fixIds": [],
  654. "verification": "PASS"
  655. },
  656. {
  657. "id": "template.depot-1",
  658. "group": "全部可达场景模板",
  659. "name": "真实装备车库",
  660. "source": {
  661. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  662. "symbol": "id: 'depot-1'",
  663. "line": 86
  664. },
  665. "implementation": "本轮修复已完成验证",
  666. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  667. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  668. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  669. "fixIds": [
  670. "SCENE-F03"
  671. ],
  672. "verification": "PASS"
  673. },
  674. {
  675. "id": "template.terrain-1",
  676. "group": "全部可达场景模板",
  677. "name": "真实野外训练场",
  678. "source": {
  679. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  680. "symbol": "id: 'terrain-1'",
  681. "line": 87
  682. },
  683. "implementation": "本轮修复已完成验证",
  684. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  685. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  686. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  687. "fixIds": [
  688. "SCENE-F03"
  689. ],
  690. "verification": "PASS"
  691. },
  692. {
  693. "id": "template.workshop-1",
  694. "group": "全部可达场景模板",
  695. "name": "综合检验车间",
  696. "source": {
  697. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  698. "symbol": "id: 'workshop-1'",
  699. "line": 88
  700. },
  701. "implementation": "本轮修复已完成验证",
  702. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  703. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  704. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  705. "fixIds": [
  706. "SCENE-F03"
  707. ],
  708. "verification": "PASS"
  709. },
  710. {
  711. "id": "template.workshop-real",
  712. "group": "全部可达场景模板",
  713. "name": "演示维修车间(可拆分)",
  714. "source": {
  715. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  716. "symbol": "id: 'workshop-real'",
  717. "line": 89
  718. },
  719. "implementation": "本轮修复已完成验证",
  720. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  721. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  722. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  723. "fixIds": [
  724. "SCENE-F03"
  725. ],
  726. "verification": "PASS"
  727. },
  728. {
  729. "id": "template.workshop-2",
  730. "group": "全部可达场景模板",
  731. "name": "总成拆卸车间",
  732. "source": {
  733. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  734. "symbol": "id: 'workshop-2'",
  735. "line": 90
  736. },
  737. "implementation": "本轮修复已完成验证",
  738. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  739. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  740. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  741. "fixIds": [
  742. "SCENE-F03"
  743. ],
  744. "verification": "PASS"
  745. },
  746. {
  747. "id": "template.workshop-3",
  748. "group": "全部可达场景模板",
  749. "name": "部件分解车间",
  750. "source": {
  751. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  752. "symbol": "id: 'workshop-3'",
  753. "line": 91
  754. },
  755. "implementation": "本轮修复已完成验证",
  756. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  757. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  758. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  759. "fixIds": [
  760. "SCENE-F03"
  761. ],
  762. "verification": "PASS"
  763. },
  764. {
  765. "id": "template.workshop-4",
  766. "group": "全部可达场景模板",
  767. "name": "清洗检测车间",
  768. "source": {
  769. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  770. "symbol": "id: 'workshop-4'",
  771. "line": 92
  772. },
  773. "implementation": "本轮修复已完成验证",
  774. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  775. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  776. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  777. "fixIds": [
  778. "SCENE-F03"
  779. ],
  780. "verification": "PASS"
  781. },
  782. {
  783. "id": "template.workshop-5",
  784. "group": "全部可达场景模板",
  785. "name": "复装调试车间",
  786. "source": {
  787. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  788. "symbol": "id: 'workshop-5'",
  789. "line": 93
  790. },
  791. "implementation": "本轮修复已完成验证",
  792. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  793. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  794. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  795. "fixIds": [
  796. "SCENE-F03"
  797. ],
  798. "verification": "PASS"
  799. },
  800. {
  801. "id": "template.outdoor-1",
  802. "group": "全部可达场景模板",
  803. "name": "室外综合训练场",
  804. "source": {
  805. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  806. "symbol": "id: 'outdoor-1'",
  807. "line": 94
  808. },
  809. "implementation": "本轮修复已完成验证",
  810. "boundary": "模板场地与种子布局须有实际执行;切模板不是创建新的业务项目。",
  811. "acceptance": "独立副本点击模板、确认/取消未存操作、真实画面、保存重开 presetId/环境/对象一致。",
  812. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  813. "fixIds": [
  814. "SCENE-F03"
  815. ],
  816. "verification": "PASS"
  817. },
  818. {
  819. "id": "template.switch-cancel",
  820. "group": "全部可达场景模板",
  821. "name": "未保存模板切换取消",
  822. "source": {
  823. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  824. "symbol": "async loadPreset",
  825. "line": 765
  826. },
  827. "implementation": "本轮修复已完成验证",
  828. "boundary": "取消保留原场景、选择与 dirty;请求中不能切换半场景。",
  829. "acceptance": "有未存修改时取消/确认分别验证,取消零对象和服务端变更。",
  830. "fix": "模板按钮使用模板种子,不再次读当前项目旧文档;模板/JSON 替换先保存当前运行对象,等待全部加载结束,失败恢复原环境、对象、选择和 dirty;真实确认取消保留原稿。",
  831. "fixIds": [
  832. "SCENE-F03"
  833. ],
  834. "verification": "PASS"
  835. },
  836. {
  837. "id": "view.orbit",
  838. "group": "三维视口、选择与变换",
  839. "name": "鼠标旋转相机",
  840. "source": {
  841. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  842. "symbol": "new OrbitControls",
  843. "line": 379
  844. },
  845. "implementation": "已有实现已完成验证",
  846. "boundary": "相机轨道操作不应误选、拖动物体。",
  847. "acceptance": "实际鼠标拖动,相机变化且对象姿态不变。",
  848. "fix": "尚未关联本轮修复记录",
  849. "fixIds": [],
  850. "verification": "PASS"
  851. },
  852. {
  853. "id": "view.pan",
  854. "group": "三维视口、选择与变换",
  855. "name": "鼠标平移相机",
  856. "source": {
  857. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  858. "symbol": "new OrbitControls",
  859. "line": 379
  860. },
  861. "implementation": "已有实现已完成验证",
  862. "boundary": "轨道目标平移与物体位置分开。",
  863. "acceptance": "实际右键/约定鼠标平移,目标变化且对象数据不变。",
  864. "fix": "尚未关联本轮修复记录",
  865. "fixIds": [],
  866. "verification": "PASS"
  867. },
  868. {
  869. "id": "view.zoom",
  870. "group": "三维视口、选择与变换",
  871. "name": "滚轮缩放相机",
  872. "source": {
  873. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  874. "symbol": "new OrbitControls",
  875. "line": 379
  876. },
  877. "implementation": "已有实现已完成验证",
  878. "boundary": "改变观察距离,不改对象 scale。",
  879. "acceptance": "滚轮前后模型可见且对象 scale 不变。",
  880. "fix": "尚未关联本轮修复记录",
  881. "fixIds": [],
  882. "verification": "PASS"
  883. },
  884. {
  885. "id": "view.perspective",
  886. "group": "三维视口、选择与变换",
  887. "name": "透视按钮",
  888. "source": {
  889. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  890. "symbol": "data-camera=\"perspective\"",
  891. "line": 259
  892. },
  893. "implementation": "本轮修复已完成验证",
  894. "boundary": "基线按钮无处理分支;需明确恢复相机视角,不静默无效。",
  895. "acceptance": "顶视切回透视,实际相机位置与激活样式变化。",
  896. "fix": "透视按钮实际恢复先前观察位置;导入、加载和历史恢复存在已保存相机时不再被车辆自动聚焦覆盖。",
  897. "fixIds": [
  898. "SCENE-F04"
  899. ],
  900. "verification": "PASS"
  901. },
  902. {
  903. "id": "view.top",
  904. "group": "三维视口、选择与变换",
  905. "name": "顶视图按钮",
  906. "source": {
  907. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  908. "symbol": "setTopView()",
  909. "line": 585
  910. },
  911. "implementation": "本轮修复已完成验证",
  912. "boundary": "仍为透视相机顶视位置,不冒称正交投影。",
  913. "acceptance": "实际点击后顶视方向与目标一致。",
  914. "fix": "透视按钮实际恢复先前观察位置;导入、加载和历史恢复存在已保存相机时不再被车辆自动聚焦覆盖。",
  915. "fixIds": [
  916. "SCENE-F04"
  917. ],
  918. "verification": "PASS"
  919. },
  920. {
  921. "id": "view.focus",
  922. "group": "三维视口、选择与变换",
  923. "name": "聚焦选中对象",
  924. "source": {
  925. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  926. "symbol": "focusSelected()",
  927. "line": 586
  928. },
  929. "implementation": "已有实现已完成验证",
  930. "boundary": "按对象真实 bounds 调整相机;无选中应提示。",
  931. "acceptance": "狐狸/卡车/环境分别聚焦可见;无选中提示不异常。",
  932. "fix": "尚未关联本轮修复记录",
  933. "fixIds": [],
  934. "verification": "PASS"
  935. },
  936. {
  937. "id": "view.grid",
  938. "group": "三维视口、选择与变换",
  939. "name": "网格显隐",
  940. "source": {
  941. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  942. "symbol": "toggleGrid(button)",
  943. "line": 1643
  944. },
  945. "implementation": "已有实现已完成验证",
  946. "boundary": "当前视图辅助选项;不默认要求跨重开持久化。",
  947. "acceptance": "真实网格出现/消失、状态同步、截图封面不含网格。",
  948. "fix": "尚未关联本轮修复记录",
  949. "fixIds": [],
  950. "verification": "PASS"
  951. },
  952. {
  953. "id": "view.enclosure-full",
  954. "group": "三维视口、选择与变换",
  955. "name": "车库外壳完整显示",
  956. "source": {
  957. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/garage-enclosure.js",
  958. "symbol": "createGarageEnclosureControls",
  959. "line": 377
  960. },
  961. "implementation": "已有实现已完成验证",
  962. "boundary": "完整显示屋顶/墙体/玻璃;仅车库资源存在时出现控制。",
  963. "acceptance": "实际点击、对象材料和显示恢复,状态与画面一致。",
  964. "fix": "尚未关联本轮修复记录",
  965. "fixIds": [],
  966. "verification": "PASS"
  967. },
  968. {
  969. "id": "view.enclosure-xray",
  970. "group": "三维视口、选择与变换",
  971. "name": "车库外壳透明查看",
  972. "source": {
  973. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/garage-enclosure.js",
  974. "symbol": "createGarageEnclosureControls",
  975. "line": 377
  976. },
  977. "implementation": "已有实现已完成验证",
  978. "boundary": "车库多种围护材料联动;不等于普通相机透视。",
  979. "acceptance": "实际外壳透明且内部模型可辨,材质无串改。",
  980. "fix": "尚未关联本轮修复记录",
  981. "fixIds": [],
  982. "verification": "PASS"
  983. },
  984. {
  985. "id": "view.enclosure-hidden",
  986. "group": "三维视口、选择与变换",
  987. "name": "隐藏车库外壳",
  988. "source": {
  989. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/garage-enclosure.js",
  990. "symbol": "createGarageEnclosureControls",
  991. "line": 377
  992. },
  993. "implementation": "已有实现已完成验证",
  994. "boundary": "隐藏围护后保留内部及地面;序列化 enclosureMode 与 dirty 契约须核对。",
  995. "acceptance": "隐藏/还原、保存重开和只读浏览行为准确。",
  996. "fix": "尚未关联本轮修复记录",
  997. "fixIds": [],
  998. "verification": "PASS"
  999. },
  1000. {
  1001. "id": "selection.viewport",
  1002. "group": "三维视口、选择与变换",
  1003. "name": "点击视口选中根对象/部件",
  1004. "source": {
  1005. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1006. "symbol": "selectFromViewport(event)",
  1007. "line": 456
  1008. },
  1009. "implementation": "本轮修复已完成验证",
  1010. "boundary": "只命中真实可选择可见对象;拖相机超过阈值不误选。",
  1011. "acceptance": "真实像素点击目标、树/属性/高亮一致,点击空白清选择。",
  1012. "fix": "新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。",
  1013. "fixIds": [
  1014. "SCENE-F18"
  1015. ],
  1016. "verification": "PASS"
  1017. },
  1018. {
  1019. "id": "selection.tree",
  1020. "group": "三维视口、选择与变换",
  1021. "name": "大纲根对象与部件选中",
  1022. "source": {
  1023. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1024. "symbol": "const treeItem =",
  1025. "line": 546
  1026. },
  1027. "implementation": "本轮修复已完成验证",
  1028. "boundary": "大纲显示所有可编辑实例和部件;环境锁定提示不是折叠控件。",
  1029. "acceptance": "树选中与视口高亮/属性联动、筛选后仍可选。",
  1030. "fix": "新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。",
  1031. "fixIds": [
  1032. "SCENE-F18"
  1033. ],
  1034. "verification": "PASS"
  1035. },
  1036. {
  1037. "id": "selection.hidden",
  1038. "group": "三维视口、选择与变换",
  1039. "name": "隐藏祖先与软删除部件不可误拾取",
  1040. "source": {
  1041. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-selection.js",
  1042. "symbol": "chooseSceneSelection",
  1043. "line": 41
  1044. },
  1045. "implementation": "本轮修复已完成验证",
  1046. "boundary": "父隐藏/子隐藏/软删除状态不能被射线重新命中。",
  1047. "acceptance": "用重叠模型/部件实测,命中应落可见有效对象。",
  1048. "fix": "射线候选逐级检查父级可见性和软删除;删除根对象先恢复高亮材质再释放几何/材质,避免错误拾取及 GPU 资源残留。",
  1049. "fixIds": [
  1050. "SCENE-F09"
  1051. ],
  1052. "verification": "PASS"
  1053. },
  1054. {
  1055. "id": "selection.highlight",
  1056. "group": "三维视口、选择与变换",
  1057. "name": "选中高亮与恢复原材质",
  1058. "source": {
  1059. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1060. "symbol": "updateSelectionHighlight()",
  1061. "line": 627
  1062. },
  1063. "implementation": "本轮修复已完成验证",
  1064. "boundary": "高亮是暂态,不写入模型/场景材质,不进入封面。",
  1065. "acceptance": "切换对象/清选择/预览/保存截图后材质原值恢复。",
  1066. "fix": "射线候选逐级检查父级可见性和软删除;删除根对象先恢复高亮材质再释放几何/材质,避免错误拾取及 GPU 资源残留。",
  1067. "fixIds": [
  1068. "SCENE-F09"
  1069. ],
  1070. "verification": "PASS"
  1071. },
  1072. {
  1073. "id": "transform.translate",
  1074. "group": "三维视口、选择与变换",
  1075. "name": "移动工具及真实 XYZ 手柄",
  1076. "source": {
  1077. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1078. "symbol": "setTransform(mode)",
  1079. "line": 1627
  1080. },
  1081. "implementation": "已有实现已完成验证",
  1082. "boundary": "对象实例位置;部件按发布能力限制。",
  1083. "acceptance": "真实拖动平移手柄,属性联动、撤销重做、保存重开一致。",
  1084. "fix": "尚未关联本轮修复记录",
  1085. "fixIds": [],
  1086. "verification": "PASS"
  1087. },
  1088. {
  1089. "id": "transform.rotate",
  1090. "group": "三维视口、选择与变换",
  1091. "name": "旋转工具及真实旋转手柄",
  1092. "source": {
  1093. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1094. "symbol": "setTransform(mode)",
  1095. "line": 1627
  1096. },
  1097. "implementation": "已有实现已完成验证",
  1098. "boundary": "UI 度数与保存弧度转换;不能仅用脚本改姿态代替拖动。",
  1099. "acceptance": "实际旋转手柄改变姿态并重开一致。",
  1100. "fix": "尚未关联本轮修复记录",
  1101. "fixIds": [],
  1102. "verification": "PASS"
  1103. },
  1104. {
  1105. "id": "transform.scale",
  1106. "group": "三维视口、选择与变换",
  1107. "name": "缩放工具及真实缩放手柄",
  1108. "source": {
  1109. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1110. "symbol": "setTransform(mode)",
  1111. "line": 1627
  1112. },
  1113. "implementation": "本轮修复已完成验证",
  1114. "boundary": "归一化模型已有 scale 必须保留,负/零/小值合同明确。",
  1115. "acceptance": "真实缩放与属性数值一致;狐狸不突然放成超大或消失。",
  1116. "fix": "实际手柄跨越枢轴时按既有严格正尺度合同限制,避免产生负或零尺度导致模型翻转或消失;未新增镜像建模功能。",
  1117. "fixIds": [
  1118. "SCENE-F17"
  1119. ],
  1120. "verification": "PASS"
  1121. },
  1122. {
  1123. "id": "transform.keys",
  1124. "group": "三维视口、选择与变换",
  1125. "name": "W/E/R 快捷键",
  1126. "source": {
  1127. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1128. "symbol": "handleKeyboard(event)",
  1129. "line": 469
  1130. },
  1131. "implementation": "本轮修复已完成验证",
  1132. "boundary": "键盘焦点在表单时不切工具,失活缓存页不能抢键。",
  1133. "acceptance": "视口按键切工具;名称输入包含 w/e/r 正常;只读不改。",
  1134. "fix": "预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。",
  1135. "fixIds": [
  1136. "SCENE-F05"
  1137. ],
  1138. "verification": "PASS"
  1139. },
  1140. {
  1141. "id": "transform.snap",
  1142. "group": "三维视口、选择与变换",
  1143. "name": "吸附 0.5m 与旋转 15° 开关",
  1144. "source": {
  1145. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1146. "symbol": "toggleSnap()",
  1147. "line": 581
  1148. },
  1149. "implementation": "已有实现已完成验证",
  1150. "boundary": "开关同时控制拖放/变换吸附;当前视图工具参数与业务值区分。",
  1151. "acceptance": "开/关实际拖动位置、旋转角度,按钮/页脚状态一致。",
  1152. "fix": "尚未关联本轮修复记录",
  1153. "fixIds": [],
  1154. "verification": "PASS"
  1155. },
  1156. {
  1157. "id": "property.name",
  1158. "group": "对象属性、部件与底部面板",
  1159. "name": "显示名称",
  1160. "source": {
  1161. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1162. "symbol": "handleInput(event)",
  1163. "line": 437
  1164. },
  1165. "implementation": "本轮修复已完成验证",
  1166. "boundary": "对象/部件 displayName 与项目名称分开。",
  1167. "acceptance": "修改名称,树/对象条/属性同步,保存重开保留。",
  1168. "fix": "恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。",
  1169. "fixIds": [
  1170. "SCENE-F06"
  1171. ],
  1172. "verification": "PASS"
  1173. },
  1174. {
  1175. "id": "property.visible",
  1176. "group": "对象属性、部件与底部面板",
  1177. "name": "在场景中可见",
  1178. "source": {
  1179. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1180. "symbol": "handleChange(event)",
  1181. "line": 438
  1182. },
  1183. "implementation": "已有实现已完成验证",
  1184. "boundary": "实例显隐可保存;受保护蒙皮部件不得独立隐藏。",
  1185. "acceptance": "开/关可见性、恢复、保存重开,视口与树状态准确。",
  1186. "fix": "尚未关联本轮修复记录",
  1187. "fixIds": [],
  1188. "verification": "PASS"
  1189. },
  1190. {
  1191. "id": "property.operable",
  1192. "group": "对象属性、部件与底部面板",
  1193. "name": "可作为实训目标",
  1194. "source": {
  1195. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1196. "symbol": "handleChange(event)",
  1197. "line": 438
  1198. },
  1199. "implementation": "已有实现已完成验证",
  1200. "boundary": "operable/capabilities 进入场景定义;不能扩大平台操作权限。",
  1201. "acceptance": "开/关并保存重开,发布数据的目标能力一致。",
  1202. "fix": "尚未关联本轮修复记录",
  1203. "fixIds": [],
  1204. "verification": "PASS"
  1205. },
  1206. {
  1207. "id": "property.position",
  1208. "group": "对象属性、部件与底部面板",
  1209. "name": "位置 X/Y/Z 数值",
  1210. "source": {
  1211. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1212. "symbol": "handleInput(event)",
  1213. "line": 437
  1214. },
  1215. "implementation": "已有实现已完成验证",
  1216. "boundary": "三个输入回写局部 position;不使用纯展示假字段。",
  1217. "acceptance": "三个轴独立输入与手柄联动、失焦/history/重开准确。",
  1218. "fix": "尚未关联本轮修复记录",
  1219. "fixIds": [],
  1220. "verification": "PASS"
  1221. },
  1222. {
  1223. "id": "property.rotation",
  1224. "group": "对象属性、部件与底部面板",
  1225. "name": "旋转 X/Y/Z 数值",
  1226. "source": {
  1227. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1228. "symbol": "handleInput(event)",
  1229. "line": 437
  1230. },
  1231. "implementation": "已有实现已完成验证",
  1232. "boundary": "UI 为角度,文档为弧度。",
  1233. "acceptance": "非整角/负角输入、实际姿态与 JSON/重开一致。",
  1234. "fix": "尚未关联本轮修复记录",
  1235. "fixIds": [],
  1236. "verification": "PASS"
  1237. },
  1238. {
  1239. "id": "property.scale",
  1240. "group": "对象属性、部件与底部面板",
  1241. "name": "缩放 X/Y/Z 数值及有效值",
  1242. "source": {
  1243. "file": "../../../unreal_tran_web/src/features/scene-legacy/modelPlacement.ts",
  1244. "symbol": "parseSceneScale",
  1245. "line": 36
  1246. },
  1247. "implementation": "本轮修复已完成验证",
  1248. "boundary": "支持小数归一化 scale,避免小值格式化成零;非法值不得破坏模型。",
  1249. "acceptance": "小正数、负数/零/清空按合同处理,三轴保存往返正常。",
  1250. "fix": "实际手柄跨越枢轴时按既有严格正尺度合同限制,避免产生负或零尺度导致模型翻转或消失;未新增镜像建模功能。",
  1251. "fixIds": [
  1252. "SCENE-F17"
  1253. ],
  1254. "verification": "PASS"
  1255. },
  1256. {
  1257. "id": "property.device-id",
  1258. "group": "对象属性、部件与底部面板",
  1259. "name": "设备编号",
  1260. "source": {
  1261. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1262. "symbol": "handleInput(event)",
  1263. "line": 437
  1264. },
  1265. "implementation": "本轮修复已完成验证",
  1266. "boundary": "根对象绑定字符串;重复/空值由预检与后端核查。",
  1267. "acceptance": "修改后绑定表同步、保存重开,重复值能被阻断。",
  1268. "fix": "恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。",
  1269. "fixIds": [
  1270. "SCENE-F06"
  1271. ],
  1272. "verification": "PASS"
  1273. },
  1274. {
  1275. "id": "property.model-id",
  1276. "group": "对象属性、部件与底部面板",
  1277. "name": "物模型编号",
  1278. "source": {
  1279. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1280. "symbol": "handleInput(event)",
  1281. "line": 437
  1282. },
  1283. "implementation": "本轮修复已完成验证",
  1284. "boundary": "与受控 assetCode、来源项目 ID 分开。",
  1285. "acceptance": "修改后只改业务编号,源 GLB 仍加载正确。",
  1286. "fix": "恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。",
  1287. "fixIds": [
  1288. "SCENE-F06"
  1289. ],
  1290. "verification": "PASS"
  1291. },
  1292. {
  1293. "id": "property.semantic",
  1294. "group": "对象属性、部件与底部面板",
  1295. "name": "语义类型六个选项",
  1296. "source": {
  1297. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1298. "symbol": "handleChange(event)",
  1299. "line": 438
  1300. },
  1301. "implementation": "已有实现已完成验证",
  1302. "boundary": "实训装备/工位设施/安全区域/采集设备/训练人员/环境设施。",
  1303. "acceptance": "逐项可选且保存重开保留;绑定表显示实际类型。",
  1304. "fix": "尚未关联本轮修复记录",
  1305. "fixIds": [],
  1306. "verification": "PASS"
  1307. },
  1308. {
  1309. "id": "part.source",
  1310. "group": "对象属性、部件与底部面板",
  1311. "name": "模型来源与部件权限说明",
  1312. "source": {
  1313. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1314. "symbol": "renderInspector()",
  1315. "line": 1520
  1316. },
  1317. "implementation": "本轮修复已完成验证",
  1318. "boundary": "固定模型版本/源节点;蒙皮仅查看高亮,非骨骼独立变换。",
  1319. "acceptance": "狐狸蒙皮与卡车刚性部件说明/禁用态准确。",
  1320. "fix": "模型来源按钮有来源权限时导航正确项目;无来源页面权限回到可访问列表,不将模型列表误称为来源工程编辑。",
  1321. "fixIds": [
  1322. "SCENE-F11"
  1323. ],
  1324. "verification": "PASS"
  1325. },
  1326. {
  1327. "id": "part.transform",
  1328. "group": "对象属性、部件与底部面板",
  1329. "name": "刚性部件独立变换并保存覆盖",
  1330. "source": {
  1331. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1332. "symbol": "captureModelPartOverrides(root)",
  1333. "line": 1123
  1334. },
  1335. "implementation": "本轮修复已完成验证",
  1336. "boundary": "partOverrides 与稳定 interactionId;多个实例互不串改。",
  1337. "acceptance": "两卡车实例改单部件,保存重开另一实例不受影响。",
  1338. "fix": "新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。",
  1339. "fixIds": [
  1340. "SCENE-F18"
  1341. ],
  1342. "verification": "PASS"
  1343. },
  1344. {
  1345. "id": "part.soft-delete",
  1346. "group": "对象属性、部件与底部面板",
  1347. "name": "部件软删除与恢复",
  1348. "source": {
  1349. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1350. "symbol": "deleteSelected()",
  1351. "line": 588
  1352. },
  1353. "implementation": "本轮修复已完成验证",
  1354. "boundary": "被允许的部件 sceneDeleted/visible 持久化;可撤销恢复。",
  1355. "acceptance": "实际删除、撤销、保存重开均一致;蒙皮不允许破坏骨架。",
  1356. "fix": "新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。",
  1357. "fixIds": [
  1358. "SCENE-F18"
  1359. ],
  1360. "verification": "PASS"
  1361. },
  1362. {
  1363. "id": "object.delete",
  1364. "group": "对象属性、部件与底部面板",
  1365. "name": "删除根对象按钮 / Delete",
  1366. "source": {
  1367. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1368. "symbol": "deleteSelected()",
  1369. "line": 588
  1370. },
  1371. "implementation": "本轮修复已完成验证",
  1372. "boundary": "移除当前场景实例,不删除源模型项目/固定发布版本。",
  1373. "acceptance": "按钮和键盘各验证;源项目不变,撤销和重开正确。",
  1374. "fix": "射线候选逐级检查父级可见性和软删除;删除根对象先恢复高亮材质再释放几何/材质,避免错误拾取及 GPU 资源残留。",
  1375. "fixIds": [
  1376. "SCENE-F09"
  1377. ],
  1378. "verification": "PASS"
  1379. },
  1380. {
  1381. "id": "panel.objects",
  1382. "group": "对象属性、部件与底部面板",
  1383. "name": "底部对象列表与选中",
  1384. "source": {
  1385. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1386. "symbol": "renderBottom(mode",
  1387. "line": 1619
  1388. },
  1389. "implementation": "本轮修复已完成验证",
  1390. "boundary": "基线显示前 6 个摘要,完整对象仍在大纲;需明确截断。",
  1391. "acceptance": "大于 6 个对象时列表说明准确,摘要点击选择正确。",
  1392. "fix": "设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。",
  1393. "fixIds": [
  1394. "SCENE-F10"
  1395. ],
  1396. "verification": "PASS"
  1397. },
  1398. {
  1399. "id": "panel.binding",
  1400. "group": "对象属性、部件与底部面板",
  1401. "name": "设备绑定总表",
  1402. "source": {
  1403. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1404. "symbol": "renderBottom(mode",
  1405. "line": 1619
  1406. },
  1407. "implementation": "本轮修复已完成验证",
  1408. "boundary": "基线语义列恒写已绑定;需要真实类型/缺失/冲突反馈。",
  1409. "acceptance": "编辑字段即时同步,空/重复数据不得假标已绑定。",
  1410. "fix": "设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。",
  1411. "fixIds": [
  1412. "SCENE-F10"
  1413. ],
  1414. "verification": "PASS"
  1415. },
  1416. {
  1417. "id": "panel.validation",
  1418. "group": "对象属性、部件与底部面板",
  1419. "name": "底部发布检查面板",
  1420. "source": {
  1421. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1422. "symbol": "renderBottom(mode",
  1423. "line": 1619
  1424. },
  1425. "implementation": "本轮修复已完成验证",
  1426. "boundary": "显示当前逐项检查,不等于已发布。",
  1427. "acceptance": "顶部校验/发布失败可定位检查面板,内容随修改更新。",
  1428. "fix": "设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。",
  1429. "fixIds": [
  1430. "SCENE-F10"
  1431. ],
  1432. "verification": "PASS"
  1433. },
  1434. {
  1435. "id": "panel.logs",
  1436. "group": "对象属性、部件与底部面板",
  1437. "name": "操作日志",
  1438. "source": {
  1439. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1440. "symbol": "renderBottom(mode",
  1441. "line": 1619
  1442. },
  1443. "implementation": "本轮修复已完成验证",
  1444. "boundary": "基线为静态示例且误称本地存储;本轮只需真实本次运行日志,不扩展服务端审计。",
  1445. "acceptance": "实际操作产生对应时间/结果;API 模式不显示本地存储为真值。",
  1446. "fix": "设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。",
  1447. "fixIds": [
  1448. "SCENE-F10"
  1449. ],
  1450. "verification": "PASS"
  1451. },
  1452. {
  1453. "id": "history.undo",
  1454. "group": "历史与预览",
  1455. "name": "回退按钮 / Ctrl+Z",
  1456. "source": {
  1457. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1458. "symbol": "async undo()",
  1459. "line": 2417
  1460. },
  1461. "implementation": "本轮修复已完成验证",
  1462. "boundary": "输入连续修改合并成合理历史步;恢复对象/模板/选择。",
  1463. "acceptance": "属性、添加、删除、模板分别撤销,真实画面与文档一致。",
  1464. "fix": "透视按钮实际恢复先前观察位置;导入、加载和历史恢复存在已保存相机时不再被车辆自动聚焦覆盖。;预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。;文档签名忽略更新时间和对象键顺序;保存后的 undo/redo 根据真实已保存文档判断 dirty;异步恢复失败保留现场并回滚历史索引。",
  1465. "fixIds": [
  1466. "SCENE-F04",
  1467. "SCENE-F05",
  1468. "SCENE-F07"
  1469. ],
  1470. "verification": "PASS"
  1471. },
  1472. {
  1473. "id": "history.redo",
  1474. "group": "历史与预览",
  1475. "name": "前进按钮 / Ctrl+Y / Ctrl+Shift+Z",
  1476. "source": {
  1477. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1478. "symbol": "async redo()",
  1479. "line": 2437
  1480. },
  1481. "implementation": "本轮修复已完成验证",
  1482. "boundary": "撤销后重做,分叉编辑清 redo。",
  1483. "acceptance": "按钮与两种快捷键各执行;新编辑后旧 redo 不可用。",
  1484. "fix": "预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。;文档签名忽略更新时间和对象键顺序;保存后的 undo/redo 根据真实已保存文档判断 dirty;异步恢复失败保留现场并回滚历史索引。",
  1485. "fixIds": [
  1486. "SCENE-F05",
  1487. "SCENE-F07"
  1488. ],
  1489. "verification": "PASS"
  1490. },
  1491. {
  1492. "id": "history.capacity",
  1493. "group": "历史与预览",
  1494. "name": "60 步历史上限与边界",
  1495. "source": {
  1496. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1497. "symbol": "new SceneHistory(60)",
  1498. "line": 180
  1499. },
  1500. "implementation": "已有实现已完成验证",
  1501. "boundary": "历史属于本次编辑会话;不宣称服务端版本历史。",
  1502. "acceptance": "聚焦测试验证 60 步边界、空 undo/redo 与失焦快照。",
  1503. "fix": "尚未关联本轮修复记录",
  1504. "fixIds": [],
  1505. "verification": "PASS"
  1506. },
  1507. {
  1508. "id": "history.failure",
  1509. "group": "历史与预览",
  1510. "name": "异步历史恢复失败/互斥",
  1511. "source": {
  1512. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1513. "symbol": "async restoreHistoryState",
  1514. "line": 2328
  1515. },
  1516. "implementation": "本轮修复已完成验证",
  1517. "boundary": "失败不能推进索引或丢当前有效场景;忙碌时写操作需一致。",
  1518. "acceptance": "GLB 恢复失败、并发 undo/redo、保存混入均不半提交。",
  1519. "fix": "文档签名忽略更新时间和对象键顺序;保存后的 undo/redo 根据真实已保存文档判断 dirty;异步恢复失败保留现场并回滚历史索引。",
  1520. "fixIds": [
  1521. "SCENE-F07"
  1522. ],
  1523. "verification": "PASS"
  1524. },
  1525. {
  1526. "id": "preview.enter",
  1527. "group": "历史与预览",
  1528. "name": "进入运行预览",
  1529. "source": {
  1530. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1531. "symbol": "togglePreview()",
  1532. "line": 583
  1533. },
  1534. "implementation": "本轮修复已完成验证",
  1535. "boundary": "当前默认预览只展示场景,未接模型 timeline/blueprint 自动执行。",
  1536. "acceptance": "实际进入,辅助选择/手柄状态正常,模型可见。",
  1537. "fix": "预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。",
  1538. "fixIds": [
  1539. "SCENE-F05"
  1540. ],
  1541. "verification": "PASS"
  1542. },
  1543. {
  1544. "id": "preview.exit",
  1545. "group": "历史与预览",
  1546. "name": "按钮 / Escape 退出预览",
  1547. "source": {
  1548. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1549. "symbol": "handleKeyboard(event)",
  1550. "line": 469
  1551. },
  1552. "implementation": "本轮修复已完成验证",
  1553. "boundary": "退出后恢复编辑选择与状态;不得丢未存变换。",
  1554. "acceptance": "两种退出方式均有效,输入焦点与缓存激活行为正确。",
  1555. "fix": "预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。",
  1556. "fixIds": [
  1557. "SCENE-F05"
  1558. ],
  1559. "verification": "PASS"
  1560. },
  1561. {
  1562. "id": "preview.lock",
  1563. "group": "历史与预览",
  1564. "name": "预览中禁止编辑",
  1565. "source": {
  1566. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1567. "symbol": "togglePreview()",
  1568. "line": 583
  1569. },
  1570. "implementation": "本轮修复已完成验证",
  1571. "boundary": "显示“场景编辑锁定”必须覆盖属性、删除、模板、导入和快捷键。",
  1572. "acceptance": "尝试所有写入口,预览时文档不改变;退出后正常。",
  1573. "fix": "预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。",
  1574. "fixIds": [
  1575. "SCENE-F05"
  1576. ],
  1577. "verification": "PASS"
  1578. },
  1579. {
  1580. "id": "cover.capture",
  1581. "group": "保存封面、发布与依赖",
  1582. "name": "保存时截取当前三维场景封面",
  1583. "source": {
  1584. "file": "../../../unreal_tran_web/src/features/scene-legacy/sceneCoverCapture.ts",
  1585. "symbol": "export async function captureSceneCover",
  1586. "line": 26
  1587. },
  1588. "implementation": "已有实现已完成验证",
  1589. "boundary": "JPEG 最大边 640、当前相机;隐藏手柄/网格/高亮且恢复现场。",
  1590. "acceptance": "截图与服务端图片可辨一致,像素实际有模型,UI 状态不被破坏。",
  1591. "fix": "尚未关联本轮修复记录",
  1592. "fixIds": [],
  1593. "verification": "PASS"
  1594. },
  1595. {
  1596. "id": "cover.atomic",
  1597. "group": "保存封面、发布与依赖",
  1598. "name": "封面资产与文档同次保存",
  1599. "source": {
  1600. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  1601. "symbol": "saveSceneDocumentWithCover",
  1602. "line": 47
  1603. },
  1604. "implementation": "已有实现已完成验证",
  1605. "boundary": "封面 upload ticket 与 version 同一次 PUT 消费,不另存过期文档。",
  1606. "acceptance": "检查资产/封面字段/当前版本相同,并真实列表加载图片。",
  1607. "fix": "尚未关联本轮修复记录",
  1608. "fixIds": [],
  1609. "verification": "PASS"
  1610. },
  1611. {
  1612. "id": "cover.failure",
  1613. "group": "保存封面、发布与依赖",
  1614. "name": "截图/封面上传失败保留原封面",
  1615. "source": {
  1616. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  1617. "symbol": "coverFailed",
  1618. "line": 390
  1619. },
  1620. "implementation": "已有实现已完成验证",
  1621. "boundary": "正文可保存时给真实 warning;409 必须阻断且不得覆盖。",
  1622. "acceptance": "截图失败、上传503、PUT409各自核对保留/提示/零错误发布。",
  1623. "fix": "尚未关联本轮修复记录",
  1624. "fixIds": [],
  1625. "verification": "PASS"
  1626. },
  1627. {
  1628. "id": "validation.complete",
  1629. "group": "保存封面、发布与依赖",
  1630. "name": "环境、对象用途、模型加载检查",
  1631. "source": {
  1632. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1633. "symbol": "verifyScene(showToast",
  1634. "line": 1715
  1635. },
  1636. "implementation": "已有实现已完成验证",
  1637. "boundary": "纯环境允许;模型未完成解析必须阻断。",
  1638. "acceptance": "空地板/纯环境/带模型和加载中分别核对检查结果。",
  1639. "fix": "尚未关联本轮修复记录",
  1640. "fixIds": [],
  1641. "verification": "PASS"
  1642. },
  1643. {
  1644. "id": "validation.bindings",
  1645. "group": "保存封面、发布与依赖",
  1646. "name": "设备/物模型编号完整与唯一",
  1647. "source": {
  1648. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1649. "symbol": "verifyScene(showToast",
  1650. "line": 1715
  1651. },
  1652. "implementation": "本轮修复已完成验证",
  1653. "boundary": "空白、重复编号按前后端合同处理,不自动替用户分配新业务身份。",
  1654. "acceptance": "空、空格、重复与合法编号;错误项可见,发布被阻断。",
  1655. "fix": "恢复显示名、设备和物模型编号使用空值保留规则,不把显式空串补回旧值;新资源序号跳过既有编号,空白编号校验按 trim 处理。;设备绑定显示真实语义与未设置;校验按钮进入当前检查面板并随绑定变更刷新;日志记录本次运行实际操作,错误详情保持瞬时提示;摘要超过六项明确完整列表位置。",
  1656. "fixIds": [
  1657. "SCENE-F06",
  1658. "SCENE-F10"
  1659. ],
  1660. "verification": "PASS"
  1661. },
  1662. {
  1663. "id": "validation.references",
  1664. "group": "保存封面、发布与依赖",
  1665. "name": "受控资源引用完整性",
  1666. "source": {
  1667. "file": "../../../unreal_tran_web/src/features/scene-legacy/serverAssetStore.ts",
  1668. "symbol": "hasReferenceSync",
  1669. "line": 18
  1670. },
  1671. "implementation": "本轮修复已完成验证",
  1672. "boundary": "project/version/assetCode/sourceAssetId 必须指向实际固定资产,不能只测有字段。",
  1673. "acceptance": "不存在编码/错误资产类型/跨项目引用显式拒绝;正确依赖通过。",
  1674. "fix": "前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。;新增 SceneResourceReferenceValidator 检查 objects 和递归 splitParts;自有/固定版本资源的所有显式引用必须指向同一 READY 模型文件,错误引用在发布/提交前阻断,保留受控的内置资源和旧引用兼容。",
  1675. "fixIds": [
  1676. "SCENE-F12",
  1677. "SCENE-F13"
  1678. ],
  1679. "verification": "PASS"
  1680. },
  1681. {
  1682. "id": "publish.saved",
  1683. "group": "保存封面、发布与依赖",
  1684. "name": "发布场景按钮的真实 API 闭环",
  1685. "source": {
  1686. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1687. "symbol": "async publishScene()",
  1688. "line": 2213
  1689. },
  1690. "implementation": "已有实现已完成验证",
  1691. "boundary": "有编辑权时先保存含封面再发布;两步均成功才显示已发布。",
  1692. "acceptance": "POST 真正发布当前版本,列表状态与下游目录一致。",
  1693. "fix": "尚未关联本轮修复记录",
  1694. "fixIds": [],
  1695. "verification": "PASS"
  1696. },
  1697. {
  1698. "id": "publish.only",
  1699. "group": "保存封面、发布与依赖",
  1700. "name": "只有发布权限时发布已存版本",
  1701. "source": {
  1702. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1703. "symbol": "if (this.readOnly)",
  1704. "line": 335
  1705. },
  1706. "implementation": "已有实现已完成验证",
  1707. "boundary": "publish-only 不先 PUT、不上传封面、不要求 update;服务器校验真值。",
  1708. "acceptance": "隔离权限会话发布已存有效版本,零 update/upload 请求。",
  1709. "fix": "尚未关联本轮修复记录",
  1710. "fixIds": [],
  1711. "verification": "PASS"
  1712. },
  1713. {
  1714. "id": "publish.failure",
  1715. "group": "保存封面、发布与依赖",
  1716. "name": "预检/保存/发布失败阻断",
  1717. "source": {
  1718. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1719. "symbol": "async publishScene()",
  1720. "line": 2213
  1721. },
  1722. "implementation": "本轮修复已完成验证",
  1723. "boundary": "保存失败不 POST 发布;发布失败不假标已发布;保持错误恢复能力。",
  1724. "acceptance": "预检错误、PUT409/503、POST失败及重试,版本/状态准确。",
  1725. "fix": "新增 SceneResourceReferenceValidator 检查 objects 和递归 splitParts;自有/固定版本资源的所有显式引用必须指向同一 READY 模型文件,错误引用在发布/提交前阻断,保留受控的内置资源和旧引用兼容。",
  1726. "fixIds": [
  1727. "SCENE-F13"
  1728. ],
  1729. "verification": "PASS"
  1730. },
  1731. {
  1732. "id": "publish.concurrent",
  1733. "group": "保存封面、发布与依赖",
  1734. "name": "重复发布与上传/保存队列",
  1735. "source": {
  1736. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  1737. "symbol": "publishDocument:",
  1738. "line": 509
  1739. },
  1740. "implementation": "已有实现已完成验证",
  1741. "boundary": "整条 POST 完成前仍占 FIFO;重复操作不串版本。",
  1742. "acceptance": "延迟上传/保存/发布并触发竞争,服务端只有完整合法版本。",
  1743. "fix": "尚未关联本轮修复记录",
  1744. "fixIds": [],
  1745. "verification": "PASS"
  1746. },
  1747. {
  1748. "id": "publish.fixed-model",
  1749. "group": "保存封面、发布与依赖",
  1750. "name": "固定 SCENE_MODEL 版本与多个实例",
  1751. "source": {
  1752. "file": "../../../unreal_tran_web/src/features/scene-legacy/contentApiClient.ts",
  1753. "symbol": "collectSceneModelDependencies",
  1754. "line": 938
  1755. },
  1756. "implementation": "本轮修复已完成验证",
  1757. "boundary": "去重精确模型版本,不能随模型新发布静默换源版本。",
  1758. "acceptance": "同模型多实例及另模型新版本,场景重开仍使用所存固定版本。",
  1759. "fix": "前端目录和资源解析同时匹配指定项目、版本、code、id、URI、READY MODEL_FILE;错误引用不回退首文件或本地缓存。仅含 sourceAssetId/assetId 的本项目资源也必须将 ID 纳入缓存/去重键,防止已缓存有效引用掩盖另一个错误ID;失败请求缓存可重试。复制场景保留旧伪 URI 但只读取当前副本资产。;新增 SceneResourceReferenceValidator 检查 objects 和递归 splitParts;自有/固定版本资源的所有显式引用必须指向同一 READY 模型文件,错误引用在发布/提交前阻断,保留受控的内置资源和旧引用兼容。;完整 PUT 回写原有相同 SCENE_MODEL 三元组时沿用场景授权边界;新增或改版依赖仍要求来源模型可见及范围权限,不扩大模型页面访问权。;新实例部件 sceneId 包含所属根对象身份,不再直接复用来源模型部件 ID;源 interaction/editor 标识保留。旧单实例 ID 保留,旧文档重复 ID 仅按文档顺序迁移后续冲突实例并同步 override。第二完整轮进一步发现 GLB 并发完成顺序会改变根对象顺序;现等待 allSettled 成功后按原文档顺序排列恢复根对象,拆分模板返回数组内部顺序和既有对象均保留,同源两实例不再随网速互换列表位置。新增延迟 30/1/10ms 乱序加载合同,验证序列化仍按文档顺序;最终浏览器验证独立记录。",
  1760. "fixIds": [
  1761. "SCENE-F12",
  1762. "SCENE-F13",
  1763. "SCENE-F14",
  1764. "SCENE-F18"
  1765. ],
  1766. "verification": "PASS"
  1767. },
  1768. {
  1769. "id": "publish.downstream",
  1770. "group": "保存封面、发布与依赖",
  1771. "name": "发布场景供训练选择和静态还原",
  1772. "source": {
  1773. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1774. "symbol": "场景已发布,训练编排可以引用",
  1775. "line": 2227
  1776. },
  1777. "implementation": "已有实现已完成验证",
  1778. "boundary": "本轮只验证版本/目标/静态可见性;不承诺模型蓝图或原生动画自动执行。",
  1779. "acceptance": "新场景出现在正式训练目录,绑定后狐狸/卡车可见且目标身份一致。",
  1780. "fix": "尚未关联本轮修复记录",
  1781. "fixIds": [],
  1782. "verification": "PASS"
  1783. },
  1784. {
  1785. "id": "permission.update",
  1786. "group": "权限、缓存与未保存恢复",
  1787. "name": "场景细分编辑权限",
  1788. "source": {
  1789. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1790. "symbol": "this.readOnly =",
  1791. "line": 149
  1792. },
  1793. "implementation": "本轮修复已完成验证",
  1794. "boundary": "只按 content.scene.update;基线残留 content.update 需修,不由角色名推断。",
  1795. "acceptance": "具更新权会话可编辑;无更新权的写入口和接口全部拒绝。",
  1796. "fix": "移除 runtime 旧 content.update 门槛,独立计算新建、更新和发布;无模型页面权限时不加载新模型目录,但既有固定依赖仍可按场景授权读取。;完整 PUT 回写原有相同 SCENE_MODEL 三元组时沿用场景授权边界;新增或改版依赖仍要求来源模型可见及范围权限,不扩大模型页面访问权。",
  1797. "fixIds": [
  1798. "SCENE-F01",
  1799. "SCENE-F14"
  1800. ],
  1801. "verification": "PASS"
  1802. },
  1803. {
  1804. "id": "permission.publish",
  1805. "group": "权限、缓存与未保存恢复",
  1806. "name": "场景细分发布权限",
  1807. "source": {
  1808. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1809. "symbol": "this.canPublish =",
  1810. "line": 152
  1811. },
  1812. "implementation": "本轮修复已完成验证",
  1813. "boundary": "页面 content.scene 与 publish 动作分开;更新权不隐含发布。",
  1814. "acceptance": "只更新不能发布;仅发布可发布已存版本;无页面权不可访问。",
  1815. "fix": "移除 runtime 旧 content.update 门槛,独立计算新建、更新和发布;无模型页面权限时不加载新模型目录,但既有固定依赖仍可按场景授权读取。",
  1816. "fixIds": [
  1817. "SCENE-F01"
  1818. ],
  1819. "verification": "PASS"
  1820. },
  1821. {
  1822. "id": "permission.readonly",
  1823. "group": "权限、缓存与未保存恢复",
  1824. "name": "只读仍可查看、搜索、选中和预览",
  1825. "source": {
  1826. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1827. "symbol": "applyAccessMode()",
  1828. "line": 198
  1829. },
  1830. "implementation": "本轮修复已完成验证",
  1831. "boundary": "禁写不应误禁观察控件;临时视图不保存到服务器。",
  1832. "acceptance": "真实键盘搜索、选择、相机、预览,零内容写请求。",
  1833. "fix": "移除 runtime 旧 content.update 门槛,独立计算新建、更新和发布;无模型页面权限时不加载新模型目录,但既有固定依赖仍可按场景授权读取。",
  1834. "fixIds": [
  1835. "SCENE-F01"
  1836. ],
  1837. "verification": "PASS"
  1838. },
  1839. {
  1840. "id": "recovery.autobuffer",
  1841. "group": "权限、缓存与未保存恢复",
  1842. "name": "800ms 未保存恢复缓冲",
  1843. "source": {
  1844. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  1845. "symbol": "markDirty(label",
  1846. "line": 654
  1847. },
  1848. "implementation": "本轮修复已完成验证",
  1849. "boundary": "仅写隔离浏览器恢复稿,不伪称自动入库。",
  1850. "acceptance": "实际修改后等待,恢复稿存在但无自动 PUT;手动保存后入库。",
  1851. "fix": "顶部新建委托宿主命名与创建 API,先确认未保存内容。选择放弃也要等创建及导航成功后才清除原 dirty/恢复稿;创建503仍保留原稿。成功后刷新原缓存页,避免再次打开时将已放弃修改冒称已保存。取消、失败不清原场景,成功导航到新项目 ID,并有创建并发守卫。;开始保存时取消之前安排的恢复稿定时器,避免它覆盖宿主保存快照 nonce;保存中的后续编辑仍单独保留。",
  1852. "fixIds": [
  1853. "SCENE-F02",
  1854. "SCENE-F08"
  1855. ],
  1856. "verification": "PASS"
  1857. },
  1858. {
  1859. "id": "recovery.same-version",
  1860. "group": "权限、缓存与未保存恢复",
  1861. "name": "同版本真实未保存恢复",
  1862. "source": {
  1863. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  1864. "symbol": "sceneRecoveryMatchesProjectVersion",
  1865. "line": 46
  1866. },
  1867. "implementation": "本轮修复已完成验证",
  1868. "boundary": "先回到视口,须显式保存才入库;相同文档不应产生假恢复。",
  1869. "acceptance": "真实修改后刷新,恢复/保存/再刷新;无注入假 localStorage 代替。",
  1870. "fix": "文档签名忽略更新时间和对象键顺序;保存后的 undo/redo 根据真实已保存文档判断 dirty;异步恢复失败保留现场并回滚历史索引。;开始保存时取消之前安排的恢复稿定时器,避免它覆盖宿主保存快照 nonce;保存中的后续编辑仍单独保留。",
  1871. "fixIds": [
  1872. "SCENE-F07",
  1873. "SCENE-F08"
  1874. ],
  1875. "verification": "PASS"
  1876. },
  1877. {
  1878. "id": "recovery.stale-version",
  1879. "group": "权限、缓存与未保存恢复",
  1880. "name": "不同版本恢复稿隔离",
  1881. "source": {
  1882. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  1883. "symbol": "sceneRecoveryMatchesProjectVersion",
  1884. "line": 46
  1885. },
  1886. "implementation": "已有实现已完成验证",
  1887. "boundary": "旧稿不能自动覆盖新服务器版本;下载供人工合并。",
  1888. "acceptance": "另一会话先保存,新会话面对旧稿只能下载/隔离/明确丢弃。",
  1889. "fix": "尚未关联本轮修复记录",
  1890. "fixIds": [],
  1891. "verification": "PASS"
  1892. },
  1893. {
  1894. "id": "recovery.discard",
  1895. "group": "权限、缓存与未保存恢复",
  1896. "name": "下载、保留、丢弃恢复稿",
  1897. "source": {
  1898. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  1899. "symbol": "async function quarantineRecovery",
  1900. "line": 223
  1901. },
  1902. "implementation": "已有实现已完成验证",
  1903. "boundary": "关闭/Escape 不算明确丢弃;他会话新写入稿不得被误删。",
  1904. "acceptance": "按钮逐项核对本地隔离键、下载文件与服务器无意外写入。",
  1905. "fix": "尚未关联本轮修复记录",
  1906. "fixIds": [],
  1907. "verification": "PASS"
  1908. },
  1909. {
  1910. "id": "recovery.multi-session",
  1911. "group": "权限、缓存与未保存恢复",
  1912. "name": "多标签/多会话恢复所有权",
  1913. "source": {
  1914. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  1915. "symbol": "recoveryStoragePrefix",
  1916. "line": 104
  1917. },
  1918. "implementation": "已有实现已完成验证",
  1919. "boundary": "会话键/nonce/锁避免覆盖别的未存稿;本地缓冲不冒充权限。",
  1920. "acceptance": "两个编辑会话产生不同草稿,保存/丢弃一份不删另一份。",
  1921. "fix": "尚未关联本轮修复记录",
  1922. "fixIds": [],
  1923. "verification": "PASS"
  1924. },
  1925. {
  1926. "id": "leave.cancel",
  1927. "group": "权限、缓存与未保存恢复",
  1928. "name": "关闭场景标签时取消离开",
  1929. "source": {
  1930. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  1931. "symbol": "async function confirmLeave",
  1932. "line": 704
  1933. },
  1934. "implementation": "本轮修复已完成验证",
  1935. "boundary": "关闭确认保留当前 dirty 与恢复副本;返回列表或切普通标签不应提示。",
  1936. "acceptance": "真实关闭确认的关闭/Escape、继续编辑,数据未丢;不把返回列表当关闭。",
  1937. "fix": "关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。",
  1938. "fixIds": [
  1939. "SCENE-F16"
  1940. ],
  1941. "verification": "PASS"
  1942. },
  1943. {
  1944. "id": "leave.save",
  1945. "group": "权限、缓存与未保存恢复",
  1946. "name": "保存并离开 / 放弃修改",
  1947. "source": {
  1948. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  1949. "symbol": "async function confirmLeave",
  1950. "line": 704
  1951. },
  1952. "implementation": "本轮修复已完成验证",
  1953. "boundary": "等待保存完成并确认最终 dirty;明确放弃只影响当前工程会话。",
  1954. "acceptance": "保存成功才离开;503/409留原页;放弃按确认执行。",
  1955. "fix": "关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。",
  1956. "fixIds": [
  1957. "SCENE-F16"
  1958. ],
  1959. "verification": "PASS"
  1960. },
  1961. {
  1962. "id": "leave.busy",
  1963. "group": "权限、缓存与未保存恢复",
  1964. "name": "加载/上传/发布途中离开",
  1965. "source": {
  1966. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  1967. "symbol": "const resourcesBusy =",
  1968. "line": 708
  1969. },
  1970. "implementation": "已有实现已完成验证",
  1971. "boundary": "资源未就绪阻止离开;进行中的保存/发布须等待最终结果。",
  1972. "acceptance": "延迟资源与提交各验证取消/等待,旧请求不污染新项目。",
  1973. "fix": "尚未关联本轮修复记录",
  1974. "fixIds": [],
  1975. "verification": "PASS"
  1976. },
  1977. {
  1978. "id": "leave.role-switch",
  1979. "group": "权限、缓存与未保存恢复",
  1980. "name": "角色切换覆盖后台场景未存稿",
  1981. "source": {
  1982. "file": "../../../unreal_tran_web/src/views/content/LegacyScenePageView.vue",
  1983. "symbol": "registerWorkspaceLeaveGuard",
  1984. "line": 2
  1985. },
  1986. "implementation": "本轮修复已完成验证",
  1987. "boundary": "全体守卫确认后才切角色;后一页取消不能抹掉前页 dirty。",
  1988. "acceptance": "含后台场景的切角色确认取消/保存失败/成功后权限重建。",
  1989. "fix": "关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。",
  1990. "fixIds": [
  1991. "SCENE-F16"
  1992. ],
  1993. "verification": "PASS"
  1994. },
  1995. {
  1996. "id": "lifecycle.cache",
  1997. "group": "权限、缓存与未保存恢复",
  1998. "name": "标签失活 pause / 激活 resume",
  1999. "source": {
  2000. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2001. "symbol": "pause()",
  2002. "line": 523
  2003. },
  2004. "implementation": "本轮修复已完成验证",
  2005. "boundary": "停止后台 RAF、恢复时重算视口;后台实例不能抢当前页键盘。",
  2006. "acceptance": "两场景标签切换、选择和未存值保留、后台无写/快捷键误动作。",
  2007. "fix": "顶部新建委托宿主命名与创建 API,先确认未保存内容。选择放弃也要等创建及导航成功后才清除原 dirty/恢复稿;创建503仍保留原稿。成功后刷新原缓存页,避免再次打开时将已放弃修改冒称已保存。取消、失败不清原场景,成功导航到新项目 ID,并有创建并发守卫。;预览状态同步全部操作禁用,Delete/W/E/R 和表单输入遵守预览/权限;失活缓存页忽略全局快捷键,输入框撤销保持文本语义。;关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。",
  2008. "fixIds": [
  2009. "SCENE-F02",
  2010. "SCENE-F05",
  2011. "SCENE-F16"
  2012. ],
  2013. "verification": "PASS"
  2014. },
  2015. {
  2016. "id": "lifecycle.destroy",
  2017. "group": "权限、缓存与未保存恢复",
  2018. "name": "关闭释放 WebGL/监听/资源",
  2019. "source": {
  2020. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2021. "symbol": "destroy()",
  2022. "line": 421
  2023. },
  2024. "implementation": "本轮修复已完成验证",
  2025. "boundary": "销毁后的异步回调无 DOM 写入,无残留全局事件和资产 URL。",
  2026. "acceptance": "反复打开/关闭、加载中关闭边界,控制台无异常/泄漏事件。",
  2027. "fix": "射线候选逐级检查父级可见性和软删除;删除根对象先恢复高亮材质再释放几何/材质,避免错误拾取及 GPU 资源残留。;关闭单个或批量场景标签先按目标调用缓存守卫;取消或后续保存失败不提交此前放弃决定,全部确认后才关闭并清理。返回列表仍保留缓存,不扩展为强制关闭。",
  2028. "fixIds": [
  2029. "SCENE-F09",
  2030. "SCENE-F16"
  2031. ],
  2032. "verification": "PASS"
  2033. },
  2034. {
  2035. "id": "lifecycle.resize-theme",
  2036. "group": "权限、缓存与未保存恢复",
  2037. "name": "桌面尺寸与明亮/暗黑可读性",
  2038. "source": {
  2039. "file": "../../../unreal_tran_web/src/features/guide-legacy/demo-src/scene-editor.js",
  2040. "symbol": "resize()",
  2041. "line": 414
  2042. },
  2043. "implementation": "本轮修复已完成验证",
  2044. "boundary": "继承正式主题;所有可达控件可读、无截断遮挡。",
  2045. "acceptance": "1920/1440 下工具栏、属性、模板与弹窗截图,主题切换无低对比。",
  2046. "fix": "原型 CSS 全局重置收敛到场景作用域,降低按钮重置优先级;侧栏、输入、模板、属性和摘要使用正式主题变量,修复白字白底;修复 1440 宽时长工具栏/画布撑开网格覆盖属性栏。",
  2047. "fixIds": [
  2048. "SCENE-F15"
  2049. ],
  2050. "verification": "PASS"
  2051. }
  2052. ]