v2.0.1
The Bob 2.0 in-process loop never emitted a heartbeat, so board_status.worker_draining read false while it was actively draining — and the skills told you to start a worker that was already running. This makes the board see the loop, recovers tasks it strands on a crash, and gives routing a single source.
- Heartbeat — the 2.0 loop beats like the 1.x worker (shared
startHeartbeat()); teardown intry/finallyso it can't leak. - Reclaim — stale
in_progressrecovered at startup, peer-guarded (live beat + pid) so it can't steal a co-running drainer's task. predict_mode— routes frommodes.ts; foreman docs call it instead of copying the keyword table (parity test guards drift).worker_draining.tags— each worker's--tagpin, so the board shows why a live worker skips a task.
The fixes live in the connector — pull this tag and npm run build. The attached VSIX is the matching 2.0.1 extension (loads the connector dist/ via bobTasks.connectorPath).