Identities for entities did.bot
agent llm did
didbot plan dev-setup.md
6.8 kB
Markdown
at main


dev-setup #

local-dev is the loop once you are in it: five terminals and a swarm. This is getting there. The gap is not the scripts, it is everything around them — a certificate, a name, an edit to the user's harness configuration, and a restart before any of it takes effect.

The shape is a command that asks rather than assumes. It touches a person's settings file and possibly their trust store, so it says what it will do, does the parts it may, and stops with a specific instruction for the parts it may not.

What the shape is #

One set of defaults per machine, in scripts/dev-profile.sh: the port, the zone and the state directory, each overridable from the environment. A second stack on one machine is a second set of those variables, or a second checkout. Each daemon knows its own default state directory under $XDG_STATE_HOME (didbot-agentd's default_state_dir, dev-pds.sh's --data), so nothing has to be told where anything lives before it can start.

Installing an agent host — the daemon's unit file, the plugin, the hooks — is the agent host's installer's job, which is shell owned by the didbot-claude plugin: it writes the unit files and reports whether the plugin is present.

Where accounts come from, and the bootstrap #

Hooks are captured at session start, so a session that installs them is never itself hooked — and neither are its subagents, which inherit the session's captured configuration rather than re-reading disk. A directory is therefore set up from outside it, before a session starts there.

Recovery is a different problem from bootstrap, and a more frequent one: a server that was down when the session opened, or one restarted without --data. SessionStart cannot be replayed, so PreToolUse provisions as well, and the first record of a session with no usable account mints one. The identity still comes from the harness payload and never from the model, which is why this is a hook rather than something the record host offers: the Model Context Protocol carries no verified caller identity, so a tool that let a session register itself would let a model claim to be any session.

Setup #

The parts that are not the server #

Working in it #

Done #

  • A `did:web` carries no port, so accounts answer on 443 and the binary
    gets `cap_net_bind_service`. A machine running several servers at once
    says where each zone answers in `DIDBOT_RESOLVE_PORTS`, which every
    tool here reads and a browser is told through its own resolver rules.