fix(client): T-1146 review round — gate the T-1088 seams, kill the settle fallback tautology, neutralize AutoPause leak

PR #190 review (Hoshe + Tyre), all five findings addressed:
- Tyre: queue_move_step/queue_stance_toggle (the T-1088 click-to-move seams)
  now share the full suppression predicate — all three input_queue producers
  in the module are gated, making the header's 'every action this file can
  produce' claim true (previously the seams relied on the sandbox caller's
  own freeze). +3 regression tests.
- Hoshe: the live suite's settle=baseline timeout fallback compared baseline
  to itself, vacuously passing the no-movement claim — a timeout now fails
  loudly (both tests).
- Hoshe: the unit suite's real open_app/close_app transitions fire the
  global auto-pause handler; with ambient SimBridge.state left CONNECTED by
  earlier suites (test_hub_teleport has no after_test) each transition
  silently appended AutoPause/AutoResume to the shared _outbound_buffer.
  before_test now forces DISCONNECTED (restored in after_test) and clears
  the buffer.
- Hoshe: documented why the live suite's reset_test_state() call is inert
  but still correct.

Full suite: 3374/3374.
This commit is contained in:
2026-07-21 20:00:18 +02:00
parent 4af3dd2607
commit 32a7b1e425
3 changed files with 74 additions and 6 deletions
+8 -3
View File
@@ -290,7 +290,12 @@ func flush_queue() -> Array[Dictionary]:
# false when throttled or input-suppressed. Ordinary Move* actions only: zero
# protocol change, no client prediction, the server validates every step (D-010).
func queue_move_step(tile_delta: Vector2i) -> bool:
if GameState.dialogue_active or GameState.free_camera_mode:
# T-1146: same suppression predicate as the _process poll — all three
# input_queue producers in this module share it, so the occlusion gate is
# self-contained here rather than delegated to seam callers (today the
# sandbox freezes the path follower itself, but Phase 5/T-962 lifts
# click-to-move into the shared session driver).
if GameState.dialogue_active or GameState.free_camera_mode or _gameplay_occluded:
return false
if tile_delta == Vector2i.ZERO:
return false
@@ -312,9 +317,9 @@ func queue_move_step(tile_delta: Vector2i) -> bool:
# Sprint, down = toward Crouch) through the same input_queue movement rides. Discrete,
# so no throttle — the server's handle_toggle_stance has no cooldown, so the sandbox
# follower can burst the exact ladder distance and trust it (server validates). No-op
# while input is suppressed (dialogue / free camera), matching movement.
# while input is suppressed (dialogue / free camera / occlusion), matching movement.
func queue_stance_toggle(up: bool) -> void:
if GameState.dialogue_active or GameState.free_camera_mode:
if GameState.dialogue_active or GameState.free_camera_mode or _gameplay_occluded:
return
input_queue.append(
{