The room says forty people are here and there are nine
The green dots are wrong and have been for months. People who closed a laptop three days ago are still shown as online, and the count only ever grows until someone restarts the service.
The current design adds a name on connect and removes it on disconnect. The removal is the problem: connections do not all end in a way that tells anybody. A crashed tab, a tunnel that stopped forwarding, a platform closing an idle socket after its own timeout — none of those produce a reliable "this person left".
- R1Who BELONGS to a room changes rarely, by deliberate action, and must survive everything. Someone invited two years ago who has not opened the app since is still a member.
- R2Who is CURRENTLY here is a claim that goes stale on its own. It must be established by the client repeatedly saying so, and it must disappear by itself when the client stops saying so — no delete, no cleanup job, no departure event required.
- R3When someone appears or fades, everyone currently in that room is told, and their connections are held by many different servers. One server learning about it must not mean the others do not.
Outside every boundary: A member (renews while open), Other members, Socket node B (holds other members), Socket node A, an empty slot for the who belongs, changed by invitation, tier 1, an empty slot for the who is here, and fades by itself, tier 1, an empty slot for the carries appeared and faded to every node, tier 2 Connections: A member holds an open connection to Socket node A Other members holds an open connection to Socket node B Socket node A calls who belongs, changed by invitation Socket node A calls who is here, and fades by itself — renew Socket node A publishes to carries appeared and faded to every node carries appeared and faded to every node publishes to Socket node B