Skip to content

Identity primitives and seats

Personality identity primitives

The selected person source owns a renderer-neutral identity record for every personality. 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. Every name is a lookup key, unique across the roster.

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 the 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. It is the agent's own representation, not a separate pet. aterm reads both halves: mask, then ink.

Body and stance

body is the creature, in prose rather than tokens, and it parses through its own validator so tokens stay tokens. stance is its posture and lives on the role beside purpose, never on a personality.

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 this fixed expression vocabulary: available, listening, thinking, acting, waiting-for-human, blocked, completed, failed, offline. Expressions communicate state supplied by the owning runtime. Agent-compose defines the vocabulary but never infers live state.

Sound mark

Each sound-mark declares timbre, contour, and pulse tokens, a short semantic identity seed for notifications or conversation entry. A renderer may synthesize it or map it to an asset. Agent-compose ships no audio files, playback behavior, volume policy, or event routing.

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. Permissions, routing, model choice, and runtime authority remain outside the identity contract.

Naming the seat

A compose request may rename the seat it composes:

compose {
    role "sysadmin"
    identity name="Echo" pronouns="it"
    delivery "native-skills"
}

Both properties are required and the node takes no arguments. Omitting it 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 belonging to a different context, in a lane whose policy forbids describing itself at all. The alternative was a whole person package, which replaces the embedded roster as one unit. Copying seven roles to rename one seat makes every future roster change something the copy has to chase.

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 it is a different shape. role.Personalities also drives the melded favorite color, the nativeui theme tokens, and a validator requiring exactly two personalities on a core role. Filtering a meld is several seams; a name is one.

The dictatable short id

Terminal surfaces append the running session's short id to the rendered name (Angie [she] (Agentic Platform Engineer) uz86), so a human can name one agent out loud among several. Read from AOS_NATIVE_SESSION, never minted. See the dictatable short id.

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. A caller that wants different role content still brings its own package, as one unit.

The override rewrites the role identity and every seat, because different consumers read different ones: the identity 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, because cacheKey hashes the rendered instructions and the card is in them. A renamed seat cannot reuse an unrenamed bundle.