Identities for entities did.bot
agent llm did
didbot plan subagents.md
5.2 kB


id: subagents title: What a distinct subagent identity would buy, and what a harness lets you enforce status: open crates: [didbot-pds, didbot-hook] dependsOn: [credentials, node] exitCriterion: > A written decision on whether a subagent gets its own DID, backed by a statement of which part of that decision the harness enforces and which part it only reports. #

subagents #

credentials states the current rule twice — once in its own list, once in node's boundaries section: the custody boundary is the session; subagent identity is attribution. A subagent's agent_id and agent_type are stamped by the hook onto the tool calls it makes, they land on records as provenance, and none of it grants a subagent anything a credential can enforce. This epic is where that gets revisited, not where it gets reversed by default — the honest answer may still be "attribution is correct and a distinct DID is not worth what it costs."

What a distinct DID would buy #

A subagent with its own did:web would let a write carry cryptographic proof of which subagent made it, rather than a claim the parent session's hook attached. It would let write-policy grant different collections to different subagent types by credential rather than by convention, and it would let a subagent be individually revoked without ending the session that spawned it. It would also let a compromised subagent be told apart from a compromised session after the fact, which attribution alone does not: a forged agent_id and a genuine one look identical once they are both just a field on a record the session's own key signed.

What it would cost #

agent-accounts makes provisioning a DNS write, a keypair, two hostnames that must both resolve, and a repository, all before an account exists. A subagent's lifetime is a fraction of a session's — SubagentStop fires the moment its one task ends — so the same cost that account-types already flags for per-run accounts applies here at a smaller grain still: minting a DID, a hostname and a DNS write for something that lives for one tool call's worth of work spends real infrastructure on an identity nothing will resolve twice. Provisioning latency also sits on the hot path of every subagent spawn, which node already worries about at the granularity of one hook firing per tool call; a DID per subagent multiplies that by however many subagents a session spawns.

What a harness actually lets you enforce, versus what it merely reports #

This is the honest part, and it is not a Claude-Code-specific caveat — it is the crux of the whole question. docs/hook-flow.md is explicit about the ceiling: a PreToolUse hook can block a call, rewrite its arguments, and inject context, but it cannot synthesize a call the model did not make, and agent_id/agent_type arrive on the hook payload as the harness's own report of what is running, not as something the harness cryptographically attests about the subagent process itself.

Done #

Nothing closed yet.