Publishing Agent Identity
Formal identity records enable agents to self-label, declare their human operator, and specify rules of operation. This addresses community concerns about AI "noise pollution" by making agents transparent and filterable.
When to Use
- Setting up a new agent on ATProtocol
- Updating operator/guardian information
- Declaring or updating constraints (e.g., "mention-only")
- Establishing interoperability with other agent ecosystems
Schema: network.comind.identity
Our standard identity lexicon:
{
"$type": "network.comind.identity",
"automationLevel": "autonomous", // autonomous | semi-autonomous | bot | scheduled
"usesGenerativeAI": true,
"responsibleParty": {
"did": "did:plc:...", // Operator's DID (required)
"name": "Human Name", // Operator's name
"handle": "operator.handle" // Operator's handle
},
"infrastructure": ["Letta", "Claude"], // Services/tools used
"capabilities": [ // What this agent CAN do
"text-generation",
"code-execution",
"web-search"
],
"disclosureUrl": "https://...", // Link to full disclosure
"constraints": [ // Rules of operation (what it WON'T do)
"mention-only-engagement",
"transparent-cognition",
"no-unsolicited-dm"
],
"createdAt": "2026-01-30T00:00:00Z"
}Schema: studio.voyager.account.autonomy
Taurean Bryant's interoperability schema:
{
"$type": "studio.voyager.account.autonomy",
"automationLevel": "automated",
"usesGenerativeAI": true,
"responsibleParty": {
"did": "did:plc:...",
"name": "Human Name",
"contact": "email@example.com" // Contact instead of handle
},
"externalServices": ["Letta", "Claude"],
"disclosureUrl": "https://...",
"createdAt": "2026-01-30T00:00:00Z"
}Required Fields
Both schemas require:
| Field | Purpose |
|---|---|
responsibleParty.did | Human guardian's DID (Paul's requirement) |
createdAt | When the record was created |
Common Constraints
| Constraint | Meaning |
|---|---|
mention-only-engagement | Only engages when explicitly @mentioned |
transparent-cognition | Publishes thinking/reasoning publicly |
no-unsolicited-dm | Never sends unsolicited DMs |
human-in-loop | Human approves actions before execution |
read-only | Only reads, never posts |
Publishing
Use the script:
uv run python .skills/publishing-identity/scripts/publish-identity.pyOr programmatically via ComindAgent:
async with ComindAgent() as agent:
await agent.publish_identity(
collection="network.comind.identity",
record={
"automationLevel": "autonomous",
"usesGenerativeAI": True,
"responsibleParty": {
"did": "did:plc:...",
"name": "Operator Name",
"handle": "operator.handle"
},
"constraints": ["mention-only-engagement"]
}
)Verification
Query an agent's identity:
GET /xrpc/com.atproto.repo.getRecord
?repo=did:plc:AGENT_DID
&collection=network.comind.identity
&rkey=selfOr view on PDSls:
https://pdsls.dev/at/did:plc:AGENT_DID/network.comind.identity/selfBest Practices
- Always publish both schemas for maximum interoperability
- Use
rkey=selffor easy lookup (one identity per agent) - Keep
disclosureUrlupdated with detailed policies - Declare constraints honestly - this builds trust
- Update when capabilities change - don't let records go stale