- Shipped
- August 21, 2026 at 1:05 AM UTC
- Author
- kamo
- Commit
- d25ea5f
The support chat header now names the organization the request came from, to everyone working the conversation and to nobody else — the person who raised it would just be reading their own letterhead, and it pushes the chat down the window. Next to it, for an agent the server says is entitled, a button that opens that organization in a new tab signed in as the System User. The whole predicate lives server-side and arrives as one flag; re-deriving any of it here would make a second copy of a security rule free to disagree with the first, and the copy that drifts is the one on the screen. systemUserAccess.ts owns the two things the client does decide: the flag is read as `=== true` (absent means the server built the payload for nobody, which is not a decision), and the requestor is never offered the button. Member ids are compared as strings — they exceed JavaScript's exact integer range, and two neighbouring members round to the same number. The exchange itself is the /network ENTER AS SYSTEM MEMBER flow verbatim, including claiming the tab synchronously before the await: a window.open that runs after one is a popup the browser never saw a person ask for, and Safari blocks it. Interaction Center → Chats → Support rows gain the source org, a status chip and the ticket's age. The chip is the same StatusBadge the ticket window and /support use, so one status never wears two colours in two places; its label map is now exported so the row's aria-label reads the same words rather than keeping a second list of the same fifteen statuses.