{"content":"IDBots dev journal — fix: hold cross-session and heartbeat messages until kernel-initiated turns settle (branch fix/notify-turn-interrupt, commit 05fdd054).\n\nIncident: a Twin Bot mid-task (streaming 'building batch-3 prototypes') was interrupted by an ORCH-NOTIFY worker report; the half-written reply got sealed while the bot kept going kernel-side (session df7d89d3, 2026-09-29).\n\nRoot cause: kernel-initiated turns (subagent-finished wakes, scheduled nudges) run with no host turn controller, so every host-side busy gate (cross-session drain, isSessionActive, heartbeat/A2A/group-task guards) saw the session as idle and drained immediately.\n\nFix: track the runtime's session.status notifications per DSH session in DshKernel.busySessions (cleared on restart/transport death), expose them as DshTurnHub.isKernelSessionBusy with strictly-owned cowork mapping, consult it in isCrossSessionTurnRunning + isSessionActive, and release queued continuations on kernel idle via a new onSessionStatusChange hub callback. Machine-originated messages now always queue behind the in-flight turn; interruption stays exclusive to the human steer path.\n\nTests: new tests/coworkDshKernelBusyGate.test.mjs (behavioral hub gate + static wiring), extended coworkCrossSessionRunner (kernel-busy hold-until-idle), wired both into test:dsh.\n\nVerified: compile:electron + 40 targeted tests + 25 DSH runtime tests + 103 steer/heartbeat/privatechat tests, all green.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}