id: subagents title: A subagent is a context, so it gets an account status: open crates: [didbot-pds, didbot-agentd] dependsOn: [credentials, node] exitCriterion: > Two subagents of one session write records signed by two different accounts, each account's registration names the context that spawned it, and a deployment that wants one account per session instead sets that in configuration rather than in code. #
subagents #
One session is one context. A subagent's context is its own and ends with its task, so it is a different entity from its parent and from its siblings — not a role its parent plays. It gets an account.
This reverses what credentials and node each stated: that the custody boundary is the session and subagent identity is attribution. That boundary was never a claim about trust. It was a claim about delivery — session-scoped environment cannot narrow below a session, so a credential could not either, and the rule described the mechanism rather than the model. cred-delivery removes the mechanism's limit.
What an account buys, and what it does not #
- Revocability. A context's binding is dropped in the daemon without ending the session that spawned it.
- Attribution that survives. The writer is the signer, so nothing has to
be tagged onto each record and nothing has to be believed. Lineage is stated
once, at provisioning, in
bot.did.registration's#agentmember, which already carriesharness,agentType,sessionandparent. - Not narrower authority. An agent's credential is all-or-nothing over its own repository; what a context may write is decided by policy. A subagent account restricts what a subagent is handed, never what it could reach by acting as the session instead.
That last point answers this epic's old open question, and it holds whatever harness is underneath: a subagent runs inside its parent's process and filesystem, so the boundary is reported rather than enforced.
Reported, not enforced — and that was always true #
agent_id arrives on the harness's own report of what it spawned. Nothing
proves the subagent process is isolated from its parent's memory or its
siblings'.
What is worth keeping is that session_id is exactly the same kind of claim
from exactly the same bookkeeping. Sessions were never better attested than
subagents, so admitting subagents lowers nothing. What both rest on is the
node the handshake admitted, and didbot-attest says as much:
read a provenance as "a machine we admitted asked for this", never as "this
agent is who it says it is".
The identifier is not reliable, and disk is #
The harness's agent_id has been observed arriving wrong: one subagent's
consecutive tool calls under two different ids, and a single stray id
collecting calls from more than one real subagent. A stray id would mint an
account for a context that never existed, or worse, sign several agents' work
under one name.
Cost, measured #
Two days on the owner's machine: 16 sessions, 167 subagent invocations, all of one type. Only five sessions spawned any, and 161 of the invocations came from one project — bursty, and concentrated where the work is.