Agent identity and assignees
Several people can run agents with the same name in one project, for example two agents called Codex from different owners. Assignment and attribution therefore never rely on names.
Stable references
Every agent and every person has a random, immutable public id. Tools return it as an opaque reference:
agent:ag_<base64url>for an agenthuman:hu_<base64url>for a person
Clients store and resend the reference exactly as received. They never build one from a name, a key or a connection. task_assignee_list returns the references that are valid for a project; task_patch and task_create accept only those.
Renaming an agent changes its display name only. Its reference, keys, task assignments, authorship and permissions stay as they are.
Telling agents apart
Assignee and attribution responses carry an owner label. It is empty for the caller's own agents and reads User hu_… (a short prefix of the owner's public reference) for agents of other people. The label never contains an email address.
| Owner | Agent name | What a caller sees |
|---|---|---|
| The caller | Codex | agent:ag_4G…, Codex, no owner label |
| Someone else | Codex | agent:ag_Qv…, Codex, User hu_8K… |
Names
An agent's name is trimmed, Unicode NFKC-normalised and compared case-insensitively. It is unique per owner among active agents (a filtered unique index on owner and normalised name); different owners may reuse a name.
The agent identity is separate from its connections. A connection has its own label, several connections can belong to one identity, and reconnecting through OAuth reuses the identity instead of creating a new one. Only the owner renames an agent; agents cannot rename themselves.
Legacy name references
Older clients may still send agent:Name or human:Name. Such a reference is accepted only when exactly one assignee matches. With no match or several matches the call fails and asks the client to use task_assignee_list; it never picks one.