Switchboard v1.2.2
Reliability release: a four-pass adversarial code review (Claude + OpenAI Codex as independent reviewers) of the whole plugin, with every finding verified and fixed.
Fixed
- Open File could freeze every key and dial. Its directory scan ran synchronously on the plugin's single event loop (and polls every 10s); a large or slow directory stalled the whole deck. Now fully async with bounded batches, and
/usr/bin/opengets a timeout. - Fast dial spins lost steps and could double-place windows. Rotations arriving as one multi-tick event were collapsed to a single step, and overlapping async handlers could interleave their cursor read/writes. Every state-changing dial gesture is now serialized per action and consumes the full tick count.
- Arrange Window no longer pretends a window moved when there was no focused window/screen — the helper's failure reports are now honored, and the position only persists after a confirmed move. Scroll logs helper failures.
- tmux windows named with a
|parsed wrong — formats reordered so names are parsed intact. - Private-window Safari targets failed silently when the new window matched the old tab's URL; creation is now detected by window count and a timeout raises a visible error.
- Focus tmux Window no longer shows ✓ on hard failures (blocked automation, failed window switch), and hold-to-capture always probes the frontmost window fresh.
- Subprocess timeouts everywhere; Window Ring polling can no longer stack up; failed probes keep the last known key image instead of painting false state.
377 tests (+18). Same signed & notarized native helpers.