# M11-12 Status status: done task: keep final video encoding on an explicit server-export capability route updated: 2026-08-17 America/New_York ## Scope Schema 1 final-export requests bind the Main timeline ID/revision, source `.blend` SHA-256, bounded frame range and rational frame rate, output dimensions, and one declared container/video/audio codec combination. The canonical encoding settings and the complete source identity receive separate SHA-256 hashes, so source revision drift and settings drift produce different request identities. The only route is `SERVER_EXPORT`. A missing endpoint fails closed with `SEQUENCER_EXPORT_SERVER_UNAVAILABLE`; a configured endpoint returns `SERVER_EXPORT_REQUIRED`, not local success. Browser `VideoEncoder` availability is recorded for diagnostics only and cannot change the route or the invariant `localEncoding=BLOCKED`. This task does not claim a server encoder implementation, upload/progress/cancellation, audio mixing, or encoded-output verification. ## Evidence - `WEB_TEST_PORT=5579 npm --prefix web run test:sequencer-final-export`: unit 4/4 and Chromium 1/1 passed on the first complete run. - Chromium opened the real Blender 5.2 `sequencer_scene.blend` through WebEngine Main and bound timeline `sequencer:scene:SequencerScene`, revision 1, frames 1..250, 24000/1001 FPS, and source SHA-256 `5f5212487bb6b5df62b5ca915c75133f1ca45678614712ea4c7d902d823cd90c`. - The fixed settings hash is `01e39d1fdd88c75aecad7bc48a2b756bbcd645929963528b42ceb180b51e5566`; the source/timeline/settings request hash is `20d3a9e333804e014a993a9892a557842293fc44902229dd6eb65661f0691cfc`. - No-server, server-without-encoder, server-with-injected-encoder, and actual Chromium runtime cases all retained the server route and blocked local encoding. Undeclared fields, invalid codec combinations, over-budget ranges, and environment drift returned `SEQUENCER_EXPORT_REQUEST_INVALID`. - Regression passed: M11-09 unit 3/3 plus Chromium 1/1, M11-10 unit 3/3 plus Chromium 1/1, M11-11 unit 4/4 plus Chromium 1/1, one-million-frame long-media 1/1, Sequencer Main reader, full Node 187/187, typecheck, lint, and production build (75 modules). ## Artifact Hashes - protocol: `559516163ce9a9c60917033455c71a1ae6be2f34666371f12723a056ddfdb3dd` - browser adapter: `f9f193eb71afa48a23b4eb618cd98b5c0064c59943b3652fb6a601b545ac175c` - app protocol exports: `d30783528fabaaefe8835998e11d75da357d265ee06db67713e57e4b85b58d7d` - error contract: `747894b216db59c753b24ce85eb946925e64340f63684311e5d9628c9a6a9c8e` - unit: `6f5030852e89160fd898b2aff4dc9911963342bd6c2301a2c0e8a3d518ddbcbd` - Chromium spec: `d8cba79c9a330c1e5c777c8f0ed08362b29f50702c31d8229fd65f4304bce363` - golden: `c0061f82ef156e53ad4dfc6aedf7c6a8f53e616d8d9fa1435fd9491ba3d07e01` - package: `83ee5bfa50a0e5b742048d4563ae815171232a121cf3df4a1e813f21313a6509` ## Rollback Remove the final-export protocol/browser adapter/tests/golden and package command, remove the two export error codes and SequencerTimeline exports, restore M11 to 11/14, and remove the N-021 final-export completed slice. Keep M11-09/10/11 decode, proxy, and revision gates and the existing `sequencerRuntimeCapabilities().localEncoding=BLOCKED` contract.