# M9-14 Status status: done task: Curve、Grease Pencil、Paint 三编辑域故障恢复闭环 updated: 2026-08-16 America/New_York ## Scope `web/protocol/editing-domain-recovery.ts` freezes one schema-v1 evidence shape for the three domains. Each report must prove Main identity, Worker generation, OOM fault mapping/cleanup, WebGL2 resource release/reinitialization, and a visible small-scene recovery. Save/reopen may reset the logical Main revision; the content identity SHA-256 remains the authoritative recovery check. ## Evidence - Curve fixture: `tests/files/web/nonmesh_scene.blend`, SHA-256 `ae8ef85d606aa120ce6b7611fc03407fd80bb60311e94a6ef73f6384d0b6c8b4`. - Grease Pencil fixture: `tests/files/web/modifier_grease_pencil_scene.blend`, SHA-256 `3a8525077807f9178dac3a5ba84b524e5f8e80874b15c54e2a6658ecb80315a3`. - Paint fixture: `tests/files/web/attribute_scene.blend`, SHA-256 `12fa75bb79f8c38e660d3d2a8fc9cc16dd3df4fc9208b0e2ad94fb1f8aa68f71`. - `WEB_TEST_PORT=5435 npm --prefix web run test:editing-domain-recovery`: unit 3/3 and Chromium 1/1. All three reports returned `RECOVERED` for Worker restart, OOM, GPU release and small-scene stages. - Full unit suite: 127/127 tests passed. - `npm --prefix web run typecheck`: passed. - `npm --prefix web run lint`: passed. - `npm --prefix web run build`: passed, Vite production bundle transformed 73 modules. - `git diff --check`: passed. ## Implementation hashes - Protocol: `42ab53dde3161ec31ca7de420046a2c06f58408b3ac4919c9904e02d875af258`. - Browser runner: `2bb9805795fc2104e5443207a08951ac7684e67913064d6795c9d165b0c54c7e`. - Unit test: `ca565149e7769b40f59e865e42d2dfb0f4ecb2a4655371004678c14536ec9ef6`. - Chromium test: `7ab3421d1b44eb78d13525f67a26f1f6ed20816ae9b43c010c9ed3ebdf32c09a`. - Golden manifest: `f548052f39f6259f30b0569528160512aad955e61e8e8559e0d553c30d5619f9`. ## Recovery boundaries - Worker restart uses a fresh `WebEngineClient`/Worker and reopens the saved bytes; stable domain identity is required, while revision reset on a newly serialized `.blend` is accepted and recorded. - OOM uses the token-isolated `GPU_GEOMETRY_UPLOAD` fault point. A tracked texture lease is released before close; the matching error is `GPU_GEOMETRY_BUDGET_EXCEEDED`, with zero live temporary resources. - GPU release disposes geometry, material and renderer once, then creates a fresh WebGL2 renderer and requires non-zero pixels for the same domain probe. - Small-scene recovery requires the reopened data IDs, identity hash, object count and visible pixels to match the committed baseline. ## Rollback Remove the M9-14 protocol/runner/tests/golden and package script together. Existing Curve, Grease Pencil and Paint writers remain unchanged; no persisted schema or release metadata migration is required.