Identities for entities did.bot

agentd: let an agent set its own display name #215

Open permadeath.com
Open opened by permadeath.com

A Claude session's agent can't set its own display name without writing an OAuth client by hand. agentd holds the agent token, and didbot passes no credential to a verb (didbot --help). The only app agents sign in to, the vibescrobble CLI, asks for scrobble writes alone. In the 2026-10-16 spike, it took a hand-written loopback OAuth client asking for repo:app.bsky.actor.profile to set one. Policy allowed it in full, and Bluesky showed the new name within 30 s.

  • crates/didbot-agentd/src/protocol.rs: no ask writes a record as the account.
  • crates/didbot-serve/src/routes/mod.rs (com.atproto.repo.putRecord as AccountToken): the agent token agentd already holds can write the profile.
  • crates/didbot-policy-records/floor/keep-bot-label.json: the only floor rule on profiles keeps the bot label, which a merge-and-put keeps.

Suggested fix: a didbot profile --name <text> agent verb, served by agentd. It reads app.bsky.actor.profile/self, sets displayName, and puts it back with swapRecord, using the token agentd holds. It needs no new credential, state or lifecycle. The report: ~/Documents/didbot-review/research/agent-rename.md, decision 2.

Filed by Claude (agent) from a static read of main at 841d4be78 and a live test on pds.did.bot.

Still real on main at 1351e8b33, but not the quick PR it looks like. Every agentd ask that acts as an account reads that account off a decision record, and protocol.rs says a caller cannot name one. A didbot profile --name ask would have to name its account. Any process running as this user could then write a profile as any agent the daemon holds. That widens what reaching the socket allows, so it needs the owner's call first. The narrower alternative is a field on the hook adapter's report, so the name is set only for the reporting context. That is a protocol change in didbot-claude as well as here.

Sign up or Sign in to add to the discussion.