AI Engineer Code 2025
Hard-Won Lessons from Building Effective AI Coding Agents
Read the talk
Hard-Won Lessons from Building Effective AI Coding Agents
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 transcript and explore slides
Loading transcript and slides…