-
Notifications
You must be signed in to change notification settings - Fork 0
First Admin Setup
Audience: Sysadmin Status: ✅ Ready
A fresh TelosMUD install has accounts but no authority: every account starts at the player
tier. This page covers how you mint the very first admin safely, how that admin promotes
builders and further admins from inside the game, and how ordinary players are onboarded
(spoiler: there's nothing to do). Authority lives in telos-account — it is the tier
authority, and the world applies a character's tier as capability flags on login. For what the
tiers mean, see Trust Tier Model.
The trust ladder is player < builder < admin, stored on the account, signed into the session
assertion at login, and applied by the world on the target's next login.
The intended way to create your first admin is the bootstrap-admin config pin. Set
TELOS_BOOTSTRAP_ADMIN (config key bootstrap_admin) on telos-account to a GitHub login
— the username, not an email address:
TELOS_BOOTSTRAP_ADMIN=octocatThe first account ever created for that OAuth login is created as an admin, atomically with
an account_role_audit row recording a system actor (NULL), in a single transaction. Then, on
that person's first GitHub sign-in (the normal OAuth flow — see
Running Locally / OAuth Setup), their account is
minted at the admin tier.
Important properties, so you use it correctly:
- Login match, not email. The pin matches the OAuth login (case-insensitive), because email is user-settable and unverified. Pin the GitHub username.
-
Only at account creation. The pin grants admin only when the account is first created.
It cannot re-grant or promote an account that already exists — if the person has already
signed in once as a
player, the pin does nothing for them. Set it before their first sign-in, or use the break-glass CLI below. -
Atomic and audited. The admin tier and the audit row are written together; there is no
window where the account exists as a
playerfirst.
There is no in-game claim-code or trust-on-first-use ceremony — the config pin is the whole mechanism.
If you didn't set the pin before the first sign-in, or you need to recover from a last-admin lockout, use the break-glass CLI on the host. Here, host / database access is the authorization — the command talks to Postgres directly and bypasses the in-game permission check and the promotion ceilings entirely:
telos-account set-tier --character <name> --tier admin --force yesIt sets the tier unconditionally, writes an account_role_audit row attributed to a system
(NULL) actor, and — note — has no last-admin-demote guard, so it will happily demote your
only admin. Treat it as the root shell of the tier system: use it to mint the first admin when
you skipped the pin, or to dig out of a lockout, and otherwise prefer the in-game verbs.
Once you have one admin in the world, further tier changes are done from inside the game with two gate verbs:
promote <character> <tier> # e.g. promote Alice builder
demote <character> # demote to the baseline (player)
The gate itself makes no trust decision — it forwards the request to telos-account via
the SetAccountTier RPC, and all authorization is enforced there:
- The actor must hold the manage-tiers capability (i.e. be an admin).
- Promotions are bounded by ceilings enforced with a compare-and-set under a row lock, so an actor cannot grant a tier above their own authority, and concurrent changes can't race.
- The path is fail-closed: if the trust ladder can't be validated, the change is refused.
- Every change writes an
account_role_auditrow.
Two behaviors worth calling out: demote <character> sends a demote-to-baseline sentinel (it
resets to player), and any tier change takes effect on the target's next login — the world
applies the new capability flags when they next connect, not mid-session. The RPC is reachable
only by a trusted gate, which authenticates to the account service with a shared caller token
(TELOS_ACCOUNT_CALLER_TOKEN); see OAuth Setup for that wiring.
There is no "create player" step. A player account comes into existence implicitly on first
OAuth sign-in: the GitHub callback resolves-or-creates an account keyed on the OAuth identity
(provider, provider_uid — never email), defaulting to the player tier, and the player then
selects or creates a character over telnet through the content-driven chargen flow. Under the
dev bypass this collapses further — typing a name spawns you with no account
row at all. So onboarding a player is simply: point them at the server and have them sign in.
-
telos-accountis the tier authority. Tiers are stored on the account, changed only through the audited paths above, and signed into the session assertion at login. - The world applies, never mints. A world shard reads the tier from the signed session and turns it into capability flags for that session; it never decides tiers itself. This is why a tier change lands on next login and why it's consistent across shards and reconnects.
-
Everything is audited.
account_role_auditrecords every grant — system-actor rows for the bootstrap pin and the break-glass CLI, actor-attributed rows for in-gamepromote/demote.
See Trust Tier Model for how the tiers map to in-world capabilities and the reserved builder-admin permission model.
TelosMUD — Wiki under construction.
- Builder Reference
- Builder Commands
- Trust Tier Model
- Pack Authoring
- Pack MUD Settings
- Pack Lua Scripting
- Pack Lua Hooks
- Pack Entity Reference
- Building Instanced Zones
- Engine Developer Reference
- Architecture Overview
- Entity Component Model
- Zone Runtime & Actor Model
- Instanced Zones
- Command Parser & Targeting
- Edge & Protocol
- GMCP Reference
- Persistence & Durability
- Content Loading & Hot Reload
- Abilities & Effects
- Combat System
- Loot, Spawns & Crafting
- Accounts & Auth Internals
- Orchestration & Directors
- Scoped Event Bus
- Cross-Shard Handoff
- Lua Sandbox Internals
- Distributed Systems Model
- RPC & Protobuf