# M12-07E Status status: done task: STL normal, unit, degenerate-triangle, and trailing-byte parity updated: 2026-08-18 America/New_York enablingTask: false parityStateChange: false ## Scope The bounded STL protocol requires an explicit binary/ASCII variant and positive unit scale. It parses facet normals and vertices, applies the scale, removes zero-area triangles the same way as Blender's validated import, and rejects binary payload after the declared triangle table with `STL_TRAILING_BYTES`. Desktop Blender accepts that trailing fixture as an empty mesh, so the report records `STRICTER_WEB_BLOCK` rather than claiming exact parity for that edge case. ## Evidence - The deterministic edge generator derived a one-degenerate-triangle binary and a four-trailing-byte binary from M12-07D. Pinned Blender 5.2 was probed at unit scales 1 and 0.001 and against both edge files; it preserves normals, scales world bounds by 1000, removes one degenerate triangle, and accepts the trailing fixture as an empty mesh. - `node --test web/tests/unit/stl-import.test.mjs` passed 2/2 for binary/ASCII normals, explicit unit scaling, degenerate removal, trailing-byte rejection, and invalid scale. - `CHROME_PATH=/usr/bin/google-chrome-stable WEB_TEST_PORT=5463 node_modules/.bin/playwright test --config playwright.config.ts --workers=1 tests/e2e/stl-edge-parity.spec.ts` passed 1/1 in Chrome 150. Normal comparison is exact, Web/Desktop unit ratio matches within Float32 tolerance, and both retain one triangle after degenerate removal. - `node tools/web/check-stl-edge-parity.mjs` passed: `stl-edge-parity-ok normals=exact unitRatio=1000 degenerate=removed trailing=STRICTER_WEB_BLOCK next=M12-07F`. - Typecheck and `git diff --check` passed. The stricter trailing-byte policy leaves N-023 full parity blocked and does not expose an STL UI route. ## Artifact Hashes - parent manifest: `bbc78e47f389562e7d648bf49c9b3bf8a08aaa36e914589a6eab0a1f6e72748d` - fixture generator/desktop probe: `018013347642603c21237ebb023bdc7a4e338f5a3f875fea536a996eb121e716` / `b3d6ea197ef77b5a14f60f5e6b43d4392e943ff5d56acf73915507fc9a4161b7` - protocol/Worker: `87eec72e2b8aa7ad0b168ca0ee8c4016c941f56f5f1ac53aa5fe71d0832f1dd8` / `d714f1f3a218a2226dd349aea81c6c54efa6246de1c4fe51aaa9f5c352ef44fc` - unit/Chromium/checker: `4af52833486421c017f3af2b833b0776e60a6ab57ed66fea2161cf9674f4b243` / `121d348250e26d29ad966f7427bbef9da77de2098e2e305827b11aae52002c5c` / `b5ed7fbb41bb46fba982d5726cb8c3eaecf360b772a01d6337c309b1c4a4f535` - fixture/desktop/Web reports: `545463a984356d6635cbaae3865d13fe95bd2d841c394ac9ddff496c95d46f18` / `2d3028a3b7d97f39654cff5fcef1d0c1c71e9f2d08e3e29c2e926651ed3860f1` / `e0686cc9be3b68e564651207443e0ebf3e3b0eb3d07a32915b03f44b1908357b` - degenerate/trailing fixtures: `c120bb0f218819eb89a3607c0b4f8fafd9afb599402e3b21deaa3b2be143e7d0` / `0a30aab6db1588722067000e2a08c3c6206a8ed5b7531caa0b082723700a3681` - package: `cfb232baa494ff59f6c8d65514a08c86332ee9354350b2a0392b6f932a7ee42c` - manifest: `19a9f460d1b939c9504dadd364cb87dab3b1769b0599035e2d2b51b47091e034` ## Next Task `M12-07F`: STL Web-to-desktop round-trip and material-loss report. ## Rollback Remove the STL edge fixtures, probes, parser, Worker, tests, reports, checker, manifest, and this status entry. Restore M12-07D as the queue tail and move the machine queue back to M12-07E. No parity ledger rollback is required.