Jason Belnick

Writing · · 5 min read

Self-refinement that knows when to stop

Nous Research's Autoreason finds naive self-refinement makes output worse, then fixes it with a blind tournament where doing nothing can win

Most of the agent pipelines I get asked to review have the same shape. They have elaborate machinery for iterating harder and nothing that decides when to stop. Retry logic, reflection prompts, critique-and-revise loops, sometimes a second model to check the first. What almost none of them have is a rule that lets the current answer survive on merit. Revision is the default. Restraint is not even a state in the machine.

A paper from Nous Research argues that default is backwards. Autoreason: Self-Refinement That Knows When to Stop, credited to SHL0MS and Hermes Agent (Nous's own AI agent is listed as co-author), starts from a blunt measurement. Naive iterative self-refinement usually makes output worse. Not neutral, worse. It was published earlier this year and has been circulating among builders over the past few weeks, and I think it names something most of us have watched happen in production without having a word for it.

Why refinement loops degrade output

The paper identifies three structural failure modes, and all three match what I see in real deployments.

First, prompt bias. Ask a model to find flaws in a draft and it will find flaws, whether or not they exist. The critique step produces changes because the prompt presupposes flaws exist. Second, scope creep. Each revision drifts a little beyond the ask, and after four rounds the output is answering a different question than the one posed. Third, lack of restraint. Nothing in a standard refinement loop can conclude that the draft is done. Every iteration produces a change because producing a change is the only action available.

In the rollouts I run, this is the quality failure I see most often. Teams seldom lose to bad first drafts. They lose to loop three, where a decent draft got improved into something longer, hedgier, and subtly off-brief.

A tournament where doing nothing can win

Autoreason's fix works at the structure of the loop rather than in the prompt. Each iteration runs a small tournament with three candidates: the unchanged incumbent (A), an adversarial revision (B) written from a critique, and a synthesis (AB) that combines the strongest elements of both. Three fresh judges, each in a clean context with no shared history with the authors, rank the candidates blind, with randomized labels and presentation order, scored by Borda count. Ties go to the incumbent. The loop converges when the unchanged incumbent wins two rounds in a row.

Doing nothing is a first-class outcome. The incumbent is never defended by the model that wrote it. It just has to survive a blind ranking against its challengers.

The numbers, as the paper reports them (these are the authors' own evaluations, not independent replications). Haiku 3.5 with Autoreason swept 42 of 42 Borda counts across three writing tasks, while standard refinement baselines degraded below single-pass output. On 150 CodeContests problems, Sonnet 4.6 with Autoreason reached 77% private-test accuracy against 73% for single-pass. At matched compute, Haiku 3.5 with Autoreason beat best-of-6 sampling 40% to 31%. The ablations are the part I find most credible: the authors report that removing either B or AB collapses the tournament into premature convergence, which suggests the mechanism is doing real work rather than riding one lucky component.

The scaling result deserves the most attention. The paper reports gains peaking on mid-tier models: Llama 8B was too weak to generate useful diversity, and the strongest model tested was often good enough that external judges added little. The sweet spot is the band in between: models strong enough to produce meaningfully different candidates but not yet strong enough to pick between them consistently. That is the class of model people run locally.

Mapping it onto a local stack and a CI gate

I run local models daily on a Mac Studio with 64GB of unified memory, mostly Qwen-family workhorses under MLX and llama.cpp, and this pattern drops onto that stack almost verbatim. The draft model writes A. A second call with a fresh prompt writes the critique and B. A third produces AB. Then three cheap judge calls, each in a clean context with no view of the conversation that produced the drafts, rank the three in randomized order. Ties keep A. Two consecutive A wins ends the loop, and a hard cap on rounds limits it. Two implementation notes from the paper are worth copying: judges run at lower temperature than authors, and chain-of-thought judge prompts are reported as a cheap convergence improvement.

Three takeaways generalize past the paper.

Blind judging beats self-assessment. The model that wrote the draft is the worst-positioned to evaluate it, because its context is saturated with the reasoning that produced the mistakes. A fresh context is the cheapest independence available.

Default-to-incumbent is the cheapest guardrail against churn. Put the burden of proof on the change. If a challenger cannot beat the current answer in a blind ranking, the current answer stands, and the system has a principled reason to stop spending tokens.

Convergence needs a definition, not a vibe. "The incumbent won twice in a row" is a testable stopping condition, where "the output seems good now" gives you nothing to test.

The same shape works as an eval gate in CI. I built llm-judge-evals on the adjacent instinct: a golden dataset and a judge that fails the build when output quality drifts. Autoreason adds the retention rule I had not named. Treat the shipped prompt or pipeline as the incumbent. A proposed change has to beat it blind on the goldens, and ties keep what is shipped. A challenger has to earn each change, instead of the loop emitting one by default. In the enterprise rollouts I run, that gate decides whether an eval suite informs decisions or just decorates a dashboard.

What I'd want before trusting it

This is one paper. It comes from the lab promoting the method, the evaluations are largely LLM-judge panels of the authors' own design, and I have not found independent replication yet. There are human evaluation materials in the repo, which is more than most method papers ship, but a paper-reported result stays a paper-reported result until someone else runs it. The 42/42 sweep is the kind of clean number I hold loosely until someone reproduces it on tasks the authors did not choose.

The cost of checking is low. The whole pattern is a few hundred lines of orchestration around models you already run. Wire it around your own drafting task, point it at your own goldens, and count how often the incumbent survives. If A keeps winning, the paper's core claim holds for your setup: your refinement loop was churn, and you now have a stop rule where the iterate-harder logic used to be.