Excellent at
Persistent PTY panes, workspaces, worktrees, agent visibility, local control, waits, event subscriptions, plugins, and human supervision.
A complete research synthesis on how operators use Herdr for multi-agent work, how Matt Pocock's small composable skills fit the model, and how to build a nested, observable agent factory without confusing panes with scheduling correctness.
Persistent PTY panes, workspaces, worktrees, agent visibility, local control, waits, event subscriptions, plugins, and human supervision.
A durable task queue, leases, authorization between workers, conflict arbitration, model routing, cost governance, or exactly-once execution.
One scheduler owns task truth; Herdr adapters provision one isolated worktree and pane per mutable attempt; workers exchange versioned artifacts.
Herdr can start, observe, read, signal, and wait on agents. Those primitives make orchestration possible; they do not decide what is safe to dispatch or when work is accepted.
The strongest pattern is controlled concurrency: role separation, worktree isolation, artifact handoffs, and visible review gates. The evidence does not support an autonomous, self-correcting swarm.
Herdr's official account demonstrated PR review and follow-up edits inside Herdr, recommending existing plugins or a custom plugin for a different UX. The same thread describes popup, split, and overlay panes, keybindings, automation scripts, and plugins as an escalation path.
Open primary post ↗Stefano Sandes reported a custom Cmd+P-style plugin for switching among workspaces and agents and invoking plugins or internal actions. This is a human routing layer—not autonomous strategy.
Open post ↗Fabian Schuh described a plugin that walks nested beans in a milestone: worktrees at milestone and epic/feature levels; tasks run sequentially, reuse context, and commit per task. It optimizes context continuity and Git safety over maximum fan-out.
Open post ↗A home-server operator separated roles into Hermes profiles, used OpenCode as a coding worker, and Herdr for sessions. Markdown spec handoffs, Git guardrails, and a second reviewing session worked; direct Kanban instruction and continuous self-improvement did not.
Open collected search ↗The tmux-agents-mon discussion, explicitly inspired by Herdr, focuses on knowing which agent needs attention. Operators value persistent terminals and state rollups because forgotten panes—not lack of raw spawn capacity—become the bottleneck.
Open collected search ↗Search surfaced projects named herdr-goal-skill, herdr-factory, pi-apnea, pi-bstn-subagents, herdr-lazy, and PR/session plugins. These are leads, not evidence: the assigned GitHub lane could not safely verify its exact Helium window and did not inspect repository content.
Open repository search ↗# Create an isolated workspace
herdr workspace create --cwd ~/project --label api
# Start a worker in a split
herdr agent start reviewer --cwd ~/project --split right -- pi
# Start a worker in a known workspace/tab
herdr agent start docs --workspace w1 --tab w1:t1 -- claude
# Observe and wait
herdr pane read w1:p2 --source recent --lines 50
herdr wait agent-status w1:p1 --status donenpx skills add ogulcancelik/herdr --skill herdr -g
# Runtime safety condition
test "$HERDR_ENV" = "1"
# Inspect the exact protocol for this binary
herdr api schema --json
herdr api snapshotThe official agent skill instructs an agent to use Herdr's CLI only when HERDR_ENV=1. This is a useful environmental guard, not an authorization system.
Native queues, DAG scheduling, shared semantic memory, cross-agent authorization, conflict resolution, retry policy, model routing, or exactly-once execution.
Marketplace discovery is automatic and unreviewed. Plugins run as the user and receive Herdr context. Review code, pin immutable revisions, and restrict socket access.
Matt Pocock's public repository is a library of engineering practices, not a separate orchestration runtime. Its most valuable factory pattern is the split between user-invoked workflows and model-invoked disciplines.
Starts only from explicit human intent. It coordinates a flow and may call model-invoked skills. It should not call another user-invoked workflow.
Loaded when the task matches. It performs one reusable discipline and emits a verifiable artifact rather than becoming a second foreman.
Short metadata lets the harness route without injecting every instruction.
Read the selected SKILL.md fully; load linked references only when required.
CONTEXT.md, ADRs, specs, tickets, tests, findings, and handoffs survive sessions.
A worker returns evidence—tests, diff, source URLs—not the assertion “done.”
| Pocock pattern | Herdr implementation | Control rule |
|---|---|---|
| User workflow | Factory foreman plugin/command | Human starts it; workers cannot recurse into peer workflows |
| Model discipline | Worker skill installed in its runtime | One bounded deliverable and output schema |
| Blocking edges | Task DAG in controller ledger | Only dispatch the ready frontier |
| Independent reviews | Two read-only reviewer panes | Standards and spec reports do not share context |
| Shared language | Versioned CONTEXT.md + ADR IDs | Summaries reference canonical artifacts, not full transcripts |
Task state, parent/child graph, attempts, leases, ownership, budgets, messages, artifacts, and audit—not Herdr pane titles.
A mutable attempt owns exactly one worktree and branch. Reviewers use read-only or detached checkouts. Integration is serialized.
Herdr “done” is a visibility signal. Controller acceptance requires a schema-valid result, current lease, and evidence digest.
Budget concurrency by model cost, CPU/RAM, provider headroom, and merge backlog—not by how many panes fit on screen.
Expired attempts lose authority. Replacement attempts receive a new fencing token; ambiguous side effects enter quarantine.
Workers exchange goal, constraints, commits, evidence, decisions, requested action, and digest—not inherited conversation history.
HERDR_ENV=1 allows a worker to use the Herdr skill and request helpers through policy.Sender writes an immutable, deduplicated handoff with goal, scope, requested action, and evidence.
Controller checks schema, lease/fencing token, policy, artifact digests, and recipient capabilities.
Controller persists the receipt and schedules exactly one successor for the dedupe key.
Recipient claims the task and records receipt before the sender releases its worktree.
{
"contract_version": "1.0",
"message_id": "uuidv7",
"dedupe_key": "parent:step:purpose",
"kind": "handoff",
"from_attempt_id": "uuidv7",
"to_task_id": "uuidv7",
"traceparent": "00-<trace>-<span>-01",
"task": {
"goal": "...",
"constraints": ["..."],
"definition_of_done": ["..."]
},
"worktree": {
"branch": "factory/root/task/attempt",
"base_commit": "sha",
"head": "sha",
"mode": "read_only|writer"
},
"evidence": [
{"uri": "artifact://...", "sha256": "...", "kind": "test"}
],
"decision_log": [{"id": "ADR-004", "reason": "..."}],
"requested_action": "review|continue|merge|answer",
"expires_at": "RFC3339"
}Give workers narrow commands such as “start approved child” and “read own logs,” not raw cross-pane input, plugin installation, or server shutdown.
One task, worktree, branch, lease, and owner. Claim paths/contracts where semantic overlap exists. Merge through one serialized queue.
Web/issues/repo text is untrusted. Read with no secrets or egress; pass sanitized structured facts to capability-limited mutating workers.
Cap nesting depth, fan-out, weighted concurrency, turns, retries, wall time, queue size, token reservation, and merge backlog.
On restart, compare leases, process trees, Herdr panes, worktrees, branches, and artifacts. Quarantine ambiguous state before creating replacements.
| Failure mode | Detection | Containment | Priority |
|---|---|---|---|
| False agent state | Compare Herdr status, process liveness, typed heartbeat, last progress | Never auto-accept from visual “done” | P0 |
| Prompt injection | Track untrusted source → tool / egress edges | Reader/actor split, no secrets, human egress gate | P0 |
| Plugin supply chain | Origin, resolved commit, hash, manifest inventory | Allowlist, review, immutable pin, staged update | P0 |
| Runaway spawning | Descendant count, token velocity, queue and lease metrics | Single scheduler, max depth/fan-out/budget | P0 |
| Orphans / retry storms | PID tree, lease TTL, attempt and idempotency key | Kill process group, jittered backoff, quarantine ambiguity | P1 |
Pin Herdr; capture the installed schema; create one worktree and agent; consume events; record all returned IDs; reconcile after restart without creating a second writer.
Implement tasks, attempts, leases, fencing, outbox, budgets, and artifact digests. Start with SQLite for one host or PostgreSQL for concurrent controllers.
Add the versioned contract, acknowledgement handshake, idempotent spawnChild, role capabilities, depth/fan-out limits, and a human attention queue.
Kill workers, restart Herdr and the controller, expire leases, duplicate messages, simulate conflicts, and verify cleanup, quarantine, and merge serialization.
Run three representative projects before expanding: measure rework, worktree conflicts, accepted completions with test evidence, tokens per accepted task, and human intervention time.