Docs
Account
A person. Global — one account however many tenants they belong to — and identified by email.
Has: an email (unique, capitals ignored) · a name · a platform role (operator, or none) · many memberships · the outside logins it has linked, never their tokens · to come, its chat ids — who it is on Slack, Teams or Discord (features/people/). Its own id is the person's identity everywhere: agents, memberships, the organization and credentials refer to the person by it. Deleting an account deletes its memberships and those logins. The agents that knew that person in Slack go on knowing them.
Signing in
A person signs in by giving their email address and opening the link that arrives. There is no password anywhere in the product.
ACCOUNT-LINK-BY-EMAILA sign-in link works once, and is stored only as a hash.
ACCOUNT-LINK-ONCEA sign-in link expires fifteen minutes after it is issued. A stale or already-used one lands back on the sign-in form saying to ask for another.
ACCOUNT-LINK-FIFTEEN-MINUTESAsking for another link does not kill the one already in the inbox. Each stands until it is used or runs out.
ACCOUNT-SECOND-LINK-KEEPS-FIRSTThe emailed link points at the address people reach the Hub on, so it opens from the phone or laptop that received it.
ACCOUNT-LINK-PUBLIC-ADDRESSWhere the Hub's address follows the browser (no fixed public address, a list of its own addresses), a sign-in link or redirect is only ever built on one of those addresses, over
httporhttps. A request naming any other host, a scheme that is not exactlyhttporhttps, or more than one host or scheme is refused (421) and nothing is sent. With a fixed public address, the request's host is never used.e.g.
Host: localhost:3000withx-forwarded-proto: https://evil.example/→ refused; no link names evil.example.e.g.
ACCOUNT-LINK-ONLY-OUR-ADDRESSESx-forwarded-host: localhost:3000, evil.example→ refused.Where a deployment has no mail relay, the "check your email" page says the link went to the Hub's log and nothing was sent.
ACCOUNT-NO-RELAY-SAYS-SOWhether an address may sign in is decided when the link is asked for and again when it is followed. Access taken away in between cannot be used.
ACCOUNT-CHECKED-TWICEWhere a Google login is set up, it stands beside the link form and signs the same person in. Where it is not, the button is absent.
ACCOUNT-GOOGLE-WHEN-CONFIGUREDA person who has been signing in by link and then signs in with Google on the same address reaches the same account, never a lock-out. Only Google joins this way, because Google proves the address.
ACCOUNT-GOOGLE-JOINS-LINKAn address is the same person however it is capitalised, with the same memberships.
e.g.
ACCOUNT-EMAIL-IGNORES-CAPITALSAna@afterana@→ one account, not a second with an empty fleet.A linked outside login records only which provider it was and who the person is there. The tokens it hands over are dropped.
ACCOUNT-LOGINS-KEEP-NO-SECRETS
A session
A session lasts eight hours and then asks for a fresh link.
ACCOUNT-SESSION-EIGHT-HOURSA session carries, from the moment it starts, the person's address and name, every tenant they belong to with their role there, and whether they run the platform.
ACCOUNT-SESSION-CARRIES-STANDINGSign out sits in the rail under the person's own address. Using it ends the session, and the next page asks for a link again.
ACCOUNT-SIGN-OUTEvery page is behind one gate. Only the sign-in, check-your-email and no-access pages and the health checks answer without a session.
ACCOUNT-ONE-GATEA signed-out browser asking for a page is sent to the sign-in form carrying where it was going, and lands there once it signs in.
e.g. a bookmark of a tenant's Members screen → sign in, then that screen.
ACCOUNT-SIGNED-OUT-PAGEA signed-out request to a machine address is refused in plain words rather than sent to the sign-in page, so a program sees a failure.
ACCOUNT-SIGNED-OUT-APIThe place carried through sign-in can only be a page of this Hub.
e.g. a link back to another site → ignored; the person lands on their own front door.
ACCOUNT-RETURN-STAYS-HERE
Who they are on the platform
Having an account is not having access: a person sees exactly their memberships, and being known to an agent in Slack never creates a login.
ACCOUNT-SIGN-IN-NOT-ACCESSSigning in lands a person on the first tenant they belong to, in a fixed order; an operator with no tenant on the Admin screen; an account with no membership on the no-access page.
ACCOUNT-FRONT-DOOROne account per address, held in one place, however it first appears — invited (MEMBER-INVITE-IS-INSTANT), signed in, or met through an agent. A second attempt updates that person, never making a twin.
ACCOUNT-EXISTS-ONCEAn account's email is the identity everything else hangs off, and no edit can change it. Only the name and the confirmed mark are written again.
ACCOUNT-EMAIL-NEVER-REWRITTENAn operator is a standing on the account itself rather than a membership: it runs the platform and reaches every tenant (TENANT-OPERATOR-SEES-ALL).
ACCOUNT-OPERATOR-RUNS-PLATFORMThe platform's owner list is the only way in before any membership exists: an address on it becomes an operator the first time it signs in, account and all.
e.g. an address on the list signs in to an empty platform → operator, and owner everywhere (MEMBER-OPERATOR-OWNS-ALL).
e.g. an address not on the list and invited nowhere → refused, and no account is made.
ACCOUNT-OWNER-EMAILS-BOOTSTRAPA person is referred to everywhere by their account's id — by agents, memberships, the organization and credentials — never by a Slack or other chat id. A chat id only says which account a message is from.
ACCOUNT-ID-IS-THE-PERSONA person's id on a chat surface — a Slack user in a workspace, a Teams or Discord user — is a chat id of their account. Every agent that meets it meets that account; no agent keeps its own copy of it.
e.g. Ben writes to Nova and to Orion → one account, one Slack chat id, known to both by her account id.
ACCOUNT-CHAT-IDThe first time someone writes and the surface gives their email, the chat id is attached to the account with that email, made if new (ACCOUNT-EXISTS-ONCE). It gives no membership and no Hub access (ACCOUNT-SIGN-IN-NOT-ACCESS), and a chat id is never a way to sign in.
ACCOUNT-CHAT-ID-FROM-SURFACEWhen the surface withholds the email, no account is made or guessed from a name. The platform's notice shows the person their own chat id and tells them to ask the agent's manager or an admin to allow them.
e.g. a Slack Connect guest writes to Nova → "I can't tell who you are yet. Ask Ben or an Northwind admin to allow Slack id U0XXXX." — no turn, no account.
ACCOUNT-NO-EMAIL-NO-GUESSA person's chat id is shown on each agent's People tab, as a detail of the person chosen (PEOPLE-ONE-PICKER); never a token. Their own profile shows it too once there is one (ORG-PROFILE-PAGES).
ACCOUNT-CHAT-IDS-SHOWN