The 99 KB Hello World: What Coding Harnesses Send Before Your Prompt
Run agents? ACP lets you see, control, and price every tool call they make — allow/ask/deny policy, per-session cost, and a full audit log for Claude Code, Cursor, Codex, and OpenClaw, in one command:
curl -sf https://agenticcontrolplane.com/install.sh | bash
irm https://agenticcontrolplane.com/install.ps1 | iex
Getting started → · see your first governed call → · free up to 5 agents
Ask a coding agent to create hello.txt containing Hello, world! and the prompt is 68 characters. What reaches the model is not. Every harness wraps that line in its own system prompt, its tool catalog, and whatever context it decides you need, and the wrapper is billed on every turn.
The leaderboards hold the harness fixed and vary the model, so nobody publishes the wrapper. We held the model fixed and varied the harness. One task, one model, every harness the runner could install, a logging proxy between each harness and the model so every request body was captured verbatim. This is the first request each one sent.
1. What the bytes are
| Harness | System prompt | Tool schemas | Other context | Task | First request |
|---|---|---|---|---|---|
| Qwen Code 0.23.0 | 28,169 | 66,455 · 27 tools | 5,684 | 68 | 101,149 B |
| Claude Code 2.1.259 | 6,172 | 56,200 · 25 tools | 7,509 | 68 | 71,078 B |
| Codex 0.153.1 | 19,819 | 17,526 · 9 tools | 329 | 68 | 40,789 B |
| OpenCode 1.18.27 | 9,570 | 20,393 · 10 tools | 0 | 72 | 30,439 B |
| goose | 3,362 | 5,176 · 7 tools | 250 | 68 | 9,188 B |
| pi | 2,633 | 3,024 · 4 tools | 0 | 68 | 6,025 B |
| mini-SWE-agent | 62 | 245 · 1 tool | 2,878 | 68 | 3,481 B |
Characters, measured from the captured JSON, so the comparison is tokenizer-neutral. What sits inside each column:
- Qwen Code is the largest: a 28 KB system prompt and 27 tools in 66 KB, plus a 5.7 KB skills catalog injected into the user turn. The tool list reads like Claude Code’s in snake_case: agent, cron, worktrees, monitor, send_message, report_findings. Harnesses are converging on the same surface, and paying for it.
- Claude Code ships a headless session the full interactive tool suite: cron scheduling, git worktrees, workflow orchestration, inter-agent messaging, task tracking. Twenty-five schemas, 56 KB, for a job that needs one
Write. The “other context” is a 306-character reminder block prepended to the user turn plus a 7,203-character catalog of agent types for the delegation tool. - Codex is the only one whose system prompt outweighs its tools: 16,979 characters of instructions plus a 2,840-character skills preamble. Its nine tools are compact except one, a 10,142-character multi-agent tool that is more than half its tool bytes.
- OpenCode sends a 9,570-character system prompt and ten tools totaling 20 KB, and nothing else. Its prefix is the same bytes every turn, which matters for caching below.
- goose sends a 3.4 KB system prompt and seven tools in 5 KB, with a short environment block in the user turn.
- pi sends 2.6 KB of system prompt and four tools in 3 KB.
- mini-SWE-agent, the research-minimal harness, is the floor: a 62-character system prompt, one tool, and a 2.9 KB task template. It solved the task like everything else. What a coding agent needs to send is close to nothing; what the popular harnesses send is a product decision.
2. What the host billed for it
Sixteen thousand tokens for Claude Code and 23,170 for Qwen Code before the model has read the word “hello.” On this model at this host that is a fraction of a cent, which is why nobody notices on a one-line task. It stops being a fraction of a cent when the same prefix is re-sent on every one of forty turns and the cache misses.
3. Three things the totals hide
The token counts came from the usage blocks. The request and response bodies showed three things the counts do not.
OpenCode calls a second model you did not choose. Before the task, it sent a 2.6 KB request to gpt-5.4-nano to title the session. Our account had the allowed providers pinned to one host that does not serve that model, so the call returned a 404 and OpenCode carried on. On an unpinned account that is a quiet extra line on the bill, on a different vendor, on every session.
Retry behavior is a harness trait. The pinned host rate-limited the model mid-run. Claude Code absorbed four 429s in ten seconds and finished. OpenCode took two and finished. pi retries three times with backoff. Codex tries a WebSocket first, gets a 404 from this host five times, falls back to HTTPS, and in a later run exhausted its retry limit and failed the task outright. Under ten runs at concurrency, retry policy decides who completes, not the model.
The harness’s own meter can be fiction. Claude Code reported a session cost of $0.133 for a run that produced 87 output tokens, and marked its own cost basis as unknown. The real spend across all four harnesses was under half a cent. A meter that does not know the model it is talking to prices it at a default and reports the number anyway.
4. What this means for a real session
The first request is the floor, not the bill. Per turn, the harness re-sends its prefix and everything the session has accumulated, so the wrapper’s share of spend depends on two things this capture only hints at: how many turns the harness takes to finish, and whether the prefix stays byte-identical so the host can serve it from cache. Systima’s July comparison of Claude Code and OpenCode on the same model found exactly that tension: Claude Code starts at 33k tokens and OpenCode at 7k, but Claude Code batched its tool calls into fewer turns and on some tasks finished cheaper, while writing far more cache. The meter starts higher; the session decides.
That is the next study: one Terminal-Bench task, these harnesses, ten runs each, with every tool call recorded independently of the harness. The first-request table above is the part that does not need ten runs to be true.
Method
- Runner: Harbor 0.22, the Terminal-Bench evaluation framework, which builds the task container, installs the harness inside it, runs the prompt and grades the result. Task:
harbor/hello-world. Harness versions are whatever Harbor installed on 2026-09-03; they are in the table. - Model:
deepseek/deepseek-v4-flashvia OpenRouter for every harness, in each harness’s native wire format: Anthropic Messages for Claude Code, the OpenAI Responses API for Codex and OpenCode, chat completions for the rest. Allowed providers were pinned to DeepInfra for the first four captures and widened to three hosts for the later ones. One trial per harness. Harbor also has aider, Terminus 2, OpenHands, Hermes and Cline; each failed on install or connectivity inside the container on the day and is not in the table. - Capture: a mitmproxy reverse proxy in front of OpenRouter, reachable from the containers. Every request and response body was written to a flow file. Character counts are
len()of the relevant JSON fields in the first request that returned 200; token counts are the host’s usage block on that response. - Caveats: Claude Code ran in headless SDK mode, which is what a CI or benchmark run looks like, not an interactive terminal session. OpenCode was configured with the
openaiprovider pointed at OpenRouter, which is why it spoke the Responses API. pi ran in print mode. One trial each is enough to read a first request; it is not enough to say anything about variance, which is what the ten-run study is for. - The independent record: each harness also ran once with the control plane’s hook installed inside the container. The gateway recorded the tool calls as they happened, from the container, under the harness’s own client name. pi printed a receipt on exit with the call count and a link to the session. That record is what the ten-run study will be scored from, so the harness never grades itself.