# M12-06D Status status: done task: Web GLB export generates a machine-readable loss report updated: 2026-08-18 America/New_York enablingTask: false parityStateChange: false ## Scope The production GLB exporter now has a schema-1 deterministic loss-report wrapper. It records the source SceneIR identity/revision, exportability, error/warning counts, sorted loss entries and the bounded data-block surface. Chromium opens all five M12-06C authoritative Main fixtures and sends their real snapshot/geometry/packed assets through the production exporter Worker. Exportable PBR/UV/skin/animation outputs are byte-hashed; the mesh fixture's unsupported Color Attribute shader is reported as `SHADER_GRAPH_UNMAPPABLE` and no GLB bytes are emitted. This task reports the bounded exporter surface only. It does not claim lossless GLB round-trip, desktop re-import, arbitrary shader mapping, or GLB file-picker import; those remain later M12-06E/G tasks or explicit blockers. ## Evidence - `node --test web/tests/unit/glb-loss-report.test.mjs` passed deterministic sorting/count semantics. - `node tools/web/check-glb-loss-report.mjs` passed artifact hashes, parent Main fixture binding, deterministic loss ordering, mesh fail-closed output, and four exportable fixture output hashes. It reports `fixtures=5 blocked=mesh warnings=3`. - `CHROME_PATH=/usr/bin/google-chrome-stable WEB_TEST_PORT=5445 node_modules/.bin/playwright test --config playwright.config.ts --workers=1 tests/e2e/glb-export-loss-report.spec.ts` passed 1/1. The test uses `WebEngineClient` and a production module Worker, requests packed image assets, produces the report, and compares it byte-for-byte with the checked-in golden report. - `npm --prefix web run typecheck` and `git diff --check` passed. `web/package.json` remains unchanged so previous M12 package bindings stay valid. ## Artifact Hashes - parent manifest: `e3a57636a47591e3b02dff5a07e8a0aec5e0dc43bf6b4829bffc811035dbbb31` - export protocol: `a5d342827860a9e55b49a3bb3a196a01b1e53546325d6e594778afb9360c3125` - loss report protocol: `dce9c790b2f52d46efe0908ecb044d63d21b3c6c3f7d77ddb5e697b29a7a2d6e` - Worker: `6f6294d26fe7b717416a5dd25fe834fb4b9a2ecbe8b011395c9559a26701ec77` - Chromium test: `ce334b6bb5d82c133d317e916c03711029fba1c19c634dec06c06da9eddbd776` - checker: `a23346860fa26405b2cd24591b0ab36fea29cb561ec8c2991ecfeabcffc17ee1` - unit: `dfcc2d968e4e0c0cef4496bc304cb481f10d1f0dc4c76a40ea1d6e2f11b6b708` - web loss report: `c6db52234d867985ef5fbcdc7c62298ec9aaa013028b5a54e2b9a16aa4133397` - package: `cfb232baa494ff59f6c8d65514a08c86332ee9354350b2a0392b6f932a7ee42c` - manifest: `c01c5861d493e1f177e8cde3038bc5283a7671fa39bf84484662d307623325a2` ## Next Task `M12-06E`: desktop Blender re-imports Web GLB and compares the canonical report. ## Rollback Remove the loss-report protocol/Worker, checker, manifest, golden report, Chromium test, and this status entry. Restore M12-06C as the queue tail and move the machine queue back to M12-06D. No parity ledger rollback is required.