Personalities
Person profiles and personality libraries
Agent Compose selects exactly one local person profile. A profile owns role skills, structured role metadata, role identity, seats, the invariant, copy contracts, and optional role evaluation matrices.
Profile layout
person.kdl
roles/NN-role.kdl
roles//SKILL.md
personalities/NN-local.kdl
definitions/INVARIANT.md
definitions/skills//SKILL.md
evaluations/.yaml
libraries//
The established complete-person layout remains valid during v1.x. Its local personalities act as an implicit package-local library.
Library layout
library.kdl
personalities/NN-personality.kdl
definitions/skills//SKILL.md
library.kdl has one stable logical library name. Libraries contain only
personality-owned content. They do not own roles or a profile invariant.
Admission and ordering
The profile discovers libraries/ children in lexical order. Callers may admit
further local roots with repeatable --personality-library flags,
personality-library request nodes, or ordered host personality_libraries.
Profile-local roots resolve first, then the caller order. Every root is a local
directory or the reserved roster:core root, and Agent Compose accepts no URLs,
git refs, release identifiers, or fetch instructions.
The reserved root is a name rather than a path. Admitting it merges the shipped
core personalities, so a package binds grounded by slug and the binary supplies
the body. Only that disposition axis crosses: roles, seats, identity, and the
invariant stay package-exclusive.
Conflicts and compatibility
Roles reference personality slugs, not a library name, so a profile may meld
local and admitted personalities. A role may have any nonempty ordered meld,
including one personality. Byte-identical definitions deduplicate, a divergent
duplicate slug or skill binding fails before materialization, and missing
references fail after all admitted libraries merge. Alias collisions stay visible
as ordered candidate sets. Generated v1-compatible person.json remains
available, and the additive person.v4.json and personality-index.md add
aliases, affinities, provenance, and derived melds.
Cues and affinities
Libraries declare aliases with alias "cue" inside a personality entry. Lookup
applies Unicode NFKC, lowercases, trims surrounding whitespace, and normalizes
whitespace, underscores, and hyphens to one hyphen. A canonical slug match
wins. Otherwise every matching alias candidate remains visible in deterministic
catalogue order. Affinities derive from the effective profile only. Each v4
personality entry records its roles and each complete ordered meld, or an empty
affinity list when no selected role uses it. A cue never changes a role,
authority, permissions, or the native confirmation and lifetime rules for an
interactive personality swap.
Signature and bond
Each core role melds exactly two personalities: a signature no other seat holds,
and a bond shared with its siblings. grounded bonds platform, sysadmin, and
eval, the substrate seats. imaginative bonds frontend and gamedev, both making
something a person enters. outward bonds tpm and devrel, both checking the
local answer against the world outside. color.Favorites weights a component by
1/shared squared, so a signature counts 1.0 and a three-seat bond about 0.11:
the signature drives the color four to one and the bond only tints it. The
roster measures 0.1590 at its closest pair against the 0.08 floor.
Personality palette explorer
The repository ships a local visual explorer for the canonical personality
colors and each role's meld. It preserves color as expression only, and
authority, safety, and completion remain outside personality. Run
just palette-serve from the repository root.
That generates web/personality-palette/public/palette.json from the embedded
person source, installs the pinned browser toolchain, and starts Vite locally.
The JSON, dependency directory, and production build stay uncommitted.
palette-build, palette-test, and palette-tidy carry the rest of the
lifecycle, and just test includes the palette test.
Data ownership and interaction
The embedded KDL person source remains the only owner of personality colors,
identity primitives, role membership, role order, and boundary inputs. The
hidden palette-data command projects that source into versioned JSON, and the
Go color package derives each role's boundary before the browser sees it. The
TypeScript layer owns only presentation metadata: friendly color names, short
associations, and spectrum ordering. Startup validation fails visibly if that
list drifts from the canonical catalog.
The explorer shows the full ten-personality spectrum with emblem, motif, geometry, and sound, role filters with complete melds, component colors and the derived role boundary, day and night previews, spectrum and alphabetical ordering, one-click copying, and a responsive reduced-motion layout.
The app is a framework-free Vite and TypeScript project under
web/personality-palette. It is a local source tool, not a deployment target.