# M02-GMP-SANDBOX-CAPABILITIES-001 — Debug movement capability gate ## Ownership - Target: M02 - Program: GMP/FND - Owner/Agent ID: sindo-main-codex - Branch: `work/sindo-main-codex/m02-sandbox-capabilities` - Lease expires UTC: 2026-07-16 - Integrator: M02 milestone integrator ## Outcome Introduce an immutable local-player movement capability contract and require it at the movement boundary so debug sprint and free flight execute only in the explicit `RenderSandbox` profile and are rejected by `Blizzlike335`. ## Non-goals - Claim that current movement values or `Blizzlike335` locomotion are 1:1. - Build a global application/profile framework before the application shell exists. - Remove debug Input Map actions or change their current sandbox bindings. - Implement jump, fall, swim, collision, server authority or reconciliation. - Mark M02 complete or edit its checklist/Evidence. ## Paths - Exclusive: `src/gameplay/movement/player_movement_capabilities.gd`, `src/tools/verify_player_movement_capabilities.gd`, this claim - Shared/hotspots: `src/gameplay/movement/local_player_movement_controller.gd`, `src/scenes/player/third_person_wow_controller.gd`, movement/input verifiers, player regression scene, `docs/modules/local-player-movement.md`, `docs/modules/player-input.md` - Generated/ignored: local `.godot`, native DLL, generated resources and renderer corpus ## Contracts and data - `PlayerMovementCapabilities` owns immutable profile ID plus explicit debug sprint/flight booleans and safe named factories. - `LocalPlayerMovementController` requires the capability value; missing input falls back to `Blizzlike335`, never sandbox. - Player scene maps its exported profile selection once at the composition boundary. - Input actions and `MoveIntent` remain unchanged; rejected debug requests have no effect. ## Dependencies - Requires: merged character presentation package on master `8c71e46`. - Blocks: final M02 integration audit and milestone closeout. - External state: none; verification is asset-free. ## Verification - Pure profile factory/default and immutability regression. - Sprint accepted in RenderSandbox and ignored in Blizzlike335. - Flight toggle/vertical basis accepted in RenderSandbox and rejected in Blizzlike335. - Real regression scene verifies both profile compositions. - Existing input/movement/terrain/camera/presentation and renderer gates remain required. - Fidelity evidence: negative proof that debug capabilities cannot affect the compatibility profile; no positive movement parity claim. ## Documentation deliverables - Inline public API and profile semantics on the capability/controller boundary. - Updated movement and input specs: API, inputs/outputs, data flow, lifecycle, failure/recovery, capability matrix and source map. ## Simplicity and naming - Important name: `PlayerMovementCapabilities`. - Simplest approach: one immutable value injected into the existing controller. - Rejected complexity: autoload singleton, generic feature-flag service and global profile registry. - Unavoidable complexity: one profile-to-capability mapping at scene composition. - Measured optimization evidence: not applicable. ## Status - State: active - Done: claim and isolated worktree from merged presentation master - Next: implement capability contract, gate controller/player and add regressions - Blocked by: