Identity primitives and seats
Personality identity primitives
The selected person source owns a renderer-neutral identity record for every personality, so web, mobile, terminal, audio, and generated-art consumers project the same semantics without agent-compose owning their presentation. The overlay carries the rules a renderer respects.
Emblem
emblem { name "knot" "hitch" "lifeline"; emoji "🪢" }
Names run widest-reading first: the emoji's literal name, then what this roster
reads the mark as. 🎨 is an artist palette and the personality it marks is
playful, so either word alone is half the story. A renderer with room for one
takes the first, and every name is a unique lookup key.
Motif
motif is one lowercase semantic token such as wet-paint, read as material or
texture rather than a CSS class or asset path. A motif is what a thing is made
of and an emblem is a thing you point at, so every motif is a material.
Geometry
geometry is one lowercase semantic token such as radial-facets, the stable
shape language a renderer generates an avatar, sprite, or overlay figure from,
and the agent's own representation rather than a separate pet. aterm reads
both halves: mask, then ink.
Body and stance
body is the creature in prose rather than tokens, parsed by its own validator
so tokens stay tokens. stance is its posture, on the role not a personality.
The animal and its colour come from the meld: one species, one color_word.
body {
archetype "sturdy compact body, simple rounded forms, thick tapering limbs"
attachment "a thick rope knotted around its shoulder, running taut out of frame"
}
Every renderer uses one fixed expression vocabulary: available, listening,
thinking, acting, waiting-for-human, blocked, completed, failed,
offline. The owning runtime supplies the state, and agent-compose defines the
vocabulary without ever inferring it.
Projection
The complete record and expression vocabulary ship in person snapshot schema v2 and palette schema v2, bundle role metadata stays compact and text-first, and permissions, routing, model choice, and runtime authority remain outside the identity contract.
A seat answers "who are you" in parts with their kinds, since Dragon-Butterfly, Claude, and Mixpost are all names: I am Dragon-Butterfly, an agent-compose persona. My role is Developer Advocate. On this seat my legal name is Mixpost. An unauthored role has no separate personal name: its creature is its whole identity, no pronoun attached, since a seat is not a person. The overlay composes it.
Naming the seat
A role's identity defaults to its own creature (species-pair, derived from its personality meld - see Personality identity primitives above). A compose request may override it with a different name:
compose {
role "sysadmin"
identity name="Echo"
delivery "native-skills"
}
The name property is required and the node takes no arguments. Omitting the
node keeps the role's own seat, which is what every existing request does.
Why it exists
A caller that already has an identity would otherwise carry two. Sirens Echo
composes sysadmin for its operator doctrine and answers as Sirens Echo, so
without this its prompt introduced Vera as well, a name from a different context,
in a lane whose policy forbids describing itself at all. The alternative was a
whole person package, which replaces the roster as one unit: copying ten roles
to rename one seat makes every future roster change something the copy chases.
What it does not do
It renames. Skills, methods, personalities, boundaries, and model tiers are
untouched, and no equivalent exists for any of them. The personality meld is the
one people ask for next and is a different shape: role.Personalities also
drives the melded favorite color, the nativeui theme tokens, and a validator
requiring exactly two on a core role. A meld is several seams, a name is one.
The dictatable short id
Terminal surfaces append the session's short id to the rendered name (Angie (Platform Engineer) uz86), so a human can name one agent out loud among
several. Read from AOS_NATIVE_SESSION, never minted. See whoami.
The invariant this sits beside and what moves together
The person contract says an overlay may not redefine selected roles, personalities, definitions, or role personality sets. This is the single exception, and the line it holds is between who is speaking and what the role is: naming a seat is identity, and a caller wanting different role content still brings its own package as one unit.
The override rewrites the role identity and every seat, because consumers read
different ones: the card and roster read the role, while the overlay,
statusline, native launcher, and bundle manifest read the seats. Rewriting one
alone yields a bundle whose card and statusline disagree. The bundle key moves
with it, since cacheKey hashes the rendered instructions and the card is in
them, so a renamed seat cannot reuse an unrenamed bundle.