- MEDIUM: reason enum stated as exactly {permission, stopped} (drop stray
"stopped/needs-next" third label)
- MEDIUM: specify oldest-READY-stuck-first — a cooldowned skipped item is not
eligible to be the head; advance to next ready item, else present empty
- MEDIUM: SubagentStop downgraded from "Confirmed" to "exists; not probed"
(probe only saw SessionStart/Stop)
- LOW: agent-inbox reuse reworded (Trail Boss actions are navigate-and-reply /
skip, not accept/edit/ignore); note permission_mode is display-only
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.2 KiB
Related work
Trail Boss sits at a specific point in the agent-tooling design space. The two axes that distinguish it: who initiates (do you poll the agents, or do they surface to you?) and observe vs. act (does the tool just show state, or let you respond in place?).
Public prior art
disler/claude-code-hooks-multi-agent-observability
A self-hosted, real-time dashboard that captures Claude Code hook events and visualizes agent
activity (sessions, tool calls, errors) over WebSocket. It proves the detection + correlation
layer Trail Boss needs: hooks → collector → live UI, keyed by session_id.
How Trail Boss differs: it is observability, not action. It shows that a session is waiting; Trail Boss adds the missing half — surfacing the blocked session and navigating the operator to the live pane to act on it (it never injects input; see "Navigator, not relay" in the plan). Its collector is a strong starting point to fork; Trail Boss extends disler's append-only event store with a self-healing session→pane registry and a tmux navigation layer. It reuses the SQLite event store, not the WebSocket/browser-UI layer (presentation is tmux, not a web app).
langchain-ai/agent-inbox
An inbox UX for human-in-the-loop agents: LangGraph agents hit an interrupt, and the inbox
presents pending items for a human to accept, edit, respond to, or ignore. This is the closest
public analog to Trail Boss's core idea — a queue of agents waiting on a human.
How Trail Boss differs: Agent Inbox is bound to the LangGraph runtime and its interrupt
primitive. Trail Boss targets interactive terminal coding agents (e.g. Claude Code
sessions): detection comes from Claude Code hooks rather than framework interrupts, and the
operator acts by being navigated to the live tmux pane — not by the tool replying through a
graph runtime. It also adds skip / re-surface semantics and an auto-advance FIFO depletion
loop (oldest-stuck first, no priority) tuned for an operator draining many live sessions.
Positioning
Observability dashboards watch agents. Broadcast/dispatch tools let you push requests out to agents. Trail Boss does the inverse and adds action: it surfaces whichever agent is stuck and lets you answer or skip from one pane — the human-in-the-loop counterpart to autonomous agent fleets, which remove the human entirely.
Concrete reuse
- Collector backend → the hook-native event store from
disler/...observability(SQLite + hook ingest) is a clean fork point; extend it with the self-healing session→pane registry and the tmux navigation layer. Drop its WebSocket/browser-UI half — Trail Boss's presentation is tmux (display-popup), not a web client. - Inbox UX patterns →
langchain-ai/agent-inboxfor the queue-of-pending-items shape only. Trail Boss's own actions stay navigate-and-reply (in the live pane) or skip — there is no accept/edit/ignore, since those happen natively in the pane (navigator, not relay). Items carry one of the two stuck reasons (permission,stopped) for display.