# M02-GMP-INPUT-001 — Player input intent seam

<!-- OPENWC_CLAIM:M02-GMP-INPUT-001:sindo-main-codex:2026-07-16 -->
<!-- OPENWC_HANDOFF:READY:M02-GMP-INPUT-001:6bd2e84 -->
<!-- OPENWC_INTEGRATION:ACCEPTED:M02-GMP-INPUT-001:14dead1 -->

## Ownership

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

## Outcome

Replace direct keyboard polling in the runtime player with remappable Input Map
actions and an immutable `PlayerInputSource → MoveIntent` boundary while
preserving the current render-sandbox movement behavior.

## Non-goals

- Extract local movement, terrain query, camera rig or character presenters.
- Claim exact build-12340 movement/keybinding parity before original-client fixtures.
- Change movement speeds, camera geometry, terrain sampling or renderer behavior.
- Mark M02 complete or edit its checklist/Evidence.

## Paths

- Exclusive: `src/domain/input/`, `src/gameplay/input/`,
  `src/tests/scenes/player_input_regression.tscn`,
  `src/tools/verify_player_input.gd`, `docs/modules/player-input.md`, this claim
- Shared/hotspots: `project.godot`,
  `src/scenes/player/third_person_wow_controller.gd`, `docs/modules/README.md`
- Generated/ignored: Godot import metadata, `.uid` files and local renderer corpus

## Contracts and data

- Public API: immutable `MoveIntent`; `PlayerInputSource.sample_move_intent`
- Configuration: additive `openwc_player_*` Input Map actions
- Persistence/schema/cache: unchanged
- Consumers: current sandbox player controller; later local movement controller

## Dependencies

- Requires: merged M01 coordinate/streaming-focus contracts on master `62eece9`
- Blocks: later M02 movement-controller extraction
- External state: none; tests use synthetic Input Map events

## Verification

- Commands: dedicated player-input verifier, headless project load, coordinate
  boundary gate, coordination/documentation gates and diff hygiene
- Fixtures: synthetic action strengths and configured default bindings
- Fidelity evidence: current W/S/A/D, Shift, E/Q and Space sandbox behavior remains
  mapped through actions; exact 3.3.5a semantics remain unverified
- Performance budget: one immutable intent allocation per physics tick; no I/O

## Documentation deliverables

- Inline API documentation for `MoveIntent`, `PlayerInputActions` and
  `PlayerInputSource`
- Player-input module specification with inputs/outputs, data-flow and sequence diagrams
- Module registry/source map and honest capability status

## Simplicity and naming

- Important names: `MoveIntent`, `PlayerInputSource`, `PlayerInputActions`
- Simplest approach: immutable value, one input adapter and one controller consumer
- Rejected complexity: input provider hierarchy, event bus and generic command framework
- Unavoidable complexity: none
- Measured optimization evidence: not applicable

## Status

- State: ready-for-review
- Done: twelve remappable actions, immutable `MoveIntent`, stateless
  `PlayerInputSource`, controller migration, asset-free regression scene,
  dedicated verifier and module specification
- Next: M02 integrator reviews and merges before local movement extraction
- Blocked by:

## Handoff

- Commit: `6bd2e84`
- Branch: `work/sindo-main-codex/m02-player-input`
- Outcome: the runtime player no longer polls physical keyboard keys. Movement
  action strengths cross an immutable `MoveIntent` seam; camera and immediate
  sandbox-flight events use the same remappable action catalog.
- Public contract: additive `MoveIntent`, `PlayerInputActions` and
  `PlayerInputSource`; no schema, cache, coordinate or renderer contract change.
- Verification: `PLAYER_INPUT PASS actions=12 intent_cases=6 controller=1
  regression_scene=1`; asset-free scene smoke exited `0`; coordinate boundary
  (`88` files) and StreamingFocus gates passed; unified renderer dry-run passed
  all eight pre-capture gates and produced seven dry-run checkpoint results;
  coordination/documentation/diff gates passed.
- Fidelity: W/S/A/D, Shift, E/Q, Space, right mouse, wheel and Escape remain the
  default sandbox bindings. Regression drives forward movement, camera zoom and
  immediate flight toggle through the real controller. This does not establish
  exact build-12340 default bindings, turn/strafe policy or gameplay movement parity.
- Local verification inputs: the isolated worktree reused the existing ignored
  native DLL and generated ADT resource scripts. Proprietary extracted data and
  the character GLB were absent, so the renderer dry-run logged the expected
  missing-corpus diagnostics while all contract steps returned success.
- Rebuild/migration: none. Action names are additive; persisted user-binding
  migration does not exist yet and is documented as a gap.
- Remaining risks: production profile gating for sprint/free flight, exact
  3.3.5a bindings, local movement/terrain/camera/presentation extraction and
  broader movement/camera state tests remain M02 work.
- Documentation: inline API comments plus `docs/modules/player-input.md` with
  inputs/outputs, data-flow and sequence diagrams, ownership, recovery,
  capability status, known gaps and source map.
