- HandTrackingProvider: drop the physics-mode auto-activation that turned
the camera/MediaPipe pipeline on whenever any interactable was nearby
(e.g. walking near the ebike to mount it). Hand tracking is now gated
*only* by the active repair-mission step (inspected, repairing,
reassembling, done). When testing in TestMap, set
mainState=ebike + currentStep=inspected via the GameStateDebugPanel.
- MissionNotification: video branch no longer inherits the CRT-style
enter/scan/flicker/sepia animations applied to the PNG branch via
index.css. The webm assets already animate themselves, so the wrapping
container is rendered with inline styles only (clip-path silhouette
preserved, but no .__image-wrap::before scan line, no .__image flicker
filter, no parent enter animation, no drop-shadow).
(1) HandTrackingProvider always renders the same JSX root
(HandTrackingRuntime) so toggling `enabled` no longer remounts the
<Canvas> below — that remount was destroying the WebGL context every
time the player entered an interaction zone.
(2) Add HAND_TRACKING_LINGER_MS (2s) cooldown on `enabled` so brief
walk-throughs of a trigger zone don't tear down MediaPipe before it
has time to initialize the webcam + model + first frame (cold start
~800ms).
Resolves the WebGL context lost + respawn loop and restores visible
hand tracking in the backend runtime. Browser JS runtime detection
quality is a separate follow-up.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>