The reports
Part of team watch — every line a pass can print, and when each is made.
A report is printed when it starts, and again only after it has cleared: a seat that stays blocked, or a machine that stays full, is said once, not every pass.
Two things go to .agents/team.log without being printed: the watch writes the machine's own
readings once every ten minutes per watch — readings: load 1.0/core, memory 69%, disk 227700000000 B free, swap used 7300000000 B of 8600000000 B (free 1300000000 B), unread where
a figure couldn't be read — and up and add write one line per machine refusal, carrying the
refusal and the readings it was decided on. The readings are the byte figures the gate compared,
in this fixed order — load, memory, disk, swap — so a later launch reads the figure that was
compared, not prose about it; the rounded-GB sentence stays the refusal the owner reads. At the
watch's worst rate that is 144 readings lines a day plus refusals, ≈170 bytes a line and ≈25 KB
a day: a 1 MB log holds ≈40 days of that, and three are kept, ≈5 months.
| Report | Made when |
|---|---|
<seat> is in the file and is not running | herdr lists no agent for a seat the file has, does not stop, and the watch has not seen running |
<seat> was running and is gone (its pane closed, or its CLI ended) | herdr lists no agent for a seat the watch had seen running; said at each disappearance |
<seat> is no longer the process team launched (its session was restored, or its CLI was restarted) | the process in the seat's pane is not the one recorded when team launched it: the pane runs no CLI, or one team did not launch |
<seat> waits at a permission prompt: its owner's to answer | a permission dialog or a trust question; only its owner answers those |
<seat> asked a question: the operator's to act on | a question the seat is waiting on |
<seat> shows a vendor notice: its owner's to act on | a screen the seat's profile captures as a vendor notice — today, Codex 0.157.0's update screen; team never answers one |
<seat> is blocked, and its screen is not one the watch recognises | herdr says blocked and the screen says nothing the watch knows |
<seat>: herdr reports the status "<status>" | a status that is neither idle, done, working nor blocked |
<seat> holds text in its input box that was never sent | unsent text for watch.unsent_after; the watch never sends or clears text it cannot show it typed itself |
<seat> has been idle since the watch started | quiet for watch.idle_first, and never seen working (reported once; repeated every watch.idle_repeat when set) |
<seat> has been idle for <n> minutes | quiet for watch.idle_first since its last turn (reported once per idle period; repeated every watch.idle_repeat when set) |
every agent is idle | every seat that is not the orchestrator, the operator or parked, quiet for watch.team_idle |
<seat> runs <model> <version>; the file says <declared>: it signs with the wrong model (<declared> is the seat's display spelling) | the running model or version is not the file's |
<name> (<pane>) is running and is not in the file | an agent in the session no seat claims, the watchdog pane aside |
the file was never approved on this machine | there is no approval record for this project |
approved before records were signed: run \team approve` once` | the record was written by an earlier team: not trusted, said once, and the watch keeps watching |
<why the record was refused> | a signed record that does not verify (changed after approval, another root, a replayed or rolled-back generation): said once, and the watch keeps watching |
the file differs from the approved one: <differences> | the file is not the approved one; the differences read as team status prints them |
the load is <n> per core, above <n> | over machine.load_max |
free memory is <n>%, below <n>% | under machine.memory_min |
free disk is <n> GB, below <n> GB | under machine.disk_min |
free swap is <n> GB, below <n> GB | under machine.swap_free_min |
swap grew by <n> GB in <n> minutes, above <n> GB | over machine.swap_growth_max inside machine.swap_growth_window |
<account> <window> is <n>% used, past the <n>% mark | the account's figure is at or past a mark of budgets.marks, once per window |
<account> <window> left <n>%, inside its <n>% reserve | a subscription account at or inside its reserve |
<account> <n> <currency> left, at its <n> <currency> floor | a spend account at or below its floor |
<account> is unknown while <seat> runs on it | nothing counts for an account whose seats are running |
Each report is addressed to the owner or to the operator. The operator's is what the nudge stands
for, and --no-notify can drop its desktop notification. The owner's — a permission prompt, a
vendor notice, an approval difference, a
machine figure, an account inside its reserve or at its floor — is notified anyway, and so are the
watch's own notices: the file can't be read, herdr doesn't answer, the operator could not be nudged,
a typed nudge was not sent, and the watch stopped. Neither flag
removes the log line, and neither reaches team status: a reserve still shows on the budgets
table, and an approval difference is still a difference.
What the nudge stands for, and the lines around it, is on the nudge page.
A report for the owner
A permission prompt is the owner's, and the watch says so rather than nudging anyone:
team watch ; echo "exit $?"
2026-10-04T09:00:00.000Z watching the session "beacon" every 120s
2026-10-04T09:00:00.000Z claude-beacon waits at a permission prompt: its owner's to answer
2026-10-04T09:00:00.000Z the watch of "beacon" stopped
exit 0A machine report
The machine is watched the same way. Free memory under machine.memory_min is the owner's to
answer, and a watch does not stop the team over it:
team watch ; echo "exit $?"
2026-10-04T09:00:00.000Z watching the session "beacon" every 120s
2026-10-04T09:00:00.000Z free memory is 8%, below 15%
2026-10-04T09:00:00.000Z the watch of "beacon" stopped
exit 0