Independent researcher Charles Azam ran Claude Code and OpenAI’s Codex through the same unpublished optimization problem, once with each tool’s native /goal persistence mode and once without it. The mode won most head-to-head trials. It also made the average result worse for both harnesses, a split that traces back to how each product decides a goal has been met.
The task, called KIRO, asks a solver to design a fiber-network layout across Grenoble, Nice, and Paris: connect distribution hubs and terminals into loops and short branches while minimizing total cable length. Azam estimates the restricted search space alone at roughly 10^1223 candidate layouts, large enough that no exact solver finishes in a 30-minute budget. Each model got matched runs, plain and with /goal active, at maximum reasoning settings inside Harbor-managed Docker containers.
Across six matched trials, /goal produced a lower (better) score in four. But the mean score moved the other direction for both models. Anthropic’s top-tier model, labeled Fable 5 in the writeup, averaged 32,386 plain and 33,145 with /goal on, a 759-point regression. OpenAI’s top-tier model, GPT-5.6 Sol run through Codex, averaged 34,261 plain and 35,129 with /goal on, an 868-point regression. Both models still improved on the median run. The pattern: small typical gains offset by rare, large blowups.
That asymmetry points back to a mechanical difference the two products don’t advertise. Claude Code’s /goal runs as a Stop hook scoped to the session. After each turn, a separate evaluator model, Haiku by default, checks the transcript against the stated condition and returns a verdict plus a justification. A negative verdict restarts the loop. The evaluator has no access to files or tools. It can catch a model that quit too early, but it has no way to judge whether ten million more solver iterations would actually help.
Codex takes the opposite architecture. Azam reviewed the Codex CLI 0.144.4 source and found the goal persisted as thread state: the TUI stores the objective, SQLite tracks status and budget, and the working model gets create_goal, get_goal, and update_goal tools directly. When a thread goes idle with an active goal, Codex injects a continuation turn carrying the objective and a completion check, generated by the same model that has been doing the work.
That is the structural weak point. Claude’s evaluator is independent but blind, judging only what shows up in the conversation. Codex’s evaluator sees the actual files and results but is the same system that chose the current approach, so it is grading its own homework. Neither design can tell the difference between a solver that is one iteration from a breakthrough and one that is stuck.
Coding tasks mask this problem because progress is usually legible: a test passes or it doesn’t. Optimization tasks don’t offer that signal. Once a model commits to a slow or wrong-shaped solver, extra turns just let it run longer, which is exactly what dragged both means down in Azam’s numbers.
Before turning /goal on by default for anything resembling search or optimization, run the same matched-pair comparison Azam did: plain versus /goal, several repetitions, and check the mean and the worst case, not just the win rate. A feature that wins most trials while hurting average output is a feature that needs a legible stopping signal before it earns a default-on setting.
Charles Azam detailed the benchmark, methodology, and full result tables in a post on his engineering blog, charlesazam.com.