A coding agent can write the right command and still fail in production.

That sounds contradictory until you look at the path between the model's text and the machine that actually runs it. The model emits a command. A tool interface serializes it. A wrapper interpolates it into another string. JSON escapes it. A terminal executor reparses it. The shell expands it. Somewhere along that path, a quote, backslash, newline, glob, variable, or nested command substitution can stop being the thing the model meant.

Most agent evaluations compress all of that into a single score: did the task pass or fail? That is useful, but incomplete. For terminal-capable coding agents, the more operational question is: did the model fail, or did the command path fail?

A new benchmark paper, “QuoteBench: How Matched Scores Can Hide Command-Path Failures,” makes that boundary hard to ignore. The authors focus on LLM coding agents that issue Bash commands through interfaces that may serialize, wrap, and reparse model output. Their benchmark uses exact final-state validation on 56 one-shot tasks from 14 incident-derived families. In the paper's abstract, replaying the same reply through an added parser lowered success by 55.4 to 73.2 percentage points across eight same-window configurations. Disclosing the boundary recovered 30.4 to 60.7 points for six configurations, and zero or slightly negative for two.

The practical lesson is not “quotes are hard,” although they are. The lesson is that a pass rate is not an intrinsic property of a model. It is a property of a model, a generation contract, an execution transport, an operating point, and a validator.

That distinction matters if you are building agents that touch real repositories, CI runners, cloud CLIs, deployment scripts, data pipelines, or customer environments.

The hidden layer between intent and side effect

Developers often talk about coding agents as if the agent directly “runs Bash.” It does not. It usually writes text into an interface that eventually asks something else to run Bash. That interface might be an IDE extension, an agent framework, a terminal multiplexer, a remote sandbox, a tool-calling API, a Model Context Protocol server, or a CI job wrapper.

Each hop can change the command contract.

A command that is safe as raw shell text may be unsafe when interpolated into another shell string. A path with spaces may survive one boundary and break at the next. A JSON-escaped newline may become a literal newline later. A command intended for bash -lc may behave differently if the executor runs it under sh, inside a quoted string, or after a sanitization pass. Even logging can create false confidence if it records the model's original text rather than the command the runner actually executed.

This is why matched benchmark scores can be misleading. Two systems may both report that a model achieved the same task-level score, while one system required the model to compensate for a brittle wrapper and the other did not. Conversely, a model may look worse because the execution transport corrupted otherwise valid commands.

For a product team, both cases are dangerous. The first hides fragility. The second punishes the wrong layer.

Evaluate the command path, not only the model

The right response is not to abandon terminal agents. It is to test them like production systems.

A useful command-path test has five parts.

First, preserve the raw model output. Teams need to know what the model actually generated before any escaping, interpolation, redaction, normalization, or wrapper logic touched it. Without that artifact, every failure investigation starts in the fog.

Second, replay the same output through the exact production transport. Do not only test a clean local shell. Test the IDE extension, tool router, MCP server, container runner, CI wrapper, sandbox bridge, and permission layer that will exist in production. The point is to catch boundary bugs, not to prove Bash works.

Third, validate final state instead of terminal aesthetics. A command can print the right-looking output and leave the filesystem wrong. A command can fail quietly and still produce a plausible log. QuoteBench's emphasis on exact final-state validation is the part teams should copy: decide what state should exist after the command and verify that state directly.

Fourth, version the command contract. If you change from one executor to another, add a sanitizer, wrap commands in bash -lc, introduce JSON tool calls, or move from local shells to remote sandboxes, that is not just plumbing. It is a new operating point. It deserves a regression run.

Fifth, report the boundary. A serious evaluation should say which model was used, what prompt or generation contract constrained it, how commands moved from text to execution, what operating mode was enabled, and what validator judged success. That metadata is not paperwork; it is the difference between a reproducible agent result and a vibes-based demo.

Disclosure is not a substitute for engineering

One interesting QuoteBench result is that disclosure helped many configurations recover substantial performance. If the model is told about the boundary it must route commands through, it can sometimes adapt its generation.

That is useful, but it should not become the whole safety strategy.

Prompts are flexible. Execution paths are supposed to be dependable. If a wrapper requires the model to remember three quoting rules, avoid certain characters, and compensate for an undocumented parser, the system is borrowing reliability from the model's situational awareness. That may work in a demo. It is a poor release gate.

A better pattern is to make the execution contract explicit and boring. Use structured arguments where possible. Avoid nested shell interpolation unless it is truly needed. Prefer direct process execution APIs over stringly shell wrappers for routine operations. When shell access is required, document the exact shell, quoting rules, working directory, environment handling, timeout behavior, and output capture.

This aligns with a broader trend in agent engineering: reliable agents are less about magical autonomy and more about clean interfaces, constrained workflows, observable state, and tested tool boundaries. Anthropic's guidance on building effective agents emphasizes simple, composable patterns over unnecessary complexity. MCP's security guidance similarly treats tool boundaries and permissions as first-class design concerns. Command-path testing belongs in that same family of practices.

What this changes for release readiness

If your team is evaluating a coding agent, stop asking only, “What score did it get?” Ask a few sharper questions:

  • Did the benchmark run through the same execution path we use in production?
  • Can we replay raw model commands through that path without the model regenerating them?
  • Do we validate final filesystem, repository, database, or API state directly?
  • Do failures distinguish model planning errors from transport errors?
  • Are wrapper changes treated as release-affecting changes?
  • Can the incident report show what the model wrote, what the executor received, and what state changed?

Those questions may feel unglamorous, but they are where agent systems become real. The last mile is not the leaderboard. It is the boundary where text becomes side effect.

For Alchemic Technology readers building internal automation, the takeaway is straightforward: put command-path tests next to your agent evals. Keep the model benchmark, but do not let it stand alone. A coding agent that passes in a clean harness and fails through your production wrapper is not production-ready. Neither is one that only works because the model learned to compensate for your wrapper.

The release artifact should name the whole path: model, generation contract, execution transport, operating point, and final-state validator. Once that is visible, teams can improve the right layer: better prompt, safer executor, or deletion of a clever wrapper in favor of a boring direct API call.

Production agent quality is not only what the model knows. It is what the system preserves between intent and execution.

Build AI Systems That Survive Contact With Real Work

We help teams turn AI research into practical automations, agent workflows, and operational systems that can be evaluated and improved.

Get the Field Guide — $10 →