Skip to content

Agent harness: zot + Colibri

Two binaries, not one (Sam rejected merging them, 13.jun.2026):

  • zotthe agent (front door to the model). Go binary; acts.
  • Colibrithe control plane (supervisor). Rust; watches agents via glasspane, runs the task board, owns cost. It observes zot/pi; it does not 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.

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).

The spawner’s contract: spawn the agent, read stdout JSONL.

  • pi self-drives (pi --mode json) with stdin null — fits directly.
  • zot’s only structured persistent mode is zot rpc, a request/response peer that reads stdin. So the spawner pipes stdin for RPC agents and the 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: crates/colibri-daemon/tests/zot_rpc_smoke.rs (#[ignore], ZOT_BIN-gated)

OOTB default harness is zot; pi remains a supported fallback (COLIBRI_AUTOSPAWN_BINARY=pi).