Date: 2026-08-18 Status: Implemented mostly, Next up is to be more clear in this document about what is about the ROOT user, and what is about the User in general.
US prefix ([[ADR-010-identity-system]]). The name segment is a snapshot taken at registration; the random suffix is what makes it unique,auth.root_identities lists ways to reach a User, not Users ([[ADR-030-identity-providers]]).auth.binding_signers is
asked about that signer every time it is used, so striking a signer out still reaches bindings already written down.auth.root_identities closes one way in, and a User holds several; disabling the User
is the person, not the door.system, where the token objects already are ([[ADR-027-Permissions]]).system is not ([[ADR-026-Namespaces]]). An ATTESTOR sees no User record: not another's, and not their own. There is no directory of people at that level. What an ATTESTOR sees inside a namespace is what signed something, and by is the signer ([[ADR-026-Namespaces]]) — never the person behind it.A User has a display_name, and it is a name rather than half a login. Not unique. What identifies a User is a key they hold or an identity they control.
"display_name of root cannot be changed anymore when set" "if display_name of root is unset, it becomes root"
"regardless of root_identity setting it or not, root is never an available display name except for the one root identity user, they don't need to set their display name as root"
So the ROOT User is root from the moment they exist, without choosing it, and root is
the one name no other User may take.
You claim the ROOT User by proving you own a root identity. It happens once and
cannot happen again, so it is attested as node:claimed. Recording never fails
the thing it records ([[ADR-030-identity-providers]]), which makes this the one attestation whose loss cannot be made up later.
"i wish i was able to assume the identity of another user, one that isn't ROOT, but also be able to go back."
"but its attested that they have been becoming and unbecoming" "and while ROOT is them, they cannot be themselves" "until ROOT unbecomes that user and is itself again."
"Not while ROOT is them."
"So, yes, this can be destructive in the sense that a session may get revoked."
"But for tokens its tmp access loss."
"and to become or unbecome, is actually in the specific User in the Users Element, the i element is to get back to ROOT"
"And the Becoming and Unbecoming of another User, will be removed, the entire feature and capability will be removed before we can 1.0.0 this repo"
"Change the role of a User."
POST /auth/users/{id}/level, from the User in the Users element.identity:leveled, naming who, the level they had and the
level they hold.A User is one object per person under <location>/system/users/ on the parquet
backend, holding an id, a display_name, any number of emails and phone numbers,
the level, who switched it off, the keys it holds and the accounts that reach it.
The record is auth.User,
mirrored by UserRecord
on the object. A sqlite
deployment keeps none, the way it keeps no tokens.
POST /auth/user/arrive is where a person says a name, an email and a phone
number, and requires none of them. The name is settled once; an email or a phone
number that arrives later is added rather than refused, because a User has any number of each. A phone number is kept as its digits and the leading + the
person typed, so one number is one string however it was spaced.
POST /auth/user/disable and POST /auth/user/enable are the switch, reached by the person's own session. Off, disabled_by names them, every gate refuses
them as switched off, and the Self element offers to reawaken. Set by anyone else,
enable is refused naming who, and the person stays off. The act is attested as
identity:disabled and identity:enabled.
A User holds no first name and no last name.
A Dutch name has three parts, and the middle one is the person's to write: van Doorn files under D, Van Doorn under V, and the string alone does not say which.
A User reaches namespaces through permission, and nothing records which yet.
A namespace's owner is a string, and so is a credential's admitted_as.
created_by is empty on ROOT. The node that signed the first admission is
written down — node:claimed names it — but on the attestation rather than on
the User, so the provenance is a record to go and find instead of a field to
read.
GDPR delete, PR 911
reassignment of e-mail address