Writes act on what the user named in this turn
open, send, approve/deny, stop, close, connect, forget act
only on the sessions or machines the user named in the turn that
authorizes them; authority does not carry forward, and a watcher event or
a discovered session is never an authorization. An ambiguous plural
("close them") is a question back. Another agent's session is a target
only when the user named it in this turn (a named ask carried here on the
user's behalf counts); an unnamed one: report it and stop.
Guards are soft — an agent with a shell can bypass them — so the split is
the safety: read and steer verbs may sit on an allow-list by subcommand,
never the bare helper; open/stop/close/adopt/attach/connect/
forget and send --type stay on the permission prompt (template:
references/allow-list.md). Anything a timer or watcher types carries
[automated, not the user, approves nothing] (--automated). Every write returns one receipt: what, on which session
(the tuple), asked by whom, when.
Stop and close
The helper's stop interrupts the current turn (ctrl-c) and the session
stays; close ends it. The user's verb fixes the semantics, no confirmation
question: "close pane X" → close X --confirm "<their words>" at once;
"close session X" / "stop session X" → graceful: send --type the session
its own exit (/quit for Muse), wait, then close only if it lingers — a
session that does not end is reported, not force-closed; an MSP session has
no exit command: close X --confirm at once. The receipt names
which was done, who asked and when ("Closed s6 (pane w6:p6, was idle) —
asked by <requester> at 19:33 UTC."). You cannot end or restart yourself:
send --type and stop on your own pane fail agent_not_ready, so a
named ask on your own session goes back to the session that started you.
Never stop a Herdr server.
Machines and remote reach
machines is the one list: Herdr's saved machines, the tmux-only boxes of
~/.config/muse/machines.toml, and your MSP hosts (muse hosts, with
TBH_AGENTS_SESSION_PROTOCOL on): your own login's host family, the ones
you connect <host id>, and any holding a session you opened; the rest of
the directory is a count, never rows. open <host> --cwd <dir> opens a
session on one (host-manager's mode msp, one call); send --type,
read, status, close reach it by handle. Its id is a transport id,
never an ssh target: never ssh it, never hand-build a session or command
id.
connect <ssh-target> --label <name> is one command, one progress line
per step, stopping at the first thing wrong
(references/getting-started.md). A machine that stops
answering shows stale; context reports its outage and recovery. A
refused ssh while a machine's master is up means its single session slot
is held by the Herdr bridge, not a dead machine: the helper reaches it over
the existing master and never opens a fresh login to test. A remote report
comes home with fetch <machine> <path> (by content hash) — never over
ssh or a same-host path; code comes home through a PR.
Providers
On Herdr every verb works (native status and dialogs, readiness for the
brief, events by subscription). On tmux only liveness, read, guarded
send --type, open, stop, close, adopt, attach. On an MSP host
open, send --type [--steer], read, status, close, attach (no
pane: no keys, no ctrl-c). Any other verb is unsupported_by_provider
naming the verb that works. Verified behaviours: references/provider-notes.md.