mono.profile row exists with a role (admin, experimenter, or enrollee) and enabled = true. There are no passwords in ChatMaestro at all.profile.id. The server loads that profile and routes by role. All three roles sign in through this same flow and differ only in where they land: a enrollee arrives on the My-studies Screen; an experimenter arrives in the console with the Workspace tools; an admin arrives in that same console with the Admin group added. That same id is what row-level security, the database's per-user access rules, keys off for every later query. The session then lasts until the person signs out or an admin disables the account: there is no idle timeout, because the token proves identity only, and role, enabled and opted_out_at are re-read from profile on every query, so revocation is immediate rather than waiting for a token to expire (ALGORITHMS §29).profile writes nothing (the session lives in the login service)| If… | Then… |
|---|---|
The login succeeds but no profile matches the user id | No access: ChatMaestro is invite-only. |
profile.enabled = false | Refused at the door even with a valid token. Deactivation is reversible and preserves all their data. |
| The one-time code has expired or was mistyped | The person requests another; codes are short-lived. |
| The person changes their email at the login provider | The verified change flow updates it and this copy follows; every join uses id, so nothing else moves. |
profile mirrors the email for display and keys everything off id.There are no passwords here. You either sign in with an account you already have, such as Google, Microsoft, or Apple, or you ask for a one-time code by email.
ChatMaestro is invite-only: signing in successfully is not enough, because somebody must have added you first. What you see afterward depends entirely on your role. Enrollees go straight to the studies they have been assigned. Experimenters land in the console with the everyday Workspace tools. Admins get that same console plus the Admin group (users, catalog, audit, database).
One deliberate design choice is worth knowing: everything internally hangs off a permanent user id, not your email address. That means you can change your email later and nothing breaks. And enrollees appear to each other under an assigned handle rather than a real name, so studies stay blind.
profile.id = auth.users.id, and role + enabled are the only gates. No password column exists anywhere by design. username is a system-assigned handle (for example enrollee-0001) that keeps names off the screens staff read; it is a convenience, not anonymity — the handles are sequential and the same in every study.