# M01-RND-STREAMING-FOCUS-001 — Explicit streaming focus contract ## Ownership - Target: M01 - Program: RND/FND - Owner/Agent ID: sindo-main-codex - Branch: `work/sindo-main-codex/m01-streaming-focus` - Lease expires UTC: 2026-07-15 - Integrator: M01 milestone integrator ## Outcome Introduce a scene-free `StreamingFocus` value and make runtime/test streaming consume it through an explicit source or public setter instead of discovering the active `Camera3D` from a viewport. ## Non-goals - Extracting `WorldRenderFacade` or `StreamingTargetPlanner` from the monolithic loader. - Adding direction, velocity, frustum or multi-focus planning. - Decomposing the player controller before M02. - Changing terrain, M2, WMO, liquid, cache or LOD formulas. ## Paths - Exclusive: `src/domain/streaming/`, `src/tools/verify_streaming_focus.gd` - Shared/hotspots: `src/scenes/streaming/streaming_world_loader.gd`, `src/scenes/streaming/eastern_kingdoms_streaming.tscn`, `src/scenes/streaming/kalimdor_streaming.tscn`, renderer diagnostic tools, `docs/modules/world-renderer.md`, this claim - Generated/ignored: local extracted assets, renderer caches and Godot import metadata ## Contracts and data - Public API: immutable `StreamingFocus`; loader `set_streaming_focus` and `refresh_streaming_focus` - Source adapter: explicit `streaming_focus_source_path` may reference any `Node3D` - Migration: runtime scenes use player focus; capture/probe tools explicitly use their dedicated camera as the source - Compatibility: streaming radii/LOD/cache behavior and coordinate contract v2 unchanged ## Dependencies - Requires: coordinate contract version 2 and golden fixtures at `52e1b2b` - Blocks: M01 renderer/test focus exit criterion and later renderer facade extraction - External state: no new dependency or proprietary input ## Verification - Commands: streaming focus contract/integration verifier, renderer baseline manifest/calibration, headless scene smoke, coordination/documentation gates - Fixtures: Node3D player-style source and explicit capture-style setter - Fidelity evidence: existing seven renderer checkpoints and build-12340 coordinate calibration must remain unchanged - Performance budget: one scalar focus snapshot per configured streaming interval; no new per-tile or per-chunk work ## Documentation deliverables - Inline public API docs: focus value and loader public methods - Module specification: inputs/outputs, ownership, lifecycle, failure/recovery and source map - Data-flow diagram: player/editor/capture source to focus contract to loader - State/sequence diagram: focus sampling and refresh threshold sequence ## Simplicity and naming - Important names introduced: `StreamingFocus`, `streaming_focus_source_path`, `set_streaming_focus`, `refresh_streaming_focus` - Simplest considered solution: one immutable value plus one explicit scene adapter path - Rejected complexity/abstractions: provider interface hierarchy, service locator, multi-focus registry and predictive motion fields - Unavoidable complexity and justification: editor viewport remains a separate adapter because its camera is owned by `EditorInterface` - Measured optimization evidence: not applicable ## Status - State: active - Done: scope and contract boundary selected - Next: implement contract, runtime/test migration, tests and documentation - Blocked by: