# WBV2 next migration waves Date: 2026-09-01 The current function-module epoch ends at `WBV2-P1130-001`. It contains 37 completed source-backed modules plus the bridge/root and successor-authorization tasks. It is a verified migration slice, not full Blender parity: the immutable inventory remains 6900 total and effective `290/6609`. ## Completed and reusable - Core scene, mesh, material, non-mesh, nodes, asset, sculpt, editor, object, compositor, audio/particle and rig modules: reuse their receipts by SHA-256. - GLB mesh/non-mesh roundtrip dependency repair: `WBV2-P1123-000`. - Historical M12 drift audit: `WBV2-P1124-000`; 84 entries across 43 paths are `BLOCKED_SOURCE_LOST`, with old manifests untouched. - Geometry Nodes allowlist/Main persistence and typed unsupported mapping: `WBV2-P1125-000`. - Grease Pencil viewport selection/marquee on main and Offscreen Chromium: `WBV2-P1126-000`. - Tracking Mask reader/interaction: `WBV2-P1127-000`. - ffmpeg.wasm MOVIE probe/proxy fallback: `WBV2-P1128-000`; local core resources are hash-bound and upstream source is checked out at `f876f907c7e9b9bf51d4ed0b913a855a63ae63fc`. - Core Scene Graph compositor/performance/sampling settings: `WBV2-P1129-001`; reused P65/P66/P67 source receipts and added one aggregate Chromium Main transaction receipt. - UI Editor View2D state: `WBV2-P1130-001`; dedicated adapter preserves Graph/Dope Sheet `cur` and pixel `mask` without changing the P1102 parser. - Web-safe Sound/Speaker/ParticleSettings retention uses authoritative Main Scene IDProperty; desktop Audaspace stays disabled. ## Ordered follow-up waves 1. `IO_LIBRARY_HASH_REHYDRATION`: use `M12-manifest-sha-drift.json` and current observed hashes to produce corrective evidence; recover original bytes only from trusted cache. Never re-sign old manifests. 2. `UI_EDITOR_FAMILY`: split the 3930 UI rows by editor/workspace/region behavior, reusing existing Main reader/context and keyboard/layout evidence without duplicate E2E. 3. `MEDIA_IO_FAMILY`: extend image/audio/video routes around the ffmpeg.wasm Worker; add a new receipt for each distinct codec/container contract. 4. `NODES_SIMULATION_FAMILY`: extend only for a new node family or simulation lifecycle with distinct Main mutation and recovery evidence. 5. `MESH_EDITING_FAMILY`: select remaining UV/material-slot/topology rows not represented by existing aggregate fixtures. 6. `OTHER_OPERATORS_CORE_SCENE`: cluster remaining operators by Main ownership and save/reopen semantics, then run source-backed modules only. ## Execution shape for the remaining inventory The 6,609 effective pending rows are a coverage ledger, not 6,609 independent implementations. The implementation unit remains: ```text owner family -> source-backed module -> shared command/reader -> operator case matrix ``` For every new module, use this bounded sequence: 1. Generate a deterministic family slice from the immutable P0 inventory. Each row must have one primary module, one behavior marker, an implementation class, and a source path. Existing receipts are linked by SHA-256 instead of reimplemented. 2. Freeze a small positive/negative/reopen contract. Implement the real Blender Main, WebEngine, WASM ABI, Worker/protocol and frontend path once for that behavior. 3. Run the mapped case matrix in shards against the same catalog/source snapshot. Shards may run concurrently inside a module, but queue handoff remains serial and follows the parent manifest only. 4. Aggregate source hashes, positive and negative counts, no-mutation/recovery evidence, undo/redo, save/reopen, deterministic replay and Chromium results into one receipt. Only then may an effective-ledger overlay add coverage; the original inventory and historical manifests stay unchanged. The recommended batching is by shared ownership, not by operator name: | Batch | Module slices | Planning scope | Required reuse | | --- | --- | ---: | --- | | Provenance gate | `IO_LIBRARY_HASH_REHYDRATION` | 84 drift entries / 43 paths | M12 corrective report; trusted cache only; never re-sign | | UI | editor/workspace/region context, input, layout persistence | 3,930 | `UI_EDITOR`, `UI_INPUT_INTERACTION`, Main context readers | | Media | image/audio/video container and codec contracts | 585 | `SEQUENCER_MOVIE_CODEC`, local ffmpeg.wasm Worker, media retention | | Nodes | node families, sockets, simulation lifecycle | 543 | `NODES_GRAPH`, `NODES_SIMULATION`, typed unsupported mapping | | Mesh | UV, material slots, topology and edit history | 431 | `SCENE_OBJECT_MESH`, mesh transaction/history fixtures | | Rig/Object | remaining rig, constraint, object ownership behaviors | 691 | `RIG_ANIMATION`, `OBJECT_OPERATIONS`, depsgraph recovery | | Simulation | non-node physics/cache lifecycles | 155 | `SIMULATION_CACHE`, `ENGINE_RUNTIME` | | Material/Render | unrepresented material and render settings | 125 | `SHADER_MATERIAL`, `RENDER_PIPELINE` | | Sculpt/Paint | remaining stroke, mask and paint data paths | 117 | `SCULPT_PAINT`, `PAINT_STROKE` | | Other/Core | residual operators and core Scene graph ownership | 169 | Main ID ownership, save/reopen and explicit unsupported routing | Planning scopes overlap where one legacy row belongs to more than one observable behavior; they must not be summed to claim more than the 6,609 effective pending rows. The provenance gate is a separate corrective lane: it must be recorded before any completion overlay is changed, but a source-lost result does not block an unrelated source-backed module once that status is explicit. Every successor still requires its own source-backed slice and parent manifest authorization. ## Per-family exit gates A family remains `in_progress` until every selected module has all of the following: - stable source, protocol, Worker/frontend and fixture hashes; - a real Main mutation or an exact Main reader/context result; - positive, malformed/unsupported and no-mutation cases; - undo/redo where the behavior mutates state, plus save/reopen and deterministic replay; - Chromium-only production evidence and an aggregate manifest with shard exit codes; - an explicit `VERIFIED`, `UNSUPPORTED`, `ENVIRONMENT_UNAVAILABLE`, `HASH_DRIFT` or `SOURCE_LOST` result for every mapped case. Failure, hash drift, missing source, budget exhaustion or browser unavailability stops the current module and preserves the parent `nextTask`. It never reduces the pending count and never creates a corrective duplicate of an existing receipt. ## Progress accounting Report three numbers independently after each handoff: source-backed modules completed, effective inventory coverage, and legacy regression coverage. The current baseline is `37` modules / `41` module tasks, `290/6609` effective, and `281/6618` legacy. A module receipt may increase effective coverage only when its case-to-inventory mapping is hash-bound; implementation or build success alone does not. ## Verification rules - Chromium only; use an isolated `WEB_TEST_PORT` for every Playwright lane. - Read the queue, print fresh context, and run context checks before edits. - Do not rerun a completed module merely to refresh logs. - Keep unsupported, environment-unavailable, hash-drift and source-lost states explicit. - A module advances only after source hashes, positive/negative/recovery evidence, save/reopen, deterministic replay and aggregate manifest pass. - The 6900 inventory and historical manifest meaning remain immutable. ## External scheduler checkpoint `print-wbv2-live-status.mjs` still reports the old scheduler/guardian/supervisor checkpoint blocked at `P594`. That state is unrelated to the local authoritative capability queue and remains read-only until an explicit scheduler recovery task is authorized.