Skip to content
Agentic Control Plane

The 99 KB Hello World: What Coding Harnesses Send Before Your Prompt

David Crowe David Crowe · · 13 min read
cost harness observability agents
Share X HN LinkedIn

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:

macOS · Linux · WSL
curl -sf https://agenticcontrolplane.com/install.sh | bash
Windows · PowerShell
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.

Tool schemasSystem promptOther context25 KB49 KB74 KB98 KBQwen Code 0.23.0tool schemas: 66,455 charssystem prompt: 28,169 charsother context: 5,752 chars98 KB · 27 toolsClaude Code 2.1.259tool schemas: 56,200 charssystem prompt: 6,172 charsother context: 7,577 chars68 KB · 25 toolsCodex 0.153.1tool schemas: 17,526 charssystem prompt: 19,819 charsother context: 397 chars37 KB · 9 toolsOpenCode 1.18.27tool schemas: 20,393 charssystem prompt: 9,570 charsother context: 72 chars29 KB · 10 toolsgoosetool schemas: 5,176 charssystem prompt: 3,362 charsother context: 318 chars8.6 KB · 7 toolspitool schemas: 3,024 charssystem prompt: 2,633 charsother context: 68 chars5.6 KB · 4 toolsmini-SWE-agentother context: 2,946 chars3.2 KB · 1 tool
Bytes of JSON in each harness's first model request, split by what the bytes are. One hello-world trial per harness, DeepSeek V4 Flash via OpenRouter, captured 2026-09-03 with a reverse proxy in the request path. The task text is 68 characters in every bar.

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

5,80011,60017,40023,200Qwen Code 0.23.023,170 prompt tokens23,170Claude Code 2.1.25916,202 prompt tokens16,202Codex 0.153.19,169 prompt tokens9,169OpenCode 1.18.277,050 prompt tokens7,050goose2,335 prompt tokens2,335pi1,537 prompt tokens1,537mini-SWE-agent1,014 prompt tokens1,014
Prompt tokens the serving host reported in the usage block of each harness's first successful response. Same trials as above, DeepSeek V4 Flash served by DeepInfra through OpenRouter. Roughly 4.4 characters per token on this tokenizer.

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-flash via 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 openai provider 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.
Share X HN LinkedIn
Get the next data drop
What agents actually cost, new tool-surface captures, and the occasional incident post-mortem — sent when we publish something worth your inbox, not on a schedule. Unsubscribe anytime.
Share: Twitter LinkedIn
Related posts

← back to blog