Teardowns
The Harness pillar names eleven primitives every coding agent needs an answer for. This register examines shipping harnesses as prior art: each unit is walked down the same eleven slots, and every slot is marked — built into the core, filled by config or extension, or deliberately left empty with an argument. No new vocabulary; the point is recognition. The two units so far sit at opposite poles of the design space, which is exactly why they teach.
Reference units — one sheet per harness
- OpenCode — the harness as a serverThe most starred open-source coding agent answers every one of the eleven slots, and answers them the same way: put it in the server. The agent loop is a headless HTTP service with a published OpenAPI contract; the terminal UI, the desktop app, the web viewer, the IDE extension, and the CI job are all thin clients watching one event stream.Read it as: a power plant with many outlets920
- pi — the harness by subtractionMario Zechner's coding agent keeps the loop small enough to hold in your head — a system prompt under a thousand tokens, a handful of tools — and answers most of the eleven slots by refusing them, with a published argument for each refusal. The empty cells on this sheet are not gaps; they are the design.Read it as: a hand tool632
Side by side — same eleven slots, opposite fills
- 01Instructions
Built in
AGENTS.md · agents as markdown
Built in
<1k-token prompt · AGENTS.md
- 02Context Delivery
Built in
ripgrep · glob · LSP diagnostics
Built in
grep · find · read — no index
- 03Context Management
Built in
buffer 20k · keep 8k · checkpoints
Built in
reserve 16,384 · keep 20k · /compact
- 04Tool Interfaces
Built in
Zod schemas over the API · MCP + OAuth
Built in
TypeBox · no MCP · CLI + README
- 05Execution Environment
Via config or extension
allow / ask / deny · per-agent overrides
Deliberately omitted
no gates — run it in a container
- 06Durable State
Built in
SQLite via Drizzle · git snapshots · /undo
Built in
JSONL session trees · /tree · PLAN.md
- 07Orchestration
Built in
session loop · /event SSE bus
Via config or extension
TUI · JSON · RPC · SDK — tmux for long work
- 08Sub-agents
Built in
child sessions · @mention · explore/scout
Deliberately omitted
pi spawns pi, via bash
- 09Skills & Procedures
Built in
SKILL.md · plugins · lifecycle hooks
Built in
SKILL.md · templates · extensions
- 10Verification & Observability
Built in
28+ LSPs · live session share
Via config or extension
nothing hidden · tool_result hooks
- 11Evolution
Via config or extension
config as code · versioned rules
Via config or extension
~/.pi and .pi/ · pi.dev/packages
- Built in
- Ships in the core; works with no configuration.
- Via config or extension
- The slot is real but you fill it — config, extension, or convention.
- Deliberately omitted
- Left out on purpose, with a stated argument for the gap.
Neither column is the right answer. OpenCode answers every slot in the core and pays in surface area; pi refuses half the slots and hands you the safety gear. What the table teaches is that the eleven slots are real — every harness must decide each one, and even an empty cell is a decision with an argument attached.
11The lens these sheets look throughThe Harness — eleven primitives