Skip to content

Trust and its limits

What the roster is actually asserting, and where it stops.

Identity is the platform's, not ours

ChannelSender idWorth
Telegrammessage.from.idSolid — the platform vouches for it
Slackevent.userSolid
Discordmessage.author.idSolid
Webhookwhatever the caller sentOnly as good as the secret

Display names are never used. They are chosen by whoever is typing.

A webhook's sender is a claim, not a fact

The secret authenticates the caller, not the person it says it is speaking for. Anything holding it can claim to be anyone.

Set Sender id on the channel and every message is pinned to one person — the secret becomes that person's credential and the body cannot override it. Leave it blank only when a trusted service is relaying many people.

What the guard covers

Roles decide what somebody may ask for. The guard decides what actually runs, and it does not take the agent's word for who is speaking: if no speaker has been identified, it falls back to the conversation's own role rather than assuming the owner.

That default matters more than it sounds. A message sent through the portal's own chat box into a colleague's conversation identifies nobody — and reading it as "the owner is typing" once let a colleague's conversation run with full privileges.

What is not covered

  • Somebody influencing what you ask for. See group chats.
  • Anything after code execution. The container has unrestricted outbound network, so a command that runs can talk to anywhere.
  • A person's own account being taken over. The portal trusts the platform's identity; if their Telegram account is compromised, so is their role here.

Revoking in a hurry

Set their role to Blocked. It takes effect on their next message — there is no session to tear down, because the check happens before one exists.

To remove a standing permission without changing their role, delete the rule on their page.

Give it a task, close the browser, come back later.