# M12-07H Status status: done task: PLY vertex/face/color/custom property mapping and unknown property loss report updated: 2026-08-18 America/New_York enablingTask: false parityStateChange: false ## Scope The production `ply-import` protocol now accepts explicitly declared ASCII and binary little-endian PLY. Vertex position, normal, RGBA color, numeric custom properties, face indices, and numeric face properties are mapped into a bounded canonical document. Unsupported vertex/face list properties and unknown elements are skipped with deterministic `PLY_UNKNOWN_PROPERTY`/`PLY_UNKNOWN_ELEMENT` loss warnings; mapped fields remain available. The worker serializes the canonical document to bounded ASCII PLY for desktop validation. This task does not expose a general PLY file-picker route or claim full PLY attribute parity. ## Evidence - `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generate-ply-mapping-fixtures.py -- tests/files/web/m12_ply_mapping_v1 tests/golden/M12-07H/mapping-report.json` generated deterministic ASCII and binary little-endian fixtures containing four vertices, two faces, RGBA colors, and two numeric custom vertex attributes. A derived ASCII fixture contains an unsupported list property. - `node tools/web/check-ply-mapping-fixtures.mjs` matched pinned Blender 5.2 runtime identity, artifact hashes, field counts and a fresh byte-for-byte regeneration: `ply-mapping-fixtures-ok vertices=4 faces=2 colors=rgba custom=2 unknown=PLY_UNKNOWN_PROPERTY deterministic=true next=M12-07I`. - `node --test web/tests/unit/ply-import.test.mjs` passed 3/3. It covers both encodings, mapped values, unknown-property loss, serialization/reopen, and format mismatch blocking. - `UPDATE_PLY_MAPPING_REPORT=1 CHROME_PATH=/usr/bin/google-chrome-stable WEB_TEST_PORT=5472 node_modules/.bin/playwright test --config playwright.config.ts --workers=1 tests/e2e/ply-web-roundtrip.spec.ts` passed 1/1. Production Chromium Worker parsed both encodings, reported unknown loss, serialized ASCII, and pinned Blender 5.2 re-imported the result with exact vertex/face/position counts and mapped custom/color attributes. - `npm --prefix web run typecheck`, `node --check tools/web/check-ply-mapping-fixtures.mjs`, and Python compile checks passed. ## Artifact Hashes - protocol: `058a3263fde553637840a4e9ad4e8e9d923eb52c250f8000317c7f43a228881d` - worker: `f6bf5e39e83286d7b257bbdce88f4d7fa027c64651da9765567788b5cf298c71` - generator: `ffc051eccfc6973ee00cc791cdbd641fcce308b4083741e3e6ae82291d9347b7` - checker: `2b055dbc705830848efdf4d8db8543a3ccc684de1f258732bcafefa86cf65c3a` - desktop importer: `6edbc6e401a1a902dcfd11c4d767e8c8620d694e40eb4ca29dd8479f9c55ef37` - unit/e2e: `b03a5f4b4b2a974fa26e653763470b92d1433c5d352ae09ab5492b841e6e5e1f` / `2cadebc89057655d78e9b520bb6adf9debb27c6d783cd002efee08d269636fb9` - desktop mapping report: `8a02fc9e364ed79e50ef00897affa9ab63808d3cb3cdabd00fdb8ee4c26ec18a` - Chromium/desktop round-trip report: `1ca9d3b7870fcc8c9e3c9bbbd90ef48bd13bbc9ae0462312c9482f24f05f13ec` - ASCII/binary/unknown fixtures: `acaa369c17252d4d089a2e3064d0c1fcdfdb2d066759ed160adf7869d3e859d5` / `d0fc195fd1a101c42ac984a2382bccdddb7d0bf60dd618e9f637c964f1b30b9e` / `a994c7126f235d0067ce4af35f8b0c6699cc83073e2a37e982edd45ece459f33` ## Next Task `M12-07I`: PLY big-endian, malformed list, and oversized count stable blocking. ## Rollback Remove the PLY mapping protocol, worker, fixture generator/checker, fixtures, reports, tests, package script, and this status entry. Restore M12-07G as the queue tail and move the machine queue back to M12-07H. No parity ledger rollback is required.