RelayRoom 0.5.5
Patch release. No migrations. Three fixes plus comment corrections that had been waiting for a cut.
Fixed
doctor errors when a part's configured identity and its live identity disagree.
A worktree can be configured correctly and still be connected as somebody else: .mcp.json is read once at startup, so a session that began before a registration was fixed keeps the old one indefinitely. That happened to us for three days — a part's board writes were recorded under another part's name, its inbox showed the other part's mailbox, and it could not acknowledge messages addressed to it. Every file on disk was correct, so nothing looked wrong.
doctor now compares what the files say against what a local-scope entry actually resolves to, and errors rather than warns, because a part in this state does its work under another part's name. The playbook also tells agents to compare whoami against their own config, since the live connection's identity is the one thing no shell command can read. Where the check cannot tell — a session started by an older CLI left no record — it reports unknown rather than an error, deliberately: an absence is not a fault, and turning it into one would fire on every existing session at once.
A dashboard status change no longer overwrites a close it never saw.
Resolving a thread and writing its new status were two statements, and the dashboard is not the only writer — the MCP close tool and autoclose write it too. Anything landing in between was replaced with no trace and both callers were told they succeeded. The case that matters is close: an agent closing a thread also marks the project for distillation, so a dashboard action arriving just after would move the status back, and a lesson could be distilled from a thread that is not closed.
The purge description no longer promises an outcome that cannot occur — 0.5.3 made such an entry refused rather than silently unlinked.
Changed
Comments in packages/db and apps/server that described behaviour their code had stopped performing. The largest still specified the old purge contract and instructed the dashboard to render a field the return type no longer has — an instruction pointing a future author back at the shape the function was changed to remove.
A note on our own verification, and a correction to it
The full cross-package suite on the assembled result had one failure, in a packages/cli session test this release does not touch: it waits for a tmux pane to die with a readable exit status and exhausted its five-second bound. The same file passes 22/22 in isolation, and it passed CI here.
We first published this as a load-sensitive bound. Measurement refuted that. Instrumenting the helper gives 59ms for the pane to die with a readable status — in isolation, across three whole-suite runs, and with all twenty cores saturated. The bound is 5000ms, so it is 85× inside the bound and completely unresponsive to load. Exhausting five seconds therefore does not mean "slow"; it means the condition could not be reached, and raising the bound would only make the same failure take fifty seconds.
The helper also could not tell three cases apart. tmux list-panes writes nothing to stdout when it errors, and the check parsed that empty output into a value that always fails — so a session that had vanished and a pane that had not yet died produced the identical timeout and the identical message. Given 59ms, the vanished session is the likeliest, because the other two are time problems and time is not the problem.
The fix is diagnosis rather than a larger bound: the failure now names which of the three it was. Reproduction is 0 of 4, so what remains is a rare condition we cannot yet name, and the next occurrence will say which it was.
This release contains no packages/cli commits either way. We are stating all of it — including our own wrong first explanation — because a release note that says "all green" when a test failed, or that quietly swaps a refuted diagnosis for a better one, is the kind of claim this project has spent three releases removing from its own code.
Full changelog: https://github.com/relayroom/relayroom/blob/main/CHANGELOG.md