{ "generatedAt": "2026-09-06T10:30:32.992Z", "status": "PENDING", "scope": "只读解析当前spec与明确unit计划;不执行测试,不推断最终PASS。", "count": { "total": 119, "withBrowserPlan": 112, "onlyUnitPlan": 7, "unmapped": 0 }, "unknownIds": [], "gaps": [], "features": [ { "id": "project.load", "name": "按真实项目 ID 打开已存场景", "group": "工程入口与顶部命令", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "successful parallel restores retain document order after delayed GLBs and split-object batches finish out of order", "featureIds": [ "project.load", "selection.tree" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "project.retry", "name": "项目或挂载加载失败后重新加载", "group": "工程入口与顶部命令", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-async-closure.spec.ts", "line": 27, "evidenceName": "loading-retry", "testTitle": "加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载", "kind": "browser", "featureIds": [ "project.retry", "glb.pending", "leave.busy" ], "scope": "GET503只留中性失败和重试;延迟受控下载时禁用写入/导出/预览并阻止关闭,释放后真实狐狸加载。" }, { "file": "tools/scene-closure-assets.test.mjs", "testTitle": "a failed fixed-version lookup is evicted and the same reference can be retried", "featureIds": [ "project.retry" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "project.title", "name": "当前场景名称与项目说明按钮", "group": "工程入口与顶部命令", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" } ] }, { "id": "project.new", "name": "顶部新建独立工程", "group": "工程入口与顶部命令", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 166, "evidenceName": "new-project", "testTitle": "新建独立场景:取消、失败、保护原工程以及成功新 ID", "kind": "browser", "featureIds": [ "project.new" ], "scope": "取消命名、创建503保留原工程、创建成功新ID、保存刷新与原工程内容核对。" } ] }, { "id": "project.back", "name": "返回场景制作列表并保留场景标签", "group": "工程入口与顶部命令", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 153, "evidenceName": "publish-fixed-version", "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用", "kind": "browser", "featureIds": [ "validation.complete", "validation.bindings", "panel.validation", "publish.saved", "publish.failure", "publish.fixed-model", "cover.atomic", "project.back" ], "scope": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。" } ] }, { "id": "project.save", "name": "保存草稿按钮", "group": "工程入口与顶部命令", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-async-closure.spec.ts", "line": 50, "evidenceName": "save-concurrency", "testTitle": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突", "kind": "browser", "featureIds": [ "project.concurrent-save", "project.save", "project.save-key", "recovery.autobuffer", "recovery.same-version" ], "scope": "延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。" }, { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 305, "evidenceName": "scene-multi-session", "testTitle": "双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿", "kind": "browser", "featureIds": [ "recovery.multi-session", "recovery.autobuffer", "recovery.discard", "project.save" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" } ] }, { "id": "project.save-key", "name": "Ctrl/Meta+S 保存快捷键", "group": "工程入口与顶部命令", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-async-closure.spec.ts", "line": 50, "evidenceName": "save-concurrency", "testTitle": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突", "kind": "browser", "featureIds": [ "project.concurrent-save", "project.save", "project.save-key", "recovery.autobuffer", "recovery.same-version" ], "scope": "延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。" }, { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 121, "evidenceName": "truck-part-history", "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致", "kind": "browser", "featureIds": [ "project.save-key", "part.transform", "part.soft-delete", "history.undo", "history.redo", "property.name", "view.enclosure-full", "view.enclosure-xray", "view.enclosure-hidden" ], "scope": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。" } ] }, { "id": "project.save-failure", "name": "保存失败保留修改和恢复稿", "group": "工程入口与顶部命令", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 85, "evidenceName": "save-cover-failure", "testTitle": "保存失败与封面降级:503 保留草稿,封面上传失败保留旧图,恢复后可重试", "kind": "browser", "featureIds": [ "project.save-failure", "cover.failure" ], "scope": "正文PUT503不清草稿;封面上传503保留旧图但正文可保存;恢复服务后保存刷新。截图异常和409另由聚焦合同验证。" } ] }, { "id": "project.conflict", "name": "409 乐观锁冲突保护", "group": "工程入口与顶部命令", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 117, "evidenceName": "real-recovery-conflict", "testTitle": "同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载", "kind": "browser", "featureIds": [ "project.conflict", "recovery.autobuffer", "recovery.same-version", "recovery.stale-version" ], "scope": "真实未存输入产生恢复稿,同版本恢复不自动入库;另一版本先保存后409拒绝覆盖,旧稿隔离下载。" }, { "file": "tools/scene-cover-api.test.mjs", "testTitle": "upload conflict propagates without any content PUT", "featureIds": [ "project.conflict", "cover.failure" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "project.concurrent-save", "name": "重复保存与保存中继续编辑", "group": "工程入口与顶部命令", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-async-closure.spec.ts", "line": 50, "evidenceName": "save-concurrency", "testTitle": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突", "kind": "browser", "featureIds": [ "project.concurrent-save", "project.save", "project.save-key", "recovery.autobuffer", "recovery.same-version" ], "scope": "延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。" } ] }, { "id": "json.export", "name": "导出当前场景 JSON", "group": "工程文件与资源导入", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 61, "evidenceName": "json-glb-roundtrip", "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返", "kind": "browser", "featureIds": [ "json.export", "json.import", "json.invalid", "json.missing-resource", "json.rendering", "glb.import", "glb.invalid", "glb.references", "validation.references" ], "scope": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。" }, { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 190, "evidenceName": "readonly", "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景", "kind": "browser", "featureIds": [ "permission.readonly", "permission.update", "permission.publish", "preview.enter", "preview.exit", "preview.lock", "json.export" ], "scope": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。" } ] }, { "id": "json.import", "name": "导入有效场景工程 JSON", "group": "工程文件与资源导入", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 61, "evidenceName": "json-glb-roundtrip", "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返", "kind": "browser", "featureIds": [ "json.export", "json.import", "json.invalid", "json.missing-resource", "json.rendering", "glb.import", "glb.invalid", "glb.references", "validation.references" ], "scope": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。" } ] }, { "id": "json.invalid", "name": "非法 JSON / 错误 schema 拒绝", "group": "工程文件与资源导入", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 61, "evidenceName": "json-glb-roundtrip", "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返", "kind": "browser", "featureIds": [ "json.export", "json.import", "json.invalid", "json.missing-resource", "json.rendering", "glb.import", "glb.invalid", "glb.references", "validation.references" ], "scope": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。" } ] }, { "id": "json.missing-resource", "name": "JSON 缺失/错误受控引用拒绝与回滚", "group": "工程文件与资源导入", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 61, "evidenceName": "json-glb-roundtrip", "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返", "kind": "browser", "featureIds": [ "json.export", "json.import", "json.invalid", "json.missing-resource", "json.rendering", "glb.import", "glb.invalid", "glb.references", "validation.references" ], "scope": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "a failed replacement GLB keeps the previous live scene rather than clearing an unsaved draft", "featureIds": [ "json.missing-resource" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-closure-assets.test.mjs", "testTitle": "an explicit missing code cannot fall back to the first READY asset", "featureIds": [ "validation.references", "json.missing-resource" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "json.rendering", "name": "相机、灯光、雾和环境序列化往返", "group": "工程文件与资源导入", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 61, "evidenceName": "json-glb-roundtrip", "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返", "kind": "browser", "featureIds": [ "json.export", "json.import", "json.invalid", "json.missing-resource", "json.rendering", "glb.import", "glb.invalid", "glb.references", "validation.references" ], "scope": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "loading and history restoration preserve an authored camera rather than auto-focusing a vehicle", "featureIds": [ "json.rendering", "history.undo" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "glb.import", "name": "本地 GLB 上传并加入当前场景", "group": "工程文件与资源导入", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 61, "evidenceName": "json-glb-roundtrip", "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返", "kind": "browser", "featureIds": [ "json.export", "json.import", "json.invalid", "json.missing-resource", "json.rendering", "glb.import", "glb.invalid", "glb.references", "validation.references" ], "scope": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。" } ] }, { "id": "glb.invalid", "name": "非 GLB / 损坏 GLB / 上传失败处理", "group": "工程文件与资源导入", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 61, "evidenceName": "json-glb-roundtrip", "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返", "kind": "browser", "featureIds": [ "json.export", "json.import", "json.invalid", "json.missing-resource", "json.rendering", "glb.import", "glb.invalid", "glb.references", "validation.references" ], "scope": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。" } ] }, { "id": "glb.pending", "name": "资源加载/上传期间操作互斥", "group": "工程文件与资源导入", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-async-closure.spec.ts", "line": 27, "evidenceName": "loading-retry", "testTitle": "加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载", "kind": "browser", "featureIds": [ "project.retry", "glb.pending", "leave.busy" ], "scope": "GET503只留中性失败和重试;延迟受控下载时禁用写入/导出/预览并阻止关闭,释放后真实狐狸加载。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "replacement failure waits for other started loads before restoring the original scene", "featureIds": [ "history.failure", "glb.pending" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "../unreal_tran_web/src/features/scene-legacy/contentApiClient.test.mjs", "testTitle": "an upload finishing after a project switch cannot register into the new session", "featureIds": [ "glb.pending", "lifecycle.destroy" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "glb.references", "name": "本项目 GLB 稳定资产引用", "group": "工程文件与资源导入", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 61, "evidenceName": "json-glb-roundtrip", "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返", "kind": "browser", "featureIds": [ "json.export", "json.import", "json.invalid", "json.missing-resource", "json.rendering", "glb.import", "glb.invalid", "glb.references", "validation.references" ], "scope": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。" }, { "file": "tools/scene-closure-assets.test.mjs", "testTitle": "copied scene keeps its original pseudo URI but reads its own copied asset by stable code", "featureIds": [ "glb.references" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "panel.left-tabs", "name": "场景大纲 / 资源库 / 场景模板切换", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 118, "evidenceName": "template-confirm", "testTitle": "模板搜索与未保存切换确认保留和放弃", "kind": "browser", "featureIds": [ "panel.left-tabs", "search.templates", "template.switch-cancel" ], "scope": "中文/无匹配/清空搜索;真实取消保留对象,真实确认放弃并切换空白模板后保存。" } ] }, { "id": "search.tree", "name": "对象/部件名称搜索与清空", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 246, "evidenceName": "published-model-assets", "testTitle": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开", "kind": "browser", "featureIds": [ "assets.catalog", "assets.model-double-click", "assets.model-drop", "search.tree", "part.source", "property.visible" ], "scope": "API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。" } ] }, { "id": "search.assets", "name": "资源搜索与异步刷新保留筛选", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 161, "evidenceName": "basic-assets", "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开", "kind": "browser", "featureIds": [ "assets.basic-double-click", "assets.basic-drop", "search.assets", "panel.objects", "asset.diagnostic", "asset.equipment", "asset.workbench", "asset.shelf", "asset.safety-zone", "asset.camera", "asset.worker", "asset.light" ], "scope": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。" } ] }, { "id": "search.templates", "name": "模板搜索与清空", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 118, "evidenceName": "template-confirm", "testTitle": "模板搜索与未保存切换确认保留和放弃", "kind": "browser", "featureIds": [ "panel.left-tabs", "search.templates", "template.switch-cancel" ], "scope": "中文/无匹配/清空搜索;真实取消保留对象,真实确认放弃并切换空白模板后保存。" } ] }, { "id": "assets.catalog", "name": "真实已发布模型成果目录", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 246, "evidenceName": "published-model-assets", "testTitle": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开", "kind": "browser", "featureIds": [ "assets.catalog", "assets.model-double-click", "assets.model-drop", "search.tree", "part.source", "property.visible" ], "scope": "API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。" } ] }, { "id": "assets.model-double-click", "name": "双击已发布模型放置", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 246, "evidenceName": "published-model-assets", "testTitle": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开", "kind": "browser", "featureIds": [ "assets.catalog", "assets.model-double-click", "assets.model-drop", "search.tree", "part.source", "property.visible" ], "scope": "API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。" }, { "file": "tools/scene-model-placement.test.mjs", "testTitle": "fresh skinned placement reaches the requested size and floor after authored scale/pose replay", "featureIds": [ "assets.model-double-click", "assets.model-drop" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "assets.model-drop", "name": "拖入已发布模型放置", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 246, "evidenceName": "published-model-assets", "testTitle": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开", "kind": "browser", "featureIds": [ "assets.catalog", "assets.model-double-click", "assets.model-drop", "search.tree", "part.source", "property.visible" ], "scope": "API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。" }, { "file": "tools/scene-model-placement.test.mjs", "testTitle": "fresh skinned placement reaches the requested size and floor after authored scale/pose replay", "featureIds": [ "assets.model-double-click", "assets.model-drop" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "assets.basic-double-click", "name": "双击基础资源放置", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 161, "evidenceName": "basic-assets", "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开", "kind": "browser", "featureIds": [ "assets.basic-double-click", "assets.basic-drop", "search.assets", "panel.objects", "asset.diagnostic", "asset.equipment", "asset.workbench", "asset.shelf", "asset.safety-zone", "asset.camera", "asset.worker", "asset.light" ], "scope": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。" } ] }, { "id": "assets.basic-drop", "name": "基础资源拖入与拖放提示", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 161, "evidenceName": "basic-assets", "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开", "kind": "browser", "featureIds": [ "assets.basic-double-click", "assets.basic-drop", "search.assets", "panel.objects", "asset.diagnostic", "asset.equipment", "asset.workbench", "asset.shelf", "asset.safety-zone", "asset.camera", "asset.worker", "asset.light" ], "scope": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。" } ] }, { "id": "assets.model-link", "name": "打开/返回模型编辑器入口", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "model source navigation locates the published owner and falls back without source permission", "featureIds": [ "assets.model-link" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "asset.diagnostic", "name": "基础资源:液压诊断工位", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 161, "evidenceName": "basic-assets", "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开", "kind": "browser", "featureIds": [ "assets.basic-double-click", "assets.basic-drop", "search.assets", "panel.objects", "asset.diagnostic", "asset.equipment", "asset.workbench", "asset.shelf", "asset.safety-zone", "asset.camera", "asset.worker", "asset.light" ], "scope": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。" } ] }, { "id": "asset.equipment", "name": "基础资源:维修装备主体", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 161, "evidenceName": "basic-assets", "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开", "kind": "browser", "featureIds": [ "assets.basic-double-click", "assets.basic-drop", "search.assets", "panel.objects", "asset.diagnostic", "asset.equipment", "asset.workbench", "asset.shelf", "asset.safety-zone", "asset.camera", "asset.worker", "asset.light" ], "scope": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。" } ] }, { "id": "asset.workbench", "name": "基础资源:检修工作台", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 161, "evidenceName": "basic-assets", "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开", "kind": "browser", "featureIds": [ "assets.basic-double-click", "assets.basic-drop", "search.assets", "panel.objects", "asset.diagnostic", "asset.equipment", "asset.workbench", "asset.shelf", "asset.safety-zone", "asset.camera", "asset.worker", "asset.light" ], "scope": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。" } ] }, { "id": "asset.shelf", "name": "基础资源:器材存放架", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 161, "evidenceName": "basic-assets", "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开", "kind": "browser", "featureIds": [ "assets.basic-double-click", "assets.basic-drop", "search.assets", "panel.objects", "asset.diagnostic", "asset.equipment", "asset.workbench", "asset.shelf", "asset.safety-zone", "asset.camera", "asset.worker", "asset.light" ], "scope": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。" } ] }, { "id": "asset.safety-zone", "name": "基础资源:安全作业区域", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 161, "evidenceName": "basic-assets", "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开", "kind": "browser", "featureIds": [ "assets.basic-double-click", "assets.basic-drop", "search.assets", "panel.objects", "asset.diagnostic", "asset.equipment", "asset.workbench", "asset.shelf", "asset.safety-zone", "asset.camera", "asset.worker", "asset.light" ], "scope": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。" } ] }, { "id": "asset.camera", "name": "基础资源:视觉采集设备", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 161, "evidenceName": "basic-assets", "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开", "kind": "browser", "featureIds": [ "assets.basic-double-click", "assets.basic-drop", "search.assets", "panel.objects", "asset.diagnostic", "asset.equipment", "asset.workbench", "asset.shelf", "asset.safety-zone", "asset.camera", "asset.worker", "asset.light" ], "scope": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。" } ] }, { "id": "asset.worker", "name": "基础资源:训练人员占位", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 161, "evidenceName": "basic-assets", "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开", "kind": "browser", "featureIds": [ "assets.basic-double-click", "assets.basic-drop", "search.assets", "panel.objects", "asset.diagnostic", "asset.equipment", "asset.workbench", "asset.shelf", "asset.safety-zone", "asset.camera", "asset.worker", "asset.light" ], "scope": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。" } ] }, { "id": "asset.light", "name": "基础资源:区域照明", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 161, "evidenceName": "basic-assets", "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开", "kind": "browser", "featureIds": [ "assets.basic-double-click", "assets.basic-drop", "search.assets", "panel.objects", "asset.diagnostic", "asset.equipment", "asset.workbench", "asset.shelf", "asset.safety-zone", "asset.camera", "asset.worker", "asset.light" ], "scope": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。" } ] }, { "id": "asset.vehicle-depot", "name": "场地资源:真实装备车库", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 193, "evidenceName": "venue-assets", "testTitle": "两种整体场地加载、重复放置阻止与显式删除后替换", "kind": "browser", "featureIds": [ "asset.vehicle-depot", "asset.field-terrain", "object.delete" ], "scope": "车库和起伏地形真实加载并分别保存重开;已有整体场地时阻止叠加,显式删除旧场地后才能替换。" } ] }, { "id": "asset.field-terrain", "name": "场地资源:真实野外地形", "group": "左侧目录与资源放置", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 193, "evidenceName": "venue-assets", "testTitle": "两种整体场地加载、重复放置阻止与显式删除后替换", "kind": "browser", "featureIds": [ "asset.vehicle-depot", "asset.field-terrain", "object.delete" ], "scope": "车库和起伏地形真实加载并分别保存重开;已有整体场地时阻止叠加,显式删除旧场地后才能替换。" } ] }, { "id": "template.depot-1", "name": "真实装备车库", "group": "全部可达场景模板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 85, "evidenceName": "template-depot-1", "testTitle": "场景模板实际加载、保存重开:真实装备车库", "kind": "browser", "featureIds": [ "template.depot-1" ], "scope": "循环参数化模板用例,每种独立副本、真实点击、保存、刷新与截图。" } ] }, { "id": "template.terrain-1", "name": "真实野外训练场", "group": "全部可达场景模板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 85, "evidenceName": "template-terrain-1", "testTitle": "场景模板实际加载、保存重开:真实野外训练场", "kind": "browser", "featureIds": [ "template.terrain-1" ], "scope": "循环参数化模板用例,每种独立副本、真实点击、保存、刷新与截图。" } ] }, { "id": "template.workshop-1", "name": "综合检验车间", "group": "全部可达场景模板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 85, "evidenceName": "template-workshop-1", "testTitle": "场景模板实际加载、保存重开:综合检验车间", "kind": "browser", "featureIds": [ "template.workshop-1" ], "scope": "循环参数化模板用例,每种独立副本、真实点击、保存、刷新与截图。" } ] }, { "id": "template.workshop-real", "name": "演示维修车间(可拆分)", "group": "全部可达场景模板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 85, "evidenceName": "template-workshop-real", "testTitle": "场景模板实际加载、保存重开:演示维修车间(可拆分)", "kind": "browser", "featureIds": [ "template.workshop-real" ], "scope": "循环参数化模板用例,每种独立副本、真实点击、保存、刷新与截图。" } ] }, { "id": "template.workshop-2", "name": "总成拆卸车间", "group": "全部可达场景模板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 85, "evidenceName": "template-workshop-2", "testTitle": "场景模板实际加载、保存重开:总成拆卸车间", "kind": "browser", "featureIds": [ "template.workshop-2" ], "scope": "循环参数化模板用例,每种独立副本、真实点击、保存、刷新与截图。" } ] }, { "id": "template.workshop-3", "name": "部件分解车间", "group": "全部可达场景模板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 85, "evidenceName": "template-workshop-3", "testTitle": "场景模板实际加载、保存重开:部件分解车间", "kind": "browser", "featureIds": [ "template.workshop-3" ], "scope": "循环参数化模板用例,每种独立副本、真实点击、保存、刷新与截图。" } ] }, { "id": "template.workshop-4", "name": "清洗检测车间", "group": "全部可达场景模板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 85, "evidenceName": "template-workshop-4", "testTitle": "场景模板实际加载、保存重开:清洗检测车间", "kind": "browser", "featureIds": [ "template.workshop-4" ], "scope": "循环参数化模板用例,每种独立副本、真实点击、保存、刷新与截图。" } ] }, { "id": "template.workshop-5", "name": "复装调试车间", "group": "全部可达场景模板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 85, "evidenceName": "template-workshop-5", "testTitle": "场景模板实际加载、保存重开:复装调试车间", "kind": "browser", "featureIds": [ "template.workshop-5" ], "scope": "循环参数化模板用例,每种独立副本、真实点击、保存、刷新与截图。" } ] }, { "id": "template.outdoor-1", "name": "室外综合训练场", "group": "全部可达场景模板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 85, "evidenceName": "template-outdoor-1", "testTitle": "场景模板实际加载、保存重开:室外综合训练场", "kind": "browser", "featureIds": [ "template.outdoor-1" ], "scope": "循环参数化模板用例,每种独立副本、真实点击、保存、刷新与截图。" } ] }, { "id": "template.switch-cancel", "name": "未保存模板切换取消", "group": "全部可达场景模板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 118, "evidenceName": "template-confirm", "testTitle": "模板搜索与未保存切换确认保留和放弃", "kind": "browser", "featureIds": [ "panel.left-tabs", "search.templates", "template.switch-cancel" ], "scope": "中文/无匹配/清空搜索;真实取消保留对象,真实确认放弃并切换空白模板后保存。" } ] }, { "id": "view.orbit", "name": "鼠标旋转相机", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 117, "evidenceName": "viewport-camera-theme", "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性", "kind": "browser", "featureIds": [ "view.orbit", "view.pan", "view.zoom", "view.top", "view.perspective", "view.grid", "view.focus", "selection.viewport", "selection.highlight", "preview.enter", "preview.exit", "preview.lock", "lifecycle.resize-theme" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" } ] }, { "id": "view.pan", "name": "鼠标平移相机", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 117, "evidenceName": "viewport-camera-theme", "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性", "kind": "browser", "featureIds": [ "view.orbit", "view.pan", "view.zoom", "view.top", "view.perspective", "view.grid", "view.focus", "selection.viewport", "selection.highlight", "preview.enter", "preview.exit", "preview.lock", "lifecycle.resize-theme" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" } ] }, { "id": "view.zoom", "name": "滚轮缩放相机", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 117, "evidenceName": "viewport-camera-theme", "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性", "kind": "browser", "featureIds": [ "view.orbit", "view.pan", "view.zoom", "view.top", "view.perspective", "view.grid", "view.focus", "selection.viewport", "selection.highlight", "preview.enter", "preview.exit", "preview.lock", "lifecycle.resize-theme" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" } ] }, { "id": "view.perspective", "name": "透视按钮", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 117, "evidenceName": "viewport-camera-theme", "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性", "kind": "browser", "featureIds": [ "view.orbit", "view.pan", "view.zoom", "view.top", "view.perspective", "view.grid", "view.focus", "selection.viewport", "selection.highlight", "preview.enter", "preview.exit", "preview.lock", "lifecycle.resize-theme" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" } ] }, { "id": "view.top", "name": "顶视图按钮", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 117, "evidenceName": "viewport-camera-theme", "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性", "kind": "browser", "featureIds": [ "view.orbit", "view.pan", "view.zoom", "view.top", "view.perspective", "view.grid", "view.focus", "selection.viewport", "selection.highlight", "preview.enter", "preview.exit", "preview.lock", "lifecycle.resize-theme" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" } ] }, { "id": "view.focus", "name": "聚焦选中对象", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 117, "evidenceName": "viewport-camera-theme", "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性", "kind": "browser", "featureIds": [ "view.orbit", "view.pan", "view.zoom", "view.top", "view.perspective", "view.grid", "view.focus", "selection.viewport", "selection.highlight", "preview.enter", "preview.exit", "preview.lock", "lifecycle.resize-theme" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" } ] }, { "id": "view.grid", "name": "网格显隐", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 117, "evidenceName": "viewport-camera-theme", "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性", "kind": "browser", "featureIds": [ "view.orbit", "view.pan", "view.zoom", "view.top", "view.perspective", "view.grid", "view.focus", "selection.viewport", "selection.highlight", "preview.enter", "preview.exit", "preview.lock", "lifecycle.resize-theme" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tools/scene-cover-capture.test.mjs", "testTitle": "copies synchronously without bounds, gizmo, grid or selection glow, then restores before JPEG encoding", "featureIds": [ "cover.capture", "selection.highlight", "view.grid" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "view.enclosure-full", "name": "车库外壳完整显示", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 121, "evidenceName": "truck-part-history", "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致", "kind": "browser", "featureIds": [ "project.save-key", "part.transform", "part.soft-delete", "history.undo", "history.redo", "property.name", "view.enclosure-full", "view.enclosure-xray", "view.enclosure-hidden" ], "scope": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。" } ] }, { "id": "view.enclosure-xray", "name": "车库外壳透明查看", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 121, "evidenceName": "truck-part-history", "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致", "kind": "browser", "featureIds": [ "project.save-key", "part.transform", "part.soft-delete", "history.undo", "history.redo", "property.name", "view.enclosure-full", "view.enclosure-xray", "view.enclosure-hidden" ], "scope": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。" } ] }, { "id": "view.enclosure-hidden", "name": "隐藏车库外壳", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 121, "evidenceName": "truck-part-history", "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致", "kind": "browser", "featureIds": [ "project.save-key", "part.transform", "part.soft-delete", "history.undo", "history.redo", "property.name", "view.enclosure-full", "view.enclosure-xray", "view.enclosure-hidden" ], "scope": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。" } ] }, { "id": "selection.viewport", "name": "点击视口选中根对象/部件", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 117, "evidenceName": "viewport-camera-theme", "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性", "kind": "browser", "featureIds": [ "view.orbit", "view.pan", "view.zoom", "view.top", "view.perspective", "view.grid", "view.focus", "selection.viewport", "selection.highlight", "preview.enter", "preview.exit", "preview.lock", "lifecycle.resize-theme" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" } ] }, { "id": "selection.tree", "name": "大纲根对象与部件选中", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "two published instances have unique tree part IDs and editing the second persists independently after reopen", "featureIds": [ "part.transform", "selection.tree" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "successful parallel restores retain document order after delayed GLBs and split-object batches finish out of order", "featureIds": [ "project.load", "selection.tree" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "selection.hidden", "name": "隐藏祖先与软删除部件不可误拾取", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "real Three ray hits on hidden descendants are excluded before selecting a root or part", "featureIds": [ "selection.hidden" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "selection.highlight", "name": "选中高亮与恢复原材质", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 117, "evidenceName": "viewport-camera-theme", "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性", "kind": "browser", "featureIds": [ "view.orbit", "view.pan", "view.zoom", "view.top", "view.perspective", "view.grid", "view.focus", "selection.viewport", "selection.highlight", "preview.enter", "preview.exit", "preview.lock", "lifecycle.resize-theme" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "selection highlight cleanup restores source materials and releases its own GPU helper", "featureIds": [ "selection.highlight", "lifecycle.destroy" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-cover-capture.test.mjs", "testTitle": "copies synchronously without bounds, gizmo, grid or selection glow, then restores before JPEG encoding", "featureIds": [ "cover.capture", "selection.highlight", "view.grid" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "transform.translate", "name": "移动工具及真实 XYZ 手柄", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 148, "evidenceName": "viewport-transform", "testTitle": "真实变换手柄移动旋转缩放、吸附与保存重开", "kind": "browser", "featureIds": [ "transform.translate", "transform.rotate", "transform.scale", "transform.keys", "transform.snap" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" } ] }, { "id": "transform.rotate", "name": "旋转工具及真实旋转手柄", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 148, "evidenceName": "viewport-transform", "testTitle": "真实变换手柄移动旋转缩放、吸附与保存重开", "kind": "browser", "featureIds": [ "transform.translate", "transform.rotate", "transform.scale", "transform.keys", "transform.snap" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" } ] }, { "id": "transform.scale", "name": "缩放工具及真实缩放手柄", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 148, "evidenceName": "viewport-transform", "testTitle": "真实变换手柄移动旋转缩放、吸附与保存重开", "kind": "browser", "featureIds": [ "transform.translate", "transform.rotate", "transform.scale", "transform.keys", "transform.snap" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "gizmo scaling across its pivot follows the same strictly positive scale contract as inspector edits", "featureIds": [ "transform.scale", "property.scale" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "transform.keys", "name": "W/E/R 快捷键", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 148, "evidenceName": "viewport-transform", "testTitle": "真实变换手柄移动旋转缩放、吸附与保存重开", "kind": "browser", "featureIds": [ "transform.translate", "transform.rotate", "transform.scale", "transform.keys", "transform.snap" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts", "featureIds": [ "history.undo", "history.redo", "transform.keys", "lifecycle.cache" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "transform.snap", "name": "吸附 0.5m 与旋转 15° 开关", "group": "三维视口、选择与变换", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 148, "evidenceName": "viewport-transform", "testTitle": "真实变换手柄移动旋转缩放、吸附与保存重开", "kind": "browser", "featureIds": [ "transform.translate", "transform.rotate", "transform.scale", "transform.keys", "transform.snap" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" } ] }, { "id": "property.name", "name": "显示名称", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" }, { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 121, "evidenceName": "truck-part-history", "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致", "kind": "browser", "featureIds": [ "project.save-key", "part.transform", "part.soft-delete", "history.undo", "history.redo", "property.name", "view.enclosure-full", "view.enclosure-xray", "view.enclosure-hidden" ], "scope": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。" } ] }, { "id": "property.visible", "name": "在场景中可见", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 246, "evidenceName": "published-model-assets", "testTitle": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开", "kind": "browser", "featureIds": [ "assets.catalog", "assets.model-double-click", "assets.model-drop", "search.tree", "part.source", "property.visible" ], "scope": "API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。" }, { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" } ] }, { "id": "property.operable", "name": "可作为实训目标", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" } ] }, { "id": "property.position", "name": "位置 X/Y/Z 数值", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" } ] }, { "id": "property.rotation", "name": "旋转 X/Y/Z 数值", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" } ] }, { "id": "property.scale", "name": "缩放 X/Y/Z 数值及有效值", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "gizmo scaling across its pivot follows the same strictly positive scale contract as inspector edits", "featureIds": [ "transform.scale", "property.scale" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-model-placement.test.mjs", "testTitle": "scale input accepts real GLTF normalization factors below 0.05", "featureIds": [ "property.scale" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "property.device-id", "name": "设备编号", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" } ] }, { "id": "property.model-id", "name": "物模型编号", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" } ] }, { "id": "property.semantic", "name": "语义类型六个选项", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" } ] }, { "id": "part.source", "name": "模型来源与部件权限说明", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 246, "evidenceName": "published-model-assets", "testTitle": "模型成果狐狸卡车双击与真实拖入、树搜索和部件隐藏重开", "kind": "browser", "featureIds": [ "assets.catalog", "assets.model-double-click", "assets.model-drop", "search.tree", "part.source", "property.visible" ], "scope": "API 已发布目录,狐狸双击和卡车真实拖入;固定来源版本、树根/部件搜索;卡车刚体部件隐藏保存重开,最后恢复可见。基线树没有折叠按钮,不将搜索伪称折叠。" }, { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" } ] }, { "id": "part.transform", "name": "刚性部件独立变换并保存覆盖", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 121, "evidenceName": "truck-part-history", "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致", "kind": "browser", "featureIds": [ "project.save-key", "part.transform", "part.soft-delete", "history.undo", "history.redo", "property.name", "view.enclosure-full", "view.enclosure-xray", "view.enclosure-hidden" ], "scope": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "two published instances have unique tree part IDs and editing the second persists independently after reopen", "featureIds": [ "part.transform", "selection.tree" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "legacy duplicate instance IDs migrate only later owners in document order despite reversed GLB completion", "featureIds": [ "part.transform", "publish.fixed-model" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "part.soft-delete", "name": "部件软删除与恢复", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 121, "evidenceName": "truck-part-history", "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致", "kind": "browser", "featureIds": [ "project.save-key", "part.transform", "part.soft-delete", "history.undo", "history.redo", "property.name", "view.enclosure-full", "view.enclosure-xray", "view.enclosure-hidden" ], "scope": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。" } ] }, { "id": "object.delete", "name": "删除根对象按钮 / Delete", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 193, "evidenceName": "venue-assets", "testTitle": "两种整体场地加载、重复放置阻止与显式删除后替换", "kind": "browser", "featureIds": [ "asset.vehicle-depot", "asset.field-terrain", "object.delete" ], "scope": "车库和起伏地形真实加载并分别保存重开;已有整体场地时阻止叠加,显式删除旧场地后才能替换。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "deleting a root disposes its geometry and materials after clearing selection", "featureIds": [ "object.delete", "lifecycle.destroy" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "panel.objects", "name": "底部对象列表与选中", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-templates-closure.spec.ts", "line": 161, "evidenceName": "basic-assets", "testTitle": "八种基础资源逐项放置、真实拖放、搜索和保存重开", "kind": "browser", "featureIds": [ "assets.basic-double-click", "assets.basic-drop", "search.assets", "panel.objects", "asset.diagnostic", "asset.equipment", "asset.workbench", "asset.shelf", "asset.safety-zone", "asset.camera", "asset.worker", "asset.light" ], "scope": "8 种基础资源分别双击放置并分开布置;真实指针拖入第 9 个工作台、吸附检查、唯一编号、保存刷新一致。照明为现有资源外观,不冒称连接真实灯控。" } ] }, { "id": "panel.binding", "name": "设备绑定总表", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" } ] }, { "id": "panel.validation", "name": "底部发布检查面板", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 153, "evidenceName": "publish-fixed-version", "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用", "kind": "browser", "featureIds": [ "validation.complete", "validation.bindings", "panel.validation", "publish.saved", "publish.failure", "publish.fixed-model", "cover.atomic", "project.back" ], "scope": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "verify opens live validation and whitespace binding edits immediately invalidate the active tab", "featureIds": [ "panel.validation", "validation.bindings" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "panel.logs", "name": "操作日志", "group": "对象属性、部件与底部面板", "verification": "PENDING", "plannedEvidence": [ { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "activity log reflects actual session events and keeps API error details transient", "featureIds": [ "panel.logs" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "history.undo", "name": "回退按钮 / Ctrl+Z", "group": "历史与预览", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 121, "evidenceName": "truck-part-history", "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致", "kind": "browser", "featureIds": [ "project.save-key", "part.transform", "part.soft-delete", "history.undo", "history.redo", "property.name", "view.enclosure-full", "view.enclosure-xray", "view.enclosure-hidden" ], "scope": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts", "featureIds": [ "history.undo", "history.redo", "transform.keys", "lifecycle.cache" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "loading and history restoration preserve an authored camera rather than auto-focusing a vehicle", "featureIds": [ "json.rendering", "history.undo" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "save B then undo A stays dirty, and redo B returns to the actual saved baseline", "featureIds": [ "history.undo", "history.redo" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "default history caps at 60 snapshots, stops at either edge and discards redo only after a new branch", "featureIds": [ "history.capacity", "history.undo", "history.redo" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "history.redo", "name": "前进按钮 / Ctrl+Y / Ctrl+Shift+Z", "group": "历史与预览", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 121, "evidenceName": "truck-part-history", "testTitle": "牛奶卡车:刚性部件独立变换、软删除、历史与保存基线一致", "kind": "browser", "featureIds": [ "project.save-key", "part.transform", "part.soft-delete", "history.undo", "history.redo", "property.name", "view.enclosure-full", "view.enclosure-xray", "view.enclosure-hidden" ], "scope": "实际部件变换和软删除、按钮/键盘历史、保存基线与输入框自身撤销;双实例隔离及车库围护三种模式真实点击、导出和隐藏后保存刷新。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts", "featureIds": [ "history.undo", "history.redo", "transform.keys", "lifecycle.cache" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "save B then undo A stays dirty, and redo B returns to the actual saved baseline", "featureIds": [ "history.undo", "history.redo" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "default history caps at 60 snapshots, stops at either edge and discards redo only after a new branch", "featureIds": [ "history.capacity", "history.undo", "history.redo" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "history.capacity", "name": "60 步历史上限与边界", "group": "历史与预览", "verification": "PENDING", "plannedEvidence": [ { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "default history caps at 60 snapshots, stops at either edge and discards redo only after a new branch", "featureIds": [ "history.capacity", "history.undo", "history.redo" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "history.failure", "name": "异步历史恢复失败/互斥", "group": "历史与预览", "verification": "PENDING", "plannedEvidence": [ { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "failed undo restoration retains live objects and keeps the undo target available for retry", "featureIds": [ "history.failure" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "replacement failure waits for other started loads before restoring the original scene", "featureIds": [ "history.failure", "glb.pending" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "preview.enter", "name": "进入运行预览", "group": "历史与预览", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 117, "evidenceName": "viewport-camera-theme", "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性", "kind": "browser", "featureIds": [ "view.orbit", "view.pan", "view.zoom", "view.top", "view.perspective", "view.grid", "view.focus", "selection.viewport", "selection.highlight", "preview.enter", "preview.exit", "preview.lock", "lifecycle.resize-theme" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 190, "evidenceName": "readonly", "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景", "kind": "browser", "featureIds": [ "permission.readonly", "permission.update", "permission.publish", "preview.enter", "preview.exit", "preview.lock", "json.export" ], "scope": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。" } ] }, { "id": "preview.exit", "name": "按钮 / Escape 退出预览", "group": "历史与预览", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 117, "evidenceName": "viewport-camera-theme", "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性", "kind": "browser", "featureIds": [ "view.orbit", "view.pan", "view.zoom", "view.top", "view.perspective", "view.grid", "view.focus", "selection.viewport", "selection.highlight", "preview.enter", "preview.exit", "preview.lock", "lifecycle.resize-theme" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 190, "evidenceName": "readonly", "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景", "kind": "browser", "featureIds": [ "permission.readonly", "permission.update", "permission.publish", "preview.enter", "preview.exit", "preview.lock", "json.export" ], "scope": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "preview locks mutation controls and Delete while Escape restores editing", "featureIds": [ "preview.lock", "preview.exit" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "preview.lock", "name": "预览中禁止编辑", "group": "历史与预览", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 117, "evidenceName": "viewport-camera-theme", "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性", "kind": "browser", "featureIds": [ "view.orbit", "view.pan", "view.zoom", "view.top", "view.perspective", "view.grid", "view.focus", "selection.viewport", "selection.highlight", "preview.enter", "preview.exit", "preview.lock", "lifecycle.resize-theme" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 190, "evidenceName": "readonly", "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景", "kind": "browser", "featureIds": [ "permission.readonly", "permission.update", "permission.publish", "preview.enter", "preview.exit", "preview.lock", "json.export" ], "scope": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "preview locks mutation controls and Delete while Escape restores editing", "featureIds": [ "preview.lock", "preview.exit" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "cover.capture", "name": "保存时截取当前三维场景封面", "group": "保存封面、发布与依赖", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" }, { "file": "tools/scene-cover-capture.test.mjs", "testTitle": "copies synchronously without bounds, gizmo, grid or selection glow, then restores before JPEG encoding", "featureIds": [ "cover.capture", "selection.highlight", "view.grid" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "cover.atomic", "name": "封面资产与文档同次保存", "group": "保存封面、发布与依赖", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 153, "evidenceName": "publish-fixed-version", "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用", "kind": "browser", "featureIds": [ "validation.complete", "validation.bindings", "panel.validation", "publish.saved", "publish.failure", "publish.fixed-model", "cover.atomic", "project.back" ], "scope": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。" }, { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 64, "evidenceName": "fox-properties-cover", "testTitle": "狐狸:真实细分权限、全部属性、清空绑定、蒙皮保护、相机与封面保存重开", "kind": "browser", "featureIds": [ "project.load", "project.title", "project.save", "selection.tree", "property.name", "property.visible", "property.operable", "property.position", "property.rotation", "property.scale", "property.device-id", "property.model-id", "property.semantic", "part.source", "panel.binding", "cover.capture", "cover.atomic" ], "scope": "真实字段输入与清空、六个语义选项、蒙皮保护、源模型可见,正文/资产/封面保存和刷新;不把原件旧模板组合当新模板结果。" }, { "file": "tools/scene-cover-api.test.mjs", "testTitle": "scene image ticket, fixed asset replacement, dependencies and coverUri commit in one versioned PUT", "featureIds": [ "cover.atomic" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "cover.failure", "name": "截图/封面上传失败保留原封面", "group": "保存封面、发布与依赖", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 85, "evidenceName": "save-cover-failure", "testTitle": "保存失败与封面降级:503 保留草稿,封面上传失败保留旧图,恢复后可重试", "kind": "browser", "featureIds": [ "project.save-failure", "cover.failure" ], "scope": "正文PUT503不清草稿;封面上传503保留旧图但正文可保存;恢复服务后保存刷新。截图异常和409另由聚焦合同验证。" }, { "file": "tools/scene-cover-api.test.mjs", "testTitle": "capture failure saves content with the previous cover and reports a warning result", "featureIds": [ "cover.failure" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-cover-api.test.mjs", "testTitle": "upload conflict propagates without any content PUT", "featureIds": [ "project.conflict", "cover.failure" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "validation.complete", "name": "环境、对象用途、模型加载检查", "group": "保存封面、发布与依赖", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 153, "evidenceName": "publish-fixed-version", "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用", "kind": "browser", "featureIds": [ "validation.complete", "validation.bindings", "panel.validation", "publish.saved", "publish.failure", "publish.fixed-model", "cover.atomic", "project.back" ], "scope": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。" } ] }, { "id": "validation.bindings", "name": "设备/物模型编号完整与唯一", "group": "保存封面、发布与依赖", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 153, "evidenceName": "publish-fixed-version", "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用", "kind": "browser", "featureIds": [ "validation.complete", "validation.bindings", "panel.validation", "publish.saved", "publish.failure", "publish.fixed-model", "cover.atomic", "project.back" ], "scope": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "new resource bindings do not reuse a saved serial after earlier objects were deleted", "featureIds": [ "validation.bindings" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "verify opens live validation and whitespace binding edits immediately invalidate the active tab", "featureIds": [ "panel.validation", "validation.bindings" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "validation.references", "name": "受控资源引用完整性", "group": "保存封面、发布与依赖", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 61, "evidenceName": "json-glb-roundtrip", "testTitle": "工程 JSON 与小 GLB:真实上传、损坏拒绝、引用失败回滚、相机参数往返", "kind": "browser", "featureIds": [ "json.export", "json.import", "json.invalid", "json.missing-resource", "json.rendering", "glb.import", "glb.invalid", "glb.references", "validation.references" ], "scope": "真实JSON/GLB文件输入、错误schema/损坏资源/上传503拒绝、错误assetCode回滚、稳定URI及渲染参数保存重开。" }, { "file": "tools/scene-closure-assets.test.mjs", "testTitle": "an explicit missing code cannot fall back to the first READY asset", "featureIds": [ "validation.references", "json.missing-resource" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "publish.saved", "name": "发布场景按钮的真实 API 闭环", "group": "保存封面、发布与依赖", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 153, "evidenceName": "publish-fixed-version", "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用", "kind": "browser", "featureIds": [ "validation.complete", "validation.bindings", "panel.validation", "publish.saved", "publish.failure", "publish.fixed-model", "cover.atomic", "project.back" ], "scope": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。" } ] }, { "id": "publish.only", "name": "只有发布权限时发布已存版本", "group": "保存封面、发布与依赖", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 171, "evidenceName": "scene-publish-only", "testTitle": "仅场景发布权限:浏览器发布已存副本,不发送保存或上传请求", "kind": "browser", "featureIds": [ "permission.publish", "publish.only", "publish.fixed-model" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" } ] }, { "id": "publish.failure", "name": "预检/保存/发布失败阻断", "group": "保存封面、发布与依赖", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 153, "evidenceName": "publish-fixed-version", "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用", "kind": "browser", "featureIds": [ "validation.complete", "validation.bindings", "panel.validation", "publish.saved", "publish.failure", "publish.fixed-model", "cover.atomic", "project.back" ], "scope": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。" } ] }, { "id": "publish.concurrent", "name": "重复发布与上传/保存队列", "group": "保存封面、发布与依赖", "verification": "PENDING", "plannedEvidence": [ { "file": "tools/scene-cover-api.test.mjs", "testTitle": "role switch waits through validation, save, and the later queued publish after dirty clears", "featureIds": [ "publish.concurrent", "leave.busy", "leave.role-switch" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "../unreal_tran_web/src/features/scene-legacy/contentApiClient.test.mjs", "testTitle": "project operation queue serializes upload, save and publish including failures", "featureIds": [ "publish.concurrent" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "publish.fixed-model", "name": "固定 SCENE_MODEL 版本与多个实例", "group": "保存封面、发布与依赖", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 142, "evidenceName": "scene-update-only", "testTitle": "仅场景编辑权限:固定模型可加载和保存,不能发布或访问模型页面", "kind": "browser", "featureIds": [ "permission.update", "permission.publish", "publish.fixed-model" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 171, "evidenceName": "scene-publish-only", "testTitle": "仅场景发布权限:浏览器发布已存副本,不发送保存或上传请求", "kind": "browser", "featureIds": [ "permission.publish", "publish.only", "publish.fixed-model" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 153, "evidenceName": "publish-fixed-version", "testTitle": "发布:前端绑定校验、保存与发布失败阻断、真实固定版本供训练目录使用", "kind": "browser", "featureIds": [ "validation.complete", "validation.bindings", "panel.validation", "publish.saved", "publish.failure", "publish.fixed-model", "cover.atomic", "project.back" ], "scope": "实际校验、绑定阻断、POST503不假发布,重试发布当前固定版本;返回列表保留编辑标签,搜索当前项目并核对真实封面图片加载。下游静态渲染另有独立用例。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "legacy duplicate instance IDs migrate only later owners in document order despite reversed GLB completion", "featureIds": [ "part.transform", "publish.fixed-model" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-closure-assets.test.mjs", "testTitle": "fixed model reads the exact version and downloads through its visible scene dependency", "featureIds": [ "publish.fixed-model", "permission.update" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "../unreal_tran_web/src/features/scene-legacy/contentApiClient.test.mjs", "testTitle": "fixed model dependencies are recursively collected, exact and de-duplicated", "featureIds": [ "publish.fixed-model" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "publish.downstream", "name": "发布场景供训练选择和静态还原", "group": "保存封面、发布与依赖", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-downstream-closure.spec.ts", "line": 28, "evidenceName": "downstream-fox", "testTitle": "fox:场景发布后在真实训练编排选择、保存并重开静态模型", "kind": "browser", "featureIds": [ "publish.downstream" ], "scope": "真实训练编排静态还原;不计来源模型动画/蓝图自动执行。" }, { "file": "tests/scene-editor-downstream-closure.spec.ts", "line": 28, "evidenceName": "downstream-truck", "testTitle": "truck:场景发布后在真实训练编排选择、保存并重开静态模型", "kind": "browser", "featureIds": [ "publish.downstream" ], "scope": "真实训练编排静态还原;不计来源模型动画/蓝图自动执行。" } ] }, { "id": "permission.update", "name": "场景细分编辑权限", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 142, "evidenceName": "scene-update-only", "testTitle": "仅场景编辑权限:固定模型可加载和保存,不能发布或访问模型页面", "kind": "browser", "featureIds": [ "permission.update", "permission.publish", "publish.fixed-model" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 190, "evidenceName": "readonly", "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景", "kind": "browser", "featureIds": [ "permission.readonly", "permission.update", "permission.publish", "preview.enter", "preview.exit", "preview.lock", "json.export" ], "scope": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "scene granular update permission enables editing without the retired shared code", "featureIds": [ "permission.update" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-closure-assets.test.mjs", "testTitle": "fixed model reads the exact version and downloads through its visible scene dependency", "featureIds": [ "publish.fixed-model", "permission.update" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "permission.publish", "name": "场景细分发布权限", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 142, "evidenceName": "scene-update-only", "testTitle": "仅场景编辑权限:固定模型可加载和保存,不能发布或访问模型页面", "kind": "browser", "featureIds": [ "permission.update", "permission.publish", "publish.fixed-model" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 171, "evidenceName": "scene-publish-only", "testTitle": "仅场景发布权限:浏览器发布已存副本,不发送保存或上传请求", "kind": "browser", "featureIds": [ "permission.publish", "publish.only", "publish.fixed-model" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 183, "evidenceName": "scene-no-page-permission", "testTitle": "无场景页面权限:编辑路由和直接内容接口均拒绝访问", "kind": "browser", "featureIds": [ "permission.publish" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 190, "evidenceName": "readonly", "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景", "kind": "browser", "featureIds": [ "permission.readonly", "permission.update", "permission.publish", "preview.enter", "preview.exit", "preview.lock", "json.export" ], "scope": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。" } ] }, { "id": "permission.readonly", "name": "只读仍可查看、搜索、选中和预览", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 253, "evidenceName": "scene-role-switch", "testTitle": "后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限", "kind": "browser", "featureIds": [ "leave.role-switch", "leave.cancel", "leave.save", "permission.readonly" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tests/scene-editor-workflow-closure.spec.ts", "line": 190, "evidenceName": "readonly", "testTitle": "只读管理员:可浏览预览与导出,模板/资源/键盘/接口不能改场景", "kind": "browser", "featureIds": [ "permission.readonly", "permission.update", "permission.publish", "preview.enter", "preview.exit", "preview.lock", "json.export" ], "scope": "只读按钮/模板/资源禁写、蒙皮浏览、运行预览与快捷键不变更对象,直接PUT拒绝;具体搜索/鼠标覆盖另见视口用例。" } ] }, { "id": "recovery.autobuffer", "name": "800ms 未保存恢复缓冲", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-async-closure.spec.ts", "line": 50, "evidenceName": "save-concurrency", "testTitle": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突", "kind": "browser", "featureIds": [ "project.concurrent-save", "project.save", "project.save-key", "recovery.autobuffer", "recovery.same-version" ], "scope": "延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。" }, { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 305, "evidenceName": "scene-multi-session", "testTitle": "双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿", "kind": "browser", "featureIds": [ "recovery.multi-session", "recovery.autobuffer", "recovery.discard", "project.save" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 117, "evidenceName": "real-recovery-conflict", "testTitle": "同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载", "kind": "browser", "featureIds": [ "project.conflict", "recovery.autobuffer", "recovery.same-version", "recovery.stale-version" ], "scope": "真实未存输入产生恢复稿,同版本恢复不自动入库;另一版本先保存后409拒绝覆盖,旧稿隔离下载。" } ] }, { "id": "recovery.same-version", "name": "同版本真实未保存恢复", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-async-closure.spec.ts", "line": 50, "evidenceName": "save-concurrency", "testTitle": "延迟保存快照:重复点击只提交一次,期间新编辑保留,旧恢复稿不会误报冲突", "kind": "browser", "featureIds": [ "project.concurrent-save", "project.save", "project.save-key", "recovery.autobuffer", "recovery.same-version" ], "scope": "延迟真实PUT快照A、重复Ctrl+S不重复请求、期间编辑B仍dirty;再次保存刷新无旧恢复稿误报。" }, { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 117, "evidenceName": "real-recovery-conflict", "testTitle": "同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载", "kind": "browser", "featureIds": [ "project.conflict", "recovery.autobuffer", "recovery.same-version", "recovery.stale-version" ], "scope": "真实未存输入产生恢复稿,同版本恢复不自动入库;另一版本先保存后409拒绝覆盖,旧稿隔离下载。" } ] }, { "id": "recovery.stale-version", "name": "不同版本恢复稿隔离", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-persistence-closure.spec.ts", "line": 117, "evidenceName": "real-recovery-conflict", "testTitle": "同版本恢复与 409:真实未保存草稿重载、服务器新版本保护与隔离下载", "kind": "browser", "featureIds": [ "project.conflict", "recovery.autobuffer", "recovery.same-version", "recovery.stale-version" ], "scope": "真实未存输入产生恢复稿,同版本恢复不自动入库;另一版本先保存后409拒绝覆盖,旧稿隔离下载。" } ] }, { "id": "recovery.discard", "name": "下载、保留、丢弃恢复稿", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 305, "evidenceName": "scene-multi-session", "testTitle": "双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿", "kind": "browser", "featureIds": [ "recovery.multi-session", "recovery.autobuffer", "recovery.discard", "project.save" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "../unreal_tran_web/src/features/scene-legacy/contentApiClient.test.mjs", "testTitle": "recovery conflict defaults to preserve and only explicit discard may remove it", "featureIds": [ "recovery.discard" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "recovery.multi-session", "name": "多标签/多会话恢复所有权", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 305, "evidenceName": "scene-multi-session", "testTitle": "双标签各自修改场景:保存和明确丢弃当前页均保留另一页真实恢复稿", "kind": "browser", "featureIds": [ "recovery.multi-session", "recovery.autobuffer", "recovery.discard", "project.save" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "../unreal_tran_web/src/features/scene-legacy/contentApiClient.test.mjs", "testTitle": "per-page recovery keys prevent copied tabs from deleting each other checkpoints", "featureIds": [ "recovery.multi-session" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "leave.cancel", "name": "关闭场景标签时取消离开", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 253, "evidenceName": "scene-role-switch", "testTitle": "后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限", "kind": "browser", "featureIds": [ "leave.role-switch", "leave.cancel", "leave.save", "permission.readonly" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tools/scene-tab-close.test.mjs", "testTitle": "closing one selected scene checks its cached guard, leaves unrelated workspaces alone", "featureIds": [ "leave.cancel", "lifecycle.cache" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-tab-close.test.mjs", "testTitle": "cancel or failed save in a later tab never commits earlier draft discard", "featureIds": [ "leave.cancel", "leave.save", "leave.role-switch" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "leave.save", "name": "保存并离开 / 放弃修改", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 253, "evidenceName": "scene-role-switch", "testTitle": "后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限", "kind": "browser", "featureIds": [ "leave.role-switch", "leave.cancel", "leave.save", "permission.readonly" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tools/scene-tab-close.test.mjs", "testTitle": "cancel or failed save in a later tab never commits earlier draft discard", "featureIds": [ "leave.cancel", "leave.save", "leave.role-switch" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-tab-close.test.mjs", "testTitle": "all successful confirmations commit together and unmounted guards are removed", "featureIds": [ "leave.save", "lifecycle.destroy" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "leave.busy", "name": "加载/上传/发布途中离开", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-async-closure.spec.ts", "line": 27, "evidenceName": "loading-retry", "testTitle": "加载失败重试与加载互斥:不展示可写半场景、恢复网络后模型完整加载", "kind": "browser", "featureIds": [ "project.retry", "glb.pending", "leave.busy" ], "scope": "GET503只留中性失败和重试;延迟受控下载时禁用写入/导出/预览并阻止关闭,释放后真实狐狸加载。" }, { "file": "tools/scene-cover-api.test.mjs", "testTitle": "role switch waits through validation, save, and the later queued publish after dirty clears", "featureIds": [ "publish.concurrent", "leave.busy", "leave.role-switch" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-cover-api.test.mjs", "testTitle": "role switch rechecks resource uploads started while the save was finishing", "featureIds": [ "leave.busy" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "leave.role-switch", "name": "角色切换覆盖后台场景未存稿", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-permissions-closure.spec.ts", "line": 253, "evidenceName": "scene-role-switch", "testTitle": "后台场景未保存时切换角色:关闭确认保留草稿,保存切换后重建只读权限", "kind": "browser", "featureIds": [ "leave.role-switch", "leave.cancel", "leave.save", "permission.readonly" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tools/scene-tab-close.test.mjs", "testTitle": "cancel or failed save in a later tab never commits earlier draft discard", "featureIds": [ "leave.cancel", "leave.save", "leave.role-switch" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-cover-api.test.mjs", "testTitle": "role switch waits through validation, save, and the later queued publish after dirty clears", "featureIds": [ "publish.concurrent", "leave.busy", "leave.role-switch" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "lifecycle.cache", "name": "标签失活 pause / 激活 resume", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 178, "evidenceName": "viewport-cache-close", "testTitle": "缓存标签暂停键盘、草稿恢复以及关闭取消和保存失败留页", "kind": "browser", "featureIds": [ "lifecycle.cache" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts", "featureIds": [ "history.undo", "history.redo", "transform.keys", "lifecycle.cache" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-tab-close.test.mjs", "testTitle": "closing one selected scene checks its cached guard, leaves unrelated workspaces alone", "featureIds": [ "leave.cancel", "lifecycle.cache" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "lifecycle.destroy", "name": "关闭释放 WebGL/监听/资源", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "deleting a root disposes its geometry and materials after clearing selection", "featureIds": [ "object.delete", "lifecycle.destroy" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-closure-engine.test.mjs", "testTitle": "selection highlight cleanup restores source materials and releases its own GPU helper", "featureIds": [ "selection.highlight", "lifecycle.destroy" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "tools/scene-tab-close.test.mjs", "testTitle": "all successful confirmations commit together and unmounted guards are removed", "featureIds": [ "leave.save", "lifecycle.destroy" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" }, { "file": "../unreal_tran_web/src/features/scene-legacy/contentApiClient.test.mjs", "testTitle": "an upload finishing after a project switch cannot register into the new session", "featureIds": [ "glb.pending", "lifecycle.destroy" ], "kind": "unit", "scope": "聚焦合同/真实DOM/Three对象计算;不称为浏览器鼠标交互。" } ] }, { "id": "lifecycle.resize-theme", "name": "桌面尺寸与明亮/暗黑可读性", "group": "权限、缓存与未保存恢复", "verification": "PENDING", "plannedEvidence": [ { "file": "tests/scene-editor-viewport-closure.spec.ts", "line": 117, "evidenceName": "viewport-camera-theme", "testTitle": "真实相机操控、视口拾取、预览禁写和两尺寸主题可读性", "kind": "browser", "featureIds": [ "view.orbit", "view.pan", "view.zoom", "view.top", "view.perspective", "view.grid", "view.focus", "selection.viewport", "selection.highlight", "preview.enter", "preview.exit", "preview.lock", "lifecycle.resize-theme" ], "scope": "以源测试实际断言为准;计划关联不代表最终通过。" } ] } ] }