Skip to content

No rename verb: an agent's identity is its directory name, so renaming means abandoning its inbox, archive, and context #21

Description

@schickling-assistant

At 46ff6ee there is no verb anywhere in the command tree that renames an agent.

Enumerated from st2 completions bash (generated from the live command tree, so it can't drift from the real flags):

  • top level: ls up message context resource service hooks ding status compile-agent down env pretrust eval pty shell validate doctor agents completions
  • message: send reply ls read archive thread
  • context: read write append
  • resource: add ls read remove

grep -iE '\b(rename|move|mv|relabel|alias)\b' over that tree returns nothing. In the source, every rename hit is either fs::rename (the atomic tmp+rename write pattern) or #[serde(rename = …)] — none is a user-facing verb.

This costs more than a convenience verb, because the identity is the path:

// src/main.rs:1075
.unwrap_or_else(|| catalog_root.join(&id));

and from src/message.rs:

The recipient is implied by the path

So the identity string names the directory holding everything durable about that agent:

  • <agent_dir>/resources/inbox/ — "Send = write the file" (src/message.rs)
  • <agent_dir>/resources/archive/ — "An archive copy is also a durable receipt" (src/message.rs)
  • <agent_dir>/resources/context/now.md plus an append-only decisions/ log; "an agent's lossless-restart memory of 'what it was mid-doing'" (src/context.rs)
  • <agent_dir>/resources/links/ — "high-value output (a PR, a doc, a dashboard) as a durable, listable record" (src/resource.rs)

If a name turns out wrong — misnamed at declaration, or the seat's purpose changed — the only available path is to declare a new identity and retire the old one. agents --json already carries retired, so the model sanctions retire-and-recreate. But the new seat starts empty: the inbox history, the archive receipts, the decisions log, and the resource links all stay behind under the dead name. Those are precisely the artifacts that make a long-lived identity worth keeping.

Adopter impact: identity naming becomes a one-way door. Every name has to be right the first time and forever, or you accept losing that agent's accumulated history — a heavy thing to hang on the moment of declaration, which is when you know least about what the seat will turn into.

Two shapes that would close it, offered rather than prescribed:

  1. A rename that moves the agent directory and rewrites the identity wherever it is recorded. Easy to reason about, but it has to handle in-flight state: a live pty, a running ding sidecar, and from fields in already-delivered messages that still name the old identity.
  2. An alias or successor edge, so a new name resolves to the same durable state without moving anything. Cheaper and inherently history-preserving, at the cost of a resolution step and a call on which name is canonical in the roster.

We may be duplicating work you already have unpushed — happy for this to be closed if so.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:catalogCatalog structure, declarations, transactions, and admission · Set: manualarea:identityAgent, session, run, and launch-generation identity · Set: manualorigin:agentFiled or primarily produced by an AI agent · Set: manualtype:featureNew user-visible or system capability · Set: manual

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions