VERSE: an optimizer that tests its own edits before it submits them
A new arXiv paper lets the program that rewrites an agent’s harness also rewrite itself, and finds the self-edits only help when it can run its drafts first.

An agent is a model plus a harness: prompts, tools, memory and control flow. Lately a second model reads the agent’s failures and edits that harness for it. VERSE asks the next question. What if that second model could rewrite its own tooling too, and what stops it from writing nonsense into itself?
The short version
The paper, “VERSE: Verified Self-Evolving Optimizer for Agent Harnesses” (arXiv 2610.02616, submitted October 2, 2026), reports that letting the optimizer evolve its own harness did not help on its own, and helped once the optimizer could run a draft edit before submitting it. On SWE-rebench its best harness reaches 42.3% on an in-distribution test and 37.7% on newer tasks in five languages, against 39.2% and 29.3% for the strongest baseline. The authors say code is at github.com/wzekai/VERSE. I read the paper; I did not run the code.
What the paper claims
The setup has two roles. The executor is a frozen model that attempts coding tasks inside a harness. The optimizer reads failed trajectories and edits the executor’s harness over several rounds. Earlier systems keep the optimizer fixed. VERSE lets it revise its own prompts, skills, tools, hooks and notes, while the weights of both models stay frozen.
The first study is the interesting one. With a Qwen3.8-Flash-Next optimizer and a Qwen3.8-27B executor, adding self-evolution to Meta-Harness made things worse: no round beat the starting harness on validation. The authors’ reading is that the optimizer wrote untested lessons into itself and could not tell which were wrong. Give it a tool to run a draft on one training task first, and the same setup reached 41.05% test accuracy, the highest in that table.
How VERSE works
Before an edit is submitted, the optimizer can replay a failure, cut a failed trajectory down to the few steps that matter, and perturb a suspected step to see whether the outcome changes. Between rounds it keeps a ledger of which tasks were fixed, which regressed and which fixes were later undone. In a second study across five executors, the self-evolving optimizer built 51 artifacts, and they fell into four kinds: attribution of failure causes, verification, a training audit, and workflow rules such as budget reminders.
A sketch of the loop
# Illustration of verify-before-submit. Not the authors' code and not run.
def improve_harness(harness, failures, budget):
for round_no in range(budget):
cause = rank_causes(failures) # attribution
draft = edit(harness, cause)
passed_before = [t for t in tasks if run(harness, t)]
ok_target = run(draft, cause.task) # replay the failure
ok_old = all(run(draft, t) for t in passed_before[:5]) # regressions
if ok_target and ok_old:
return draft
return harnessThe numbers
| Host optimizer | In distribution (108 tasks) | Out of distribution (107 tasks) | ||||
|---|---|---|---|---|---|---|
| Baseline | VERSE, no self-evolution | VERSE, self-evolution | Baseline | VERSE, no self-evolution | VERSE, self-evolution | |
| Meta-Harness | 39.20 | 34.57 | 42.28 | 28.66 | 28.35 | 37.69 |
| AHE | 33.95 | 37.96 | 35.19 | 26.17 | 35.51 | 30.22 |
| Self-Harness | 29.63 | 40.12 | 34.88 | 29.28 | 31.78 | 30.22 |
| HarnessX | 32.72 | 38.89 | 35.80 | 27.41 | 27.10 | 37.69 |
The paper’s summary holds: VERSE with self-evolution beats its own unequipped baseline in all 16 comparisons of the table, by 0.6 to 10.3 points. Reading the table closely adds a qualification. Among the four hosts, the best in-distribution harness comes from VERSE without self-evolution on three of them, and the best out-of-distribution harness comes from the self-evolving version on two. So the verification tools do most of the work in distribution, and the case for self-evolution rests mainly on the newer, multi-language tasks.
Where the evidence is thin
Each row is one evolution run. The error bars are the spread over three test evaluations of that run, not over independent runs. The in-distribution test set has 108 tasks, so one task is about 0.9 points, and several gaps in the table are two or three tasks. All training and validation tasks are Python, and the 107 out-of-distribution tasks are newer ones with 87 in Go, Java, Rust or TypeScript. The authors also say the optimizer’s verification tools are fixed, every action is logged, and the executor runs without network access. That bounds the scope of self-modification in their setup, and it is the part a practitioner would have to rebuild.
Who should care
Teams that tune an agent harness by hand or with an optimizer. The practical lesson survives the caveats: give an automatic editor a way to run its change and check that already-passing tasks still pass, before you let it keep that change. The paper notes that the fixed optimizer often tested only tasks the current harness fails, which cannot show a regression.
Sources and limits
Facts come from the paper’s abstract, text and Table 2 as read on October 5, 2026. The reading of the table is my analysis. I did not run the released code or reproduce a number.