Files
open-wc/coordination/claims/M02-GMP-MOVEMENT-001.md
T
sindoring 1bf5b526be qar(M02): close player decomposition milestone
Work-Package: M02-QAR-INTEGRATOR-CLOSEOUT-001
Agent: sindo-main-codex
Tests: all M02 contracts, renderer dry-run, documentation and coordination gates passed
Fidelity: direct binding evidence and reference-only timing/routing are separated; remaining locomotion/camera gaps stay explicit
2026-07-15 23:35:00 +04:00

5.6 KiB

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

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.