neon-sprawl/client/scripts
VinPropane 435a32b3b3 NEO-24: fix movement-driven target refresh via authoritative_ack signal
Review 2026-04-21 caught that the hybrid soft-lock refresh path is
unreachable during normal WASD locomotion. `main.gd` was wiring
`TargetSelectionClient` to `PositionAuthorityClient.authoritative_position_received`,
which only fires on boot sync and move-rejection resync — successful
`move-stream` 200s are intentionally silent to avoid RTT rubber-banding.
So walking out of an alpha/beta radius never triggered the throttled
`GET /target` the HUD depends on, and validity stayed stuck at `ok`.

Add a separate `authoritative_ack(world)` signal on `PositionAuthorityClient`
emitted from both `BOOT_GET` 200 and successful `move-stream` 200, and
switch `TargetSelectionClient` (+ `main.gd`) to it. The snap signal keeps
its current semantics so rubber-band suppression is untouched; the ack
signal is a pure heartbeat that cooldown-throttled consumers can hook.

Also adds an integration test that wires both real clients together (per
the review's suggestion 1) so renames or mis-wires between the two
scripts fail loudly rather than silently skipping the end-to-end path.

- `client/scripts/position_authority_client.gd`: new `authoritative_ack`
  signal; extracted `_parse_world_from_response` helper to share JSON
  parse across `BOOT_GET` and `STREAM_POST`; emit ack from both.
- `client/scripts/target_selection_client.gd`: rename
  `on_authoritative_position_snap` to `on_authoritative_ack`; drop
  `apply_as_snap` gate (no longer meaningful).
- `client/scripts/main.gd`: connect the new signal.
- `client/test/position_authority_client_test.gd`: assert ack on boot
  200 and stream 200.
- `client/test/target_selection_client_test.gd`: rename tests for new
  handler.
- `client/test/target_refresh_on_locomotion_test.gd`: new integration
  suite wiring real authority + target clients.
- Plan Decision 3 + Tests row + Files-to-modify row updated.
- `docs/reviews/2026-04-21-NEO-24.md`: committed with blocking issue +
  suggestions struck through with `Done.` notes per
  planning-implementation-docs rule.
- `docs/decomposition/modules/documentation_and_implementation_alignment.md`:
  E1.M3 row now reflects NEO-24 landed.
- `client/README.md` + `docs/manual-qa/NEO-24.md`: refreshed signal names
  so the soft-lock refresh description matches the wiring.

Tests: 88/88 GdUnit headless passed locally.
2026-04-21 22:35:41 -04:00
..
camera_state.gd chore: point docs and rules at Linear NEO issue ids 2026-04-13 13:15:32 -04:00
camera_state.gd.uid NEON-25: isometric follow camera, CameraState, tests, and docs 2026-04-07 23:46:04 -04:00
ground_pick.gd.uid NS-16: MoveCommand → server PositionState, Godot sync, tests 2026-03-30 19:54:17 -04:00
interaction_radius_indicators.gd NS-18: fix gdlint (line length, const order/naming) 2026-04-04 20:24:59 -04:00
interaction_radius_indicators.gd.uid NS-18: InteractionRequest, client prototype, Postgres test UX 2026-04-04 20:19:33 -04:00
interaction_request_client.gd NS-18: fix gdlint (line length, const order/naming) 2026-04-04 20:24:59 -04:00
interaction_request_client.gd.uid NS-18: InteractionRequest, client prototype, Postgres test UX 2026-04-04 20:19:33 -04:00
isometric_follow_camera.gd chore: point docs and rules at Linear NEO issue ids 2026-04-13 13:15:32 -04:00
isometric_follow_camera.gd.uid NEON-25: isometric follow camera, CameraState, tests, and docs 2026-04-07 23:46:04 -04:00
main.gd NEO-24: fix movement-driven target refresh via authoritative_ack signal 2026-04-21 22:35:41 -04:00
main.gd.uid fix(client): reliable NS-14 click-to-move without NavigationMesh 2026-03-29 22:08:25 -04:00
occlusion_policy.gd chore: point docs and rules at Linear NEO issue ids 2026-04-13 13:15:32 -04:00
occlusion_policy.gd.uid NEON-27: finalise review (Approved) + Godot uid files 2026-04-08 23:55:29 -04:00
player.gd NEO-22: Extract WASD locomotion for gdlint max-file-lines 2026-04-17 20:13:36 -04:00
player.gd.uid fix(client): reliable NS-14 click-to-move without NavigationMesh 2026-03-29 22:08:25 -04:00
player_locomotion_wasd.gd NEO-22: Cache scrape contact in WASD tick; close review items 2026-04-17 20:21:13 -04:00
player_locomotion_wasd.gd.uid NEO-22: Add Godot .uid sidecars for WASD locomotion scripts 2026-04-17 20:51:16 -04:00
position_authority_client.gd NEO-24: fix movement-driven target refresh via authoritative_ack signal 2026-04-21 22:35:41 -04:00
position_authority_client.gd.uid NS-16: MoveCommand → server PositionState, Godot sync, tests 2026-03-30 19:54:17 -04:00
prototype_interaction_constants.gd NS-18: gdformat — blank line after doc block (gdtoolkit 4.5.0) 2026-04-04 20:29:25 -04:00
prototype_interaction_constants.gd.uid NS-18: InteractionRequest, client prototype, Postgres test UX 2026-04-04 20:19:33 -04:00
prototype_smooth_hill_piece.gd NEON-29: Prototype smooth hill piece, movement script updates, NEO-22 plan 2026-04-15 23:39:47 -04:00
prototype_smooth_hill_piece.gd.uid NEON-29: Prototype smooth hill piece, movement script updates, NEO-22 plan 2026-04-15 23:39:47 -04:00
prototype_target_constants.gd NEO-24: client tab-target + lock HUD synced to server 2026-04-21 22:14:16 -04:00
prototype_target_constants.gd.uid NEO-24: client tab-target + lock HUD synced to server 2026-04-21 22:14:16 -04:00
random_floor_bump_collision_constants.gd NS-24: Fix GDScript lint (line length, gdlint, gdformat) 2026-04-06 00:41:32 -04:00
random_floor_bump_collision_constants.gd.uid NS-24: Eliminate idle jitter and movement QA bumps (Godot client) 2026-04-06 00:32:41 -04:00
random_floor_bumps.gd NS-24: Fix GDScript lint (line length, gdlint, gdformat) 2026-04-06 00:41:32 -04:00
random_floor_bumps.gd.uid NS-24: Eliminate idle jitter and movement QA bumps (Godot client) 2026-04-06 00:32:41 -04:00
target_selection_client.gd NEO-24: fix movement-driven target refresh via authoritative_ack signal 2026-04-21 22:35:41 -04:00
target_selection_client.gd.uid NEO-24: client tab-target + lock HUD synced to server 2026-04-21 22:14:16 -04:00
zoom_band_config.gd NEON-26: add pre-push GDScript lint hook 2026-04-08 23:10:40 -04:00
zoom_band_config.gd.uid NEON-26: ZoomBandConfig, discrete zoom input, CameraState sync 2026-04-08 22:32:45 -04:00