The Harness Changes the Model
By Tony Ojeda
I use ChatGPT, Claude Code, Cursor, Codex, and OpenClaw regularly, and one of the easiest ways to get a disappointing result is to use the right model in the wrong place.
For a while, I thought of these tools mostly as competitors. Claude Code versus Codex. Cursor versus Claude Code. ChatGPT versus Claude. The natural question was which one was best, and every new model release seemed to invite another round of comparison. I don’t think that is the right question anymore.
What matters in practice is the combination of the task, the model, and the harness around it. The same model can feel significantly better or worse depending on what context it has, what tools it can access, how work gets delegated, what you can see while it is working, and how well the environment matches the kind of work you are asking it to do.
I have experimented with these combinations enough now that I rarely choose an AI tool in isolation. I choose an environment for the job.
What Sits Around the Model
The model obviously matters. I have fairly strong preferences at this point, and when I run similar work through different models the differences are not subtle.
Claude has generally produced the highest-quality work for me. That has been especially visible when I run the same research and publishing workflows through multiple models and compare what comes back. Claude has been the best at following detailed writing instructions and producing strong prose, and its visual design work has also been near the top of the models I have tested.
But the model is still only part of what determines the result. The harness decides what happens around the model. It controls things like memory, context assembly, tool access, agent orchestration, autonomy, visibility into the work, interaction style, and sometimes even how the task itself gets framed before the model sees it. Those choices affect both the quality of the output and the amount of effort required to get there.
Codex is the clearest example in my own setup. I rarely use Codex as a standalone coding environment because, for the work I do, the model-plus-harness combination usually feels middle of the road. I will occasionally use it as a second implementation or to compare an alternative solution against Claude Code or Cursor, but it is almost never my first choice.
Put Codex inside my OpenClaw setup, though, and I like it much more. OpenClaw is an open-source personal AI assistant you can run yourself; Meraxes is my instance of it. It has been tuned as a front door to the rest of my AI system. It has access to the agents, tools, files, memory, and workflows I want available, and I can interact with it through Telegram when I am away from my computer. In that environment, Codex is not being asked to behave like my primary coding partner. It is operating inside a system that already supplies much of the structure and context it needs — the same principle behind Compound Agent OS: the surrounding system changes what the model has to invent on its own.
The underlying model did not suddenly improve. The surrounding system became better suited to the task.
ChatGPT Is Where I Think
I have increasingly moved brainstorming, strategy, learning, quick research, and general question answering into ChatGPT. That is not because I think the underlying GPT models outperform Claude. For complex execution, I generally think the opposite. The reason ChatGPT works so well for me as a thinking partner is how it handles accumulated context.
Over time, it has access to a large amount of information from previous conversations and files, which makes it possible to pick up a topic without reconstructing all of the background every time. More importantly, I like the balance it strikes in deciding when that context is useful.
I experimented with Claude’s memory in a similar role and found it too aggressive for the way I work. It would sometimes pull ideas from prior conversations into a new discussion when I wanted the current conversation to stand mostly on its own. That made the memory feel less like background knowledge and more like an additional participant constantly trying to connect everything together.
There are times when I want that continuity, and there are times when I just want to ask a question. ChatGPT has been better at giving me both. That distinction has made it increasingly valuable as the place where I work out what I think before the work turns into implementation.
Claude Is Where I Go When Quality on the First Pass Matters
When the task is complex and I care a lot about the quality of the first result, I generally reach for Claude. For coding and implementation work, that usually means Claude Code. I see the difference across architecture, debugging, instruction following, code quality, design, and writing. None of those categories is absolute, and other models sometimes beat it on individual tasks. Grok, for example, produced slightly better visual design than Claude in some of my side-by-side design tests.
But Claude has been the most consistently good across the entire workload. That consistency matters on complex work because a mediocre first pass is expensive. It means reviewing more closely, explaining what went wrong, undoing decisions, or allowing errors from an early stage to propagate into later work. A model that gets more of the structure right the first time reduces all of that downstream correction.
The frustrating part is that Claude’s usage limits become part of the workflow. When I am doing serious work, I routinely run into the five-hour limit, which means I cannot simply use my preferred model for every task all day. That forces a more deliberate allocation of work.
Cursor Might Be My Favorite Harness
If I could have effectively unlimited Claude usage inside Cursor, that would probably be my preferred coding setup. Cursor’s IDE integration is better suited to how I like to work, and its biggest advantage for me is visibility. When agents or subagents are working, I can open those sessions and see what they are doing rather than treating the whole process as a black box.
That matters more as the amount of delegated work increases. If an agent is editing a few lines of code, I do not need much operational visibility. If several agents are exploring a codebase, implementing pieces of a feature, or making changes in parallel, I want to know what they are doing and where their assumptions are starting to diverge. That is the same visibility requirement I argued for in I Want to See My Agents Work.
Cursor gives me a much better window into that process than the other coding environments I use. Because its own models also seem to have relatively generous usage, I have been leaning on Cursor more for work that is not especially difficult. I can preserve Claude for tasks where I expect the quality difference to matter and use Cursor when the task is straightforward or when the ability to inspect the agent work is more important than having my absolute first-choice model. That is a tradeoff I would never see in a model benchmark.
Usage Is a Routing Constraint
Usage limits sound like a subscription detail, but they have become part of how I design the workflow. ChatGPT and Codex having separate usage pools is surprisingly valuable to me because it gives different parts of my system independent capacity. I can spend a lot of time thinking in ChatGPT and continue using Codex through Meraxes without feeling like one mode of work is draining the other.
Claude is almost the opposite experience. It is usually where I want to send the hardest work, but the five-hour window means I have to ration it when I am deep into a project. Cursor adds another option because I can use its models more liberally for simpler implementation work and save Claude for the tasks where I am most likely to notice the difference. So my actual tool choice is not simply a ranking from strongest to weakest. It is closer to resource allocation. I am trying to match the best available combination to the work while preserving the scarcer combinations for the places where they create the most value.
My Current Routing
The rules I use are not complicated:
-
If the task is complex and I want the best chance of getting high-quality work on the first pass, I use Claude Code.
-
If I need a thinking partner, want to work through a strategy, learn something, or ask a question where my previous context might matter, I use ChatGPT.
-
If the implementation is less complex or I care about being able to inspect what the subagents are doing, I use Cursor.
-
If I am away from my computer and want access to the agents and capabilities running on it, I use OpenClaw through Meraxes. I would only recommend that kind of setup after taking the time to configure the permissions, tools, agents, memory, and routing so the system behaves the way you expect.
Codex by itself mostly serves as a comparison point for me. Codex inside that OpenClaw harness serves an actual role. Someone else could make completely different choices. The specific routing is not the important part. The fact that there is routing is.
The Better Comparison Is the Whole System
There is a tendency to collapse all of this into the model name. If an output is excellent, we say Claude is excellent. If an agent struggles, we say Codex struggled. That is directionally useful, but it leaves out a large part of what actually produced the result.
The more useful unit of comparison is the whole working system: the task being performed, the model doing the reasoning, the harness supplying context and tools, the interface through which the human supervises the work, and the capacity available to keep doing it. Change one of those pieces and the result can change with it. That is the practitioner version of the argument in The Torch Has Passed: the moat is not the model, it is the system around it — and that system starts with which harness you put the model in.
Advanced AI users already know that interfaces and harnesses matter. What has surprised me after deliberately experimenting across these environments is how much they matter. I can use essentially the same underlying model in two different places and have a materially different opinion of its usefulness because the surrounding system changes what the model has to do and what I have to do around it.
That has also changed how I think about the tool market itself. I no longer expect one product to win and replace everything else I use. Different environments are becoming good at different modes of work, and in my own setup the capabilities underneath them are increasingly portable anyway. My personal AI ecosystem already has different interfaces for thinking, building, commanding agents, debating decisions, and turning successful work into repeatable workflows.
The mistake is treating all of those jobs as though they should happen in the same place. Instead of asking which AI tool is best, I have started asking a narrower question: what am I trying to do, and which combination gives me the best working environment for doing it? That question has been much more useful.