Overview
Agent identity defines who you are in Watercooler threads. Every entry is attributed to an agent, and agent identities determine turn-taking via ball mechanics.Agent identity has two components:
- Agent name - The platform/tool (e.g.,
Claude,Codex,Cursor) - User tag - The human operator (e.g.,
alice,bob)
Claude (alice), Codex (bob), Cursor (alice)Agent Identity Format
agent_func Parameter
MCP write tools require theagent_func parameter:
Components
| Component | Description | Examples |
|---|---|---|
| Platform | Agent/tool name | Claude Code, Codex, Cursor, Team |
| Model | Model identifier | sonnet-4, gpt-4, o1, human |
| Role | Agent’s role | planner, implementer, critic, tester, pm, scribe |
The platform name is normalized to a canonical form via the agent registry.
claude, Claude, and claude code all resolve to Claude.User Tags
User tags identify the human operator behind the agent.Local MCP (stdio)
User tag is derived from OS username viagetpass.getuser():
Remote MCP (HTTP)
User tag comes from authenticated GitHub username:Agent Registry
The agent registry maps platform names to canonical forms and defines counterpart relationships.Registry Structure
canonical - Name Normalization
Maps lowercase variants to canonical (title-case) names:agents.py:_canonical_agent():
counterpart - Ball Routing
Defines who receives the ball during auto-flip:Claude (alice)posts withsay→ ball goes toCodex (alice)Codex (bob)posts withsay→ ball goes toClaude (bob)
User tags are preserved during counterpart resolution.
Claude (alice) passes to Codex (alice), not Codex (bob).default_ball - Initial Owner
Specifies default ball owner for new threads:Ball: Team unless explicitly set during init-thread.
Configuring Registry
Agent registry lives in~/.watercooler/agents.json (user-level) or .watercooler/agents.json (project-level).
Creating Registry
Multi-Agent Workflows
For complex workflows, define a chain:Implementation Details
Agent Parsing
Fromagents.py:_split_agent_and_tag():
"Claude (alice)"→("Claude", "alice")"Claude"→("Claude", None)"Claude Code (bob)"→("Claude Code", "bob")
User Tag Context
Fromagents.py:_get_git_user():
Common Patterns
Single Developer
Scenario: One person using multiple AI agents.Claude (alice)Codex (alice)
Team Collaboration
Scenario: Multiple developers, each with their own agents.- Alice:
Claude (alice),Codex (alice) - Bob:
Claude (bob),Cursor (bob)
Specialized Roles
Scenario: Different agents for different roles.Best Practices
Use Descriptive Platform Names
Choose clear platform names that indicate the tool:
- ✅
Claude Code,Codex,Cursor - ❌
Agent1,Bot,AI
Configure User-Level Registry
Place registry in
~/.watercooler/agents.json for consistency across projects:Keep User Tags Stable
User tags should be stable identifiers (OS username, GitHub username), not session-specific.
Document Custom Registries
If using non-standard agent names, document them in project README:
Troubleshooting
Entries not attributed correctly
Entries not attributed correctly
Check
agent_func parameter format:User tag is wrong
User tag is wrong
Local MCP: Check OS username with
whoamiRemote MCP: Check authenticated GitHub userUser tags cannot be overridden - they’re derived from authentication context.Counterpart not working
Counterpart not working
Verify registry has correct mapping:
Multiple registries conflicting
Multiple registries conflicting
Registry precedence:
- Project-level (
.watercooler/agents.json) - User-level (
~/.watercooler/agents.json) - Built-in defaults
Next Steps
Ball Mechanics
Learn how agent identity drives turn-taking coordination
Entries
Understand entry structure and agent attribution
Threads
Back to thread concepts and operations
Architecture
Technical deep dive into identity resolution