# NEO-27 — Manual QA checklist

Story: [NEO-27](https://linear.app/neon-sprawl/issue/NEO-27/e1m3-slice-3-telemetry-hook-sites-target-changed)  
Plan: [`docs/plans/NEO-27-implementation-plan.md`](../plans/NEO-27-implementation-plan.md)

## Preconditions

- Game server running (`server/NeonSprawl.Server`).
- Godot client opens `client/project.godot` and runs `scenes/main.tscn`.
- In the scene, `TargetSelectionClient.log_selection_events` is enabled (`true`).

## Checks

- [ ] **`target_changed` dev token appears on lock transition**
  - Press `Tab` to acquire a target lock or switch lock ids.
  - Verify Godot Output prints a line prefixed with `[TargetSelectionClient] target_changed`.
  - Confirm payload includes `previous`, `next`, `cause`, and `sequence`.

- [ ] **No `target_changed` log on validity-only updates**
  - Hold a lock, move to force `validity` changes (`ok` ↔ `out_of_range`) without lock-id change.
  - Verify `target_state_changed` behavior remains, and no new `target_changed` log is printed for id-unchanged refreshes.

- [ ] **Ability telemetry reserves are documented (not implemented)**
  - Confirm comment block exists in `client/scripts/main.gd` naming `ability_cast_requested` and `ability_cast_denied`.
  - Confirm comments include `TODO(E9.M1)` and reference E1.M4/E5.M1 as future wiring points.

## Expected outcome

- Slice 3 telemetry hook names are explicitly present in code/docs:
  - Active hook mapping: `target_changed`.
  - Reserved hook names: `ability_cast_requested`, `ability_cast_denied`.
- No production telemetry pipeline is introduced in this story.
