The first release cut through the new pipeline, and the first since the browser room was removed.
House rules
The room already watched for two agents in one worktree, two worktrees editing one path, and a lane nobody has touched. It reported all of them at one volume nobody chose. A rule now names one of those conditions and its value is the rung:
| Rung | Effect |
|---|---|
off |
not reported |
advise |
reported in chat-room alerts — the default |
warn |
reported, and carried into every session's injected context |
refuse |
reported, carried, and the write is denied before it happens |
chat-room rules
chat-room option-set --namespace rules --key one-actor-per-worktree --value refuseA rule at advise says nothing to a session, so raising one reaches your agents without interrupting a turn. refuse is evaluated in a PreToolUse hook and fails open — an unreachable room, an unreadable database, or a directory outside Git never denies anything, because a broken room must not be able to stop work.
The room-cleanup skill asks only about rules nobody has decided, using the room's real numbers.
A board
chat-room boardNo board table and no status to maintain. A coordination thread is already a card; blocked waits on a human, doing has an active participant, backlog has none. A worker moves a card by doing the work. Reading it starts no turn.
Conflict detection works again
It had been dead since the browser room was removed. The scan ran in a background thread no CLI process waited for, and the step that opens the thread returned early unless a scan had already finished — and every CLI invocation is a fresh process, so it was always the first caller. Two worktrees editing one file, with Git confirming the collision, produced nothing.
No probe cap
Whether two commits conflict is a fixed fact, so the answer is memoised against the pair of commits — a key that changes the moment either branch moves, so it cannot go stale. Every candidate pair is now asked.
On a forty-worktree project the capped answer checked 40 of 820 pairs and called seven branches clean. Asking all of them, one is. First sweep 31s; every one after, 3s.
Also
- A tag arriving mid-turn is handed over when the session comes to rest. A session already parked at a prompt cannot be reached — Claude Code holds no socket, verified with
lsof— which is whatchat-room codexexists for. - An actor is a row in a table rather than a branch in the code;
wakes_in_placerecords the one real vendor asymmetry. chat-room boardno longer crashes on Windows consoles, and room text with an emoji no longer killschat-room read.- Bounded scans report their own coverage.
Under it
- The command is exercised as a real process against a real Git project. Both bugs above were invisible to tests that call the store in-process.
- A release is installed back out of a package index and run before PyPI sees it. Publishing is irreversible and yanking is deliberately manual.
docs/architecture.mdrecords seventeen decisions, each naming the test that holds it — including one that fails when a row names a test that no longer exists.
78 tests across three platforms, all blocking.
pipx install chat-room