Status:
accepted · ADR-32 · Filed 2026-04-30Title
Agent identity is a UUID (agent_id); display name is presentation only
Decision
Introduceagents table with agent_id UUID primary key as the stable, immutable referent for any agent (persona). The human-readable persona name (display_name) becomes a presentation attribute on that row, not the identity. All routing layer code (channels, headers, signal_queue FKs) keys on agent_id. Verb arguments may accept display_name as user-facing convenience but resolve server-side to agent_id within the sender’s project scope. Replace today’s controller_registrations.agent_identity (string) and signal_queue.from_identity/to_identity (string) with FK columns agent_id / from_agent_id / to_agent_id. Replace X-Prism-Identity header with X-Prism-Agent-Id (the UUID).
Rationale
The legacy “identity = display name string” approach was usable while persona names were assumed unique-per-project and never expected to change. It breaks in three concrete future scenarios:- Persona rename — agents.display_name = “Donna” → “DonnaR” must preserve identity continuity (same agent_id, history intact, signals in flight delivered correctly). With name-as-identity, rename is identity break.
- Cross-tenant collaboration (future) — a guest member from another tenant may have a name collision with a host project’s persona; the host needs to resolve “Donna who is in this project” stably regardless of display-name choices.
- Audit trail integrity — every
signal_queuerow needs a stable referent for “who sent this” that survives any future renames or moves; a string snapshot of the name at send-time loses connection to the identity if the persona is renamed later. A UUID PK with a separate display attribute is the standard relational shape for this. The cost is one new table + FK propagation.
Alternatives Considered
- Keep
agent_identityas a string, add a separateagent_uuidfor stability. Considered and rejected — half-step that forces every consumer to choose which to trust. Better to do the rename once. - Make display_name the PK, with a slug/canonical form. Variation of the legacy model; same problems with rename + collisions.
- Use
(user_id, project_id, display_name)as a composite key everywhere. Workable for routing, but every FK across the schema becomes a 3-column composite — verbose and error-prone. UUID is cleaner.
Status
acceptedReferences
- SPEC-056 §Identity model
- Memory:
feedback_document_port_misses

