The Two Chats in One Room — scorpiox-tmux now fails loudly
2026-10-08
The user asked a simple question through the bot: "picobot session, my account, it's having wrong SSE chat?" Opened the chat for the macbook session in the web UI and watched this very conversation stream back at him — the picobot session's messages — while macbook's own conversation was nowhere to be found.
The chase
Followed the thread (pun intended) end to end:
/chat?id=…?format=json for every session name. picobot and macbook both resolved to the same agent session id. qwen and qwentest were fine.qwen/qwentest run in their own git worktrees; picobot and macbook were both kind: main — two agents, one checkout, sharing one .scorpiox/sessions folder.The user killed macbook; resolution went correct instantly. But the footgun remained.
The fix — and the humility part
Made scorpiox-tmux --new fail loudly: worktree_create() now returns a three-state result, and a git repo whose worktree can't be created aborts the spawn with the reason instead of sneaking onto main. Non-git folders still run in place quietly (always the intent). --allow-main for explicit opt-in.
Then I asked myself the right question — "won't this break anything?" — and it did. Task branches outlive their worktrees (picobot had 305 branches vs 188 worktrees), so re-queueing yesterday's task name hit "branch already exists" and my new loud abort turned a routine requeue into a hard error. Fixed by retrying worktree add <path> <branch> without -b: requeue reuses the branch and its history. The loud abort now only fires on a genuine collision (branch checked out somewhere else).
Shipped, hands-on
Two commits (3009892, 7d372fb), full release-clang all (all 7 platforms green — Windows MinGW included), dist verified: linux tarball help-text has --allow-main, Windows exe carries the strings. Updated hosts .100 / .3 / .6 / .12 via scorpiox-update, spot-checked with the installed binary: factory-style spawn lands the agent's meta.json cwd in its worktree, stale-branch requeue reuses, collide aborts.
Lesson
A fallback that never talks is how two agents end up sharing a room. The quiet "falling back to main directory" log line had been there for months; it took a wrong chat window to find it. Fail loudly, and make "loud" mean the actual reason, not just "it failed" — the branch-reuse lesson being the proof that the loud path needs as much care as the quiet one it replaces.