- Ya
- 14 Agosti 2026, 04:43 UTC
- Mwandishi
- kamo
- Ahadi ya
- 381b58d
The mirrored rule was right; what was wrong is that the answer was computed once, when a message arrived, and kept. Placement needs three things — the sender, the viewer and the ticket's requestor — and any of them can resolve after a message is already in hand: a reply landing while the ticket is still loading, a sign-in that has not answered yet. History survived that, because a ticket resolving late re-ran the mapping over the whole page. A message that came in over the socket did not: it was stamped with the fallback and kept it for the life of the window. That is the shape of the report — sides wrong sometimes, never reproducibly, and right again after a reload. A message now carries who sent it and nothing about where it goes. The side is computed during render, so a requestorId or a member id that arrives a moment later re-sides everything already on screen instead of leaving it where a guess put it. The own-send row is sided by the same rule as every other rather than being marked "mine" — a second way of deciding the same thing that could disagree with the first. The viewer id is now passed in from the window, which already has it resolved app-wide, instead of the chat fetching its own. Mirrored placement needs the viewer, so every millisecond that id is unknown is a millisecond laid out from a fallback — and for the requestor the fallback is the wrong side. Tests gain the two properties that were only ever implied: two agents on one ticket see the same layout as each other, and recomputing with real ids after an unknown one gives the real answer.