- Shipped
- August 30, 2026 at 3:59 PM UTC
- Author
- Kamo
- Commit
- 549b29f
Leaving is DELETE /sessions/{guid}/membership, not removeMember aimed at yourself — that route refuses self-removal on purpose. Removal is done TO somebody and names the actor; leaving is something you do. Both write the same transit row (isJoin=false) and the clients tell them apart by whether the actor and the subject are the same person, which the row already records, so this needs no new column. Groups only, for the same reason removal is: leaving one side of a two-person chat would end it for that side while the other could still write into it. The larger fix is underneath it. A MediaObj carrying a transit has no MSG, so history serialized it as messageType MESSAGE with a null body — an empty bubble. Join and leave lines therefore existed ONLY live, on the NATS frame, and vanished on the next reload: "Sage added Daniel" was visible to whoever happened to be watching and to nobody after. Which made the removal and departure lines — the ones that exist to explain why somebody is no longer in the room — the least durable thing in the conversation. History now serves them as TRANSIT with the subject's id, name and direction. Both paths name the subject. On a removal or a departure that person is gone from the session by the time the frame lands, so every recipient's member list has already dropped them and there was nowhere to resolve the id: the line rendered with the name blank. Requires kamo-shared-library with transitMemberName.