Du, Yan, Shi et al. (Shanghai AI Lab) — 2026

MLEvolve: A Self-Evolving Agent for ML Discovery

An LLM multi-agent framework that discovers end-to-end machine-learning pipelines by extending tree search to a graph, accumulating experience in memory, and separating "what to change" from "how to code it" — reaching state-of-the-art on MLE-Bench in half the standard time budget.

Prerequisites: LLM agents + Monte Carlo Tree Search intuition + basic ML workflow (train/eval)
10
Chapters
4
Simulations

Chapter 0: The Problem

You hand an AI agent a Kaggle competition. "Here is a dataset of audio clips. Predict the bird species. You have 12 hours and a GPU. Go." No human in the loop. The agent must write data-loading code, pick a model, train it, read the error when it crashes, fix it, try a better architecture, ensemble its best attempts, and submit — over and over, hundreds of times.

This is Machine Learning Engineering (MLE) as an autonomous task, and it is brutal precisely because it is long-horizon. A single good idea is not enough. The agent must keep getting better over hundreds of attempts, learning from its own failures faster than it burns through the clock. The paper calls this capability self-evolution.

The trouble: today's MLE agents do not really self-evolve. They get stuck. The authors diagnose three concrete diseases, and the entire MLEvolve design is a cure for each one.

Disease 1 — Branch isolation. Most agents search like a tree: each line of attempts ("branch") is sealed off from the others. If branch A discovers that a learning-rate warmup fixes instability, branch B — running in parallel on the same problem — has no way to find out. Good ideas die in the branch that found them. And the exploration strategy is fixed: the agent explores just as widely in hour 11 as in hour 1, wasting its dwindling budget on hopeless branches.
Disease 2 — Memoryless search. Classic tree search propagates a single number — a reward — back up the tree. That number says "this branch is worth 0.7" but carries no content: not the plan that worked, not the bug that was fixed, not the insight. Every new decision is made from a blank slate. The agent re-discovers the same fix for the same crash, attempt after attempt.
Disease 3 — One-shot generation with no hierarchy. Many agents rewrite the entire solution file every iteration, fusing two very different jobs — deciding what to change (strategy) and writing how to change it (code) — into one giant prompt. The result is uncontrollable: the model "improves" the model architecture but silently breaks the data loader. There is no clean separation between planning and implementation.

Hold those three diseases in your head. By the end of this lesson you will see exactly which MLEvolve component cures each one — Progressive MCGS for isolation, Retrospective Memory for memorylessness, and Hierarchical/Adaptive coding for the lack of control.

Why is "memoryless search" a problem even when the reward signal is accurate?

Chapter 1: The Key Insight

If you had to compress MLEvolve into one sentence: turn the search tree into a search graph, give the search a memory, and split the agent's brain from its hands.

That is literally three insights, one per disease. The elegance is that they compose into a single loop.

Progressive MCGScross-branch info flow + exploration that narrows over time
Retrospective Memorya knowledge base for cold start + a growing memory of what worked / what crashed
Hierarchical + Adaptive Codinga planner decides what, a coder decides how, in 3 edit modes

The word doing the heavy lifting is progressive. A human expert with 12 hours does not explore at a constant rate. In the first few hours they try wildly different approaches — gradient boosting, a CNN, a transformer. In the last few hours, having found that the CNN clearly wins, they stop wandering and pour every remaining minute into squeezing that CNN: tuning, augmenting, ensembling. MLEvolve bakes this exploration→exploitation arc directly into the search schedule.

The unifying idea: "Self-evolution" is not a vague aspiration here. It has a precise meaning — the agent's behavior changes as a function of accumulated experience and elapsed time. Early it explores and has little memory; late it exploits and is steered by a rich memory of its own past trials. The same prompt, run at hour 1 vs hour 11, produces different actions.

Here is the headline result that tells you the cure works: under a 12-hour budget — half the standard 24-hour budget other agents get — MLEvolve reaches a 65.3% average medal rate on MLE-Bench, beating every prior method including ones that ran twice as long. And the same machinery, pointed at pure math-optimization problems, beats AlphaEvolve on 11 of 15 tasks. The design generalizes.

What does "progressive" specifically refer to in Progressive MCGS?

Chapter 2: MLE as a Search Problem

Before any of the clever machinery, we need to frame the task precisely. The paper poses MLE as optimization over a space of candidate solutions.

A single "candidate solution" is a complete program — preprocessing, feature engineering, model definition, training loop, and prediction, all in one runnable file (think solution.py that emits submission.csv). The space of all such programs is called S. We want the single best one.

find the solution s* that maximizes   h(T, s)   over all s in the space S

Reading that in words: s* is the solution we are hunting for. T is the task (this Kaggle competition). h(T, s) is the score you get by running program s on task T — it might be accuracy, AUC, or a loss, whatever the competition grades on. S is the (astronomically large, mostly-broken) set of all programs you could write. We cannot enumerate S, so we search it: generate a candidate, run it, read the score, generate a better one, repeat.

Why this framing matters. Once MLE is "find the best node in a space of solutions," the whole toolbox of tree search becomes available — selection, expansion, simulation, backpropagation. The agent's job is to spend a limited number of "expansions" (LLM calls + code runs) wisely. MLEvolve gets 500 expansion steps and 12 hours per task.

A 30-second refresher on MCTS, because everything builds on it. Monte Carlo Tree Search repeats four steps:

1. Selectwalk down the tree to a promising node, balancing "known-good" vs "unexplored" via UCT
2. Expandcreate a child — here, the LLM writes a new variant of the solution
3. Simulaterun the code, read the metric — this is the rollout
4. Backpropagatepush the reward back up the path so ancestors learn how good this region is

Standard MCTS has the fatal flaw from Chapter 0: that tree structure isolates branches. The reward in step 4 is a lone number. MLEvolve keeps the four-step loop but surgically upgrades two of them — it adds graph edges to expansion (so branches can borrow from each other) and a memory write/read around the whole loop (so the content, not just the number, survives).

Data flow to hold onto: a node carries (plan text, code, metric score, execution log, analysis). Standard MCTS backpropagation transmits only the metric. MLEvolve's memory captures the whole record — that is the difference between "branch B is worth 0.7" and "branch B got 0.7 by adding mixup augmentation after the data-leakage fix."
In this framing, what does a single "node" in the search represent?

Chapter 3: From Tree to Graph

Here is the first cure. Disease 1 was branch isolation. The cure is to stop treating the search as a tree and start treating it as a directed graph with two kinds of edges.

G = (V, E),   with   E = ET  ∪  Eref

The vertices V are the candidate solutions. The edges split into two families that do completely different jobs:

Primary edges (ET) — the "born from" relation. If node v was created by taking node u and applying some operator (improve it, debug it), we draw a primary edge u→v. These edges form the tree backbone. They — and only they — carry credit during backpropagation. Think of them as parent→child lineage.

Reference edges (Eref) — the "inspired by" relation. If node v also looked at node r for ideas — even though r lives in a totally different branch — we draw a reference edge r⊣v. These edges carry information (the agent reads r's code/plan as context) but carry no credit during backpropagation.

The single most important design decision in the paper: reference edges deliberately do not participate in backpropagation. Why? Because a reference is "I borrowed an idea," not "I am your child." If you let borrowing inflate a node's visit counts and rewards, the credit-assignment math corrupts — a popular node would look artificially valuable just because everyone glanced at it. So: ET for credit, Eref for ideas. Keep them separate.

And the beautiful boundary condition: when there are no reference edges at all (Eref = ∅), the graph collapses back into a plain tree, and Progressive MCGS reduces exactly to standard MCTS. MCGS is a strict generalization — it can never do worse than the tree it contains, because the tree is a special case.

Play with the toggle below. With references OFF you see the isolated tree (standard MCTS). Flip references ON and watch the dashed cross-branch edges appear — suddenly a stagnating branch can pull a strong idea from across the graph.

Tree vs Graph: the two edge typesInteractive

Solid teal = primary edges (ET, carry credit). Dashed purple = reference edges (Eref, carry ideas only). Toggle references and pick which expansion type fires.

References off — this is exactly standard MCTS.

Those three buttons map to the three graph-based expansion types the paper defines (alongside plain "primary expansion" with no references):

Intra-branch evolutionreference the nearest k ancestors in the same branch — "what did my recent attempts teach me?"
Cross-branch referencewhen a branch stalls, reference the top-N nodes from other branches — "borrow the community's best ideas"
Multi-branch aggregationwhen everything stalls, spawn a fresh branch root that fuses the best trajectories from many branches

Notice these are escalating responses to escalating stagnation — a theme we'll formalize in the next chapter. The ablation later reveals intra-branch evolution is the single most important of the three: reflecting on your own recent history beats blindly borrowing from strangers.

Why are reference edges excluded from backpropagation?

Chapter 4: Progressive MCGS — the Search Engine

This is the heart of the paper, so we will build it piece by piece and then make it interactive. Three sub-mechanisms live here: (a) the selection rule (UCT), (b) the entropy-inspired soft switch from exploration to exploitation, and (c) stagnation-triggered graph expansions.

(a) Selection with a decaying UCT

To pick which node to expand, MCGS walks the tree backbone using the classic UCT (Upper Confidence bound for Trees) score on each child:

UCT(i) = Qi  +  c(t) · √( ln(Nv + 1) / (Ni + ε) )

Decode every symbol: Qi is child i's average reward (how good it has looked so far — the exploit term). Ni is how many times we visited child i, Nv is visits to the parent. The square-root term is the explore bonus: it is large for rarely-visited children (small Ni) and shrinks as we visit them. ε is a tiny constant so we never divide by zero. c(t) is the exploration constant — and crucially it is a function of time, decaying from c0=2 down to cmin=0.5. As the clock runs, the explore bonus literally shrinks.

Worked example. Two children of the same parent (parent visited Nv=10 times). Child A: Q=0.8, visited N=8 times. Child B: Q=0.5, visited N=2 times. Take c=2, ε=0.001. The explore term uses √(ln(11)/(N+ε)) = √(2.398/(N)).
Child A: 0.8 + 2·√(2.398/8) = 0.8 + 2·0.548 = 1.895.
Child B: 0.5 + 2·√(2.398/2) = 0.5 + 2·1.095 = 2.690.
Even though A scores higher, B wins selection — its high explore bonus (rarely visited) overrides A's better mean. Now drop c to 0.5 (late game): A → 0.8+0.137=0.937, B → 0.5+0.274=0.774, and A wins. Same nodes, opposite choice — that is c(t) doing its job.

(b) The entropy-inspired soft switch

Decaying c(t) is a gentle nudge. MLEvolve adds a sharper mechanism: at each step it flips a biased coin to choose between two whole modes:

P(strategy = UCT-explore) = w(t),    P(strategy = Elite-exploit) = 1 − w(t)

The weight w(t) starts at 1.0 (always explore via UCT) and decays to a floor wmin=0.2. Early on, the coin almost always says "explore." Late on, it usually says "exploit." When it says Elite-exploit, the agent ignores the local tree entirely and jumps to one of the globally best nodes, picked by inverse rank:

P(pick node vi from elite set) = (1 / rank(vi))  /  Σj (1 / rank(vj))

So the rank-1 node gets weight 1/1, rank-2 gets 1/2, rank-3 gets 1/3. Worked example with top-K=3: weights are 1, 0.5, 0.333, summing to 1.833. Probabilities: 54.5% / 27.3% / 18.2%. The best node is favored but the runners-up still get real chances — exploitation that isn't blindly greedy.

Why "entropy-inspired"? If you measure how search effort is spread across branches as a probability distribution πt, its Shannon entropy H(πt) = −Σ π log π measures dispersion. High entropy = effort spread evenly (exploring); low entropy = effort concentrated (exploiting). The schedule w(t) is designed so this entropy provably decreases over time. In Chapter 8 we'll see the empirical proof: effective active branches fall from 4.8 to 2.8.

(c) Multi-level stagnation detection

When does each graph expansion from Chapter 3 fire? On stagnation, at two levels:

Branch stalls (τbranch=3 steps no gain)try intra-branch evolution; later, also cross-branch reference
Global stalls (τglobal=6 steps no gain)fire multi-branch aggregation — spawn a fused fresh start

The reward that drives it all

Backpropagation needs a reward. MLEvolve uses a deliberately coarse 3-level signal:

R(v) = −1 if the run fails / no valid metric  |  +1 if it runs but doesn't beat the branch best  |  +2 if it sets a new branch best

This is smart: it cleanly separates "broken," "feasible-but-meh," and "genuine improvement," giving stable credit without depending on the raw metric's wildly different scales across tasks (an AUC of 0.9 vs a loss of 0.02 are not comparable, but "+2 = improved" always is). Each ancestor on the primary path then updates its visit count and cumulative reward, and Q = W/(N+ε).

Now drive the engine yourself

The simulator below runs Progressive MCGS one step at a time. Click Run step to expand the search. Watch two things: (1) the strategy badge flips from blue EXPLORE to orange EXPLOIT as the weight w(t) decays, and (2) the effective branch count readout falls as effort concentrates. Toggle to Vanilla MCTS to see the difference: vanilla keeps w fixed, so it never concentrates — it sprays effort across branches forever.

Progressive MCGS search simulatorInteractive — SHOWCASE
step 0 / 40 strategy: — w(t) = 1.00 eff. branches: — global best: —

Each circle is a candidate solution; brightness = score. Blue halo = expanded under EXPLORE (UCT). Orange halo = expanded under EXPLOIT (elite-guided). Dashed edges appear when stagnation triggers a cross-branch reference.

In Elite-Guided exploitation with top-K=3 and inverse-rank weighting, what is the probability of picking the rank-1 node?

Chapter 5: Retrospective Memory

Cure number two, for the memoryless disease. MLEvolve gives the agent two memories that work together: a static domain knowledge base for cold start, and a dynamic global memory that grows during the search.

The cold-start knowledge base

Drop an LLM into a niche task — say, protein-structure regression — and its first attempts are often naive: it reaches for whatever it half-remembers. The fix is a small, curated library of "for task-type X, these models tend to work, used like this," synthesized from open-source repos and competition write-ups. Given a task T, the system retrieves matching entries by keyword and offers them as an optional hint to the very first draft:

sinit = Init(T, RKB(T))

Where Init(·) is the routine that writes the first plan + code, and RKB(T) is the retrieved set of relevant model suggestions. It is a prior, not a mandate — it just stops the agent from face-planting on attempt #1.

The dynamic global memory

This is the real engine of self-evolution. After every valid node executes, the system writes a structured record: the plan, the outcome, the analysis, and the feedback signal. This is exactly the "content" that scalar backpropagation threw away in Chapter 0. The memory grows into a searchable diary of the agent's entire campaign.

Hybrid retrieval with Reciprocal Rank Fusion

How do you find the relevant past records? Keyword search (BM25-style, "lexical") is great for exact terms like a specific error string. Semantic search (FAISS embeddings, "vector") is great for meaning ("this crash feels like that one"). Each is weak where the other is strong, so MLEvolve runs both and fuses their rankings with Reciprocal Rank Fusion (RRF):

score(d) = α · 1/(k + rlex(d))  +  (1 − α) · 1/(k + rvec(d))

Decode it: for a record d, rlex(d) is its rank in the keyword results and rvec(d) is its rank in the vector results. RRF rewards records that rank high in either list (rank 1 contributes a big 1/(k+1); rank 50 contributes almost nothing). k is a smoothing constant that dampens how much the very top ranks dominate. α tilts the blend toward lexical (α→1) or vector (α→0).

Worked example. Take k=60, α=0.5. Record d appears at rank 1 in lexical search but rank 10 in vector search. Lexical term: 0.5·1/(60+1)=0.5·0.01639=0.00820. Vector term: 0.5·1/(60+10)=0.5·0.01429=0.00714. Fused score = 0.01534. A record that ranked 1 in both would score 0.5·0.01639 + 0.5·0.01639 = 0.01639 — only slightly higher, because RRF's diminishing returns mean "good in both" beats "great in one, absent in the other" only modestly. That robustness is the point.

Drag the α slider below to watch the fused ranking re-order live as you shift trust between the keyword list and the semantic list.

Reciprocal Rank Fusion of two retrieversInteractive

Six memory records, each with a lexical rank and a vector rank. The fused column re-sorts by the RRF score as you change α and k.

Stage-aware retrieval

Critically, memory is queried differently depending on what the agent is doing:

Planningquery with the draft plan → retrieve past successes & failures → refine plan to reuse winners, avoid losers
Debuggingquery with the error message → retrieve similar resolved errors → apply the fix that worked before
Cured. Notice what makes this "automatic": unlike memory schemes that spin up an extra LLM to reflect and summarize after each trial, MLEvolve just stores the structured record and retrieves it. No extra reasoning calls. The experience accumulates for free as a side effect of running the search.
Why fuse a lexical retriever and a vector retriever instead of using just one?

Chapter 6: Hierarchical Planning & Adaptive Coding

The third cure. Disease 3 was one-shot generation that fuses strategy and implementation. The fix is to split the agent into a planner and a coder, and to let the coder pick from three edit modes depending on the situation.

Planner / Coder decoupling

Planner (the "why/what")works at the module level; reads feedback + memory + branch history; decides what to modify and produces a structured spec
Coder (the "how")works at the code level; implements the spec while preserving working functions — doesn't touch what isn't broken

This is the same separation a senior engineer enforces in code review: the design discussion ("we should swap to a transformer encoder and add early stopping") is distinct from the diff that implements it. Fusing them is how the model "fixes" one thing and silently breaks another.

Three adaptive coding modes

The coder does not always rewrite everything. It chooses granularity to match the situation — this is the controllability that one-shot generation lacks:

Basefull write from scratch — used when no reliable solution exists yet (initial drafting)
Stepwisemodule-by-module generation — for complex multi-stage pipelines where decomposition reduces difficulty
Difftargeted patch edits — when a working solution already exists and you want a stable, localized refinement
The progression mirrors the search. Early (no solution) → Base. Mid (building out a pipeline) → Stepwise. Late (polishing a winner) → Diff. The coding mode tracks the same exploration→exploitation arc as the MCGS schedule. Diff mode is what makes late-game exploitation safe: you can squeeze a strong solution without risking a from-scratch rewrite that regresses.

Pick a search state below and see which mode the framework selects, and why:

Adaptive coding-mode selectorInteractive
Pick a search state above to see the selected mode & the agent that runs it.

A team of specialized agents

The framework is realized as a roster of single-purpose agents, each tied to a search phase or operator. This specialization is what makes the modes reliable — each agent has a narrow, well-defined job:

AgentJobMaps to
DraftGenerate initial root solutions; can pull from the knowledge baseBase mode, cold start
ImproveRefine a runnable solution via controlled revisionsDiff mode, primary expansion
DebugRepair crashes from error traces; minimal edits until fixedTriggered on failure
EvolutionAggregate recent same-branch nodes; reflect & refineIntra-branch evolution
FusionPull strong solutions from other branchesCross-branch reference
AggregationFuse top trajectories into a new branch rootMulti-branch aggregation
Code ReviewCatch naming/import errors, metric inconsistencies pre-runAfter every generation
Data LeakageCheck for train/eval leakage to prevent inflated scoresQuality gate
Result ParseExtract metric, status, insights from logs back into the loopSimulation → backprop
The Data Leakage agent is an under-appreciated detail. An autonomous agent optimizing a metric will happily cheat — leaking the test target into training spikes the score and earns a fake medal. A dedicated guard that audits train/eval splits is what keeps the 100% valid-submission rate honest. Optimizing agents need anti-cheating referees.
Why does the coder default to Diff mode once a working solution exists?

Chapter 7: Does It Work?

The benchmark is MLE-Bench (OpenAI): 75 real Kaggle competitions across vision, NLP, signal processing, and tabular data, split into 22 low / 38 medium / 15 high complexity. An agent "earns a medal" when its submission would have placed at bronze/silver/gold on the real human leaderboard. The backbone LLM is Gemini-3.1-Pro-preview, temperature 1.0, with 500 expansion steps on a single H200.

The headline. MLEvolve hits a 65.3% average medal rate and 34.7% gold rate — best of every method tested — while running in a 12-hour budget, half of the 24 hours most baselines used. It also posts a 100% valid-submission rate and beats the human median on 76% of tasks. Doing better in half the time is the part that matters: it shows the gains come from smarter search, not just more compute.

The comparison below plots medal rate against the strongest baselines. Toggle the metric to see how MLEvolve's lead holds across overall medals, golds, and above-median rate. Bars are theme-aware and read off the paper's Table 1.

MLEvolve vs. the field on MLE-Bench (75 tasks)Interactive
Overall medal rate. MLEvolve runs in 12h; most baselines in 24h.

Cross-domain generalization: beating AlphaEvolve at math

The same machinery — unchanged — was pointed at 15 open-ended mathematical optimization problems from AlphaEvolve (circle packing, kissing numbers, autocorrelation inequalities, and the like). These are not ML pipelines at all, but they share the iterative shape: propose a candidate, score it, refine. MLEvolve won the best result on 11 of 15, edging out AlphaEvolve, AlphaEvolve-v2, SimpleTES, TTT-Discover, and OpenEvolve.

Why this generalization is the real story. If MLEvolve only beat MLE agents on MLE-Bench, you'd suspect it overfit to Kaggle's quirks. But beating specialized math-discovery systems at their own game says the contribution is a general recipe for long-horizon iterative optimization — graph search + memory + hierarchical control — not a Kaggle trick.
What makes the 65.3% medal rate especially impressive?

Chapter 8: Analysis & Ablations

A result table tells you that it works; ablations tell you why. The authors removed one component at a time on MLE-Bench Lite (22 tasks).

ConfigurationMedal %Gold %Beat Ratio %
Full MLEvolve81.8254.5588.39
− Progressive MCGS68.1840.9179.91
− Retrospective Memory68.1850.0081.90
− Adaptive Code Generation72.7340.9184.14

Reading the table: every removal hurts, confirming all three components pull weight. The biggest drop comes from removing Progressive MCGS (medal 81.8→68.2) — without it the search reverts to fixed-strategy MCTS that wastes the late budget on dead branches. Removing memory costs a full 13.6 points of medal rate. Drilling deeper, the paper finds intra-branch evolution is the most critical sub-mechanism inside MCGS, while Elite-Guided exploitation mainly sharpens leaderboard rank by polishing already-good solutions.

The entropy proof: search effort really does concentrate

Recall the Chapter 4 claim that w(t) makes branch-selection entropy fall over time. The authors verify it directly. Within a sliding window they compute the branch distribution πt and report exp(H(πt)) — the "effective number of active branches." A value of 5 means effort is spread as if over 5 equal branches; a value of 1 means all effort is on one.

Worked example of exp(H). Suppose at an early step effort splits across 5 branches as (0.30, 0.25, 0.20, 0.15, 0.10). Then H = −Σ p·ln p ≈ 1.539 nats, and exp(H) ≈ 4.66 — close to 5, "almost uniform." Late in the search, effort concentrates to (0.55, 0.25, 0.12, 0.05, 0.03): H ≈ 1.116, exp(H) ≈ 3.05. The number literally measures how many branches are "alive."

The curve below reproduces Figure 3. MLEvolve (teal) slides from ~4.8 effective branches down to ~2.8 as search progresses — it concentrates. Vanilla MCTS (gray), with its fixed exploration constant, stays flat near 4.3 the whole way, spraying effort even after the winners are obvious.

Effective active branches over search progress (Fig. 3)Interactive
MLEvolve concentrates (4.8 → 2.8). Vanilla stays dispersed (~4.3).

Robustness across backbones & over time

Two more findings round out the analysis. (1) Backbone-agnostic: swapping the LLM among Gemini-3.1-Pro, GPT-5.5, DeepSeek-v4-Pro, and Kimi-K2.6 keeps MLEvolve competitive — each backbone has domain strengths (GPT-5.5 tops NLP at 96.2% beat ratio; Kimi leads audio at 99.2%) but the framework isn't bolted to any one model. (2) Sustained improvement: over the 12-hour budget MLEvolve keeps climbing to a 98.2% beat ratio on representative tasks, while Vanilla MCTS plateaus early around 70% — the visible signature of self-evolution actually working.

Removing which component causes the largest medal-rate drop, and why?

Chapter 9: Connections & Cheat Sheet

MLEvolve sits at the crossroads of three lines of work. Place it in the map and the contribution sharpens.

AlphaEvolve / FunSearchevolutionary LLM program search for math/algorithms; MLEvolve beats them and handles full ML pipelines
AB-MCTSadaptive width-vs-depth in a tree; MLEvolve goes further — a graph with cross-branch flow, plus memory
AI-Scientist / R&D-Agentautonomous research agents; MLEvolve's self-evolving loop is a candidate engine for the "experiment" inner loop

Explore these on the site to deepen each thread:

Limitations & what the paper doesn't say

Read the fine print. (1) Several key hyperparameters — τbranch=3, τglobal=6, the w(t) phase ratios, elite top-K=3 — are fixed by hand; the paper doesn't show how sensitive results are to them. (2) The cold-start knowledge base is curated by humans, so part of the "autonomy" leans on expert priors. (3) Cost: 500 steps × (LLM calls + code runs) over 12 hours on an H200 is expensive per task — the medal rate buys you nothing about dollars-per-medal. (4) The reward is coarse (−1/+1/+2); finer credit might help but could also destabilize the cross-task comparability that the coarse signal buys.

Cheat sheet — every key equation

Symbol / Eq.MeaningWhen it fires
s* = argmax h(T,s)Best solution program for task TThe overall objective
E = ET ∪ ErefPrimary (credit) + reference (ideas) edgesGraph structure; Eref=∅ ⇒ plain MCTS
UCT = Qi + c(t)√(ln(Nv+1)/(Ni+ε))Selection score; c(t) decays 2→0.5Picking which node to expand
P(UCT)=w(t), P(Elite)=1−w(t)Soft switch; w(t) decays 1.0→0.2Every selection step
P(vi) ∝ 1/rank(vi)Inverse-rank pick among top-K elitesExploitation mode
R(v) ∈ {−1, +1, +2}Fail / no-gain / new bestSimulation reward
RRF: α/(k+rlex) + (1−α)/(k+rvec)Fuse keyword + semantic retrievalMemory retrieval
exp(H(πt))Effective # of active branchesDiagnostic: 4.8→2.8
The mastery test. You should now be able to: draw the MCGS graph and explain why reference edges skip backprop; work the UCT and RRF numbers by hand; explain how w(t) turns exploration into exploitation and why exp(H) falls; name which agent runs in each coding mode; and argue why beating AlphaEvolve at math proves the recipe generalizes. If you can teach all that at a whiteboard, you own this paper.
What is the single best one-line summary of MLEvolve's contribution?