Collective intelligence  ·  Part 2  ·  Part 1  ·  Part 3 →  ·  Part 4 →

The Wall, the Compile Tax, and the Oracle

In part 1, RL nearly doubled a 9B model on competitive programming, then stopped. This post is about why. The model learned to write code that compiles rather than code that wins. It often names the better algorithm and ships the safe one, and the best of its samples is more than twice a single one. Rewarding the best answer didn't lift the average. In agent mode, the untrained model already used the judge as its test suite, and RL added submissions, not testing. The next experiments make the oracle scarce. No team has been trained yet; that's still ahead.

Model · Qwen3.5-9B Train → eval · FrontierSmith (200 problems) → FrontierCS (172) Method · GRPO, Clip-Cov, max@k, own agent loop
Narrated summary · animated with Manim · AI-generated voice (OpenAI text-to-speech)
Findings
  1. The wall is the recipe, not compute. Every checkpoint from step 50 to step 100, across three runs, scores 11.6–12.7 Avg@5 on FrontierCS (Avg@5: the mean over 5 samples per problem, 0–100); none of the differences is significant. Training reward plateaus at the same point, and so does reward on the training problems themselves.
  2. Most of the gain was learning to produce valid code. Of the +6.2 points from the base model to Clip-Cov's step 70, about +4.9 came from more answers that are valid (compile and finish within budget), and about +1.4 from better answers.
  3. RL learned to avoid ambitious code: a compile tax. Search-style programs fail to compile more often (+16 points), but score +4.3 higher when they score. Mean-reward RL cut them from 19% of training rollouts to 4–9%.
  4. It knows better than it ships. The trained model often names the better algorithm, then submits the safer program. The best of 55 samples per problem, pooled across 11 trained checkpoints, averages 29, against ~12 for a single sample.
  5. Rewarding the best answer doesn't lift the average. It avoided Clip-Cov's loss of search-style code, but the average didn't rise (12.7 → 11.8, not significant). In theory, with deterministic scores, collapsing onto one program is that objective's optimum.
  6. In agent mode, RL added submissions, not testing. Even untrained, the agent used the judge as its test suite. Training added about 12 submissions per trial, all after the last improvement, while local testing stayed at ~15%; the eval stayed flat at step 20 (−0.12 [−0.76, +0.53]).
Epistemic status

Everything in §1–§6 is measured, with paired bootstrap intervals over problems, except the toy model and derivations in §5. The experiments in §7 are running or about to run; no results are reported for them here. The eval resolves differences of about 1.5–2 points, so small effects in either direction are invisible.

Snapshot of work through October 11, 2026.


01 · The wall

Three recipes, one ceiling

Part 1 ended with single-call GRPO taking Qwen3.5-9B from 6.22 to 12.22 Avg@5 on FrontierCS by step 70, with most of the gain by step 40. I then restarted from step 40 twice, each time with a recipe aimed at the obvious suspect, lost exploration. One restart used Clip-Cov, which stops the gradient on the tokens most responsible for entropy collapse. The other rewarded the best answer in each group: 75% of the advantage came from a leave-one-out best-of-4 score, 25% from ordinary GRPO.

Figure 1 · FrontierCS Avg@5 (0–100), three runs
plain GRPOClip-Cov, restarted at step 40reward the best of the group, restarted at step 40
0 4 8 12 16 base 20 40 60 80 100 training step Avg@5 every checkpoint from step 50 on: 11.6–12.7
Every checkpoint from step 50 on lands in the same band. The shaded band is plain GRPO's 95% CI. Clip-Cov at step 70 is +0.21 [−0.81, +1.31] over plain GRPO, and rewarding the best is +0.28 [−0.91, +1.46]. The reward-the-best run stopped itself at step 103 after two evals without a gain. Hover a point for its numbers.
CheckpointAvg@5Best@5ValidSearch-style (eval)All 5 equal (incl. all-zero)
Plain GRPO, step 4011.4820.8872%14.4%45%
Plain GRPO, step 7012.2218.8383%13.1%49%
Clip-Cov, step 7012.4318.6483%7.8%52%
Reward the best, step 5012.7320.8283%12.7%47%
Reward the best, step 7012.5020.0184%13.4%48%
Reward the best, step 10011.8419.8084%14.9%52%

Two things rule out "just train longer". Training reward rose from 0.10 to 0.26 by step 40 and then sat at 0.30–0.35 from step 50 in all three runs. And the model stopped improving on the training problems themselves. Each problem came back about every 14 steps, and reward on the same problem climbed visit by visit until the fourth visit, then went flat (Figure 2). The best of 8 samples on a problem stayed stuck at 0.46 from that point.

It isn't a lack of learning signal either. After step 20, 85–95% of groups still had a spread of scores, and all-zero groups were under 5%. Entropy held at 0.65–0.69. A 100-step run cost about 87 GPU-hours, so compute is small, and large-scale RL studies find that bigger batches raise the ceiling; 64 rollouts per step is small. My working conclusion is that the 9B model hit a wall of model plus recipe, and more steps of the same recipe would add at most about a point. This corrects part 1, which read the plateau as overfitting the 200-problem pool while training reward kept rising; in fact training reward went flat too.

Figure 2 · Reward on the same training problem, by visit
0 0.1 0.2 0.3 0.4 1 2 3 4 5 6 visit to the same training problem (about every 14 steps) reward flat after the 4th visit
In-sample improvement stops too. Mean reward over the 200 FrontierSmith training problems, by how many times the problem had been drawn. About two thirds of the gain is validity (43% → 84–87% valid) and one third is quality on valid answers (0.29 → 0.36). 95–105 problems improved and at most one regressed. There is no held-out FrontierSmith split to check unseen training-style problems. The curve shown is the average over the three runs; plain GRPO alone reaches about 5.5 visits.

02 · Where the gain came from

Mostly: answers that compile and run

Splitting the gain from the base model to Clip-Cov's step 70 into "more valid answers" and "better valid answers" shows what RL actually bought. A valid answer here is one that compiles and finishes within the budget (part 1's 43% → 86% counted compiling only). Valid answers rose from 38% to 83–85%, and the number of problems (of 172) where all five samples got the same nonzero score went from 2 to 10. The spread across a problem's valid samples halved.

Figure 3 · Decomposing the +6.2-point gain, base → Clip-Cov step 70 (Avg@5 points)
0 2 4 6 8 10 12 14 base model 6.22 + more valid answers +4.9 + better valid answers +1.3 = Clip-Cov step 70 12.43
About 80% of the gain is validity. Quality on valid answers rose +2.1 [−0.2, +4.5] per answer, which is not significant on its own. The training curves agree: the share of valid rollouts went from 35% to 85–90%.

A 172-problem eval with 5 samples per problem resolves differences of about 1.5–2 points, and every difference among checkpoints from step 50 on is 1.2 or less, none significant. Training reward and eval Avg@5 correlate at 0.90 across all checkpoints, but only at 0.12 after step 50. The eval can see the climb, but not the ranking at the top.

There is also a train/eval mismatch worth knowing: 74 of the 172 eval problems are interactive, and none of the 200 training problems are. Interactive problems score 7.2 on average against 16.2 for the rest.


03 · The compile tax

RL learned that ambitious code is risky

FrontierCS problems are optimisation problems with partial credit, so the good solutions are often search: simulated annealing, randomised restarts, timed local search. Comparing programs within the same group, on the same problem, shows what the reward was teaching:

A mean-centred reward sees a group where the safe programs reliably earn a modest score and the ambitious ones sometimes earn more but often earn nothing. Its gradient pushes toward safe.

Figure 4 · Algorithm style in training rollouts, base → trained (code-keyword heuristics)
0% 20% 40% 60% 80% greedy / constructive 36% 62–70% timed search, annealing 19% 4–9% trivial code 9.5% 1%
Search was trained out. Training rollouts by algorithm style, classified from the code. In eval (valid samples, base → Clip-Cov step 70) the same shift appears: programs using a timer fell from 12% to 2.5% and programs using randomness from 22.5% to 7.8%, even though, within a run, code that uses them scores 2–3× higher. The table in §1 uses this eval-side keyword measure.

04 · It knows better than it ships

Naming the better algorithm, submitting the safe one

Reading paired base and trained solutions in full (10 problems, base vs Clip-Cov step 70) showed a pattern the numbers only hint at. The trained model often states the better algorithm, or names the flaw in its own approach, and then submits the safer program anyway. In its own words: "simple is better", and "It's safer for TLE." On one problem the score went from 99.9 for the base model to 48. On a maximum-independent-set problem it went from 86 to 34, and on a sphere-spreading problem from about 99 to 59.5.

Figure 5 · The model writes much better programs than it reliably picks (FrontierCS, 0–100)
Avg@5 (one sample, on average) 12 Best@5 (best of 5 samples) 20 best of 55 samples, 11 checkpoints 29
The best of 55 samples per problem, pooled across 11 trained checkpoints from the three runs, averages 29. A single sample averages about 12 and the best of 5 about 20. The ability to write a strong program is there; the policy doesn't put it first. 48 of 172 eval problems never score at all, 24 of them interactive, and about 47% of late samples run but score 0.

RL didn't fail to teach the model good algorithms. It taught the model which of its own algorithms is safe to submit under a mean-reward objective.


05 · Rewarding the best answer

It keeps the best alive. It can't raise the average.

If the problem is that the policy picks safe over strong, the natural fix is to reward the best answer in each group instead of the mean. This is the max@k family of objectives: optimise the best of k samples rather than the average sample. It avoided Clip-Cov's loss of search-style code (13.4% vs 7.8%, +5.6 points [+3.3, +8.0]), matching plain GRPO. Best@5 was 20.0 vs 18.6–18.8 for the other runs at step 70, but that difference is not significant. Quality on valid answers at step 50 was +1.36 [+0.04, +2.72] over Clip-Cov, the only significant score gain between the restarts. But Avg@5 slipped from 12.7 at step 50 to 11.8 at step 100 (not significant), and the run's stop rule ended it.

In theory and in a toy model, the reason is structural rather than a tuning problem:

Figure 6 · Credit per copy of the best answer, under a reward for the best of the group
1 copy of the best 0.5 2 copies 0.21 3 copies 0.07 4 copies 0.014
Duplicating the winner is free. Credit per copy, as a multiple of the gap between the best answer and the rest, for 1–4 copies in a group of 8. A version with a diverse optimum needs an explicit un-centred penalty on duplicates; it's designed but held for a later run.

06 · Agent mode

In agent mode, RL added submissions, not testing

The agentic arm now runs in a minimal loop of my own: the problem statement in the first message, a handful of tools, and a submit that runs the benchmark's official feedback, up to 100 judged submissions per trial in training (unlimited in eval), scored as the higher of the best judged submission and the final file. The training reward discounts improvements by submission index (0.98 per extra submission, floored at 0.25). Trained from the base model with GRPO (and, from step 18, a 50% weight on the best of the group), per-step training reward was noisy (0.35–0.49) with no clear trend; reward on revisited problems rose about 0.02–0.04 per revisit. The eval didn't move.

Eval (40 problems × 4 attempts)BaseTrainedPaired difference
Step 10 vs base5.786.71+0.93 (no CI); +0.88 [−0.15, +2.05] on the first 114 trials
Step 20 vs base (later harness revision)7.096.79−0.12 [−0.76, +0.53]
Single-call step 40, run in agent mode (first harness revision)4.845.37+0.53 [−0.70, +2.23]

The three base scores differ because the harness was revised between evals; each row compares checkpoints on the same revision. The first revision had an early-ending bug that lowered both arms by about 1.4 points.

The traces at step 20 explain the flat eval. Even untrained, the agent already used the judge as its test suite: it rewrote the file, submitted, read the score, and repeated. Only about 15% of judged submissions follow a local run, and training didn't change that (14.6% → 14.8%). RL added about 12 submissions per trial (median 38 → 50), all after the last improvement, mostly a habit of resubmitting to finish: endings at the repeat limit went from 9 to 20, and duplicate submissions stayed flat at about 25%. The four attempts on a problem became more alike (all four identical on 23 of 39 problems, up from 18); the worst attempt improved (+1.15, significant) while the best didn't (−0.69), and thinking per call fell 8%. With up to 100 exact-score submissions, the judge was nearly free, so RL never had a reason to make the model test itself.

The single-call model's gain also didn't carry over: run in agent mode, step 40 is +0.53 [−0.70, +2.23] over the base model. The two modes don't share as much as I'd hoped.

Short thinking is the model's habit, not the prompt's

In part 1 I suspected the harness was suppressing thinking. A 2×2 prompt ablation says it's mostly the model: a neutral task prompt and a "think first" system prompt changed thinking per call by −38 [−111, +33] and −26 [−95, +49] tokens from a mean of 566 over the first 20 calls (part 1 quoted medians, which are lower). The planning call runs about 1.3K tokens in every arm, while the same problem asked as one question gets 42K or more, 15–45× more. Removing "submit early and iterate" from the prompt changed nothing either (9.0 vs 9.1 submits per 10 minutes).


Running, no results yet

The scarce-oracle run started on October 11; the per-test-case reward arms are in final review. Their success measures are stated here in advance.

Reward per test case (from step 40, 16 samples × 8 problems)

Both arms score each test case separately, drop the per-group standard-deviation division in favour of one batch-wide scale, and give −1 to invalid code. That last choice risks making the compile tax worse, and it switches to 0 if search-style code keeps falling.

What would count: the in-sample per-visit curve rising past the fourth visit, search-style share and Best@5 holding, fewer all-identical groups, and an Avg@5 gain over the step-70 checkpoints of all three earlier runs that the eval can resolve.

A scarce oracle (agent mode, from the base model)

OpenAI's o1-ioi used hand-engineered inference strategies designed for the 2024 olympiad; o3 reached gold without hand-crafted strategies. The search moved inside the model. My agent never had to learn it, because judging was nearly free. So the training run now allows 10 judged submissions per trial (with a visible counter), and feedback is only the verdict and a 10-point score band, never the exact score. The reward still uses the exact hidden score, and the eval stays in the benchmark's official mode.

What would count: the model starting to check its own work. That means more local compile-and-run before each judged submission (the share of judged submissions whose exact code was run locally first), brute-force checkers and stress tests appearing in the traces, those behaviours predicting higher scores, and the gain showing up in the official eval. The risk is that a 9B model barely self-tests today: about 15% of judged submissions follow a local run, and a brute-force checker plus generator appears in under 1% of trials. RL mostly amplifies what's already there.


08 · What it means for teams

Solo RL drifted toward one safe answer. A team has to be paid not to.

The series is about collective intelligence: whether a team of copies of one model can learn to do more than the same model sampled more times. I don't think it's test-time compute in a different costume, but I'll only find out with a recipe that produces a different scaling curve. People specialised once communities grew past a certain size; the hope is something similar once a team does.

This post is a warning for that plan. Mean-centred RL narrowed diversity in the single-call runs, and rewarding the best answer only partly held it. A team reward based on the best answer would make copying a teammate optimal, by the same argument as Figure 6. So the team experiment is planned to:

If teams are more than extra samples, the online team's curve should bend above best-of-N past some team size, with measures of specialisation rising at the same point. I haven't found published work showing roles emerging among shared-weight agents after RL, and I'm not assuming they will. A flat solo curve at least makes any team effect easy to see.

RL learns what you pay for. Pay for valid code, and you get safe code. Make the judge free, and it becomes the test suite. The next experiments change what is paid for.