AI Engineer Code 2025
Hard-Won Lessons from Building Effective AI Coding Agents
Read the talk
Building Coding Agents That Help Models Improve
Effective coding agents need more than a clever wrapper: they need reproducible engineering tasks, outcome-based verifiers, and a path from real failures to model training.
From a talk by Nik Pash
Before you start: Familiarity with coding agents, Git commits, and software tests will help; reinforcement learning concepts are introduced as needed.
How much scaffolding does a stronger model need?
If a stronger model can solve a coding task with terminal access, how much of an elaborate agent stack is still helping? Retrieval-augmented generation, repository indexes, search trees, and tool-calling scaffolds can compensate for model weaknesses. Nik Pash’s opening challenge is that those compensations can become constraints as frontier models improve. The engineering advantage may disappear with the next model release.
His motivating example is Gemini 3.0, released during the week of the talk. Pash reports that Gemini 3.0 running with Terminus outperformed the vast majority of model–agent combinations on the Terminal-Bench leaderboard shown in the talk. The useful comparison is the amount of machinery involved: Terminus provides a generic terminal-agent harness, rather than the graph search, RAG, or repository indexing he associates with more elaborate systems.
This is a minimal harness, not an absence of one. Pash presents its terminal-first design as evidence that model capability can outweigh sophisticated orchestration. His description of the example as lacking context-engineering features belongs to that historical comparison, rather than a permanent specification of Terminus. The practical challenge is to establish what the model can already do before surrounding it with additional machinery.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
The diminishing returns of model-specific tuning
That observation leads to deliberately restrained advice: simplify. Pash is skeptical of the attention paid to small context tricks and agent hacks, which he considers a increasingly repetitive conversation with little new signal. There is still integration work to do, but he treats it as a familiar playbook rather than a fresh architectural breakthrough for each model.
Cline’s model-agnostic approach makes that repetition especially visible. Supporting successive releases means repeatedly adapting the agent as models change. Pash’s examples are Sonnet 4 to Sonnet 4.5, Gemini 2.5 to Gemini 3, and GPT-5 to GPT-5.1. In his experience, these adjustments have become small and their gains marginal. That judgment sets up the more consequential question: where can agent builders contribute something that improves the model itself?
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
From a better wrapper to a better model
A cleaner agent can make better use of a model, but changing the wrapper does not itself update the model’s weights. Pash locates the deeper bottleneck in training: models need difficult tasks that force them to acquire useful capabilities. Benchmarks help define which problems matter, while reinforcement learning environments provide opportunities to practice actions, handle failures, and retry.
Pash attributes the advances in reasoning and agent reliability to benchmarks and RL environments. The actionable part of that argument is a set of design questions: how can real coding work become a reproducible training task? What makes a verifier trustworthy? How do we identify genuine difficulty, and ensure that training rewards the engineering outcomes people actually need?
For this purpose, a benchmark task has three essential parts:
- An executable environment, such as a Docker container in which the agent can work.
- A starting state and prompt, pairing a repository snapshot with the requested change.
- A verifier, which checks whether the agent’s final state is correct or acceptable.
The starting snapshot anchors the problem. The prompt tells the agent what to accomplish. The verifier makes the result scoreable.
An RL environment can use the same structure. The distinction is what happens to the score after the agent finishes.
| Use | What the score does |
|---|---|
| Benchmark evaluation | Measures the model’s performance |
| Reinforcement learning | Supplies reward used to update policy weights |
Evaluation measures a model; training changes it. A task need not become a different kind of engineering problem to serve both purposes. Its result must feed a different downstream process.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Qualify the task before building the environment
Cline’s RL Environments Factory begins by deciding which real coding sessions can become useful training environments. Parallel sub-agents qualify candidate tasks before the system invests in reconstructing and packaging them.
Qualification follows the task from its origin through the developer’s intent to its eventual resolution:
- Origins: Confirm that the repository exists, the starting commit is accessible, and the project is open source.
- Journey: Read the initial request and follow-up prompts to recover what the user was actually trying to accomplish. The first prompt alone may not capture the full intent.
- Outcome: Locate the later commits or pull requests that solved the problem in real life.
This establishes both the problem the agent should face and evidence that an acceptable solution exists.
The factory also looks for reasons to reject a candidate early. Generic requests to build another Next.js application from scratch are not the desired source of difficulty. Trivial tasks add little training value, and tasks without reliable starting or ending states cannot be reconstructed confidently. Real-world origin is necessary, but it does not automatically make a useful benchmark.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Reconstruct both states, then package the task
Once a task qualifies, the work becomes repository archaeology. Pull down the code, reconstruct the starting and solved states locally, and build them. Attempt the implementation and confirm that the reported bug and its real-world solution actually exist. A plausible conversation and a later commit are not substitutes for a reproducible problem.
The remaining packaging steps make that reconstruction usable by another agent:
- Document obstacles and dependencies encountered while restoring the task.
- Containerize the environment with Docker so the task has a portable execution setting.
- Remove Git, a measure Pash describes as preventing reward hacking by denying access to solution history.
- Define the verifier that will judge the resulting state.
The last step requires particular care: reconstructing the known solution does not mean the verifier should insist on reproducing that solution’s every detail.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
The kettle whistle test
Suppose the user’s goal is to boil water. Pash’s verifier analogy is a kettle whistle: it signals the outcome without specifying the method. Gas, induction, and a campfire can all produce the desired result. In the analogy, the whistle answers the question that matters—whether the water has reached boiling—without judging the route taken.
Problems arise when a verifier copies incidental details from a reference solution. A sub-agent might observe that the successful run used high heat and turn that observation into a requirement. But water can boil on a lower setting too.
| Proposed check | What it actually tests |
|---|---|
| Kettle whistles | Intended outcome |
| Burner is set to high | One heating choice |
| Front-left burner is used | One location choice |
| Five minutes have elapsed | One timing assumption |
The latter checks can reject a valid solution because it differs from the recorded path. Verify the user’s intended outcome, not the incidental shape of the reference solution.
The finished artifact is a containerized task that can function as either a benchmark or an RL environment. Agent work is recorded as a trace or trajectory, making the attempted solution inspectable alongside its score. Portability, recorded actions, and a reliable verifier turn a one-off engineering session into a reusable experiment.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Automating the factory—and evaluating the factory itself
The next goal is to automate the conversion from real coding data to training environments. Pash reports that his first manually built RL environment took about sixteen hours of his time, while the later process took less than twenty minutes per task. These are reported workflow timings, not a controlled throughput comparison; he does not specify a task sample or separate human effort from elapsed runtime.
A fully automated factory remains the goal. If environment construction becomes routine, the expected bottleneck shifts toward collecting high-quality tasks: difficult, reproducible engineering problems with recoverable outcomes.
That raises a recursive possibility: build RL environments that test how well agents construct RL environments. Such a meta-benchmark could measure the factory’s agents, provide a target for improving them, and help produce further training environments from real user work. Pash poses this as a direction to explore, not an already completed self-improvement loop.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Opening real engineering work to training and evaluation
The factory also creates a question about access. Pash asserts that major agent labs already collect comparable engineering data and build internal systems around it. He criticizes the use of private benchmarks to defend existing agent architectures: when the tasks remain closed, others cannot inspect the evidence or reproduce the comparison.
Agent products occupy a valuable position between engineers and models. They encounter the initial request, the model’s attempts, the user’s corrections, and sometimes the eventual human solution. Pash argues that withholding this data slows frontier research, because improving prompts and tools alone does not train the underlying model. That argument leads to the announcement of ClineBench.
ClineBench is presented as real software development packaged into standardized training and evaluation environments, rather than toy exercises such as writing a Fibonacci-generating server. The announced contract is openness: people should be able to run and inspect the tasks, with environments available for supervised fine-tuning, reinforcement learning, or evaluation. This is the launch commitment, not a claim that every planned artifact was already available during the talk.
The intended resource is a shared collection of meaningful engineering problems on which the ecosystem can both measure and improve models. Its usefulness depends on community contributions: the environment-building machinery still needs a supply of difficult tasks drawn from actual work.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
A model failure followed by a human fix
The contribution path described at launch starts with ordinary development work:
- Work on an open-source project with the Cline provider enabled.
- Explicitly opt into the ClineBench initiative.
- When a frontier model gets stuck, step in and solve the problem.
That combination—a model struggling and a human subsequently fixing the issue—is a promising signal of task difficulty. It produces a candidate for qualification and environment construction, rather than automatically making every failed session a benchmark.
The closing commitment is that ClineBench will remain free, fully open source, and freely accessible. The invitation is to make the difficult parts of everyday engineering available for the next round of model training: a failure encountered in useful work can become a task that future models learn to solve.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Resources
From the talk
Engineering tasks packaged with Docker environments, reference solutions, tests, and instructions for running evaluations with Harbor.
The original design of a model-agnostic terminal agent built around one interactive tmux session.
Further reading
Cline's explanation of task selection, contribution options, participation controls, and its commitment to open access.
The November 2025 release announcement, including Google's reported Terminal-Bench 2.0 result.
Updates since the talk
Configuration, terminal interaction, context summarization, and trajectory recording in Harbor's reference agent.
Read the complete timestamped transcript
- 0:00
[upbeat music] Wow.
- 0:21
It's wild to be on the same stage as so many people I've drawn inspiration from. Let's dive into it. My name's Nick. I'm the head of AI at Cline, and today I'm gonna share some lessons we learned along the way.
- 0:34
So let's start with the bitter truth. For years, we compensated for weak models by building clever scaffolds around them. All kinds of clever ideas like RAG, indexing systems, search trees, tool calling scaffolds, all this was invented to cope with weaker models, and frontier models simply bulldoze those abstractions now.
- 0:57
You don't really need your scaffolding anymore. Your sc- your scaffolding just gets in the way of these models. And the question really isn't how fancy is your agent stack.
- 1:07
Increasingly, it's how strong is the model driving it.
- 1:11
And the lesson here is relentless. Um, a perfect example of what I'm talking about is Gemini 3.0 released this week, and it immediately dominated Terminal-Bench leaderboards with no agentic harness supporting it at all.
- 1:26
In this chart, you can see Gemini 3.0 on Terminus scored better than the vast majority of model agent combinations in the world, all out of the box. And what's remarkable is that Terminus is designed to be an unopinionated, generic, stripped-down harness, and it has no graph search, no RAG, no indexing, just, "Here's a terminal.
- 1:46
Go figure it out," and it crushes. The whole point of Terminus is that it has no clever tool calling, no context engineering features. So the takeaway here is that capability beats scaffolding.
- 1:59
If you get out of the model's way, it will perform just fine.
- 2:03
So really what I'm driving at, and the key takeaway from this whole talk is, if you're building agents, just relax. Cool it with all your clever engineering tricks. Stop overthinking it.
- 2:16
That's it. That's the lesson. And another point on this, kind of like an aside, is, I don't know about you guys, but we're all on Twitter. I'm on Twitter.
- 2:28
And at this point, I just think talking about these, like, clever little context tricks and, and hacks is a little played out. Like, at this point, I'm straight up tired of seeing some of this stuff.
- 2:41
And, like, I get it, it's free engagement, and we all, you know, indulge in it a little bit. But personally, I think there's not really much signal there. So if you want the full playbook for building an effective coding agent, like the playbook's right here.
- 2:57
It's up on the screen. Um, there was really some novelty talking about it like months ago, but at this point, in my opinion, it's been done to death. And we've been in this...
- 3:06
You know, we're model agnostic at Cline. We support all the models. Every two weeks, there's a new big model release going out, and we've basically come down to the same playbook of supporting each model as it comes out.
- 3:19
So I'm sure everyone here knows how to tune an agent from Sonnet 4 to Sonnet 4.5, from Gemini 2.5 to Gemini 3, and GPT-5 to GP- GPT-5.1. I feel like this entire conversation is a little played out, so I'm not really even gonna cover this in depth because the tweaks here are trivial and the gains are marginal.
- 3:43
So what I really wanna talk about is something that's not actually given a lot of attention, and it's the real bottleneck. And the real bottleneck is that you can build the cleanest agent in the world, but that doesn't improve model capability by even one percent.
- 3:59
Models only get better when labs train on something hard. And benchmarks, not agent cleverness, not all your clever engineering techniques, not your clever RAG pipelines. It's benchmarks that determine what frontier models learn to do next.
- 4:16
And models didn't magically get better at tool use.
- 4:21
They got better because people built RL environments that forced them to practice certain actions, handling failure more, uh, handling failure modes, retrying, and for example, like agents improve only when the model learns inside the right environment.
- 4:36
Every jump in reasoning we've seen came from a benchmark. Every jump in agent reliability came from an RL environment. So the real questions become: What is a benchmark? How do you turn real-world agentic coding data into an RL environment?
- 4:54
And what makes a good verifier? How do you detect real difficulty? And how do you train these models to work on the problems that we actually care about as engineers?
- 5:03
These are the questions that matter for the next frontier.
- 5:07
So what is a benchmark? A benchmark, put simply, it's an environment. It's a s-- So in our case, it's like a Docker container where you let the agent run wild.
- 5:17
It's a starting state, which is the snapshot of the code when you started working on a real-world coding task, as well as a starting prompt. And the last thing is a verifier at the end that checks whether an end state is correct or acceptable.
- 5:33
So how are RL environments different? Well, here's the thing: They're not really different at all. And you might notice this chart is basically the same thing as the previous slide.
- 5:44
The only real difference, the only distinction here, is how the reward is used. Benchmarks measure models. RL environments improve models. The score doesn't just stop in a leaderboard where you publish the results.
- 5:58
The score is actually used to update the weights of the policy model.
- 6:03
So how do you transform real-world coding data into useful RL environments for training?
- 6:12
At Cline, we created this system called an RL Environments Factory. Looking for a better name there, but that's what we got so far. And the first phase in this pipeline is you get sub-agents, and you have them qualify tasks.
- 6:29
And these sub-agents, they work in parallel to decide whether or not given tasks are suitable to be turned into RL environments for the purpose of training.
- 6:37
And the qualification process goes as follows. So you have-- You start with origins, so you have to validate, does the repository actually exist? Is the starting commit accessible? Is it open source?
- 6:49
The journey where you look at the starting prompts, the other follow-on prompts that the user might have followed up with with the agent, you have to try to understand what was the user actually trying to accomplish, what was the spirit of their task.
- 7:04
And lastly, it's the outcome. So can we find the actual commits or PRs that fix the problem in real life? Like, did they actually commit the solution to their problem later on in the timeline?
- 7:18
And we're actively looking for easy disqualifiers as part of this. So things like vibe-coded slop, we don't need another benchmark that tests for, you know, build the Next.js app, uh, from scratch.
- 7:29
We're looking, we're looking to disqualify trivial tasks that are too easy and tasks that have no reliable start or end states.
- 7:38
And lastly, what makes a good RL environment good? How do we actually make an RL environment, and what makes a good test or verifier?
- 7:47
So phase two of this pipeline is building the actual RL environment. So you start out with archeology, where you actually reconstruct both states locally. You pull down the code, you see if you can implement it yourself, reconstruct it, build it, and verify that the bug that the user was referencing and the solution actually exist.
- 8:09
You document every obstacle and dependency. You containerize it with Docker, removing Git obviously, so agents can't reward hack. And lastly, you define the verifier at the end. And this is where it gets into, like, a little bit of the art of building a good verifier.
- 8:24
And I wanna talk about this because the analogy that I typically give is a tea kettle. So the-- let's say the user's goal is, "I wanna boil water."
- 8:36
A really good example of a verifier to test whether or not the water is boiling is a little whistle attachment that goes inside your tea kettle, and the whistle is a pure outcome verification.
- 8:48
It's an, an example of a pure outcome-driven verifier where the water either reached the boiling point or it didn't. Either it's whistling or it's not. The kettle doesn't care how you achieved it, whether you used a gas stove, an electric induction stove, or a campfire, it just signals the result.
- 9:06
And in the process of doing this, all these weird, bad tests can emerge. So you might have noticed, like, that the sub-agent might have noticed, like, oh, in the ground truth solution, like, in a previous run, the burner was set to high, so maybe we should be checking for that.
- 9:21
But we all know that water can boil at a low setting on the burner. Or was it on the front left burner? Has five minutes elapsed? Like, all kinds of weird bad tests.
- 9:30
And the key point here is don't over-prescribe based on the ground truth. Test for the spirit of the task. Test for the outcome of the task. And the outcome at the end of all of this is a containerized benchmark RL environment for that task.
- 9:48
Agent work is recorded, so you can see the traces, the trajectory that the agent took to complete the task, and you can reliably score it and verify it. And it's fully portable.
- 9:58
You can run it on any device. So the path to automation that we've been undertaking as part of this is, can we fully automate the process of converting real-world coding data into RL environments for the purpose of training models?
- 10:16
And this work largely started out manual, but in the first time, the RL environment was, like, about sixteen hours of my time. And what used to take sixteen hours now takes less than twenty minutes per task.
- 10:29
And we're building towards a fully automated RL environment factory where the bottleneck shifts from engineering to collecting high-quality tasks. And an interesting kind of point here, the natural endpoint of all this is what if we actually built RL environments?
- 10:45
And this is, like, a question for everyone in the audience is, what if we built RL environments to test how well agents can actually make RL environments, kinda like a meta benchmark?
- 10:55
What would hill climbing on that look like? And you can kind of start imagining that as models get really, really good at making their own RL environments to train on based on real-world user data, you kinda complete that loop.
- 11:07
Something to think about. So okay, um, this next part is the truth nuke, um, also known as Truke. Um,
- 11:19
an unspoken fact is that we're not alone at Cline building this kind of system. Every major agent lab captures this data. They all do some version of this behind the scenes, but no one really talks about it.
- 11:34
And I don't even need to name them. If you know, you know, and realistically, you all know. These same companies cite internal benchmarks to justify legacy systems that they spent months maintaining, but curiously, you'll never be able to study or inspect them because they don't publish them openly.
- 11:52
And this data is so valuable, yet no one shares it. It's the only thing that actually moves the needle.
- 12:00
And here's the heart of my argument, is by standing between real-world engineers working on real-world tasks and the models, agent labs have a unique role in history. We can build better prompts, we can build better tools, but none of that improves the underlying models.
- 12:16
We possess the single richest dataset of real engineering work anywhere in the world. Models don't improve without this data, and keeping them closed is slowing down frontier research. So today we're announcing ClineBench.
- 12:32
This is our attempt to finally create a benchmark that isn't cosplay engineering. It's not write me a server that generates Fibonacci sequences. This is real software development captured and packaged into standardized RL and eval- and eval environments.
- 12:47
And this is the benchmark that we always wanted someone else to build. No one did, so we're doing it, and anyone can participate. So here's how it works.
- 12:57
The whole thing is open source. There's no secret sauce, no locked away datasets. You can openly run it yourself and inspect it to see how it works. Anyone can use these environments for SFT, RL, evals, whatever.
- 13:11
The point is, is to just give the entire ecosystem a real substrate to measure and improve models on, not just leet code puzzles. And this only works if the community contributes.
- 13:22
And the good news is you don't actually need to do anything special. Just work on your open source project with the client provider turned on and opt into the ClineBench initiative.
- 13:31
If a frontier model gets stuck and you step in to fix it, that's actually a ideal task for-- to be a candidate for a benchmark, and that's it. Just use the client provider, see where the model struggles, and we'll pick it up and introduce it into this open source benchmark.
- 13:51
So ClineBench will always remain free, fully open source, and freely accessible. [upbeat music]
- 13:57
Thank you, all. If you want to contribute- [audience applauding]
- 14:00
Thank you. [upbeat music]