# M03-RND-WMO-RENDER-BUILD-PLANNER-001 — WMO render build step planner ## Ownership - Target: M03 - Program: RND - Owner/Agent ID: sindo-main-codex - Branch: `work/sindo-main-codex/m03-wmo-render-build-planner` - Lease expires UTC: 2026-07-20 - Integrator: M03 milestone integrator ## Outcome Extract the pure one-operation WMO render build cursor decision from the loader while preserving mesh-before-MultiMesh ordering and one budget permit per group. ## Non-goals - Move Nodes, Resources, materials, jobs, queues, cancellation or permits. - Change WMO placement, cache loading, transforms, visibility or shadows. - Change build ordering, group names, editor ownership or finalization thread. - Change cache formats, settings, presets or renderer diagnostics. - Claim asset-backed WMO fidelity or p95/p99 acceptance. ## Paths - Exclusive: `src/render/wmo/wmo_render_build_step_planner.gd`, `src/tools/verify_wmo_render_build_step_planner.gd`, `docs/modules/wmo-render-build-step-planner.md`, this claim - Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`, `docs/modules/world-renderer.md`, `docs/modules/README.md`, `RENDER.md`, `targets/03-renderer-facade.md` - Generated/ignored: `.godot`, native DLL, generated ADT/WMO resources, caches and proprietary renderer corpus ## Contracts and data - Input: mesh count/index and MultiMesh count/index - Output: `mesh`, `multimesh` or `complete` operation, selected index and next cursor values - Mesh is selected while its cursor is below count; MultiMesh is selected only after mesh exhaustion; complete follows both exhausted ranges - Loader retains cursor adoption, Resource array access, Node creation, material refresh, ownership, queue cancellation and budget permit consumption - Cache/schema/coordinate/profile versions: unchanged ## Dependencies - Requires: current master `1e73e59`, accepted WMO placement registry/resolver - Blocks: further WMO render build state decomposition - External state: none; verification uses scalar synthetic fixtures ## Verification - Commands: dedicated ordering/cursor/empty/raw-edge/source/timing verifier; WMO registry/resolver/material/shutdown plus M2/terrain/facade/internal-access/ manifest/scheduler/streaming/coordinate/docs/coord gates - Fidelity evidence: exact mesh-first, one-step cursor behavior preserved - Performance budget: 20,000 pure plans under 1 second; no Node, Resource, RID, task, queue, mutex, cache or file access ## Documentation deliverables - Inline public planner API documentation - New module spec with inputs/outputs, data flow, sequence, ownership, failure/recovery, performance/fidelity limits and source map - Renderer module registry, world renderer and `RENDER.md` updates ## Simplicity and naming - Important name: `WmoRenderBuildStepPlanner` - Simplest solution: one stateless function and three operation constants - Rejected complexity: job class, iterator, generic cursor framework, callbacks, signals or ownership of engine objects - Unavoidable complexity: loader still has separate mesh/MultiMesh materializers - Measured optimization evidence: bounded synthetic planning loop ## Status - State: claimed - Done: cursor and ownership boundary published - Next: implement planner, migrate loader decision, tests and docs - Blocked by: ## Handoff - Commit: - Results: - Remaining risks: - Documentation updated: