{ "time": "2026-09-06T10:31:52.558Z", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "overallStatus": "PASS", "finalRun": true, "scope": "默认路由的119项功能;浏览器证据与聚焦单元合同分别计数。较大功能扩展未实施。", "e2e": { "tests": 33, "pass": 33, "fail": 0, "retries": 0, "startTime": "2026-09-06T10:24:04.121Z", "durationMs": 422286.673, "complete": true }, "priorFullRun": { "pass": 32, "fail": 1, "reason": "关闭保存失败用例的提示定位同时匹配成功和失败消息,已限定目标错误;另补列表搜索遮罩消失后截图的等待条件。", "privateArchived": true, "countedAsFinal": false }, "secondFullRun": { "pass": 32, "fail": 1, "reason": "并行加载同源模型时恢复顺序不稳定;已保留文档对象顺序,并以实例编号验证部件隔离和重开。", "privateArchived": true, "countedAsFinal": false }, "frontend": { "status": "PASS", "command": "pnpm run build", "legacyModelPayloadUnchanged": true }, "backend": { "status": "PASS", "command": "mvn -pl ut_tran -am test package", "tests": 373, "failures": 0, "errors": 0, "skipped": 0, "suites": 54 }, "runtime": { "status": "PASS", "tests": 106, "pass": 106, "fail": 0, "skipped": 0 }, "client": { "status": "PASS", "tests": 32, "pass": 32, "fail": 0, "skipped": 0 }, "coverage": [ { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "scene granular update permission enables editing without the retired shared code", "featureIds": [ "permission.update" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "typing undo/redo stays inside text controls and inactive cached editors ignore global shortcuts", "featureIds": [ "history.undo", "history.redo", "transform.keys", "lifecycle.cache" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "preview locks mutation controls and Delete while Escape restores editing", "featureIds": [ "preview.lock", "preview.exit" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "real Three ray hits on hidden descendants are excluded before selecting a root or part", "featureIds": [ "selection.hidden" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "deleting a root disposes its geometry and materials after clearing selection", "featureIds": [ "object.delete", "lifecycle.destroy" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "loading and history restoration preserve an authored camera rather than auto-focusing a vehicle", "featureIds": [ "json.rendering", "history.undo" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "save B then undo A stays dirty, and redo B returns to the actual saved baseline", "featureIds": [ "history.undo", "history.redo" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "new resource bindings do not reuse a saved serial after earlier objects were deleted", "featureIds": [ "validation.bindings" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "a failed replacement GLB keeps the previous live scene rather than clearing an unsaved draft", "featureIds": [ "json.missing-resource" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "failed undo restoration retains live objects and keeps the undo target available for retry", "featureIds": [ "history.failure" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "selection highlight cleanup restores source materials and releases its own GPU helper", "featureIds": [ "selection.highlight", "lifecycle.destroy" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "replacement failure waits for other started loads before restoring the original scene", "featureIds": [ "history.failure", "glb.pending" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "activity log reflects actual session events and keeps API error details transient", "featureIds": [ "panel.logs" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "verify opens live validation and whitespace binding edits immediately invalidate the active tab", "featureIds": [ "panel.validation", "validation.bindings" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "model source navigation locates the published owner and falls back without source permission", "featureIds": [ "assets.model-link" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "gizmo scaling across its pivot follows the same strictly positive scale contract as inspector edits", "featureIds": [ "transform.scale", "property.scale" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "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" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "two published instances have unique tree part IDs and editing the second persists independently after reopen", "featureIds": [ "part.transform", "selection.tree" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "legacy duplicate instance IDs migrate only later owners in document order despite reversed GLB completion", "featureIds": [ "part.transform", "publish.fixed-model" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "successful parallel restores retain document order after delayed GLBs and split-object batches finish out of order", "featureIds": [ "project.load", "selection.tree" ], "source": "tools/scene-closure-engine.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "closing one selected scene checks its cached guard, leaves unrelated workspaces alone", "featureIds": [ "leave.cancel", "lifecycle.cache" ], "source": "tools/scene-tab-close.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "cancel or failed save in a later tab never commits earlier draft discard", "featureIds": [ "leave.cancel", "leave.save", "leave.role-switch" ], "source": "tools/scene-tab-close.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "all successful confirmations commit together and unmounted guards are removed", "featureIds": [ "leave.save", "lifecycle.destroy" ], "source": "tools/scene-tab-close.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "fixed model reads the exact version and downloads through its visible scene dependency", "featureIds": [ "publish.fixed-model", "permission.update" ], "source": "tools/scene-closure-assets.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "an explicit missing code cannot fall back to the first READY asset", "featureIds": [ "validation.references", "json.missing-resource" ], "source": "tools/scene-closure-assets.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "copied scene keeps its original pseudo URI but reads its own copied asset by stable code", "featureIds": [ "glb.references" ], "source": "tools/scene-closure-assets.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "a failed fixed-version lookup is evicted and the same reference can be retried", "featureIds": [ "project.retry" ], "source": "tools/scene-closure-assets.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "scene image ticket, fixed asset replacement, dependencies and coverUri commit in one versioned PUT", "featureIds": [ "cover.atomic" ], "source": "tools/scene-cover-api.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "capture failure saves content with the previous cover and reports a warning result", "featureIds": [ "cover.failure" ], "source": "tools/scene-cover-api.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "upload conflict propagates without any content PUT", "featureIds": [ "project.conflict", "cover.failure" ], "source": "tools/scene-cover-api.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "role switch waits through validation, save, and the later queued publish after dirty clears", "featureIds": [ "publish.concurrent", "leave.busy", "leave.role-switch" ], "source": "tools/scene-cover-api.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "role switch rechecks resource uploads started while the save was finishing", "featureIds": [ "leave.busy" ], "source": "tools/scene-cover-api.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "copies synchronously without bounds, gizmo, grid or selection glow, then restores before JPEG encoding", "featureIds": [ "cover.capture", "selection.highlight", "view.grid" ], "source": "tools/scene-cover-capture.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "fresh skinned placement reaches the requested size and floor after authored scale/pose replay", "featureIds": [ "assets.model-double-click", "assets.model-drop" ], "source": "tools/scene-model-placement.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "scale input accepts real GLTF normalization factors below 0.05", "featureIds": [ "property.scale" ], "source": "tools/scene-model-placement.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "fixed model dependencies are recursively collected, exact and de-duplicated", "featureIds": [ "publish.fixed-model" ], "source": "../unreal_tran_web/src/features/scene-legacy/contentApiClient.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "recovery conflict defaults to preserve and only explicit discard may remove it", "featureIds": [ "recovery.discard" ], "source": "../unreal_tran_web/src/features/scene-legacy/contentApiClient.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "per-page recovery keys prevent copied tabs from deleting each other checkpoints", "featureIds": [ "recovery.multi-session" ], "source": "../unreal_tran_web/src/features/scene-legacy/contentApiClient.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "project operation queue serializes upload, save and publish including failures", "featureIds": [ "publish.concurrent" ], "source": "../unreal_tran_web/src/features/scene-legacy/contentApiClient.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" }, { "kind": "unit", "status": "PASS", "runId": "scene-editor-2026-09-06T10:24:04.121Z", "testTitle": "an upload finishing after a project switch cannot register into the new session", "featureIds": [ "glb.pending", "lifecycle.destroy" ], "source": "../unreal_tran_web/src/features/scene-legacy/contentApiClient.test.mjs", "note": "实际执行真实方法/纯函数合同,未冒称浏览器操作" } ], "database": { "ddlChanged": false, "reason": "未新增或修改表结构;仅注册并清理测试副本、账号和角色。" }, "logSha256": { "web-build-final.log": "60909f032950078c3fc1e979de879a63626335d271a343f1eec3e9181c79a2bb", "api-build.log": "b7b7dfccd66ffba22116a7f2d1e034b0ec608b8a33d9b57226ff91c330b6abcf", "node-tests-final.log": "22f353c2a1c09f31c604fcaf7a4759cc2d652900e7090875b036b8aacc7ea56c", "scene-api-tests-final.log": "e37ac6f5e235ae4699e9b26601f72717927decbda5d7df616f680d23e2945897" } }