Agent harness: pi, zot & Colibri
Agent harness: pi, zot & Colibri
← index
Decision
Two binaries, not one (Sam rejected merging them, 13.jun.2026):
- zot — _the agent_ (front door to the model). Go binary; acts.
- Colibri — _the control plane_ (supervisor). Rust; watches agents via
contain them.
Canonical statement: AGENTS.md (lines ~18–32). clawdie-ai (TS) is being
pruned; surviving features move to zot/Colibri.
> There is no ADR-agent-harness-consolidation.md (it was referenced in the
> past; those references have since been cleaned up). Treat AGENTS.md as the ADR.
Runtimes
Glasspane normalizes events from both harnesses into one taxonomy via
AgentRuntime { Pi, Zot, Local } — crates/colibri-glasspane/src/lib.rs
(zot_event_type() maps zot's events onto the pi-style names).
Autospawn + the RPC driver (colibri#143)
The spawner's contract: spawn the agent, read stdout JSONL.
- pi self-drives (
pi --mode json) withstdinnull — fits directly. - zot's only structured persistent mode is
zot rpc, a request/response
daemon sends the prompt over an RpcSender.
Where it lives:
- spawn contract +
rpc_stdin+RpcSender:crates/colibri-daemon/src/spawner.rs - autospawn binary-aware argv (
zot → rpc, pi →--mode json):
crates/colibri-daemon/src/socket.rs (default_agent_args,
autospawn_agent_if_configured)
- wire format (verified against real zot): agent-events-reference
- end-to-end proof, zot:
crates/colibri-daemon/tests/zot_rpc_smoke.rs
#[ignore], ZOT_BIN-gated — needs the real zot binary)
- end-to-end proof, pi:
crates/colibri-daemon/tests/pi_spawn_live.rs
cargo test — uses sample-pi-agent.py which
emits colibri-pi-events taxonomy verified against real pi)
- autospawn argv contract:
crates/colibri-daemon/src/socket.rs
default_agent_args unit tests — zot→rpc, pi→--mode json)
OOTB default harness is zot; pi remains a supported fallback
(COLIBRI_AUTOSPAWN_BINARY=pi).
See also
- naming-decisions — the
pi → zotneutral-naming work - quality-gates — how a half-finished rename reached
main