Skip to specification

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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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

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

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

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

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

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

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

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

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

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

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

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