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 units do not line up from less to more: the third is built on the second’s loop and still fills almost every slot the second refuses — which is the clearest evidence available that the slots are real.
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
- Flue — the harness as a frameworkThe Astro team's answer to a question this site's eleven primitives raise but never ask out loud: if the slots are a library, what is the framework? Flue runs the same pi loop torn down one sheet earlier, fills nearly every slot pi refused — sandbox, sub-agents, MCP, receipts — and deletes the one thing pi assumed. There is no human at the terminal.Read it as: ductwork designed into the house1010
- DeepSeek Harness — the harness with no coreA model lab shipped its own harness and made one claim about it: everything is a plugin. Not the tools — everything. The model adapter, the tool registry, the session log, the sandbox, and the agent loop itself are all rows in a config tree, and every row can be replaced from a file. The three sheets before this one describe harnesses with a centre. This one argues there does not have to be a centre at all.Read it as: a ship of theseus, built that way on purpose1010
- fx — the harness as one binaryA 7.8 MiB coding agent in Zig with an empty dependency list. Not few dependencies — none: .dependencies = .{} in the build manifest, so every primitive on this register was written by hand inside one artifact. The three harnesses before it answer the slots by composing parts. This one answers them by refusing to load any, and then argues that a boundary you cannot extend is a boundary you can reason about.Read it as: a sealed instrument830
- TrueForge — the harness as a switchboardThe first unit on this register that is not a coding agent. TrueFoundry's open-source runtime drives enterprise agents over MCP servers — a CRM, a tracker, a document store — and it still answers all eleven slots, which is the best evidence yet that the slots are about harnesses and not about code. Its own axis is narrower than any sheet before it: how few tokens can reach the model per turn and still get the same answer. It publishes a benchmark to say so.Read it as: a telephone exchange830
Side by side — one row per primitive, one column per harness
- 01Instructions
OpenCode
Built in
AGENTS.md · agents as markdown
pi
Built in
<1k-token prompt · AGENTS.md
Flue
Built in
'use agent' · prompt is a return value · AGENTS.md
DeepSeek Harness
Built in
ctx.systemPrompt · sections per plugin · presets
fx
Built in
AGENTS.md · resolved per tool target · 128 KiB total
TrueForge
Built in
InstructionBuilder XML tree · CDATA user text · seed messages
- 02Context Delivery
OpenCode
Built in
ripgrep · glob · LSP diagnostics
pi
Built in
grep · find · read — no index
Flue
Built in
sandbox tools + cwd listing in the prompt
DeepSeek Harness
Built in
ctx.fs · ctx.web · ctx.lsp · agent.inject()
fx
Built in
grep / glob / ranged read · web_search built in
TrueForge
Via config or extension
MCP servers · sandbox shell · Code Mode via mcp_client
- 03Context Management
OpenCode
Built in
buffer 20k · keep 8k · checkpoints
pi
Built in
reserve 16,384 · keep 20k · /compact
Flue
Built in
reserve <=20k · keep 8k · cheaper compaction model
DeepSeek Harness
Built in
token meter · pruner · spill · no compact tool
fx
Built in
8 turns → keep 4 · a byte budget per source
TrueForge
Built in
defer by default · 6k / 10k → disk · compact at 50k
- 04Tool Interfaces
OpenCode
Built in
Zod schemas over the API · MCP + OAuth
pi
Built in
TypeBox · no MCP · CLI + README
Flue
Built in
defineTool · Valibot · useMcpConnection
DeepSeek Harness
Built in
guarded pipeline · Code Mode · MCP client
fx
Built in
~25 built-ins · mcp.json is user-global only · lazy select
TrueForge
Built in
remote MCP + OAuth · @read-only / @write / @destructive selectors
- 05Execution Environment
OpenCode
Via config or extension
allow / ask / deny · per-agent overrides
pi
Deliberately omitted
no gates — run it in a container
Flue
Built in
useSandbox() · virtual | local() | 11 remote
DeepSeek Harness
Built in
argv handover · one policy home · fails closed
fx
Via config or extension
ask / auto / yolo · gpt-5.4 reviewer · OS sandbox: macOS only
TrueForge
Built in
sandbox as tool · credentials never enter it · approval on @write
- 06Durable State
OpenCode
Built in
SQLite via Drizzle · git snapshots · /undo
pi
Built in
JSONL session trees · /tree · PLAN.md
Flue
Built in
Durable Streams · 10 attempts / 1h · step.do
DeepSeek Harness
Built in
append-only log · model-visible means logged
fx
Built in
~/.fx/sessions · /undo · /clear keeps, /reset kills
TrueForge
Built in
event log · persist before mutate · SQLite / Postgres + Redis
- 07Orchestration
OpenCode
Built in
session loop · /event SSE bus
pi
Via config or extension
TUI · JSON · RPC · SDK — tmux for long work
Flue
Built in
dispatch() · POST /:id · 17 verified channels
DeepSeek Harness
Built in
turn / step · agent/pre-step waterfall · one inbox
fx
Built in
PreToolUse · Stop → synthetic continuation · /background
TrueForge
Built in
three processor phases · pause states · 100-iteration cap
- 08Sub-agents
OpenCode
Built in
child sessions · @mention · explore/scout
pi
Deliberately omitted
pi spawns pi, via bash
Flue
Built in
task tool · fresh context · depth 4
DeepSeek Harness
Built in
6 providers · incl. Codex and Claude Code
fx
Built in
one tool, six branches · durable queues · no privilege escalation
TrueForge
Built in
create_sub_agent · one level · parallel · model per child
- 09Skills & Procedures
OpenCode
Built in
SKILL.md · plugins · lifecycle hooks
pi
Built in
SKILL.md · templates · extensions
Flue
Built in
SKILL.md · activate_skill · bundled files
DeepSeek Harness
Built in
ctx.skills · catalogue then body · rival hook formats
fx
Built in
SKILL.md · progressive disclosure · reads rivals' dirs, writes only its own
TrueForge
Built in
git-backed SKILL.md · sparse clone into the sandbox
- 10Verification & Observability
OpenCode
Built in
28+ LSPs · live session share
pi
Via config or extension
nothing hidden · tool_result hooks
Flue
Built in
observe() · instrument() · OTel · Vitest evals
DeepSeek Harness
Built in
OTel · 4-operation LSP · attributed invariants
fx
Via config or extension
/trace · fx doctor · FX_TRACE_LOG · no LSP fleet
TrueForge
Via config or extension
events API · OTel spans · judge outside the loop
- 11Evolution
OpenCode
Via config or extension
config as code · versioned rules
pi
Via config or extension
~/.pi and .pi/ · pi.dev/packages
Flue
Via config or extension
flue add — blueprints for an agent · flue docs offline
DeepSeek Harness
Via config or extension
cordis_define / cordis_run · in-memory only
fx
Via config or extension
memories.json — save / list / clear · rules · otherwise recompile
TrueForge
Via config or extension
the agent spec is the surface · roadmap names the rest
- 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.
No column is the right answer. OpenCode answers every slot in the core and pays in surface area. pi refuses half of them and hands you the safety gear instead. Flue takes pi’s own loop and fills nearly everything pi left out — because it deleted the operator pi was built around. DeepSeek Harness fills almost every slot too, and then argues that none of them should be fixed in place: each one is a row you can replace from a file.
That last pair is the one worth sitting with. Two harnesses can share an engine and still disagree about most of the eleven slots, which means the slots are not a taxonomy imposed from outside — they are the decisions the work forces. Every harness must answer each one, and an empty cell is an answer with an argument attached.
11The lens these sheets look throughThe Harness — eleven primitives