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.