aDepartedClientLeavesEveryRoomItJoined

A client whose link tears leaves every room it joined, and the room keeps serving whoever is left.

closingOneRoomDoesNotAffectSibling closes a room from the server side; nothing in this suite closed a client. A hub that leaks a dead connection into its fanout list keeps a stale roster and writes to a dead socket forever, and every other property here stays green — the departure path is reached only by a client going away, which no egress-only property does.

What this one is and is not. Unlike aNonMembersFrameNeverEntersTheRoom, this is not a defect nothing in the tree can see: the reference loom's own unit tests cover deregistration directly, and two shared suites red on it as collateral. What was missing is narrower and worth stating exactly — it was not an obligation of this suite, so a second server-fanout backend subclassing RoomFanoutIsolationConformanceSuite inherited no departure property at all. The two suites that do catch it catch it for reasons a fanout backend cannot rely on: SeamConformanceSuite's drain property is gated behind an opt-in injection hook, and PrincipalAttestationConformanceSuite is subclassed only by a backend that attests principals. Both also red here as a wedge — a timeout or an UncompletedCoroutinesError — rather than as a diagnosis; this property reds in one line with the offending roster printed.

What keeps each assertion from being vacuous

awaitPeers is itself the precondition gate at both ends: it fails with the roster it actually observed, so "both joined" and "the leaver left" cannot pass by never having been true. The remaining risk is a room that answers "the leaver is gone" by collapsing entirely — a torn hub, a cleared roster, a dead fanout all satisfy that. Three assertions close it: the surviving member is still in the roster, the hub is still in its own roster (the { selfId } collapse a closed Seam publishes would otherwise read as success), and a broadcast issued after the departure still reaches the survivor. The rig itself is receipted by the departing seam's own terminal SeamState — without it, a harness whose close() did nothing would leave this test asserting a departure that never happened.

Mutation receipt

Reference: deleting the per-room deregistration loop in us.tractat.kuilt.core.MuxServerLoom.teardownConnection reddens this test's roster assertion — peers never satisfied: the departed client leaves table-7 … peers (3): [server, client-leaver, client-stayer] — and leaves all four pre-existing properties of this suite green. It also reds five tests elsewhere, per the paragraph above; the row's claim is that this suite could not see it, not that nothing could.