# M02-GMP-MOVEMENT-001 — Local movement state/controller

<!-- OPENWC_CLAIM:M02-GMP-MOVEMENT-001:sindo-main-codex:2026-07-16 -->
<!-- OPENWC_HANDOFF:READY:M02-GMP-MOVEMENT-001:435e1c9 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M02-GMP-MOVEMENT-001:5206c42 -->

## Ownership

- Target: M02
- Program: GMP
- Owner/Agent ID: sindo-main-codex
- Branch: `work/sindo-main-codex/m02-local-movement`
- Lease expires UTC: 2026-07-16
- Integrator: M02 milestone integrator

## Outcome

Move local velocity, sandbox flight state, acceleration and directional speed
calculation from `ThirdPersonWowController` into a scene-free,
independently-testable local movement controller without changing current
sandbox motion.

## Non-goals

- Extract terrain queries, camera rig, character presentation or animation.
- Add jump/fall/swim, server prediction or reconciliation.
- Change current movement speeds, acceleration, camera-relative flight or ground snap.
- Gate debug movement by build profile; that remains a separate M02 package.
- Mark M02 complete or edit its checklist/Evidence.

## Paths

- Exclusive: `src/gameplay/movement/`,
  `src/tools/verify_local_player_movement.gd`,
  `docs/modules/local-player-movement.md`, this claim
- Shared/hotspots: `src/scenes/player/third_person_wow_controller.gd`,
  `src/tools/verify_player_input.gd`, `docs/modules/player-input.md`,
  `docs/modules/README.md`
- Generated/ignored: local `.godot`, native DLL, generated ADT resources and renderer corpus

## Contracts and data

- Public API: stateful `LocalPlayerMovementController`
- Inputs: immutable `MoveIntent`, local Godot movement basis and physics delta seconds
- Outputs: local Godot displacement and read-only velocity/flight state
- Schema/cache/coordinate contracts: unchanged
- Consumer: current sandbox player scene; later gameplay composition root

## Dependencies

- Requires: merged input seam on master `14dead1`
- Blocks: terrain query and camera/presentation extraction from the player hotspot
- External state: none; unit tests use synthetic intents and bases

## Verification

- Commands: dedicated pure movement verifier, player-input regression, asset-free
  scene smoke, coordinate/StreamingFocus gates, renderer dry-run and repository gates
- Fixtures: identity/rotated/pitched bases, acceleration steps, sprint and flight transitions
- Fidelity evidence: exact current 7.0/4.5/4.5 speeds, 28.0 acceleration,
  6x sandbox sprint and camera-relative free flight are regression-locked only
- Performance budget: one small state update per physics tick; no allocation, I/O or scene lookup

## Documentation deliverables

- Inline public API docs for movement state/configuration and update methods
- Local movement module specification with data-flow, state and sequence diagrams
- Updated player-input consumer diagram/status and module registry

## Simplicity and naming

- Important name: `LocalPlayerMovementController`
- Simplest approach: one stateful RefCounted owning velocity and flight toggle
- Rejected complexity: generic locomotion framework, ECS component hierarchy and event bus
- Unavoidable complexity: movement basis remains an explicit local-space input
  so the pure controller does not discover player/camera Nodes
- Measured optimization evidence: not applicable

## Status

- State: ready-for-review
- Done: scene-free movement state/controller, player scene migration, twelve
  numeric cases, two flight transitions, integrated regression and module documentation
- Next: M02 integrator reviews and merges before TerrainQuery extraction
- Blocked by:

## Handoff

- Commit: `435e1c9`
- Branch: `work/sindo-main-codex/m02-local-movement`
- Outcome: `ThirdPersonWowController` no longer owns velocity, flight state,
  acceleration or directional speed calculation. It selects an explicit
  Godot-world basis, applies returned displacement, and retains terrain and
  presentation adapters for later M02 packages.
- Public contract: additive `LocalPlayerMovementController` with read-only
  Godot-world velocity/flight state, `toggle_sandbox_flight` and `advance`.
  Input, coordinate, cache and renderer contracts remain unchanged.
- Verification: `LOCAL_PLAYER_MOVEMENT PASS cases=12 state_transitions=2
  scene_boundary=1`; `PLAYER_INPUT PASS actions=12 intent_cases=6 controller=1
  regression_scene=1`; asset-free scene smoke exited `0`; coordinate boundary
  and StreamingFocus passed; renderer dry-run passed all eight pre-capture gates
  and seven checkpoint plans; coordination/documentation/diff gates passed.
- Fidelity: exact existing defaults are regression-locked—forward `7.0`,
  backward/strafe `4.5`, acceleration `28.0`, sandbox sprint `6x`, vertical
  flight `7.0`, velocity reset on toggle and camera-relative pitched flight.
  This preserves the sandbox baseline but is not original-client evidence.
- Local verification inputs: the isolated worktree reused the existing ignored
  native DLL and generated ADT resource scripts. Proprietary extracted data and
  character GLB were absent, so renderer dry-run logged expected missing-corpus
  diagnostics while every contract step returned success.
- Rebuild/migration: none; transient movement state is not persisted.
- Remaining risks: exported speed changes after `_ready` do not reconfigure the
  controller; exact build-12340 movement semantics, terrain/collision state,
  jump/fall/swim, server prediction and debug profile gating remain open.
- Documentation: inline public API plus `docs/modules/local-player-movement.md`
  with inputs/outputs, data-flow, state and sequence diagrams, ownership,
  recovery, capability status, risks and source map; player-input consumer
  diagrams/status were updated.
