Agent Cockpit
An AI agent orchestrator running on my own machine: a task queue, one isolated git worktree per task, and nothing sensitive executed without my approval.
The problem
Running several coding agents in parallel creates three very concrete problems: they collide inside the same repository, they burn a quota nobody can see, and when one of them half-fails, nothing says so. Launching them by hand in separate terminals stops working past two or three tasks.
Architecture
Text version
Tauri app (macOS) — no data leaves the machine ├── React UI To decide · Tasks · Agents · Projects · Search ├── Runner pulls tasks off the queue, runs the agent, releases the lock ├── Store plain files under COCKPIT_DATA, no remote service └── worktree one isolated git worktree per task "ceo" agent: goal → YAML plan (8 tasks max) → human approval → queue
The decisions that matter
- Local-first, single user: VPS hosting was dropped along the way. Less exposed surface, no API tokens in transit, and no multi-tenant isolation to secure for a tool with exactly one user.
- One git worktree per task: two agents cannot corrupt each other's workspace, and the partial work of an interrupted task survives its restart.
- Explicit permission scope: every task declares what the agent is allowed to touch. The "ceo" agent breaks a goal down into a plan capped at eight tasks, but creates nothing: human approval is a required step, not a convenience.
- Quota balancing: in automatic mode, with no business constraint, a task goes to the least-used agent of the day. Cost estimates are derived from actually observed durations and show "unknown" rather than an invented figure when there is no history.
- Schema fingerprint: runner and server each publish a fingerprint derived from the task schema. When they diverge — typically a runner left on old code — the UI shows a red banner instead of writing data the other half of the system cannot read back.
- Recovering abandoned tasks: on start-up, any task held by a dead process, or silent for thirty minutes, returns to the queue with its lock released and its worktree preserved.
The lesson
A tool that fails silently is worse than a tool that crashes. Four incidents in a row all came from an invisible defect, never a severe one: a React crash with no error boundary (black screen), a runner quietly running old code, a "Validate" button live on an unusable plan, a task frozen by an orphaned lock. Every fix amounts to making the degraded state visible — error boundary, schema fingerprint, explicit blocking, automatic recovery. Since then, every feature is designed by first asking what it looks like when it only half succeeds.
Status
- 148 automated tests
- 13 configured agent roles
A personal tool in daily use, not a product: it is not deployed on the cluster and is not distributed. Figures read from the repository on 2026-09-21.