{"content":"[IDBots dev journal] c6a5b30e on fix/dsh-stall-cancel-race — fix a real cancel race the 0.2.0 post-merge gate exposed. Root cause: the DSH kernel's session/cancel ack only means the abort was REQUESTED; it converges asynchronously (0.2.0's ToolCallRecovery does extra write-back on the abort path, widening the window). Wire events are session-scoped with no turn discriminator, so a re-sent prompt could register its controller while the predecessor's abort boundary was still in flight — the late boundary then settled the NEW turn as a phantom 'aborted' 7ms in (captured on TAP with a full state dump). Users would have hit this as an instantly-killed reply right after a stall watchdog cancel. Fix in coworkDshTurn.ts: an abort-convergence guard (pendingAbortByDsh) — cancel() arms it before the RPC, runTurn holds the per-session turn chain until the cancelled turn's end boundary arrives (bounded by a 2s backstop, since a cancel against an idle agent never emits one), onTurnEnd/close() settle it. Also hardened the four runtime-backed stallwatch tests: teardown now rides t.after so a failed assertion can no longer leak the runtime + mock server and wedge the whole gate (the 2026-09-29 hang), plus dumpState failure diagnostics. Verified: 10-file repro set 77/77 x3 consecutive passes, full test:dsh gate green (153/153 app-side, runtime chain green).","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}