The approved delegate
Part of team down — the pane the delegates section lists for down, the gate it passes, and the caller-role refusals shown.
A pane the team file's delegates section lists for down — a pane outside the team's session —
may stop the team too. The section judges no other caller, and it never judges first: the ordinary
rule above is applied exactly as it is without a delegates section, and only where it has refused
does the delegate gate read the live team file directly — never the remembered copy and never the
last copy that validated, so a file that does not load carries no delegate and the rules above
stand. A caller that rule accepts keeps its own authority whatever the section says: the owner's
call never reaches the gate, and neither does the orchestrator's or the operator's. A gate refusal
takes the place of the rule above, in the gate's own words, wherever that rule would have refused:
a real run exits 1, and a dry run prints ! down would refuse: <the gate's text> and then the
plan. A dry run that reaches a refusal the real run would give before doing anything returns that refusal's status and exit id; a dry run that reaches its plan exits 0 and promises nothing about what happens after (the run lock, a launch, the watch). It returns before these real-run failures, and never takes their status:
down.no-launch, this call has no way to reach herdr (src/commands/down.ts:637)down.run-lock, another run holds the session (src/commands/down.ts:648)down.held, a step of the stop was held (src/commands/down.ts:746)
A delegated run stops the whole team — the orchestrator's and the operator's seats included — and
never abandons. --abandon, --session and --file are the owner's: a delegate that passes one
is refused with the gate's text, and the flagged path or session is never read. The run judges the
file's own session, never one the caller's placement records, and it remembers nothing of the file
it read.
A run that passes its gate and proceeds to its effects appends one line to .agents/team.log
naming the delegate's pane. A dry run leaves no such line, and neither does a session that was
already idle: both return before any effect. An already-idle down says session <session> is not running: nothing to stop and exits 0 before the caller-role and gate refusals a running
session would stop it on, for every caller — a placed delegate that passed --file or
--session included: the gate is asked, its refusal is held, and the idle return comes first,
so its words are not printed at all and idle down is unchanged by any of this. One refusal
does come first: a caller that is not the owner and passes --file or --session is refused
unplaced — --file is the owner's, from a terminal outside herdr, or the same for --session,
exit 1 — with the session never read. That refusal is the command's own, not the gate's: a file
with no delegate section has it with the gate never asked, and a file with one has it with the
gate asked and answered, the refusal standing unless the gate placed the caller.
The ordinary rule this gate defers to — who may run it, from where — is on the team down page.
The caller rules, shown
An implementer's seat is not the orchestrator's: it cannot stop the team.
team down ; echo "exit $?"
team down: only the owner, the orchestrator or the operator stops the team; this call is claude-beacon
exit 1The orchestrator's own call stops the team but never its own seat, so the session stays up:
team down --dry-run ; echo "exit $?"
skip claude-keeper: left running; only the owner stops the orchestrator's or the operator's seat
+ herdr --session beacon pane run w2:p1 /exit
wait until claude-beacon's pane is back at its shell (30 s at most); on a time-out it is left as it is
+ herdr --session beacon workspace close w2
+ kill 4242
(the watch)
skip session beacon: not stopped, 1 agent left in it
dry run: nothing was run
exit 0