Dwell timed itself with std::time::Instant, whose now() panics on
wasm32-unknown-unknown ("unreachable"). Express calls gaze_enter() and
check_completion() every 50 ms once the camera sees a face, so the first time
an eye-gaze or head-tracking user looked at a cell, the app crashed. Proven
with a small wasm probe: std's Instant throws, web_time's returns. Dwell and
aac-core's store now use web-time, which is std's Instant on native targets and
performance.now() in the browser.
ScanEngine gains set_grid()/grid(): the engine was built for a fixed 4×5 grid
and had no way to learn the board on screen. A running scan restarts from the
top of the new grid, so it never highlights a row the board does not have.
New test: set_grid_follows_the_board_and_restarts_a_running_scan.
Co-Authored-By: Claude Opus 5.5 <[email protected]>