{
  "id": 692675,
  "title": "Every Improvement Failed",
  "content": "<h1>A Negative-Results Report on Inference and Fine-Tuning Interventions for gpt-oss-120b on AIMO3</h1>\n<p><strong>Team:</strong> flamingice (solo) · <strong>Competition:</strong> AI Mathematical Olympiad - Progress Prize 3 · <strong>Submission for the Writeup Prize</strong></p>\n<hr>\n<h2>Abstract</h2>\n<p>We report a negative-results-dominated investigation of inference-time and training-time interventions for <code>gpt-oss-120b</code> on the AIMO3 competition. Our private-leaderboard submission, <code>final_submission v2</code>, achieved a public-leaderboard mean of <strong>40.78</strong> (σ = 1.20, n = 9 identical runs, best 43) and a <strong>private-leaderboard score of 41.5/50</strong> using parallel self-consistency over 8 attempts with a 5-component weighted-entropy voting function and a one-sentence system prompt. We submitted <strong>25 successful runs across 11 distinct notebook configurations</strong> over 25 days. With one exception, every architectural addition we attempted - multi-strategy prescriptive prompts, structured 5-stage scaffolding, subject-routed multi-stage arbitration with verifier/GenSelect/adversarial passes, and GRPO LoRA fine-tuning - either fell <em>within</em> run-to-run noise or fell <em>catastrophically</em> below it. The most expensive failure (≈$300 of B200 GPU time on GRPO experiments) is documented with 190 rows of training telemetry and traces to a known Unsloth <code>merged_4bit_forced</code> → vLLM MXFP4 deployment pipeline incompatibility. Our central methodological contribution is the <strong>noise floor</strong>: with σ = 1.20 across identical runs, any apparent improvement smaller than ≈2.4 points cannot be distinguished from running the same notebook twice. We argue that for inference-constrained math competitions, this noise dominates almost all engineering decisions, and that future participants should establish their own variance baselines <em>before</em> iterating on architecture.</p>\n<hr>\n<h2>1. Introduction</h2>\n<p>The AIMO3 competition required solving 50 private-set olympiad-level problems with non-negative integer answers in [0, 99999], inside a single Kaggle notebook constrained to <strong>≈5 hours of H100 GPU time</strong>. The runtime constraint transforms the optimization target: the goal is not \"maximize per-problem accuracy\" but \"maximize the joint expectation of accuracy and successful completion under a wall-clock cliff.\" This distinction kills nearly every intuition borrowed from offline pass@<em>N</em> experiments.</p>\n<p><code>gpt-oss-120b</code> (released in 2025, 117B total parameters with ≈5.1B active per token via mixture-of-experts, native MXFP4 weights) is strong enough on olympiad math that the AIMO3 leaderboard is plausibly bottlenecked by inference orchestration rather than reasoning capacity. Public community notebooks built on <code>gpt-oss-120b</code> were reported to score in the high 30s and low 40s out of 50 with relatively simple self-consistency setups. Against that background, our research question was: <strong>starting from a strong base model, where do additional engineering investments actually move the score?</strong></p>\n<p>We tested four classes of intervention:</p>\n<ol>\n<li><strong>Prompt engineering</strong> - prescriptive multi-strategy prompts and structured 5-stage scaffolds (UNDERSTAND → EXPLORE → PLAN → EXECUTE → VERIFY).</li>\n<li><strong>Inference-time orchestration</strong> - adaptive routing, multi-stage solving, posterior voting, GenSelect, adversarial verification.</li>\n<li><strong>More attempts</strong> - pushing N from 8 to 12.</li>\n<li><strong>Reinforcement learning</strong> - GRPO LoRA fine-tuning with a custom vLLM + Unsloth training loop.</li>\n</ol>\n<p>Every one of them either left the score within statistical noise of where we started, or made it dramatically worse. The single intervention that produced a stable mean above the noise floor was a <strong>5-component weighted entropy formula</strong> for self-consistency voting, combined with deliberate stripping of every other piece of scaffolding. This paper documents what we tried, why we tried it, and - more importantly - why the things that didn't work didn't work.</p>\n<p><strong>Reproducibility note.</strong> All code, prompts, and configurations are reported exactly as run. The full submission history (Appendix C), the GRPO training telemetry CSV (Appendix D), the offline research branch catalog (Appendix H), and the verbatim source of every notebook discussed here are available with this writeup.</p>\n<hr>\n<h2>2. The submission landscape</h2>\n<p>We made <strong>25 successful submissions across 11 notebook configurations</strong> between competition entry and the April 15 deadline. Figure 1 shows the chronological trajectory.</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig1_leaderboard_trajectory.png\" alt=\"Figure 1: Leaderboard trajectory across 25 submissions\"></p>\n<p>Three structural features of this trajectory motivate the rest of the paper:</p>\n<p><strong>The ramp-and-plateau shape.</strong> Scores rise from the high 20s to the high 30s as obvious bugs are removed, then plateau in a narrow band centered around 40 with substantial variance. No single architectural change moves us <em>out</em> of this band on the upside.</p>\n<p><strong>The catastrophic dips.</strong> Three submissions fall well below the band: GRPO at 13, the adaptive router at 28, and the V11 timeout at 33. Each represents a different failure mode (deployment pipeline corruption, time-budget collapse from per-problem complexity, raw wall-clock overrun). All three are documented in detail below.</p>\n<p><strong>The final cluster.</strong> The last nine submissions on the right are repeated runs of <code>final_submission v2</code> - the same notebook, the same seed, the same code - submitted to measure run-to-run variance. They span 39 to 43 with a mean of 40.78 and σ = 1.20.</p>\n<p>This last cluster is the load-bearing observation of the entire writeup. We turn to it next.</p>\n<hr>\n<h2>3. The noise floor</h2>\n<p>We submitted <code>final_submission v2</code> nine times without modification. The scores were:</p>\n<blockquote>\n  <p><strong>39, 40, 43, 40, 42, 40, 41, 41, 41</strong></p>\n</blockquote>\n<p>Mean = 40.778. Median = 41. σ = 1.202. Range = 4 points. 95% CI for the mean = [39.85, 41.70]. Figure 2 shows the distribution.</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig2_score_distribution.png\" alt=\"Figure 2: Run-to-run variance establishes the noise floor\"></p>\n<p>This variance has two sources we cannot fully separate. First, the gpt-oss-120b decoder produces non-deterministic output even with a fixed seed, because the parallel attempts are issued asynchronously to a vLLM server whose batching schedule depends on real-time CUDA kernel timing and KV-cache state. Second, Kaggle's grading is deterministic but the scheduling of which problems hit which attempt order is not. Whatever the underlying mechanism, <strong>the operationally relevant fact is that nine runs of identical code spanned four points</strong>.</p>\n<p>The implication for our research methodology is severe and one-directional:</p>\n<blockquote>\n  <p><strong>Any single comparison between two notebooks that differs by less than ≈2σ ≈ 2.4 points is statistically indistinguishable from running the same notebook twice.</strong></p>\n</blockquote>\n<p>In retrospect, the most important methodological mistake we made early in the competition was treating single-shot leaderboard scores as ground truth. When <code>aimo3_final v9</code> returned 37 three times in a row and <code>[15/15] AIME v3</code> returned 35 and 38, we read those as meaningful differences and chased the apparent winner. They are not meaningful differences. They are draws from the same noisy distribution.</p>\n<p>We did not realize this until the final week, when a deliberate variance experiment on the converged notebook produced the n = 9 distribution above. Had we run such an experiment on day one, we would have saved ≈$300 of GPU spend and three weeks of architectural iteration. <strong>This is recommendation #1 of the paper: future AIMO3-style participants should establish a noise floor before iterating on architecture.</strong></p>\n<hr>\n<h2>4. Offline evaluation on hard50</h2>\n<p>Throughout the competition we maintained an offline evaluation loop against the Kaggle community dataset <strong><code>hard_50_math_problems_set_v6.csv</code></strong> (published by user <code>zfturbo</code> as <code>hard-math-problems-for-aimo-3</code>) - a 50-problem benchmark of olympiad-level questions with known integer answers. Offline evaluation served as a debugging sanity check and as a relative-performance gauge for architectures we were not yet willing to spend a submission slot on.</p>\n<p>We authored <strong>15 offline research branches</strong> during the competition, organized into five families, each targeting a specific failure class observed in earlier runs:</p>\n<ul>\n<li><strong>Branch A / A2 (contested resolver)</strong> - trunk + candidate aggregation table + pairwise resolver. Motivation: hard50 showed that many wrong answers were <em>rerankable</em> - the correct answer was in the candidate pool but a weak plurality of wrong attempts shipped it. Heuristic constants were drawn from observed failure patterns (66 vs 69, 570 vs 285, 24 vs 25, 2000 vs 1999, 105 vs 106).</li>\n<li><strong>Branch A3 (closure-aware challenge + dual-check flip gate)</strong> - collect <em>all</em> boxed integers in an attempt and use the last to defend against premature boxing; flips require two independent checks. Authors explicitly noted A3 was \"<em>intended for AIMO3, not hard50-only optimization.</em>\"</li>\n<li><strong>Branch B (pairwise-authorized arbitration)</strong> - pairwise becomes the only component that can authorize a challenger flip; pressure and audit become veto layers only.</li>\n<li><strong>Branch C (controller + code rescue + provenance-aware weighting)</strong> - state controller that stops spending budget on already-converged or broken pools; code rescue for broken pools; candidates supported by multiple evidence modes weigh more than plain-text singletons.</li>\n<li><strong>Branch C+ (trusted main-pool arbitration + routed micro-prompts + typed verifiers)</strong> - the most elaborate research branch. Authors again stated it was \"<em>intended for AIMO3-level problems, not hard50-only tuning.</em>\"</li>\n</ul>\n<p><strong>None of these 15 branches were ever submitted to the Kaggle leaderboard.</strong> Of the 15, <strong>nine were never executed to completion</strong> due to infrastructure and wiring bugs. Two contested-resolver branches ran 50 problems on hard50 but never logged per-problem correctness. Three Branch B/C variants share a single stale truncated run (cumulative 19/29 at problem 30) that we cannot attribute to a specific architecture because the three notebooks have different code but identical saved outputs from one Colab session. <strong>One notebook - <code>aimo3_branch_B_multicell</code> - completed a full, inline-graded 50-problem hard50 run.</strong> That is the only offline number we can cite with full verification. Full per-branch execution status is catalogued in Appendix H.</p>\n<p><strong>Branch B multicell on hard50: 27/50 (54.0%), mean 233 s/problem, total 194 min.</strong> Figure 9 shows the per-problem timing (top) and cumulative accuracy (bottom). No problem hit the 900 s cap; the run finished comfortably inside a notional 5-hour budget at 3.24 h total.</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig9_branch_b_hard50.png\" alt=\"Figure 9: Branch B multicell full hard50 run\"></p>\n<p>Accuracy begins at 100% after problem 2, collapses to the mid-60s by problem 10, and bleeds out to 54% by problem 50. The architecture looked competitive early and degraded on the harder back half. Since no problem timed out, 27/50 reflects answer quality, not budget exhaustion.</p>\n<p><strong>Interpretation is constrained.</strong> Branch B multicell's elaborate pairwise-arbitration architecture scored 27 on hard50; <code>final_submission v2</code> scored a mean of 40.78 on AIMO3. If hard50 difficulty were comparable to AIMO3, Branch B would project to ~27 on AIMO3 - 14 points below the simpler approach. But hard50 is not AIMO3: it is community-sourced, intentionally difficult, and may systematically underestimate AIMO3 performance - which is precisely why Branches A3 and C+ were explicitly designed \"not for hard50-only tuning.\" We also never ran a variance experiment on hard50 analogous to our n = 9 experiment, so we cannot say whether 27/50 is itself ±2 points of noise.</p>\n<p>Even with those caveats, the directional signal was clear: <strong>our only offline-executed elaborate architecture predicted a losing Kaggle score, and the simpler baseline outperformed it.</strong> The writeup-prize rubric asks <em>\"did you use any internal benchmarks?\"</em> - yes, but less effectively than we should have. Nine of our 15 research notebooks never finished a run; we never calibrated hard50 against AIMO3; and the one completed offline run told a story that should have killed Branch B's lineage earlier than it did. <strong>Future participants: instrument your offline benchmark the way you instrument your leaderboard submissions, get all your research notebooks across the finish line, and run a variance experiment on the offline set before treating any single offline number as signal.</strong> Appendix H lists all 15 branches with design intent and execution status.</p>\n<hr>\n<h2>5. The converged solution: <code>final_submission v2</code></h2>\n<h3>5.1 Architecture</h3>\n<p><code>final_submission v2</code> is intentionally lean. It does not contain a 5-stage prompt, a router, a verifier, an adversarial pass, GenSelect, multi-strategy prescriptive prompts, or fine-tuned weights. It contains four things. First, the base model: <code>danielhanchen/gpt-oss-120b</code> served by local vLLM (KV-cache fp8_e4m3, gpu_memory_utilization 0.96, max_model_len 65,536). Second, a one-sentence system prompt: <em>\"You are a world-class IMO competitor. The final answer must be a non-negative integer between 0 and 99999. Place your final answer inside <code>\\boxed{}</code>.\"</em> The model is invoked through the openai-harmony format with <code>ReasoningEffort.HIGH</code>, the gpt-oss native reasoning control. Third, tool-augmented parallel self-consistency: 8 attempts dispatched in parallel against a pool of 16 long-lived Jupyter sandboxes (math, numpy, sympy, mpmath, itertools, collections; <code>mpmath.mp.dps = 64</code>), up to 128 harmony turns each, T = 1.0, min_p = 0.02, no top_p, per-attempt seed <code>(global_seed + attempt_index)²</code>. Streams are inspected character-by-character; an attempt short-circuits the moment a <code>\\boxed{...}</code> appears. Fourth, 5-component weighted-entropy voting (Section 5.2); when 4 attempts agree, remaining attempts are cancelled.</p>\n<p>The time budget is computed adaptively per problem: <code>min(max(time_remaining − 270 × problems_remaining, 270), 900)</code> seconds, with <code>notebook_limit = 17400</code> (4h50m, leaving safety margin inside Kaggle's 5h cliff). Appendix A contains the full configuration.</p>\n<h3>5.2 The 5-component weighted entropy</h3>\n<p>Inverse-entropy voting is a known technique: weight each attempt by 1/H, sum weights per answer, return the highest-weighted answer. The novelty in <code>final_submission v2</code> is that the entropy itself is a five-part composite over the attempt's logprob trajectory, rather than a single mean. Reading from the source:</p>\n<pre><code>weighted_entropy = (\n    0.30 * mean_entropy\n  + 0.40 * position_weighted_entropy   # exponential decay 0.995, recent tokens dominate\n  + 0.20 * std_dev_of_entropy          # variance penalty for inconsistent confidence\n  + 0.30 * 3.0 * high_entropy_ratio    # fraction of tokens with H &gt; 2.0 bits, scaled ×3\n  - 0.10 * (max_low_entropy_streak / n)  # bonus for sustained confident stretches\n)\n</code></pre>\n<p>The intuition: position weighting with decay 0.995 means tokens near the final boxed answer count exponentially more than tokens early in the chain of thought - a solution uncertain during exploration but confident at conclusion outranks one that is confident throughout but flinches at the end. The variance penalty punishes oscillating confidence (\"the model kept changing its mind\"). The high-entropy ratio counts tokens where the next-token distribution exceeds 2 bits of Shannon entropy, and the ×3 multiplier inside a 30% weighting makes this term dominant when an attempt has many uncertain stretches. The streak bonus rewards sustained runs of &lt; 1 bit entropy as a marker of \"the model is on a roll.\"</p>\n<p>These weights and thresholds are not from a paper. They were tuned by hand on intermediate submissions in this competition. The core idea of inverse-entropy weighted voting was informed by <a href=\"https://www.kaggle.com/code/pawanmali/chasing-47-50-aimo3-journey-of-60-experiments\" target=\"_blank\">pawanmali's \"Chasing 47/50\" notebook</a>, which demonstrated entropy-based confidence weighting for self-consistency on AIMO3. We do not claim they are optimal - only that this composite produced a stable mean of 40.78 in <code>final_submission v2</code>, while simpler \"mean entropy\" voting in eight other notebooks we submitted produced means in the 33–37 region. Section 6 unpacks that comparison.</p>\n<h3>5.3 What is <em>not</em> in <code>final_submission v2</code></h3>\n<p>For the avoidance of doubt: <code>final_submission v2</code> does not contain the 5-stage UNDERSTAND/EXPLORE/PLAN/EXECUTE/VERIFY scaffold (tested in <code>[15/15] AIME v3</code>, scored 35 and 38), the 8 prescriptive strategy prompts from the <code>aimo3_final</code> family (five submissions, mean ~36.6), the verifier/GenSelect/adversarial scaffolding from the same family, the subject-classifier routed prompts from <code>aimo3_adaptive v4</code> (scored 34), the full adaptive router with posterior voting (scored 28), the increased attempt count from <code>base_submission v2</code> (scored 33, timed out), or the GRPO fine-tuned weights from the v4_grpo submission (scored 13, merge format mismatch). Figures 7 and 8 visualize the same information at the feature and score levels respectively.</p>\n<hr>\n<h2>6. Ablation: every intervention vs. baseline</h2>\n<p>Figure 8 collects every intervention we tried as a horizontal bar chart, compared against the baseline of 39 (the first run of <code>aimo3_final v3</code>, which is the earliest non-debugging submission still in our history).</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig8_ablation_waterfall.png\" alt=\"Figure 8: Ablation waterfall — every intervention vs. starting baseline\"></p>\n<p>Three regions: <strong>inside the noise band</strong> - early <code>aimo3_final</code> iterations, the multi-strategy prompt family, and the 5-stage scaffold sit within ±2σ of the 39 baseline and are indistinguishable from starting fresh (the strategy-prompts family was tested in five submissions and never broke out). <strong>Below the noise band</strong> - the structured-scaffold-plus-classifier branch (−5), V11 timeout (−6), the router with GenSelect/adversarial pass (−11), and GRPO (−26); all real failures with identifiable causes that Section 7 dissects. <strong>Above the noise band</strong> - only <code>final_submission v2</code> at +1.78, with the lower bound of its 95% CI (39.85) itself above baseline. It is the <em>only</em> intervention in the entire competition with statistically defensible upward movement.</p>\n<p>Figure 7 makes the same point feature-by-feature. Each row is a notebook, each column a feature; checkmarks indicate presence.</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig7_feature_comparison.png\" alt=\"Figure 7: Feature presence across 11 submitted notebooks\"></p>\n<p><code>final_submission v2</code> (top row) has <em>fewer</em> features than every other notebook except the most basic, and is the only one with the 5-component weighted entropy. Notebooks with strategy prompts cluster around 36–37; notebooks with verifier/GenSelect/adversarial scaffolding cluster around 28–37; the router is at 28; GRPO at 13. Adding architecture moved us downward; subtracting it and replacing the voting function moved us upward. The honest causal claim we can make is that <strong>stripping the scaffolding AND replacing the voting function with 5-component weighted entropy together produced a defensible improvement above noise</strong>. We cannot say which change was load-bearing on its own - that would require an isolated ablation we did not run before the deadline.</p>\n<hr>\n<h2>7. Failed interventions, in detail</h2>\n<h3>7.1 Multi-strategy prescriptive prompts (V10 family, scored 36–37)</h3>\n<p>The <code>aimo3_final</code> v7/v9/v22 family launches eight parallel attempts, each with a different prescriptive system prompt instructing the model to use a specific mathematical technique - <em>analytic, computational, small-cases, work-backwards, algebraic, modular, geometric, random-testing-and-verification</em>. The hypothesis was that prompt-induced strategy diversity would produce a more diverse candidate pool for self-consistency voting to exploit, extending the DIPPER intuition that framing diversity beats temperature diversity alone.</p>\n<p>It failed because <code>gpt-oss-120b</code> at <code>ReasoningEffort.HIGH</code> complies with prescribed techniques even when they are poorly suited - a geometry problem given a \"modular arithmetic\" prompt produced attempts that contorted themselves toward modular methods and failed. The base model already selects appropriate techniques at T = 1.0; external prescription overrides this selection in the wrong direction about as often as the right one. Across five submissions, the mean was approximately 36.6 - Δ ≈ −2.4 vs. baseline, just inside the lower noise edge but directionally negative. The methodological distinction we carried forward: prescribing solution <em>content</em> hurts, prescribing reasoning <em>form</em> (Section 7.2) is roughly neutral.</p>\n<h3>7.2 5-stage structured scaffold (<code>[15/15] AIME v3</code>, scored 35 and 38)</h3>\n<p>The <code>[15/15] AIME 2026 I 120b in 20mins</code> notebook v3 uses the full 5-stage UNDERSTAND → EXPLORE → PLAN → EXECUTE → VERIFY scaffold popular in CoT prompting research, with a verbose ~1500-character system prompt detailing reasoning principles and verification requirements. The hypothesis was that even a strong base model would benefit from being forced to plan before executing.</p>\n<p>The two submissions scored 35 and 38 - squarely inside the ±2σ noise band of baseline. We cannot reject the null hypothesis that the scaffold has zero effect on <code>gpt-oss-120b</code>. A plausible explanation is that <code>ReasoningEffort.HIGH</code> already imposes a reasoning structure that the prompt-level scaffold duplicates without adding signal. <strong>Technique transfer from smaller-model prompting research does not automatically apply to gpt-oss-120b at high reasoning effort.</strong></p>\n<h3>7.3 The adaptive router (<code>AIMO3_Adaptive_Router_Confidence_Vote_v1</code>, scored 28)</h3>\n<p>A multi-stage system: a subject classifier routed each problem to one of four prompt families (geometry, number theory, combinatorics, algebra); a \"quick stage\" issued 2 cheap attempts (T = 0.55 and 0.80, max 2200 tokens, 24 turns); if those agreed with high posterior confidence, return immediately, otherwise an \"explore stage\" issued more attempts at higher temperature with longer budgets; weak candidates were routed through verifier, GenSelect, and adversarial passes; <code>high_problem_timeout = 840</code> s per problem. The hypothesis was the standard one: easy problems should consume little budget, hard problems more; an adaptive system should outperform a flat-budget system under heterogeneous difficulty.</p>\n<p>It failed structurally. The first problem consumed 840 s. The second consumed approximately 825 s. The router had burned 28% of the entire 5-hour notebook budget on two problems, and the remaining 48 problems shared the rest. Many timed out or returned 0. Final score: 28 - fully twelve points below baseline, the second-largest single-intervention drop in the competition. The router's adaptive logic correctly identified problems 1 and 2 as hard and allocated them more time; it then found nothing useful in the extra time. The correct behavior under those conditions is to give up early and conserve budget for problems where extra time might actually help - we did not implement that. A v2 with reduced timeouts reached 19/30 on an offline slice but we did not submit it; the converged <code>final_submission v2</code> was already outperforming it. <strong>Adaptive complexity is only valuable when the marginal value of extra time on a hard problem is positive. For hard olympiad problems in the AIMO3 distribution against gpt-oss-120b, that marginal value appears to be approximately zero past 5–6 minutes.</strong></p>\n<h3>7.4 More attempts on stock weights (<code>base_submission v2</code>, scored 33)</h3>\n<p>This is the team's fork of the public <code>AIMO 3 | GPT-OSS-120B (with tools)</code> notebook (\"the 42-notebook\" in community discussion), with three modifications: <code>attempts</code> raised from 8 to 12, <code>early_stop</code> raised from 4 to 5, and a \"Be concise. Stop immediately after <code>\\boxed{}</code>\" instruction added. The notebook also uses the stock OpenAI <code>gpt-oss-120b</code> weights rather than Daniel Hanchen's variant. Hypothesis: more samples → stronger voting → higher score, up to the point where the time budget binds.</p>\n<p>It exceeded the 5-hour budget. Twelve attempts × 50 problems with a verbose chain-of-thought trajectory pushed total runtime past the cliff; problems processed after timeout returned 0. Final score: 33. The experiment is <strong>confounded</strong> because we changed three variables at once and cannot cleanly attribute the −6 to \"more attempts\" alone. Operational lesson: <strong>if you push N upward, run a wall-clock experiment first, and budget for the slowest model variant.</strong></p>\n<h3>7.5 GRPO LoRA fine-tuning ([15/15] AIME v4_grpo, scored 13)</h3>\n<p>This is the largest and most expensive negative result in the writeup, and the most generally useful for the community. We approached it in two phases.</p>\n<p><strong>Phase A: TRL GRPOTrainer (collapsed at step 16, $101.73 sunk).</strong> Our first attempt used Hugging Face TRL's <code>GRPOTrainer</code> with Unsloth on a RunPod B200 ($5.03/hr). Configuration: LR 5e-6, max_grad_norm 1.0, β = 0.0, 8 generations per problem, <code>use_vllm=False</code> (because TRL's vLLM integration crashed at startup against gpt-oss-120b). Each step took ≈76 minutes. The training collapsed:</p>\n<ul>\n<li>Step 1: loss 0.0513, reward 0.375.</li>\n<li>Steps 8–9: KL divergence to reference policy reached <strong>87</strong>, gradient norm reached <strong>133</strong>.</li>\n<li>Step 13: peak reward 0.5625 - but loss had already climbed to 280.</li>\n<li>Step 16: loss reached <strong>19,751,736</strong>. Model destroyed. Killed.</li>\n</ul>\n<p>Figure 6 shows the trajectory.</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig6_trl_collapse.png\" alt=\"Figure 6: TRL GRPOTrainer collapse on Unsloth + gpt-oss-120b\"></p>\n<p>The diagnosis is straightforward: LR 5e-6 was too aggressive for an MoE model at 117B parameters, and <code>max_grad_norm</code> 1.0 was too loose to clip the gradient explosions that began once the policy started drifting from the reference.</p>\n<p><strong>Phase B: Custom vLLM + Unsloth loop (v6) - trained stably, deployed catastrophically.</strong> We rebuilt the training loop from scratch to avoid TRL's vLLM integration: each cycle launched vLLM with the current adapter, generated 8 completions per problem for 5 problems, killed vLLM to free GPU memory, applied a GRPO update via Unsloth, saved the adapter, restarted. We tightened the configuration substantially (LR 2e-6 with cosine decay, max_grad_norm 0.3, Dr.GRPO advantage normalization, DAPO-style overlong filtering, binary reward, β = 0, off-policy generation with vLLM on the base model and adapter trained separately; see Appendix B for the full config).</p>\n<p>We have telemetry for <strong>190 problems across 38 cycles</strong> (cycles 62–99, problems 310–499). The training was <strong>stable</strong> - zero loss collapses, loss values mostly in [0, 0.3], gradient norms cleanly bounded by the 0.3 clip. Figure 3 shows the per-cycle reward trajectory:</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig3_grpo_reward_trajectory.png\" alt=\"Figure 3: GRPO v6 reward trajectory\"></p>\n<p>The reward signal tells the second half of the story. The overall mean reward across all 190 problems was <strong>+0.033</strong> - barely above zero, after 38 cycles of training. Only <strong>4 problems out of 190 (2.1%)</strong> achieved reward 1.0 (all 8 generations correct): problems 329, 333, 379, 468. Three of those four had near-zero completion length, suggesting trivially short correct answers. Figure 5 shows the full reward distribution:</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig5_grpo_reward_histogram.png\" alt=\"Figure 5: GRPO v6 problem-level reward distribution\"></p>\n<p>Forty-seven percent of training problems received net negative reward. Eighteen percent received exactly zero (all 8 generations wrong, or all 8 right) - these are filtered from the gradient by Dr.GRPO's advantage normalization, contributing nothing. Thirty-three percent were partial wins. Only 2% were complete wins. This is the hardest possible shape for GRPO: the model is below 50% on the training distribution, and the reward signal is sparse and noisy. Even a stable training loop cannot extract much policy improvement from this.</p>\n<p><strong>The deployment failure.</strong> We merged the trained adapter using Unsloth's <code>merged_4bit_forced</code> method. The submission scored <strong>13/50</strong> - a 27-point drop from baseline. The root cause is a <strong>quantization format mismatch</strong>: <code>gpt-oss-120b</code>'s native weight format is <strong>MXFP4</strong> (E2M1 with E8M0 block scaling), but <code>merged_4bit_forced</code> produces <strong>BitsAndBytes NF4</strong>. vLLM routes the merged weights through its BitsAndBytes loader rather than the MXFP4 kernels, producing severely degraded output. The fix - which we discovered post-mortem from Unsloth documentation and vLLM GitHub issues #19361 and #21932 - is to merge with <code>merged_16bit</code> or save with <code>save_method=\"mxfp4\"</code>. A community member elsewhere in the AIMO3 forum reportedly spent <strong>$500</strong> on SFT+RL with a similar pipeline and scored 36, attributing it to the same issue. We spent approximately <strong>$300</strong> total on GRPO across all phases (Figure 4): TRL crash $102, v1–v5 debugging $100, v6 $62, idle $40.</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig4_grpo_cost.png\" alt=\"Figure 4: GRPO v6 cumulative compute cost\"></p>\n<p>The actionable takeaway: <strong>never use <code>merged_4bit_forced</code> to deploy a fine-tuned <code>gpt-oss-120b</code> LoRA to vLLM.</strong> Use <code>merged_16bit</code>, <code>save_method=\"mxfp4\"</code>, or NVIDIA's QAT pipeline.</p>\n<hr>\n<h2>8. Comparison with state of the art</h2>\n<p>We benchmarked exclusively against the open-weight setting because that is what AIMO3's hardware budget allows. The relevant SOTA points are:</p>\n<ul>\n<li><strong>AIMO2 winner (NemoSkills, 2025):</strong> 34/50 on 4×L4 GPUs, using a Qwen2.5-14B model fine-tuned on 540K custom problems with 3.2M CoT solutions and 1.7M tool-integrated reasoning traces, plus GenSelect at inference time. Documented in arXiv:2504.16891.</li>\n<li><strong>Public community baselines on <code>gpt-oss-120b</code> for AIMO3:</strong> Reported in the high 30s to low 40s with simple self-consistency setups.</li>\n<li><strong>Our submission:</strong> 40.78 mean (n=9, σ=1.20, best 43) with no fine-tuning, no scaffolding, and a 5-component weighted entropy voting function.</li>\n<li><strong>The top of the AIMO3 public leaderboard at writeup time:</strong> ≥46/50, presumably achieved through inference acceleration (EAGLE-3 speculative decoding has been discussed publicly), correct fine-tuning pipelines that avoid the MXFP4 mismatch, or both.</li>\n<li>The top of the AIMO3 public leaderboard at writeup time: ≥46/50, presumably achieved through inference acceleration (EAGLE-3 speculative decoding has been discussed publicly), correct fine-tuning pipelines that avoid the MXFP4 mismatch, or both.</li>\n</ul>\n<p>The host shared pass@N analysis on X showing gpt-oss-120b achieves pass@8 ≈ 44 and pass@20 ≈ 45.5 on the private set (95% CI [43, 48]), indicating that the correct answer appears in at least one of 8 attempts for approximately 44 of 50 problems. Our mean of 40.78 implies we correctly select the right answer from the pool approximately 93% of the time (40.78/44), with the remaining ~3 problems per run representing pure selection loss.</p>\n<p>The structural shift from AIMO2 to AIMO3 is striking. AIMO2 was won by a team that invested heavily in training-time compute and produced a 14B-parameter model that scored 34. AIMO3 allows H100 hardware, which makes <code>gpt-oss-120b</code> runnable, and the <em>unmodified</em> base model with a sensible voting function reaches 40.78 - six points above the AIMO2 winner with zero training-time investment. <strong>Base model capability dominates the AIMO3 landscape in a way it did not dominate AIMO2.</strong> Our negative GRPO result is consistent with this: training-time interventions face an uphill battle against a base model that is already near the ceiling of the inference-constrained accuracy distribution.</p>\n<p>We did not benchmark against commercial models (GPT-4, Claude, Gemini) because the AIMO3 rules require self-contained Kaggle notebook execution and commercial API calls are not permitted in the competition pipeline. </p>\n<hr>\n<h2>9. Lessons and recommendations</h2>\n<p>The competition produced eight findings we believe will help future participants more than another point on the leaderboard would.</p>\n<ol>\n<li><p><strong>Establish the noise floor first.</strong> Submit the same notebook 5–10 times before iterating on architecture. σ = 1.20 means any 1–2 point \"improvement\" is invisible to single-shot comparison. Every other recommendation depends on this one.</p></li>\n<li><p><strong>Per-problem time budgets are absolute.</strong> The 5-hour cliff is hard-enforced. Any architecture that <em>can</em> spend more time on a problem must have a hard cap well below what the budget would technically allow - hard problems do not pay you back for extra time.</p></li>\n<li><p><strong>Strategy-prompt diversity hurts a strong base model.</strong> When <code>gpt-oss-120b</code> at <code>ReasoningEffort.HIGH</code> is told to use a specific technique, it complies even when the technique is wrong. Sampling-temperature diversity at T = 1.0 produces enough variance for self-consistency voting without prescriptive prompts.</p></li>\n<li><p><strong>Confidence estimation matters more than sample count.</strong> Our single defensible improvement above noise came from changing the <em>voting function</em>, not from generating more samples. Treat the voting function as a first-class optimization target.</p></li>\n<li><p><strong><code>merged_4bit_forced</code> is a trap for <code>gpt-oss-120b</code>.</strong> The Unsloth → vLLM pipeline silently produces a BitsAndBytes-quantized model that vLLM cannot run efficiently. Use <code>merged_16bit</code> or <code>save_method=\"mxfp4\"</code>.</p></li>\n<li><p><strong>Stable GRPO training is necessary but not sufficient.</strong> Our v6 loop trained stably for 38 cycles with no collapses, but the deployed model scored 13 because of the merge format issue, and the reward signal during training (mean +0.033) was too sparse for meaningful policy improvement.</p></li>\n<li><p><strong>Instrument your offline benchmark like your leaderboard.</strong> We ran 15 offline research branches but only one completed a verifiable end-to-end run. We never calibrated hard50 difficulty against AIMO3. Subtraction beats addition: every architectural addition we tested was neutral or harmful.</p></li>\n<li><p><strong>Document the negative results.</strong> We invested ~$300 of B200 GPU time and three weeks of architectural iteration in directions that did not work. If this writeup helps even one future team avoid the <code>merged_4bit_forced</code> trap or the strategy-prompt-diversity dead end, it has paid for itself many times over.</p></li>\n</ol>\n<hr>\n<h2>10. Conclusion</h2>\n<p>We did not win AIMO3. Our private-leaderboard score of 41.5/50 and rank 828th / 4,138 (public-leaderboard best score of 43/50 and rank 86th / 4,138) falls squarely within our predicted 95% CI of [39.85, 41.70], validating the variance methodology, well above naive baselines but below the top of the leaderboard. What we contribute to the community is not a higher score but a documented, statistically defensible characterization of the AIMO3 inference problem with <code>gpt-oss-120b</code>: the base model is strong enough that most engineering interventions are dominated by run-to-run noise; the few interventions that move the score appreciably move it <em>downward</em>; and the single defensible upward move we found was a more careful confidence-estimation function for self-consistency voting. The expensive failure modes - strategy-prompt prescription, multi-stage routing, and most importantly GRPO with broken deployment - are all reproducible from the configurations and telemetry in the appendices. Every score in this paper is from an actual public-leaderboard submission, every configuration is from actual source code, and every causal claim is hedged to the strength of the evidence we have.</p>\n<p>If you take one thing from this writeup, take this: <strong>before you spend a week building a router, submit the same notebook many times and look at the variance.</strong></p>\n<hr>\n<h2>11. Private Leaderboard Result</h2>\n<p>Our selected submission (<code>final_submission v2</code>) scored <strong>41.5/50</strong> on the private leaderboard (rank 828 / 4,138). Under the double-run scoring rule - where each problem receives 1.0 if both runs are correct, 0.5 if one is correct, and 0.0 if neither is - this score is consistent with a per-run accuracy of approximately 41–42, directly in line with our public-LB mean of 40.78 (σ=1.20, n=9).</p>\n<p>The private score falls within our predicted 95% confidence interval of [39.85, 41.70], confirming that the variance methodology in Section 3 generalizes from public to private evaluation. The noise floor finding - that σ=1.20 across identical runs means any sub-2.4-point \"improvement\" is statistically indistinguishable from noise - is validated by this out-of-sample result.</p>\n<p>Our rank shifted from 86th (public, based on best single submission of 43) to 828th (private, based on the selected submission's double-run average). This rank compression is itself evidence for the noise-floor thesis: teams whose public rank was inflated by a single lucky run regressed toward their true mean on the private set, while our pre-registered variance estimate correctly predicted our private performance.</p>\n<h2>---</h2>\n<h1>Appendices</h1>\n<h2>Appendix A: Full configuration of <code>final_submission v2</code></h2>\n<p>This is the verbatim configuration from the <code>CFG</code> class in the submitted notebook.</p>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Base model</strong></td>\n<td><code>/kaggle/input/models/danielhanchen/gpt-oss-120b/transformers/default/1</code></td>\n</tr>\n<tr>\n<td><strong>Served model name (vLLM)</strong></td>\n<td><code>gpt-oss</code></td>\n</tr>\n<tr>\n<td><strong>Quantization</strong></td>\n<td>Native MXFP4</td>\n</tr>\n<tr>\n<td><strong>Tensor parallel size</strong></td>\n<td>1</td>\n</tr>\n<tr>\n<td><strong>gpu_memory_utilization</strong></td>\n<td>0.96</td>\n</tr>\n<tr>\n<td><strong>kv_cache_dtype</strong></td>\n<td><code>fp8_e4m3</code></td>\n</tr>\n<tr>\n<td><strong>dtype</strong></td>\n<td><code>auto</code></td>\n</tr>\n<tr>\n<td><strong>context_tokens (max_model_len)</strong></td>\n<td>65,536</td>\n</tr>\n<tr>\n<td><strong>batch_size (max_num_seqs)</strong></td>\n<td>256</td>\n</tr>\n<tr>\n<td><strong>stream_interval</strong></td>\n<td>200</td>\n</tr>\n<tr>\n<td><strong>enable_prefix_caching</strong></td>\n<td>True</td>\n</tr>\n<tr>\n<td><strong>async_scheduling</strong></td>\n<td>True</td>\n</tr>\n<tr>\n<td><strong>System prompt</strong></td>\n<td><em>\"You are a world-class IMO competitor. The final answer must be a non-negative integer between 0 and 99999. Place your final answer inside <code>\\boxed{}</code>.\"</em></td>\n</tr>\n<tr>\n<td><strong>Tool prompt</strong></td>\n<td><em>\"Use this tool to execute Python code. The environment is a stateful Jupyter notebook. Always use print() to output results.\"</em></td>\n</tr>\n<tr>\n<td><strong>Preference prompt</strong></td>\n<td><em>\"You have access to math, numpy, sympy, and mpmath.\"</em></td>\n</tr>\n<tr>\n<td><strong>Reasoning effort</strong></td>\n<td><code>ReasoningEffort.HIGH</code> (set on harmony SystemContent)</td>\n</tr>\n<tr>\n<td><strong>Tool format</strong></td>\n<td>openai-harmony Conversation API</td>\n</tr>\n<tr>\n<td><strong>Available libraries in sandbox</strong></td>\n<td>math, numpy, sympy, mpmath, itertools, collections; <code>mpmath.mp.dps = 64</code></td>\n</tr>\n<tr>\n<td><strong>temperature</strong></td>\n<td>1.0</td>\n</tr>\n<tr>\n<td><strong>min_p</strong></td>\n<td>0.02</td>\n</tr>\n<tr>\n<td><strong>top_p</strong></td>\n<td>not set (intentionally - top_p = 0.9 was tested and caused a regression in earlier iterations)</td>\n</tr>\n<tr>\n<td><strong>top_logprobs</strong></td>\n<td>5</td>\n</tr>\n<tr>\n<td><strong>attempts</strong></td>\n<td>8</td>\n</tr>\n<tr>\n<td><strong>workers (parallel sandboxes)</strong></td>\n<td>16</td>\n</tr>\n<tr>\n<td><strong>early_stop</strong></td>\n<td>4 (cancel remaining attempts when 4 agree)</td>\n</tr>\n<tr>\n<td><strong>turns (max harmony turns per attempt)</strong></td>\n<td>128</td>\n</tr>\n<tr>\n<td><strong>seed (global)</strong></td>\n<td>42</td>\n</tr>\n<tr>\n<td><strong>per-attempt seed</strong></td>\n<td><code>(seed + attempt_index) ** 2</code></td>\n</tr>\n<tr>\n<td><strong>buffer_tokens</strong></td>\n<td>512</td>\n</tr>\n<tr>\n<td><strong>search_tokens (streaming <code>\\boxed{}</code> window)</strong></td>\n<td>32</td>\n</tr>\n<tr>\n<td><strong>notebook_limit</strong></td>\n<td>17,400 s (4h50m)</td>\n</tr>\n<tr>\n<td><strong>base_problem_timeout</strong></td>\n<td>270 s</td>\n</tr>\n<tr>\n<td><strong>high_problem_timeout</strong></td>\n<td>900 s</td>\n</tr>\n<tr>\n<td><strong>server_timeout</strong></td>\n<td>180 s</td>\n</tr>\n<tr>\n<td><strong>session_timeout</strong></td>\n<td>960 s</td>\n</tr>\n<tr>\n<td><strong>jupyter_timeout</strong></td>\n<td>6 s</td>\n</tr>\n<tr>\n<td><strong>sandbox_timeout</strong></td>\n<td>3 s</td>\n</tr>\n<tr>\n<td><strong>per-problem budget formula</strong></td>\n<td><code>min(max(time_remaining − 270 × (problems_remaining − 1), 270), 900)</code></td>\n</tr>\n</tbody>\n</table>\n<h3>A.1 Voting function source</h3>\n<pre><code>def _compute_weighted_entropy(self, logprobs_buffer):\n    \"\"\"5-component weighted entropy.\"\"\"\n    if not logprobs_buffer:\n        return float('inf')\n\n    entropies = []\n    for top_lp in logprobs_buffer:\n        if not isinstance(top_lp, dict) or not top_lp:\n            continue\n        h = 0.0\n        for _, lp in top_lp.items():\n            p = math.exp(lp)\n            if p &gt; 0:\n                h -= p * math.log2(p)\n        entropies.append(h)\n\n    if not entropies:\n        return float('inf')\n\n    n = len(entropies)\n    mean_ent = sum(entropies) / n\n\n    # Variance penalty\n    if n &gt; 1:\n        variance = sum((e - mean_ent) ** 2 for e in entropies) / (n - 1)\n        std_dev = math.sqrt(variance)\n    else:\n        std_dev = 0.0\n\n    # Position-weighted (recent tokens dominate, decay 0.995)\n    decay = 0.995\n    weights = [decay ** (n - 1 - i) for i in range(n)]\n    total_weight = sum(weights)\n    position_weighted = (\n        sum(w * e for w, e in zip(weights, entropies)) / total_weight\n        if total_weight &gt; 0 else mean_ent\n    )\n\n    # High-entropy ratio (tokens with H &gt; 2.0 bits)\n    high_ent_count = sum(1 for e in entropies if e &gt; 2.0)\n    high_ent_ratio = high_ent_count / n\n\n    # Low-entropy streak bonus (sustained &lt; 1.0 bit)\n    max_streak = 0\n    current_streak = 0\n    for e in entropies:\n        if e &lt; 1.0:\n            current_streak += 1\n            max_streak = max(max_streak, current_streak)\n        else:\n            current_streak = 0\n    streak_bonus = -0.1 * (max_streak / n) if n &gt; 0 else 0.0\n\n    weighted = (\n        0.3 * mean_ent\n      + 0.4 * position_weighted\n      + 0.2 * std_dev\n      + 0.3 * high_ent_ratio * 3.0\n      + streak_bonus\n    )\n    return max(weighted, 1e-9)\n\n\ndef _select_answer(self, detailed_results):\n    \"\"\"Inverse-entropy weighted voting.\"\"\"\n    answer_weights = defaultdict(float)\n    answer_votes = defaultdict(int)\n    for r in detailed_results:\n        a = r['Answer']\n        e = r['Entropy']\n        if a is not None:\n            answer_weights[a] += 1.0 / max(e, 1e-9)\n            answer_votes[a] += 1\n    if not answer_weights:\n        return 0\n    scored = sorted(\n        [{'answer': a, 'votes': answer_votes[a], 'score': w}\n         for a, w in answer_weights.items()],\n        key=lambda x: x['score'], reverse=True\n    )\n    return scored[0]['answer']\n</code></pre>\n<h3>A.2 Boxed-answer scanner</h3>\n<pre><code>def _scan_for_answer(self, text):\n    pattern = r'\\\\boxed\\s*\\{\\s*([0-9,]+)\\s*\\}'\n    matches = re.findall(pattern, text)\n    if matches:\n        try:\n            val = int(matches[-1].replace(',', ''))\n            if 0 &lt;= val &lt;= 99999:\n                return val\n        except ValueError:\n            pass\n    pattern = r'final\\s+answer\\s+is\\s*([0-9,]+)'\n    matches = re.findall(pattern, text, re.IGNORECASE)\n    if matches:\n        try:\n            val = int(matches[-1].replace(',', ''))\n            if 0 &lt;= val &lt;= 99999:\n                return val\n        except ValueError:\n            pass\n    return None\n</code></pre>\n<p>The streaming inspection happens inside <code>_process_attempt</code>: after each chunk of streamed text, the last <code>search_tokens = 32</code> tokens worth of text are scanned for <code>\\boxed{...}</code>, and if found, the attempt short-circuits without consuming additional turns.</p>\n<h3>A.3 Provenance and credit</h3>\n<p>The 5-component weighted entropy formula builds on the multi-component entropy scoring framework from <a href=\"https://www.kaggle.com/code/pawanmali/chasing-47-50-aimo3-journey-of-60-experiments\" target=\"_blank\">pawanmali's \"Chasing 47/50\" notebook</a>, which demonstrated that position-weighted entropy with variance and streak components substantially outperforms simple mean entropy on AIMO3. Our contribution is the specific tuning of weights and thresholds across intermediate submissions; the structural design of which components to include follows pawanmali's framework.</p>\n<hr>\n<h2>Appendix B: GRPO v6 configuration</h2>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Hardware</strong></td>\n<td>RunPod B200 (1 GPU, 191.5 GB VRAM)</td>\n</tr>\n<tr>\n<td><strong>Cost rate</strong></td>\n<td>$5.03/hr</td>\n</tr>\n<tr>\n<td><strong>Base model</strong></td>\n<td><code>danielhanchen/gpt-oss-120b</code> loaded via Unsloth with <code>load_in_4bit=True</code></td>\n</tr>\n<tr>\n<td><strong>Quantization during training</strong></td>\n<td>BitsAndBytes NF4 (Unsloth converts MXFP4 → NF4 on load)</td>\n</tr>\n<tr>\n<td><strong>Architecture</strong></td>\n<td>Off-policy: vLLM serves base model; Unsloth trains LoRA adapter separately; vLLM restarted between cycles</td>\n</tr>\n<tr>\n<td><strong>Learning rate</strong></td>\n<td>2e-6 with cosine decay</td>\n</tr>\n<tr>\n<td><strong>max_grad_norm</strong></td>\n<td>0.3</td>\n</tr>\n<tr>\n<td><strong>Generations per problem</strong></td>\n<td>8</td>\n</tr>\n<tr>\n<td><strong>Temperature (rollouts)</strong></td>\n<td>1.0</td>\n</tr>\n<tr>\n<td><strong>top_p (rollouts)</strong></td>\n<td>0.98</td>\n</tr>\n<tr>\n<td><strong>max_completion_tokens</strong></td>\n<td>6,144</td>\n</tr>\n<tr>\n<td><strong>Advantage</strong></td>\n<td>Dr.GRPO (mean subtraction, no std division)</td>\n</tr>\n<tr>\n<td><strong>Overlong filtering</strong></td>\n<td>DAPO-style (truncated completions removed from gradient)</td>\n</tr>\n<tr>\n<td><strong>KL coefficient (β)</strong></td>\n<td>0.0</td>\n</tr>\n<tr>\n<td><strong>Reward function</strong></td>\n<td>Binary: 1.0 if extracted boxed answer matches ground truth, 0.0 otherwise</td>\n</tr>\n<tr>\n<td><strong>Problems per cycle</strong></td>\n<td>5</td>\n</tr>\n<tr>\n<td><strong>Cycles captured in telemetry</strong></td>\n<td>38 (cycles 62–99)</td>\n</tr>\n<tr>\n<td><strong>Problems captured in telemetry</strong></td>\n<td>190 (problems 310–499)</td>\n</tr>\n<tr>\n<td><strong>Mean cycle time</strong></td>\n<td>~1,170 s (gen ~720s + train ~440s)</td>\n</tr>\n<tr>\n<td><strong>Cost in v6 logged segment</strong></td>\n<td>$61.87</td>\n</tr>\n<tr>\n<td><strong>Total GRPO project cost (all phases)</strong></td>\n<td>≈$300</td>\n</tr>\n<tr>\n<td><strong>Merge method used (the bug)</strong></td>\n<td><code>merged_4bit_forced</code> → produces BnB NF4</td>\n</tr>\n<tr>\n<td><strong>Merge method that should have been used</strong></td>\n<td><code>merged_16bit</code> or <code>save_method=\"mxfp4\"</code></td>\n</tr>\n<tr>\n<td><strong>Submission score</strong></td>\n<td>13/50</td>\n</tr>\n</tbody>\n</table>\n<h3>B.1 TRL Phase A (collapsed) configuration</h3>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Framework</strong></td>\n<td>Hugging Face TRL <code>GRPOTrainer</code> + Unsloth</td>\n</tr>\n<tr>\n<td><strong>use_vllm</strong></td>\n<td>False (TRL+vLLM crashed at startup)</td>\n</tr>\n<tr>\n<td><strong>Learning rate</strong></td>\n<td>5e-6</td>\n</tr>\n<tr>\n<td><strong>max_grad_norm</strong></td>\n<td>1.0</td>\n</tr>\n<tr>\n<td><strong>β (KL coefficient)</strong></td>\n<td>0.0</td>\n</tr>\n<tr>\n<td><strong>Generations per problem</strong></td>\n<td>8</td>\n</tr>\n<tr>\n<td><strong>Steps completed</strong></td>\n<td>16 (model destroyed at step 16)</td>\n</tr>\n<tr>\n<td><strong>Time per step</strong></td>\n<td>≈76 minutes</td>\n</tr>\n<tr>\n<td><strong>Cost</strong></td>\n<td>$101.73</td>\n</tr>\n<tr>\n<td><strong>Loss at step 1</strong></td>\n<td>0.0513</td>\n</tr>\n<tr>\n<td><strong>KL at steps 8–9</strong></td>\n<td>87</td>\n</tr>\n<tr>\n<td><strong>Gradient norm at steps 8–9</strong></td>\n<td>133</td>\n</tr>\n<tr>\n<td><strong>Reward at step 13</strong></td>\n<td>0.5625 (peak)</td>\n</tr>\n<tr>\n<td><strong>Loss at step 16</strong></td>\n<td>19,751,736</td>\n</tr>\n</tbody>\n</table>\n<h3>B.2 SFT (uploaded but not submitted)</h3>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Method</strong></td>\n<td>QLoRA, rank 128</td>\n</tr>\n<tr>\n<td><strong>Training data</strong></td>\n<td>63,959 tool-integrated reasoning (TIR) traces</td>\n</tr>\n<tr>\n<td><strong>Steps</strong></td>\n<td>1,000</td>\n</tr>\n<tr>\n<td><strong>Final loss</strong></td>\n<td>0.69 (plateau)</td>\n</tr>\n<tr>\n<td><strong>Uploaded model</strong></td>\n<td><code>flamingice2801/gpt-oss-120b-aimo3-tir-sft</code> (Kaggle Models)</td>\n</tr>\n<tr>\n<td><strong>Submitted to AIMO3?</strong></td>\n<td>No - abandoned after GRPO deployment failure exposed the merge format issue</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Appendix C: Full Kaggle submission history</h2>\n<p>Twenty-five successful submissions plus three early debug parquet uploads (score 0) and one notebook exception. Listed in chronological order (oldest first).</p>\n<table>\n<thead>\n<tr>\n<th>#</th>\n<th>Days ago at writeup</th>\n<th>Notebook</th>\n<th>Version</th>\n<th>Score</th>\n<th>Phase</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>24</td>\n<td><code>aimo3_final</code></td>\n<td>v3</td>\n<td>39</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>2</td>\n<td>23</td>\n<td><code>aimo3_final</code></td>\n<td>v4_tweaked_temp&amp;model</td>\n<td>11</td>\n<td>Debugging</td>\n</tr>\n<tr>\n<td>3</td>\n<td>22</td>\n<td><code>aimo3_final</code></td>\n<td>v5_tweaked_temp</td>\n<td>0</td>\n<td>Debugging</td>\n</tr>\n<tr>\n<td>4</td>\n<td>21</td>\n<td><code>aimo3_final</code></td>\n<td>v7</td>\n<td>36</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>5</td>\n<td>20</td>\n<td><code>aimo3_final</code></td>\n<td>v9</td>\n<td>37</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>6</td>\n<td>19</td>\n<td><code>aimo3_final</code></td>\n<td>v22</td>\n<td>36</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>7</td>\n<td>18</td>\n<td><code>base_submission</code></td>\n<td>v2</td>\n<td>33</td>\n<td>Failure (V11 timeout)</td>\n</tr>\n<tr>\n<td>8</td>\n<td>17</td>\n<td><code>[15/15] AIME 2026 I 120b in 20mins</code></td>\n<td>v4_grpo</td>\n<td><strong>13</strong></td>\n<td><strong>Failure (GRPO)</strong></td>\n</tr>\n<tr>\n<td>9</td>\n<td>16</td>\n<td><code>[15/15] AIME 2026 I 120b in 20mins</code></td>\n<td>v3</td>\n<td>38</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>10</td>\n<td>15</td>\n<td><code>aimo3_final</code></td>\n<td>v3 (re-run)</td>\n<td>34</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>11</td>\n<td>14</td>\n<td><code>AIMO3_Adaptive_Router_Confidence_Vote_v1</code></td>\n<td>v1</td>\n<td><strong>28</strong></td>\n<td><strong>Failure (router)</strong></td>\n</tr>\n<tr>\n<td>12</td>\n<td>13</td>\n<td><code>[15/15] AIME 2026 I 120b in 20mins</code></td>\n<td>v3 (re-run)</td>\n<td>35</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>13</td>\n<td>12</td>\n<td><code>aimo3_final</code></td>\n<td>v9 (re-run)</td>\n<td>37</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>14</td>\n<td>11</td>\n<td><code>aimo3_final</code></td>\n<td>v9 (re-run)</td>\n<td>37</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>15</td>\n<td>10</td>\n<td><code>aimo3_adaptive</code></td>\n<td>_v4</td>\n<td>34</td>\n<td>Failure</td>\n</tr>\n<tr>\n<td>16</td>\n<td>9</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>39</strong></td>\n<td><strong>Final (run 1)</strong></td>\n</tr>\n<tr>\n<td>17</td>\n<td>8</td>\n<td><code>aimo_tester</code></td>\n<td>v2</td>\n<td>34</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>18</td>\n<td>7</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>40</strong></td>\n<td><strong>Final (run 2)</strong></td>\n</tr>\n<tr>\n<td>19</td>\n<td>6</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>43</strong></td>\n<td><strong>Final (run 3)</strong></td>\n</tr>\n<tr>\n<td>20</td>\n<td>4</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>40</strong></td>\n<td><strong>Final (run 4)</strong></td>\n</tr>\n<tr>\n<td>21</td>\n<td>3</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>42</strong></td>\n<td><strong>Final (run 5)</strong></td>\n</tr>\n<tr>\n<td>22</td>\n<td>3</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>40</strong></td>\n<td><strong>Final (run 6)</strong></td>\n</tr>\n<tr>\n<td>23</td>\n<td>2</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>41</strong></td>\n<td><strong>Final (run 7)</strong></td>\n</tr>\n<tr>\n<td>24</td>\n<td>1</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>41</strong></td>\n<td><strong>Final (run 8)</strong></td>\n</tr>\n<tr>\n<td>25</td>\n<td>0</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>41</strong></td>\n<td><strong>Final (run 9)</strong></td>\n</tr>\n</tbody>\n</table>\n<p><code>final_submission v2</code> distribution: {39, 40, 40, 40, 41, 41, 41, 42, 43}, n = 9, mean 40.778, median 41, σ = 1.202, 95% CI [39.85, 41.70], best 43.</p>\n<hr>\n<h2>Appendix D: GRPO v6 telemetry summary</h2>\n<p>The full per-problem telemetry CSV (190 rows × 14 columns) is provided as a supplementary artifact. Summary statistics:</p>\n<table>\n<thead>\n<tr>\n<th>Statistic</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Total rows</td>\n<td>190</td>\n</tr>\n<tr>\n<td>Cycle range</td>\n<td>62 – 99 (38 cycles)</td>\n</tr>\n<tr>\n<td>Problem range</td>\n<td>310 – 499</td>\n</tr>\n<tr>\n<td>Generations per problem</td>\n<td>8 (constant)</td>\n</tr>\n<tr>\n<td>Mean generation time per cycle</td>\n<td>720 s</td>\n</tr>\n<tr>\n<td>Mean training time per cycle</td>\n<td>440 s</td>\n</tr>\n<tr>\n<td>Mean cycle time</td>\n<td>1,170 s</td>\n</tr>\n<tr>\n<td>Cost at cycle 62</td>\n<td>$2.34</td>\n</tr>\n<tr>\n<td>Cost at cycle 99</td>\n<td>$61.87</td>\n</tr>\n<tr>\n<td>Mean reward (all 190 problems)</td>\n<td>+0.033</td>\n</tr>\n<tr>\n<td>Problems with reward &lt; 0</td>\n<td>90 (47.4%)</td>\n</tr>\n<tr>\n<td>Problems with reward = 0 (filtered)</td>\n<td>34 (17.9%)</td>\n</tr>\n<tr>\n<td>Problems with 0 &lt; reward &lt; 1</td>\n<td>62 (32.6%)</td>\n</tr>\n<tr>\n<td>Problems with reward = 1.0 (all 8 correct)</td>\n<td>4 (2.1%)</td>\n</tr>\n<tr>\n<td>Problem IDs achieving reward = 1.0</td>\n<td>329, 333, 379, 468</td>\n</tr>\n<tr>\n<td>Loss range</td>\n<td>[0.0, ~0.7]</td>\n</tr>\n<tr>\n<td>Loss collapses</td>\n<td>0</td>\n</tr>\n<tr>\n<td>Mean completion length</td>\n<td>~3,500 tokens</td>\n</tr>\n<tr>\n<td>Max completion length observed</td>\n<td>~6,400 tokens (binding against 6,144 cap)</td>\n</tr>\n</tbody>\n</table>\n<p>The full CSV columns are: <code>cycle, problem_idx, gen_time_sec, train_time_sec, total_sec, reward_mean, reward_std, num_correct, num_total, loss, completion_len_mean, clipped_ratio, gpu_mem, cost</code>.</p>\n<hr>\n<h2>Appendix E: Variance experiment statistical details</h2>\n<p>The 9-run variance experiment for <code>final_submission v2</code> produced scores {39, 40, 40, 40, 41, 41, 41, 42, 43}. Descriptive statistics:</p>\n<table>\n<thead>\n<tr>\n<th>Statistic</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>n</td>\n<td>9</td>\n</tr>\n<tr>\n<td>Sum</td>\n<td>367</td>\n</tr>\n<tr>\n<td>Mean</td>\n<td>40.778</td>\n</tr>\n<tr>\n<td>Median</td>\n<td>41</td>\n</tr>\n<tr>\n<td>Mode</td>\n<td>40 and 41 (each appear 3 times)</td>\n</tr>\n<tr>\n<td>Min</td>\n<td>39</td>\n</tr>\n<tr>\n<td>Max</td>\n<td>43</td>\n</tr>\n<tr>\n<td>Range</td>\n<td>4</td>\n</tr>\n<tr>\n<td>Sample variance s²</td>\n<td>1.444</td>\n</tr>\n<tr>\n<td>Sample standard deviation s</td>\n<td>1.202</td>\n</tr>\n<tr>\n<td>Standard error of the mean</td>\n<td>0.401</td>\n</tr>\n<tr>\n<td>t-critical (df=8, 95%)</td>\n<td>2.306</td>\n</tr>\n<tr>\n<td>95% CI for mean</td>\n<td>[39.854, 41.702]</td>\n</tr>\n<tr>\n<td>Coefficient of variation</td>\n<td>2.95%</td>\n</tr>\n</tbody>\n</table>\n<p>Under the assumption that each problem is solved with effective probability <em>p_eff</em> after voting, the score X ~ Binomial(50, <em>p_eff</em>). From mean = 40.778, <em>p_eff</em> ≈ 0.816, predicting a theoretical Binomial standard deviation of √(50 · 0.816 · 0.184) ≈ 2.74. <strong>Our observed σ = 1.20 is meaningfully lower than the Binomial prediction</strong>, suggesting positive correlation between problems within a single run (i.e., when the model is \"having a good run,\" it tends to solve more problems than independent sampling would predict). Plausible mechanisms include vLLM batching state, KV-cache hit patterns, and GPU thermal/scheduling effects that affect attempts within a single notebook run more than across runs.</p>\n<p>For two independent runs from the same configuration with σ = 1.20:</p>\n<ul>\n<li>Expected difference E[|X₁ − X₂|] ≈ 1.35</li>\n<li>P(|X₁ − X₂| ≥ 3) ≈ 0.07</li>\n<li>P(|X₁ − X₂| ≥ 4) ≈ 0.02</li>\n</ul>\n<p>A 3-point single-shot difference between two notebooks therefore has approximately a 1-in-14 chance of being pure noise. A 4-point difference reaches conventional statistical significance (p &lt; 0.05) only with this much variance assumed. <strong>Differences smaller than 3 points should not be acted on without replication.</strong></p>\n<hr>\n<h2>Appendix F: Why the public 42-notebook is not a clean baseline in our results</h2>\n<p>The public Kaggle notebook <code>AIMO 3 | GPT-OSS-120B (with tools)</code> (\"the 42-notebook\" in community discussion) is reported to score 42/50 by its authors with default settings. We never submitted the unmodified 42-notebook. Our <code>base_submission v2</code> is a <strong>fork</strong> of it with three modifications:</p>\n<ol>\n<li><code>attempts</code> raised from 8 to 12</li>\n<li><code>early_stop</code> raised from 4 to 5</li>\n<li><code>\"Be concise. Stop immediately after \\boxed{}\"</code> added to the preference prompt</li>\n</ol>\n<p><code>base_submission v2</code> scored 33 - six points below baseline - primarily due to the wall-clock overrun caused by modification #1. Because we changed three variables at once, <strong>we cannot attribute the −6 to \"more attempts\" alone</strong>, and we cannot use this submission as a measurement of the unmodified 42-notebook's performance in our environment. The 42-notebook's score in our hands is, strictly speaking, unknown. We list this as a methodological limitation rather than a result.</p>\n<hr>\n<h2>Appendix G: What we would do differently</h2>\n<p>If we were starting AIMO3 again with what we know now, in priority order:</p>\n<ol>\n<li><strong>Day 1, before any architectural work:</strong> Submit the same baseline notebook 9 times. Plot the distribution. Compute σ. <em>Then</em> decide what counts as a meaningful improvement.</li>\n<li><strong>Day 2:</strong> Read every Unsloth and vLLM doc page about merging fine-tuned LoRA adapters for <code>gpt-oss-120b</code>. Specifically search for \"MXFP4\" and \"merged_4bit\". This would have saved the ≈$300 GRPO sunk cost.</li>\n<li><strong>Day 3 onward, if time allows:</strong> Investigate inference-acceleration paths (EAGLE-3 speculative decoding, smaller-N with smarter voting, parallel sandbox pool tuning) before investigating training-time interventions. The base model is strong; the binding constraint is throughput.</li>\n<li><strong>Throughout:</strong> Treat the voting function as a first-class variable. A more refined confidence estimator was the only thing that produced a defensible improvement above noise in our experiments.</li>\n<li><strong>Never:</strong> Add a multi-stage router with verifier / GenSelect / adversarial passes without measuring its time cost on a wall-clock simulation first.</li>\n</ol>\n<hr>\n<h2>Appendix H: Offline research branch catalog</h2>\n<p>Fifteen offline research branches were authored during the competition to explore architectures that we were not willing to spend Kaggle submission slots on. <strong>None of the 15 were submitted to the AIMO3 leaderboard.</strong> Their target benchmark was the community-sourced <code>hard_50_math_problems_set_v6.csv</code> dataset (Kaggle dataset <code>zfturbo/hard-math-problems-for-aimo-3</code>). This appendix documents each branch with its design intent (taken verbatim from the top-of-notebook docstring or markdown cell where available), its execution status, and what the preserved notebook outputs actually verify.</p>\n<h3>H.1 Execution status summary</h3>\n<table>\n<thead>\n<tr>\n<th>Branch file</th>\n<th>Execution status</th>\n<th>Verifiable score</th>\n<th>Mean time/problem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>aimo3_branch_a_contested_resolver</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_a_contested_resolver_rebuilt</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3-contested-resolver</code></td>\n<td>Ran 50 problems; <strong>no correctness logging</strong></td>\n<td>Cannot verify</td>\n<td>216 s</td>\n</tr>\n<tr>\n<td><code>aimo3_contested_resolver_conservative</code> (A2)</td>\n<td>Ran 50 problems; <strong>no correctness logging</strong></td>\n<td>Cannot verify</td>\n<td>216 s</td>\n</tr>\n<tr>\n<td><code>aimo3_A3_1_clean_multicell</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3_A3_2_candidategen_multicell</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3_A3_2_patch_multicell</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><strong><code>aimo3_branch_B_multicell</code></strong></td>\n<td><strong>Complete 50-problem run with inline grading</strong></td>\n<td><strong>27/50 (54.0%)</strong></td>\n<td><strong>233 s</strong></td>\n</tr>\n<tr>\n<td><code>aimo3_branch_B_fixed</code></td>\n<td>Shares stale truncated run with C_final</td>\n<td>19/29 (ambiguous)</td>\n<td>218 s</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_B_updated</code></td>\n<td>Shares stale truncated run with C_final</td>\n<td>19/29 (ambiguous)</td>\n<td>218 s</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_C_final</code></td>\n<td>Shares stale truncated run with B_fixed/updated</td>\n<td>19/29 (ambiguous)</td>\n<td>218 s</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_C_fixed2</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_C_c2</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_C_trust_patch</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_C_plus_final</code> (C+)</td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Critical caveat on the 19/29 row.</strong> Three notebooks (<code>B_fixed</code>, <code>B_updated</code>, <code>C_final</code>) have different code but identical saved outputs - same per-problem trace, same cumulative markers, same trace zip timestamp <code>20260409_092715</code>. The outputs come from a single Colab run that was saved into three different notebook files during iteration. We cannot attribute 19/29 to any specific architecture and therefore do not cite it as a score for any named branch in the main paper. The run terminated at problem 30 - we do not know whether termination was voluntary (user stopped) or involuntary (Colab session died).</p>\n<p><strong>The only offline number that survives full provenance audit is Branch B multicell: 27/50 on hard50.</strong> All per-problem <code>[EVAL] id=&lt;X&gt; pred=&lt;Y&gt; actual=&lt;Z&gt; correct=&lt;bool&gt; cumulative=&lt;N&gt;/&lt;M&gt;</code> lines are preserved inline in the notebook output cells.</p>\n<h3>H.2 Branch A - Trunk + Contested Resolver</h3>\n<p><strong>Files:</strong> <code>aimo3_branch_a_contested_resolver</code>, <code>aimo3_branch_a_contested_resolver_rebuilt</code>, <code>aimo3-contested-resolver</code></p>\n<p><strong>Design intent (verbatim from the notebook docstring):</strong></p>\n<blockquote>\n  <p>\"This notebook starts from the stable <code>final_submission</code> baseline rather than the experimental branches. The baseline kept the proven ingredients that were strongest in prior AIMO3 experiments: simple prompts, T=1.0 generation, 8 attempts, weighted entropy, 65k context, and no large bundles of interacting heuristics.\"</p>\n  <p>Motivation: hard50 analysis showed two failure classes - <em>rerankable</em> (correct answer appears in the candidate pool but a plurality of wrong attempts shipped it) and <em>exploration</em> (correct answer never generated). Branch A targets only the first class.</p>\n</blockquote>\n<p><strong>Key changes from <code>final_submission</code>:</strong></p>\n<ol>\n<li>Quick-unanimous exit (3/3 agree) removed as over-confident on genuinely hard problems.</li>\n<li>Early stop means \"stop further generation only\" - still build full candidate table; never auto-ship solely because generation stopped early.</li>\n<li>Candidate aggregation table with support, inverse-entropy weight, mean entropy, mean Python calls/errors, Python error rate.</li>\n<li>Conservative stage-1 winner ordering: <code>support DESC → inverse-entropy DESC → mean entropy ASC → Python error rate ASC</code>.</li>\n<li>Contest detector fires when any of: top support ≤ 3; runner-up support ≥ 2; top/runner weight ratio &lt; 1.35; stage-1 winner not \"safe to ship\"; a structured nearby rival (off-by-one / off-by-two / double-half) exists.</li>\n<li>Rerank score used only inside contested handling: <code>rerank = log1p(avg_inv_entropy) − 0.15 × py_err_rate − 0.03 × log1p(mean_py_calls)</code>. Constants drawn from hard50 failure taxonomies (66 vs 69, 570 vs 285, 24 vs 25, 2000 vs 1999, 105 vs 106) and explicitly labeled \"heuristic and intentionally mild; not claimed to be optimal.\"</li>\n</ol>\n<p><strong>Execution status:</strong> The two <code>aimo3_branch_a_*</code> variants have zero outputs (never ran end-to-end). <code>aimo3-contested-resolver</code> ran 50 problems on hard50 but only logged <code>answer=X</code> per problem, never <code>pred=X actual=Y correct=bool</code>, so correctness is not inline-verifiable. Mean time 215.9 s/problem, max 710 s.</p>\n<h3>H.3 Branch A2 - Trunk + Conservative Challenger + Pairwise Resolver</h3>\n<p><strong>File:</strong> <code>aimo3_contested_resolver_conservative</code></p>\n<p><strong>Design intent (verbatim):</strong></p>\n<blockquote>\n  <p>\"The first Branch A run clarified four things: (1) Candidate tables are useful. They make it obvious when the correct answer is already in the pool. (2) The resolver is NOT reliable enough to hard-override the pipeline. In several cases the rerank or stage-1 winner was better than the resolver. (3) Single-cluster early agreement is still dangerous. Some hard problems produced 4 quick agreements on one wrong answer with no serious alternative exploration. (4) The reranker is better used to nominate a challenger than to become the final answer.\"</p>\n</blockquote>\n<p><strong>Key changes from Branch A:</strong></p>\n<ol>\n<li>Single-cluster challenge mode: if generation stops early with only one candidate, run up to two extra challenge attempts (one diversity-oriented, one exact-check-oriented), each with a hard cap.</li>\n<li>Stricter <code>safe_to_ship</code>: requires single-cluster challenge to have passed when applicable.</li>\n<li>Suspicion-based contested detector: does not trigger on one weak signal alone; accumulates a suspicion score from multiple evidence sources.</li>\n<li>Rerank only nominates a challenger (never auto-ships).</li>\n<li>Pairwise resolver: compares only incumbent vs challenger; forbidden to invent a third answer; may flip only if it explicitly chooses the challenger; if undecided or chooses incumbent, keeps incumbent.</li>\n<li><code>safe_weight_share = 0.70</code> - explicitly labeled \"heuristic, not hidden-set tuned, not paper-derived optima.\"</li>\n</ol>\n<p><strong>Execution status:</strong> Same as <code>aimo3-contested-resolver</code> - ran 50 problems on hard50 but without per-problem correctness logging. The outputs are byte-identical to the earlier contested-resolver run (same output hash), suggesting this notebook saved the same run's outputs without re-executing.</p>\n<h3>H.4 Branch A3 - Trunk + Closure-Aware Challenge + Dual-Check Flip Gate</h3>\n<p><strong>Files:</strong> <code>aimo3_A3_1_clean_multicell</code>, <code>aimo3_A3_2_candidategen_multicell</code>, <code>aimo3_A3_2_patch_multicell</code></p>\n<p><strong>Design intent (verbatim from markdown cell):</strong></p>\n<blockquote>\n  <p>\"Preserve the stable baseline generator while making post-generation decisions much more conservative and closure-aware. <strong>The design is intended for AIMO3 itself, not for hard50-only optimization.</strong>\"</p>\n</blockquote>\n<p><strong>Key changes from Branch A2:</strong></p>\n<ol>\n<li>Do NOT stop an attempt at the first <code>\\boxed{}</code> - collect all boxed integers seen in an attempt and use the LAST one; record box instability signals (multiple boxed values, box_changed flag, last-box position). Targets premature-boxing / double-counting / off-by-one failures.</li>\n<li>De-anchored single-cluster challenge: if only one answer cluster exists, run two fresh-from-scratch extra attempts - (a) diverse solve with no incumbent mentioned, (b) closure-audit solve with no incumbent mentioned. Both prompts explicitly remind the model to check symmetry, ordered-vs-unordered counting, endpoint inclusion, and final-step closure before boxing.</li>\n<li>Strict safe-to-ship: safe only if exactly one candidate remains after challenge, support is strong, and the cluster is box-stable.</li>\n<li>Challengers must have support ≥ 2 (unless stage-1 support ≤ 2) - prevents noisy singleton challengers from overturning healthy incumbents.</li>\n<li>Flips require TWO independent checks: pairwise exact check (incumbent vs challenger only, cannot invent a third answer) AND an independent fresh audit (solve from scratch without seeing the candidates). Flip only if both checks agree on the challenger.</li>\n<li>Time discipline preserved: hard problems still get up to 900 s; extra auditing capped and skipped when time is tight.</li>\n</ol>\n<p><strong>Constants explicitly labeled:</strong> \"not hard50-fit coefficients. They are conservative priors chosen from observed failure classes.\"</p>\n<p><strong>Execution status:</strong> All three A3 notebooks have zero outputs. Never executed end-to-end.</p>\n<h3>H.5 Branch B - Trunk + Pairwise-Authorized Arbitration + Bounded Checks</h3>\n<p><strong>Files:</strong> <code>aimo3_branch_B_fixed</code>, <code>aimo3_branch_B_updated</code>, <strong><code>aimo3_branch_B_multicell</code></strong></p>\n<p><strong>Design intent (verbatim from markdown cell):</strong></p>\n<blockquote>\n  <p>\"Preserve the stable AIMO3 generator while making post-generation arbitration stricter and more faithful to the candidate pool. <strong>This branch is intended for AIMO3-level problems, not hard50-only tuning.</strong>\"</p>\n</blockquote>\n<p><strong>Key changes:</strong></p>\n<ol>\n<li><strong>Pairwise becomes the only component that can authorize a challenger flip.</strong></li>\n<li>Pressure becomes a challenger stress-test / veto, not an independent flip engine.</li>\n<li>Audit remains candidate-bounded and can only confirm or veto a pairwise-authorized challenger.</li>\n<li>Narrow strong-challenger override: allowed only when pairwise already picked the challenger AND the incumbent does not dominate support.</li>\n<li>Challenge-created rivals still force escalation, but adjacency / double-half only trigger extra checking, not easier flips.</li>\n<li>Trace writing remains non-fatal; final cell zips the trace folder for download.</li>\n</ol>\n<p><strong>Execution status - this is the one verified data point:</strong></p>\n<ul>\n<li><code>aimo3_branch_B_multicell</code>: <strong>Completed a full 50-problem hard50 run.</strong> 27 correct, 23 wrong, <strong>27/50 = 54.0%</strong>. Total wall-clock: 194.4 min. Mean time per problem: 233.3 s, median 188 s, max 659 s, min 27 s. 10 problems took ≥ 400 s. <strong>Zero problems hit the 900 s cap</strong> - the 27/50 is not a timeout artifact, it reflects actual answer quality on the hard50 distribution. All per-problem <code>[EVAL]</code> lines with <code>pred</code>, <code>actual</code>, <code>correct</code>, and <code>cumulative</code> are preserved inline in the notebook outputs.</li>\n<li><code>aimo3_branch_B_fixed</code>, <code>aimo3_branch_B_updated</code>: Share stale identical outputs with <code>aimo3_branch_C_final</code> from a Colab run with trace timestamp <code>20260409_092715</code>, truncated at problem 30, cumulative 19/29 (65.5%). Different code bodies, same saved outputs - we cannot attribute the 19/29 to any specific architecture.</li>\n</ul>\n<p><strong>Figure 9 in the main paper is based on the Branch B multicell run.</strong></p>\n<h3>H.6 Branch C - Controller + Code Rescue + Provenance-Aware Arbitration</h3>\n<p><strong>Files:</strong> <code>aimo3_branch_C_final</code>, <code>aimo3_branch_C_c2</code>, <code>aimo3_branch_C_trust_patch</code>, <code>aimo3_branch_C_fixed2</code></p>\n<p><strong>Design intent (verbatim from <code>CFG</code> docstring):</strong></p>\n<blockquote>\n  <p>\"Branch C keeps the stable Branch B generator and pairwise-centered arbitration, but adds four portable ideas motivated by the AIMO2 analysis and the recent Branch B traces…\"</p>\n</blockquote>\n<p><strong>Key changes from Branch B:</strong></p>\n<ol>\n<li><strong>Convergence / divergence / broken-state controller</strong> - after the first few attempts, detect whether the candidate pool has already converged, fragmented, or broken (invalid-heavy / no useful generation). Stop spending more budget on repeated plain-text attempts when the pool is obviously converged or broken.</li>\n<li><strong>Targeted code rescue</strong> - when the pool is broken, fragmented, or definition-ambiguous, switch to an exact tool-backed rescue path rather than more of the same text sampling.</li>\n<li><strong>One-step code repair</strong> - if the rescue path reaches Python but fails to finish cleanly, one repair attempt that fixes the prior code / extraction instead of restarting.</li>\n<li><strong>Provenance-aware weighting</strong> - candidates supported by multiple evidence modes (main pool, challenge, code rescue, repair) are stronger than plain text-only singleton rivals. Verifier-only candidates are kept weak unless also supported elsewhere.</li>\n<li>Pairwise remains the main discriminator; audit is weakened when pairwise + pressure already align.</li>\n<li>Larger reserve and lighter verification spending to protect tail problems.</li>\n</ol>\n<p><strong>Execution status:</strong> <code>C_final</code> shares stale outputs with <code>B_fixed/B_updated</code> (see H.5 caveat). <code>C_c2</code>, <code>C_trust_patch</code>, and <code>C_fixed2</code> have zero outputs - never executed end-to-end. No new verifiable score.</p>\n<h3>H.7 Branch C+ - Trusted Main-Pool Arbitration + Routed Micro-Prompts + Typed Verifiers</h3>\n<p><strong>File:</strong> <code>aimo3_branch_C_plus_final</code></p>\n<p><strong>Design intent (verbatim from <code>CFG</code> docstring):</strong></p>\n<blockquote>\n  <p>\"Design constraints: <strong>This branch is intended for AIMO3-level problems, not hard50-only tuning.</strong> Pairwise remains the main discriminator in binary contests. Audit is weakened relative to Branch B when pairwise + pressure already align. Tail problems are protected by a larger reserve and by lighter verification spending on already-settled problems.\"</p>\n</blockquote>\n<p><strong>Key changes:</strong> Inherits the full Branch C controller + code rescue + repair + provenance weighting, then adds:</p>\n<ul>\n<li>Trusted main-pool arbitration: the main pool is trusted more strongly; other stages become confirmatory.</li>\n<li>Routed micro-prompts: short targeted prompts routed by inferred failure class.</li>\n<li>Typed verifiers: verifiers specialized for specific failure classes observed in earlier traces.</li>\n</ul>\n<p>This is the most elaborate architecture in the 15-branch catalog.</p>\n<p><strong>Execution status:</strong> Zero outputs. Authored but never executed to completion.</p>\n<h3>H.8 What the catalog tells us about our workflow</h3>\n<p>Of 15 offline research branches authored over the course of the competition:</p>\n<ul>\n<li><strong>1 produced a verified inline-graded hard50 score</strong> (Branch B multicell: 27/50, 54%)</li>\n<li><strong>2 ran 50 problems without correctness logging</strong> (contested resolver A / A2 - no verifiable score)</li>\n<li><strong>3 share stale outputs from one truncated Colab session</strong> (B_fixed, B_updated, C_final - 19/29 ambiguous attribution)</li>\n<li><strong>9 were authored but never executed to completion</strong> (the two <code>branch_a</code> variants, all three A3 notebooks, C_c2, C_fixed2, C_trust_patch, C_plus_final)</li>\n</ul>\n<p>In other words, <strong>60% of our offline research architecture never produced a single hard50 data point</strong>. The ones that did were either non-graded (40% of the remaining six) or attribution-ambiguous (50% of the remaining six). We learned a lot from reading the traces and tuning heuristics, but we did not run a clean offline benchmark loop, and the result was that the only number we can defend in this paper is the one Branch B multicell saved inline. The methodological finding in Section 4 stands on that single data point plus the nine \"intended for AIMO3, not hard50\" design-intent statements preserved verbatim above.</p>\n<p>The full verbatim docstrings and markdown cells quoted in this appendix are reproduced from the actual <code>.ipynb</code> files and can be verified byte-for-byte against the notebook sources supplied with this writeup.</p>\n<h2>---</h2>\n<h1>Streamlined branch naming guide</h1>\n<p>For consistency in this writeup, the team's notebook history has been mapped to canonical names. The mapping is as follows:</p>\n<table>\n<thead>\n<tr>\n<th>Canonical name (used in writeup)</th>\n<th>Kaggle notebook name &amp; version</th>\n<th>Submitted?</th>\n<th>Score(s)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Final submission</strong></td>\n<td><code>final_submission v2</code></td>\n<td>Yes (×9)</td>\n<td>39, 40, 40, 40, 41, 41, 41, 42, 43</td>\n</tr>\n<tr>\n<td><strong>42-notebook fork (V11)</strong></td>\n<td><code>base_submission v2</code></td>\n<td>Yes (×1)</td>\n<td>33</td>\n</tr>\n<tr>\n<td><strong>GRPO submission</strong></td>\n<td><code>[15/15] AIME 2026 I 120b in 20mins v4_grpo</code></td>\n<td>Yes (×1)</td>\n<td>13</td>\n</tr>\n<tr>\n<td><strong>Adaptive router</strong></td>\n<td><code>AIMO3_Adaptive_Router_Confidence_Vote_v1</code></td>\n<td>Yes (×1)</td>\n<td>28</td>\n</tr>\n<tr>\n<td><strong>5-stage AIME scaffold</strong></td>\n<td><code>[15/15] AIME 2026 I 120b in 20mins v3</code></td>\n<td>Yes (×2)</td>\n<td>35, 38</td>\n</tr>\n<tr>\n<td><strong>Strategy-prompt family</strong></td>\n<td><code>aimo3_final v7 / v9 / v22</code></td>\n<td>Yes (×5)</td>\n<td>36, 37, 37, 37, 36</td>\n</tr>\n<tr>\n<td><strong>UNDERSTAND/EXPLORE adaptive</strong></td>\n<td><code>aimo3_adaptive _v4</code></td>\n<td>Yes (×1)</td>\n<td>34</td>\n</tr>\n<tr>\n<td><strong>Multi-temperature tester</strong></td>\n<td><code>aimo_tester v2</code></td>\n<td>Yes (×1)</td>\n<td>34</td>\n</tr>\n<tr>\n<td><strong>Early iteration</strong></td>\n<td><code>aimo3_final v3</code></td>\n<td>Yes (×2)</td>\n<td>39, 34</td>\n</tr>\n<tr>\n<td><strong>Debug / temp tweaks</strong></td>\n<td><code>aimo3_final v4_tweaked_temp&amp;model</code>, <code>v5_tweaked_temp</code></td>\n<td>Yes (×2)</td>\n<td>11, 0</td>\n</tr>\n</tbody>\n</table>\n<p>The name <code>final_submission v2</code> is preserved as-is per team preference. Submissions earlier than 25 days before writeup (3 × <code>submission.parquet</code> uploads at score 0) and one notebook exception (<code>aimo_check v4</code>) are excluded from analysis.</p>\n<hr>\n<p><em>End of writeup. All scores are from the public AIMO3 leaderboard. Configurations are reproduced from the verbatim source code of each submitted notebook. The GRPO telemetry CSV (190 rows) is provided as a supplementary artifact alongside this writeup.</em></p>\n<h2>References</h2>\n<ol>\n<li><p>S. Frieder et al., \"AI Mathematical Olympiad - Progress Prize 3,\" Kaggle Competition, 2025. <a href=\"https://kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3\" target=\"_blank\">https://kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3</a></p></li>\n<li><p>I. Moshkov et al., \"AIMO-2 Winning Solution: Building State-of-the-Art Mathematical Reasoning Models with OpenMathReasoning Dataset,\" arXiv:2504.16891, 2025.</p></li>\n<li><p>P. Mali, \"Scaling Inference-Time Compute for Mathematical Reasoning,\" AIMO3 Writeup, Kaggle, 2026. <a href=\"https://www.kaggle.com/code/pawanmali/chasing-47-50-aimo3-journey-of-60-experiments\" target=\"_blank\">https://www.kaggle.com/code/pawanmali/chasing-47-50-aimo3-journey-of-60-experiments</a></p></li>\n<li><p>N. Nitarach, \"Model Capability Dominates: Inference-Time Optimization Lessons from AIMO 3,\" arXiv:2603.27844, 2026.</p></li>\n<li><p>X. Wang et al., \"Self-Consistency Improves Chain of Thought Reasoning in Language Models,\" ICLR, 2023.</p></li>\n<li><p>W. Kwon et al., \"Efficient Memory Management for Large Language Model Serving with PagedAttention,\" SOSP, 2023.</p></li>\n<li><p>OpenAI, \"gpt-oss-120b Model Card,\" 2025. <a href=\"https://huggingface.co/openai/gpt-oss-120b\" target=\"_blank\">https://huggingface.co/openai/gpt-oss-120b</a></p></li>\n</ol>",
  "comments": [
    {
      "id": 3458585,
      "author_name": "Sam Bealing",
      "author_url": "",
      "post_date": "2026-05-16T08:07:00.963000",
      "content": "<p>Following up on the questions from <a href=\"https://www.kaggle.com/philipvonderlind\" target=\"_blank\">@philipvonderlind</a> (and thanks for the very thorough response), here are some additional questions to help us assess your submission:</p>\n<ol>\n<li><strong>Sensitivity of the 5-component formula:</strong> Your entropy formula uses specific weights. Given the σ=1.20 noise you measured, are these constants informally tuned to your dev set, or did you do any sensitivity analysis showing the formula's apparent gain survives perturbations? <a href=\"https://www.kaggle.com/pawanmali\" target=\"_blank\">@pawanmali</a>'s evidence supports position weighting in principle, but not necessarily these particular weights.</li>\n<li><strong>Offline branches that didn't complete:</strong> You note 9 of 15 offline branches didn't execute to completion. Were there any that you would have liked to resurrect if you had more time?</li>\n</ol>\n<p>Look forward to reading your responses on these.</p>",
      "votes": 0,
      "replies": [
        {
          "id": 3458923,
          "author_name": "Utkarsh Sharma",
          "author_url": "",
          "post_date": "2026-05-16T23:59:20.207000",
          "content": "<p>Thank you <a href=\"https://www.kaggle.com/sambealing\" target=\"_blank\">@sambealing</a> - excellent questions. </p>\n<p><strong>1. Sensitivity of the 5-component formula</strong></p>\n<p>To answer the direct question first: the weights were not tuned against the public leaderboard. The 5-component structure was adopted from pawanmali's framework, and the specific constants (0.30/0.40/0.20/0.30/−0.10, decay 0.995, thresholds 2.0 and 1.0) were set during development and held fixed across all final_submission v2 runs. They were not iterated based on leaderboard feedback - the same formula was used for all 9 variance-measurement runs. However, since there was no separate held-out validation set for the weights either, the question of whether the formula's gain survives perturbation is still worth testing.</p>\n<p>To address this, I built a post-hoc perturbation analysis using 1,500 synthetic problem scenarios calibrated to the AIMO3 difficulty distribution (35% easy with 6-2/7-1 vote splits, 20% medium with 5-3, 10% hard where the correct answer is minority 3-5, 20% exact ties at 4-4, 15% three-way splits at 3-3-2). Entropy profiles were modeled on observed competition patterns: confident solvers (low entropy, especially near conclusion), uncertain solvers (high entropy with spikes), and exploring-then-converging solvers (high early, low late - the profile position weighting is designed to reward). I verified that the sensitivity formula produces identical outputs to the submission code on 4 test sequences before running the analysis.</p>\n<p>The script is public at:\n<a href=\"https://github.com/utkarshsharma00/aimo3/blob/main/sensitivity_analysis.py\" target=\"_blank\">https://github.com/utkarshsharma00/aimo3/blob/main/sensitivity_analysis.py</a></p>\n<p><strong>Key finding: the exact weights barely matter. What matters is using entropy weighting at all.</strong></p>\n<p>The 5-component formula scores 92.5% on the synthetic benchmark. Plain majority vote scores 73.1% - a 19.4-point gap. But all entropy-weighted variants fall within a 3.1-point spread:</p>\n<table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Accuracy</th>\n<th>Δ vs default</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>No std_dev penalty</td>\n<td>93.9%</td>\n<td>+1.4%</td>\n</tr>\n<tr>\n<td>Position-weighted only</td>\n<td>92.7%</td>\n<td>+0.2%</td>\n</tr>\n<tr>\n<td>Double position weight</td>\n<td>92.6%</td>\n<td>+0.1%</td>\n</tr>\n<tr>\n<td><strong>5-comp (our default)</strong></td>\n<td><strong>92.5%</strong></td>\n<td><strong>baseline</strong></td>\n</tr>\n<tr>\n<td>No streak bonus</td>\n<td>92.4%</td>\n<td>−0.1%</td>\n</tr>\n<tr>\n<td>Half position weight</td>\n<td>92.4%</td>\n<td>−0.1%</td>\n</tr>\n<tr>\n<td>Mean + position only</td>\n<td>92.1%</td>\n<td>−0.5%</td>\n</tr>\n<tr>\n<td>No high_ent_ratio</td>\n<td>92.1%</td>\n<td>−0.5%</td>\n</tr>\n<tr>\n<td>Mean entropy only</td>\n<td>90.8%</td>\n<td>−1.7%</td>\n</tr>\n<tr>\n<td><strong>Plain majority vote</strong></td>\n<td><strong>73.1%</strong></td>\n<td><strong>−19.4%</strong></td>\n</tr>\n</tbody>\n</table>\n<p>Even the worst entropy variant (mean entropy only, 90.8%) beats majority vote (73.1%) by 17.7 points. The 3.1pp spread between entropy variants is dwarfed by the 19.4pp gap from majority vote.</p>\n<p>Under individual weight perturbation (each weight scaled by 0.0×, 0.5×, 0.75×, 1.25×, 1.5×, 2.0× independently - 30 perturbations total), the maximum answer flip rate was 1.4% (21/1500 scenarios). Total accuracy range across all 30 perturbations: [92.1%, 93.9%] - a spread of just 1.8 percentage points. Most perturbations caused 0-2 flips out of 1500 (≤0.2%).</p>\n<p>Under Monte Carlo random perturbation (200 trials, all 5 weights simultaneously perturbed by random factors in [0.5, 1.5]), mean accuracy change was +0.08% with a standard deviation of 0.38% and a range of [−0.33%, +1.73%]. Mean flip rate was 0.2%, max 1.7%. No perturbation caused more than 1.73% accuracy change in either direction.</p>\n<p>Where entropy voting concentrates its value (by scenario type):</p>\n<table>\n<thead>\n<tr>\n<th>Scenario type</th>\n<th>5-comp</th>\n<th>Majority</th>\n<th>Δ</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Easy (6-2 split)</td>\n<td>100.0%</td>\n<td>100.0%</td>\n<td>+0.0%</td>\n</tr>\n<tr>\n<td>Medium (5-3 split)</td>\n<td>100.0%</td>\n<td>100.0%</td>\n<td>+0.0%</td>\n</tr>\n<tr>\n<td>Hard (3-5 minority)</td>\n<td>21.7%</td>\n<td>0.0%</td>\n<td>+21.7%</td>\n</tr>\n<tr>\n<td>Tied (4-4 split)</td>\n<td>100.0%</td>\n<td>48.6%</td>\n<td>+51.4%</td>\n</tr>\n<tr>\n<td>Three-way (3-3-2)</td>\n<td>100.0%</td>\n<td>49.5%</td>\n<td>+50.5%</td>\n</tr>\n</tbody>\n</table>\n<p>On uncontested problems (easy/medium), entropy weighting is irrelevant - majority vote already picks the right answer. The entire value concentrates in contested cases: ties, three-way splits, and minority-correct scenarios. This is consistent with our competition experience: on ~35 of 50 problems, all 8 attempts agree and the voting function doesn't matter. On the ~15 contested problems, entropy weighting breaks ties toward the more confident trace.</p>\n<p><strong>An unexpected finding:</strong> The analysis suggests our formula may be slightly over-engineered. \"No std_dev penalty\" (removing the variance component entirely) scored +1.4% better than the full 5-component formula, and \"position-weighted only\" (dropping all 4 other components) scored +0.2% better. The std_dev component may introduce noise rather than signal. This is a finding we did not expect and would not have discovered without this post-hoc analysis.</p>\n<p><strong>Important caveats:</strong> This analysis uses synthetic scenarios, not a replay of actual competition logprobs. The entropy profiles are modeled on observed patterns but make a key assumption: that correct traces tend to have lower position-weighted entropy near the conclusion than incorrect traces. This is the intuition behind position weighting (a solver that reached the correct answer through valid reasoning should be confident at the end), and it's supported by multiple independent findings: pawanmali's multi-run evidence (3-6 point advantage for position-weighted over mean entropy across ~8 runs), Potrhino's empirical result that tail entropy (last 2048 tokens) is the strongest single indicator of incorrect reasoning paths on gpt-oss-120b, outperforming global mean entropy (§4.5.1.3 of their writeup), and the DeepConf framework (Fu et al., 2025), which achieves 99.9% on AIME 2025 by filtering traces using token-level confidence. Conversely, rzatemizel's density analysis shows that mean entropy has near-zero discriminative power - which is precisely why we use position weighting rather than mean entropy. The assumption remains unproven on real gpt-oss-120b logprobs for our specific formula, but the directional evidence across these independent analyses is consistent. A proper validation would require logging per-attempt logprobs during competition runs and replaying them with perturbed weights - data I did not collect. The structural conclusion (any entropy weighting &gt;&gt; majority vote; exact weights don't matter much; position weighting &gt; mean entropy) is robust within this simulation framework.</p>\n<p><strong>2. Offline branches worth resurrecting</strong></p>\n<p>If I had more time, I would prioritize <strong>Branch C (controller + code rescue + provenance-aware arbitration)</strong>. </p>\n<p>The design addresses a failure class that few submitted approaches directly targeted: what to do when the attempt pool is <em>fragmented</em> (multiple incompatible answer clusters with no majority) or <em>broken</em> (most attempts failed to produce valid  answers). AMO's Master Vision pipeline (davidacad10 et al.) is the closest parallel - both detect the absence of consensus and launch a resolution mechanism. Branch C differs in using a deterministic state machine rather than an LLM agent for the detection step.</p>\n<p><strong>Convergence/divergence state controller.</strong> Detects whether the pool has converged (stop early, save budget), fragmented (multiple clusters, need resolution), or broken (most attempts returned no answer). This is strictly better than flat early-stop thresholds because it adapts compute to the observed pool state rather than applying a fixed rule.</p>\n<p><strong>Targeted code rescue.</strong> When text-based reasoning fails, switches to a tool-backed exact computation path. This directly addresses what IceBeam777's RSA writeup calls \"Class 4/5\" problems - where the model converges confidently to a wrong answer and no amount of resampling fixes it.</p>\n<p><strong>Provenance-aware weighting.</strong> Candidates supported by multiple evidence modes (main pool + code rescue + challenge pass) receive higher weight than single-source answers. This is a richer signal than entropy alone.</p>\n<p>What makes Branch C architecturally interesting is how it relates to other competitors' independently developed approaches:</p>\n<p><em>vs. ippeiogawa's Blackboard.</em> The Blackboard shares tool I/O between threads during generation, allowing threads to build on each other's computational discoveries. Branch C's code rescue is complementary - instead of sharing intermediate computations between threads, it launches an entirely separate computation mode when text-based reasoning fails. Both address threads getting stuck in wrong reasoning frames, but from different directions: Blackboard prevents getting stuck by sharing information; code rescue recovers after getting stuck by switching modality.</p>\n<p><em>vs. rzatemizel's Judger.</em> The 3-base/5-judger architecture evaluates completed reasoning traces to select the best answer. Branch C's provenance-aware arbitration is similar in spirit - both use evidence quality rather than raw vote count to weight  answers. The key difference is that rzatemizel's judger is a separate LLM call that evaluates the full reasoning trace, while Branch C's provenance weighting is a lightweight, deterministic function of which evidence modes support each answer - far less compute cost but less nuanced information about reasoning quality.</p>\n<p><em>vs. AMO's Master Vision (davidacad10 et al.).</em> AMO introduces a Master Vision agent that synthesizes findings from competing solvers when no majority exists - essentially a conflict-resolution pipeline. Branch C's convergence controller serves the same role but as a deterministic state machine rather than an LLM agent, avoiding the latency and hallucination risk of another LLM call while sacrificing the flexibility of natural-language synthesis.</p>\n<p>The reason Branch C didn't ship was infrastructure: wiring bugs in the multi-stage pipeline prevented end-to-end execution on Colab. With another week of debugging time, I believe the state controller alone would have been worth integrating - it addresses time allocation more intelligently than any flat threshold. But in a time-constrained competition, architectural ambition must be balanced against execution reliability. Our final submission won not because it was the best architecture we designed, but because it was the best one we <em>shipped</em>.</p>\n<hr>\n<p>Happy to provide additional detail on any of these points.</p>",
          "votes": 0,
          "replies": [
            {
              "id": 3463165,
              "author_name": "Utkarsh Sharma",
              "author_url": "",
              "post_date": "2026-05-26T05:01:58.780000",
              "content": "<p>Note: After posting this analysis, the 2nd-place solution writeup 'Vote-dominant Ensembling and a Sharper System Prompt' by <a href=\"https://www.kaggle.com/varianceofx\" target=\"_blank\">@varianceofx</a> was published. Their \"tail-windowed entropy\" (Improvement 3) independently converges on the same design as our position weighting - using entropy over only the last 256 tokens rather than the full trace, with the same reasoning that early-trace entropy reflects exploration, not answer confidence. Their ensemble design (Improvement 5) also independently confirms our sensitivity finding: they weight vote_share at 2.0 and confidence at only 0.3, concluding that \"entropy is best used as a tiebreaker, not as the main criterion.\" Two independent teams arriving at the same architectural conclusion strengthens the case that position/tail entropy &gt; mean entropy, and that exact weights are secondary to using entropy weighting at all.</p>",
              "votes": 0,
              "replies": []
            }
          ]
        }
      ]
    },
    {
      "id": 3457396,
      "author_name": "Utkarsh Sharma",
      "author_url": "",
      "post_date": "2026-05-13T17:44:36.593000",
      "content": "<p><strong>Edited on May 13th 2026 for the rebuttal phase:</strong></p>\n<p>Changes made:</p>\n<ul>\n<li>Added Section 11 (Private Leaderboard Result): private LB score of 41.5/50, rank 828/4,138, confirming the score falls within our predicted 95% CI of [39.85, 41.70]</li>\n<li>Updated Abstract and Section 10 to include the private LB score</li>\n<li>Responded to <a href=\"https://www.kaggle.com/philipvonderlind\" target=\"_blank\">@philipvonderlind</a>'s three reviewer questions (GRPO reconciliation with outliar's results, local testing methodology, entropy correlation evidence) in a separate comment below</li>\n</ul>\n<p>No architectural claims, experimental results, or methodological conclusions were altered. The private LB result validates the variance methodology described in Section 3 - our pre-registered 95% CI correctly predicted the out-of-sample private score.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 3456831,
      "author_name": "Philip Vonderlind",
      "author_url": "",
      "post_date": "2026-05-12T16:43:16.203000",
      "content": "<p>Hi, thank you for your submission to the Writeup Prize. <a href=\"https://www.kaggle.com/sambealing\" target=\"_blank\">@sambealing</a> and I will post some questions below that help us in assessing your submission more closely, as described in the updated discussion post.</p>\n<p>I have a few questions regarding some of the ideas proposed and implemented in your writeup:</p>\n<ol>\n<li><p><strong>GRPO</strong>: Other contestants, notably <a href=\"https://www.kaggle.com/outliar\" target=\"_blank\">@outliar</a>, have <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/four-phase-adaptation-of-a-120b-model-for-tool-aug\" target=\"_blank\">reported successful gains</a> using GRPO. You mention that the observed improvements in your pipeline may be attributable to noise, which could certainly also apply to other submissions. How would you explain the GRPO gains reported by other contestants in comparison to your own training results?</p></li>\n<li><p><strong>Local Testing</strong>: Most of your ablations appear to rely on single public leaderboard experiments. Did you also attempt to verify these changes locally, for example, using one of the datasets from the Math Corpus Prize entries? Reporting score distributions across repeated runs, along with variance estimates, would make the results easier for others to interpret.</p></li>\n<li><p><strong>Entropy</strong>: Did you verify that entropy-based voting actually correlates with more mathematically correct traces? Some <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/model-capability-dominates\" target=\"_blank\">other writeups</a> have reported that model confidence does not necessarily correspond to trace correctness.</p></li>\n</ol>\n<p>Looking forward to your response :)</p>",
      "votes": 0,
      "replies": [
        {
          "id": 3456863,
          "author_name": "Utkarsh Sharma",
          "author_url": "",
          "post_date": "2026-05-12T17:24:06.790000",
          "content": "<p>Hi <a href=\"https://www.kaggle.com/philipvonderlind\" target=\"_blank\">@philipvonderlind</a> - thank you for the detailed questions. Happy to address each one.</p>\n<p><strong>1. GRPO: Reconciling our failure with outliar's reported gains</strong></p>\n<p>The critical distinction between our GRPO attempt and outliar's is the deployment path, not the training itself. Our GRPO v6 loop trained stably for 38 cycles with zero loss collapses - the training worked. The failure was at deployment: we used Unsloth's <code>merged_4bit_forced</code> to merge the adapter, which produces BitsAndBytes NF4 weights. gpt-oss-120b's native format is MXFP4. vLLM routes NF4 weights through a different (degraded) kernel path, producing the 13/50 catastrophic score. outliar avoided this by using <code>save_method=\"mxfp4\"</code> - the correct deployment path.</p>\n<p>However, even when GRPO deployment succeeds, the gains appear modest relative to inference-only optimization. outliar's final fine-tuned model (SFT + GRPO + ORPO + MXFP4 bake) achieved μ=38.57 (σ=1.67, n=35) - which is 2.2 points below our inference-only μ=40.78 (σ=1.20, n=9). Their pre-ORPO baseline was μ=36.6, so the total fine-tuning gain was approximately +2 points. Meanwhile, Inoichan et al. (\"Pushing the Limits: Post-Training High-Capability Models under Strict Inference\" writeup, 10 authors, 32 H100s) ran full-parameter SFT for 10 epochs on 10.37 billion tokens and improved pass@1 by only +0.77 percentage points - while actually <em>reducing</em> coverage (Pass@16) from 92.28% to 90.88%. Their RL (GRPO variant) showed a similar pattern: +1.0 pass@1 but −2.11 coverage.</p>\n<p>So our position is nuanced. We do NOT claim GRPO cannot help - outliar's +2 is real. We claim that (a) the deployment pipeline is a documented trap that cost us $300 and that future participants should be aware of, and (b) even when fine-tuning succeeds, the gains are small relative to inference-only optimization on a base model this strong, and coverage (the model's solvable problem space) may actually shrink with training. The latter finding from Inoichan et al. is the strongest independent evidence supporting our thesis.</p>\n<p><strong>2. Local Testing: Variance estimates and offline verification</strong></p>\n<p>You're right that many of our architectural ablations (strategy prompts, 5-stage scaffold, router, etc.) relied on single or few-shot public leaderboard comparisons. This is the most significant methodological limitation of our writeup, and we acknowledge it.</p>\n<p>However, we did two things that go beyond single-shot LB comparison:</p>\n<p><em>The n=9 variance experiment.</em> We submitted <code>final_submission v2</code> nine times without modification, producing scores {39, 40, 43, 40, 42, 40, 41, 41, 41} with μ=40.78 and σ=1.20. This established our noise floor: any Δ &lt; 2σ ≈ 2.4 points is indistinguishable from running the same notebook twice. This measurement is what allows us to claim the strategy-prompt family (5 submissions, mean ~36.6) is directionally negative (Δ ≈ −4.2, outside the ±2σ band) rather than noise.</p>\n<p><em>Offline evaluation on hard50.</em> We ran 15 offline research branches against hard_50_math_problems_set_v6.csv (zfturbo's dataset from the Math Corpus Prize). One branch - aimo3_branch_B_multicell - completed a full 50-problem run with inline grading: 27/50 (54.0%), mean 233s/problem. This is the only verified offline number we cite, and we document honestly that 9 of our 15 offline branches never executed to completion. The offline work is detailed in Section 4 and Appendix H of the writeup.</p>\n<p>We did not use the offline benchmark for per-variant ablation (e.g., running each of our 11 configurations on hard50 multiple times) - which would have been the methodologically stronger approach. The reason was practical: each hard50 run took ~3.5 hours on Colab, and we prioritized leaderboard submissions over systematic offline testing. In hindsight, this was the wrong tradeoff - our Lesson #1 in Section 9 is exactly this: \"Establish the noise floor first. Submit the same notebook 5-10 times before iterating on architecture.\"</p>\n<p>For comparison, sebastiangil00's writeup (\"Three Substrate Traps on gpt-oss-120b-MXFP4\") tested 16 variants on a 199-problem validation set with McNemar paired tests and Benjamini-Hochberg correction - a substantially more rigorous methodology than ours. We consider their statistical approach the gold standard for future competitions.</p>\n<p><strong>3. Entropy: Does it actually correlate with correctness?</strong></p>\n<p>This is the hardest question, and the honest answer is: we don't have conclusive evidence that our specific entropy formula correlates with trace correctness in isolation.</p>\n<p>What we know:</p>\n<p><em>Mean entropy does not discriminate.</em> rzatemizel's density plots (\"Fighting Variance\" writeup) show correct answers have mean entropy 0.7053 vs wrong answers 0.7503 - a gap of 0.045 on almost completely overlapping distributions. Schwyter (arXiv:2603.27844) also found that model confidence does not correspond to trace correctness, as you reference. We agree with this finding for mean entropy.</p>\n<p><em>Our formula is structurally different from mean entropy.</em> The 5-component weighted entropy uses position weighting (40% of the score, exponential decay 0.995 favoring tokens near <code>\\boxed{}</code>), variance penalty, high-entropy ratio, and low-entropy streak bonus. The key intuition is that a solution can be uncertain during exploration but should be confident at the conclusion - position weighting captures this, while mean entropy averages over the entire trace and loses the signal.</p>\n<p><em>rzatemizel confirmed they did not test position-weighted variants.</em> In their reply to our comment on their writeup, they stated: \"I did not check position-weighted entropy or other similar variants, because I lost confidence in logprobs fairly early.\" So the density - overlap finding applies to mean entropy specifically, not necessarily to our position-weighted composite.</p>\n<p><em>pawanmali provides the strongest supporting evidence.</em> In their reply to our comment, they confirmed: \"mean entropy consistently underperformed position-weighted entropy by 3-6 points across ~8 different runs where that was the primary variable.\" This is multi-run directional evidence that position-weighted entropy captures something that mean entropy does not.</p>\n<p><em>Our own comparison is confounded.</em> We changed the voting function AND stripped the scaffolding simultaneously, so we cannot isolate which change was load-bearing. We state this explicitly in the writeup (Section 6, final paragraph). The honest answer is: we don't know whether the entropy formula or the scaffold removal (or both) drove the improvement from ~36.6 to 40.78.</p>\n<p>The bottom line: mean entropy is probably not a useful discriminator (confirmed by rzatemizel and Schwyter). Position-weighted entropy may retain discriminative power at the conclusion of the reasoning trace, supported by pawanmali's multi-run evidence but not conclusively proven by our own data. We consider this an open empirical question that deserves a controlled ablation we were unable to run before the deadline.</p>\n<hr>\n<p>Happy to provide additional detail on any of these points.</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 3454392,
      "author_name": "Utkarsh Sharma",
      "author_url": "",
      "post_date": "2026-05-07T03:06:55.633000",
      "content": "<p><strong>Reproducibility Package</strong></p>\n<p><strong>Model:</strong> danielhanchen/gpt-oss-120b (HuggingFace, unmodified - no fine-tuning, no LoRA, no weight patches)\n<a href=\"https://huggingface.co/danielhanchen/gpt-oss-120b\" target=\"_blank\">https://huggingface.co/danielhanchen/gpt-oss-120b</a></p>\n<p><strong>Kaggle submission notebook (final_submission v2):</strong>\n<a href=\"https://www.kaggle.com/code/flamingice2801/final-submission\" target=\"_blank\">https://www.kaggle.com/code/flamingice2801/final-submission</a></p>\n<p><strong>Google Colab notebook (Kaggle-agnostic):</strong>\n<a href=\"https://colab.research.google.com/github/utkarshsharma00/aimo3/blob/main/colab_inference.ipynb\" target=\"_blank\">https://colab.research.google.com/github/utkarshsharma00/aimo3/blob/main/colab_inference.ipynb</a></p>\n<p><strong>Standalone inference script:</strong>\n<a href=\"https://github.com/utkarshsharma00/aimo3/blob/main/run_inference.py\" target=\"_blank\">https://github.com/utkarshsharma00/aimo3/blob/main/run_inference.py</a></p>\n<p><strong>Figure generation script (reproduces all 9 figures):</strong>\n<a href=\"https://github.com/utkarshsharma00/aimo3/blob/main/generate_figures.py\" target=\"_blank\">https://github.com/utkarshsharma00/aimo3/blob/main/generate_figures.py</a></p>\n<p><strong>Full repository:</strong>\n<a href=\"https://github.com/utkarshsharma00/aimo3\" target=\"_blank\">https://github.com/utkarshsharma00/aimo3</a></p>\n<p>The entire contribution is inference-side - no custom model artifacts. The Colab notebook pulls the stock model from HuggingFace and contains the full pipeline (solver, 5-component entropy voting, sandbox pool, streaming parser, adaptive time management). Requires an A100/H100 80GB runtime.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 3446698,
      "author_name": "Utkarsh Sharma",
      "author_url": "",
      "post_date": "2026-04-22T00:58:51.433000",
      "content": "<p><strong>Note added after reviewing concurrent writeups (April 21, 2026)</strong></p>\n<p>Several independent writeups have now been published that converge on the same central finding documented here. Schwyter (arXiv:2603.27844, 23 experiments across 3 models) found that model capability dominates all prompt-level optimizations by 4×. <a href=\"https://www.kaggle.com/merkiraz\" target=\"_blank\">@merkiraz</a> (11 controlled submissions) found every modification preserved or degraded performance. <a href=\"https://www.kaggle.com/kolenkovskin\" target=\"_blank\">@kolenkovskin</a> (20+ dead ends across 28 submissions) independently concluded that \"subtraction beats addition.\" <a href=\"https://www.kaggle.com/potrhino\" target=\"_blank\">@potrhino</a> (7 controlled ablation runs on a 75-problem validation set) documented positive contributions from TIR and dynamic time management but found that the remaining gap is compute-constrained. This convergence across 5+ independent teams - each arriving at similar negative conclusions through different experimental paths - is itself evidence that the finding is robust.</p>\n<p>Regarding selection loss: the host's pass@N analysis shows pass@8 ≈ 44 on the private set, meaning the correct answer appears in at least one of our 8 attempts for ~44 of 50 problems. Our mean of 40.78 implies we correctly select the right answer from the pool ~93% of the time. The remaining ~3 problems per run where we have the correct answer but select wrong represent the selection loss that our 5-component entropy voting addresses but does not fully close. <a href=\"https://www.kaggle.com/rzatemizel\" target=\"_blank\">@rzatemizel</a> density-overlap analysis suggests that mean entropy has near-zero discriminative power between correct and incorrect answers; whether our position-weighted variant retains discriminative power where mean entropy does not remains an open empirical question.</p>",
      "votes": 0,
      "replies": []
    }
  ],
  "comment_count": 8,
  "messages": [
    {
      "id": 3444258,
      "postDate": "2026-04-17T14:45:38.060Z",
      "content": "<h1>A Negative-Results Report on Inference and Fine-Tuning Interventions for gpt-oss-120b on AIMO3</h1>\n<p><strong>Team:</strong> flamingice (solo) · <strong>Competition:</strong> AI Mathematical Olympiad - Progress Prize 3 · <strong>Submission for the Writeup Prize</strong></p>\n<hr>\n<h2>Abstract</h2>\n<p>We report a negative-results-dominated investigation of inference-time and training-time interventions for <code>gpt-oss-120b</code> on the AIMO3 competition. Our private-leaderboard submission, <code>final_submission v2</code>, achieved a public-leaderboard mean of <strong>40.78</strong> (σ = 1.20, n = 9 identical runs, best 43) and a <strong>private-leaderboard score of 41.5/50</strong> using parallel self-consistency over 8 attempts with a 5-component weighted-entropy voting function and a one-sentence system prompt. We submitted <strong>25 successful runs across 11 distinct notebook configurations</strong> over 25 days. With one exception, every architectural addition we attempted - multi-strategy prescriptive prompts, structured 5-stage scaffolding, subject-routed multi-stage arbitration with verifier/GenSelect/adversarial passes, and GRPO LoRA fine-tuning - either fell <em>within</em> run-to-run noise or fell <em>catastrophically</em> below it. The most expensive failure (≈$300 of B200 GPU time on GRPO experiments) is documented with 190 rows of training telemetry and traces to a known Unsloth <code>merged_4bit_forced</code> → vLLM MXFP4 deployment pipeline incompatibility. Our central methodological contribution is the <strong>noise floor</strong>: with σ = 1.20 across identical runs, any apparent improvement smaller than ≈2.4 points cannot be distinguished from running the same notebook twice. We argue that for inference-constrained math competitions, this noise dominates almost all engineering decisions, and that future participants should establish their own variance baselines <em>before</em> iterating on architecture.</p>\n<hr>\n<h2>1. Introduction</h2>\n<p>The AIMO3 competition required solving 50 private-set olympiad-level problems with non-negative integer answers in [0, 99999], inside a single Kaggle notebook constrained to <strong>≈5 hours of H100 GPU time</strong>. The runtime constraint transforms the optimization target: the goal is not \"maximize per-problem accuracy\" but \"maximize the joint expectation of accuracy and successful completion under a wall-clock cliff.\" This distinction kills nearly every intuition borrowed from offline pass@<em>N</em> experiments.</p>\n<p><code>gpt-oss-120b</code> (released in 2025, 117B total parameters with ≈5.1B active per token via mixture-of-experts, native MXFP4 weights) is strong enough on olympiad math that the AIMO3 leaderboard is plausibly bottlenecked by inference orchestration rather than reasoning capacity. Public community notebooks built on <code>gpt-oss-120b</code> were reported to score in the high 30s and low 40s out of 50 with relatively simple self-consistency setups. Against that background, our research question was: <strong>starting from a strong base model, where do additional engineering investments actually move the score?</strong></p>\n<p>We tested four classes of intervention:</p>\n<ol>\n<li><strong>Prompt engineering</strong> - prescriptive multi-strategy prompts and structured 5-stage scaffolds (UNDERSTAND → EXPLORE → PLAN → EXECUTE → VERIFY).</li>\n<li><strong>Inference-time orchestration</strong> - adaptive routing, multi-stage solving, posterior voting, GenSelect, adversarial verification.</li>\n<li><strong>More attempts</strong> - pushing N from 8 to 12.</li>\n<li><strong>Reinforcement learning</strong> - GRPO LoRA fine-tuning with a custom vLLM + Unsloth training loop.</li>\n</ol>\n<p>Every one of them either left the score within statistical noise of where we started, or made it dramatically worse. The single intervention that produced a stable mean above the noise floor was a <strong>5-component weighted entropy formula</strong> for self-consistency voting, combined with deliberate stripping of every other piece of scaffolding. This paper documents what we tried, why we tried it, and - more importantly - why the things that didn't work didn't work.</p>\n<p><strong>Reproducibility note.</strong> All code, prompts, and configurations are reported exactly as run. The full submission history (Appendix C), the GRPO training telemetry CSV (Appendix D), the offline research branch catalog (Appendix H), and the verbatim source of every notebook discussed here are available with this writeup.</p>\n<hr>\n<h2>2. The submission landscape</h2>\n<p>We made <strong>25 successful submissions across 11 notebook configurations</strong> between competition entry and the April 15 deadline. Figure 1 shows the chronological trajectory.</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig1_leaderboard_trajectory.png\" alt=\"Figure 1: Leaderboard trajectory across 25 submissions\"></p>\n<p>Three structural features of this trajectory motivate the rest of the paper:</p>\n<p><strong>The ramp-and-plateau shape.</strong> Scores rise from the high 20s to the high 30s as obvious bugs are removed, then plateau in a narrow band centered around 40 with substantial variance. No single architectural change moves us <em>out</em> of this band on the upside.</p>\n<p><strong>The catastrophic dips.</strong> Three submissions fall well below the band: GRPO at 13, the adaptive router at 28, and the V11 timeout at 33. Each represents a different failure mode (deployment pipeline corruption, time-budget collapse from per-problem complexity, raw wall-clock overrun). All three are documented in detail below.</p>\n<p><strong>The final cluster.</strong> The last nine submissions on the right are repeated runs of <code>final_submission v2</code> - the same notebook, the same seed, the same code - submitted to measure run-to-run variance. They span 39 to 43 with a mean of 40.78 and σ = 1.20.</p>\n<p>This last cluster is the load-bearing observation of the entire writeup. We turn to it next.</p>\n<hr>\n<h2>3. The noise floor</h2>\n<p>We submitted <code>final_submission v2</code> nine times without modification. The scores were:</p>\n<blockquote>\n  <p><strong>39, 40, 43, 40, 42, 40, 41, 41, 41</strong></p>\n</blockquote>\n<p>Mean = 40.778. Median = 41. σ = 1.202. Range = 4 points. 95% CI for the mean = [39.85, 41.70]. Figure 2 shows the distribution.</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig2_score_distribution.png\" alt=\"Figure 2: Run-to-run variance establishes the noise floor\"></p>\n<p>This variance has two sources we cannot fully separate. First, the gpt-oss-120b decoder produces non-deterministic output even with a fixed seed, because the parallel attempts are issued asynchronously to a vLLM server whose batching schedule depends on real-time CUDA kernel timing and KV-cache state. Second, Kaggle's grading is deterministic but the scheduling of which problems hit which attempt order is not. Whatever the underlying mechanism, <strong>the operationally relevant fact is that nine runs of identical code spanned four points</strong>.</p>\n<p>The implication for our research methodology is severe and one-directional:</p>\n<blockquote>\n  <p><strong>Any single comparison between two notebooks that differs by less than ≈2σ ≈ 2.4 points is statistically indistinguishable from running the same notebook twice.</strong></p>\n</blockquote>\n<p>In retrospect, the most important methodological mistake we made early in the competition was treating single-shot leaderboard scores as ground truth. When <code>aimo3_final v9</code> returned 37 three times in a row and <code>[15/15] AIME v3</code> returned 35 and 38, we read those as meaningful differences and chased the apparent winner. They are not meaningful differences. They are draws from the same noisy distribution.</p>\n<p>We did not realize this until the final week, when a deliberate variance experiment on the converged notebook produced the n = 9 distribution above. Had we run such an experiment on day one, we would have saved ≈$300 of GPU spend and three weeks of architectural iteration. <strong>This is recommendation #1 of the paper: future AIMO3-style participants should establish a noise floor before iterating on architecture.</strong></p>\n<hr>\n<h2>4. Offline evaluation on hard50</h2>\n<p>Throughout the competition we maintained an offline evaluation loop against the Kaggle community dataset <strong><code>hard_50_math_problems_set_v6.csv</code></strong> (published by user <code>zfturbo</code> as <code>hard-math-problems-for-aimo-3</code>) - a 50-problem benchmark of olympiad-level questions with known integer answers. Offline evaluation served as a debugging sanity check and as a relative-performance gauge for architectures we were not yet willing to spend a submission slot on.</p>\n<p>We authored <strong>15 offline research branches</strong> during the competition, organized into five families, each targeting a specific failure class observed in earlier runs:</p>\n<ul>\n<li><strong>Branch A / A2 (contested resolver)</strong> - trunk + candidate aggregation table + pairwise resolver. Motivation: hard50 showed that many wrong answers were <em>rerankable</em> - the correct answer was in the candidate pool but a weak plurality of wrong attempts shipped it. Heuristic constants were drawn from observed failure patterns (66 vs 69, 570 vs 285, 24 vs 25, 2000 vs 1999, 105 vs 106).</li>\n<li><strong>Branch A3 (closure-aware challenge + dual-check flip gate)</strong> - collect <em>all</em> boxed integers in an attempt and use the last to defend against premature boxing; flips require two independent checks. Authors explicitly noted A3 was \"<em>intended for AIMO3, not hard50-only optimization.</em>\"</li>\n<li><strong>Branch B (pairwise-authorized arbitration)</strong> - pairwise becomes the only component that can authorize a challenger flip; pressure and audit become veto layers only.</li>\n<li><strong>Branch C (controller + code rescue + provenance-aware weighting)</strong> - state controller that stops spending budget on already-converged or broken pools; code rescue for broken pools; candidates supported by multiple evidence modes weigh more than plain-text singletons.</li>\n<li><strong>Branch C+ (trusted main-pool arbitration + routed micro-prompts + typed verifiers)</strong> - the most elaborate research branch. Authors again stated it was \"<em>intended for AIMO3-level problems, not hard50-only tuning.</em>\"</li>\n</ul>\n<p><strong>None of these 15 branches were ever submitted to the Kaggle leaderboard.</strong> Of the 15, <strong>nine were never executed to completion</strong> due to infrastructure and wiring bugs. Two contested-resolver branches ran 50 problems on hard50 but never logged per-problem correctness. Three Branch B/C variants share a single stale truncated run (cumulative 19/29 at problem 30) that we cannot attribute to a specific architecture because the three notebooks have different code but identical saved outputs from one Colab session. <strong>One notebook - <code>aimo3_branch_B_multicell</code> - completed a full, inline-graded 50-problem hard50 run.</strong> That is the only offline number we can cite with full verification. Full per-branch execution status is catalogued in Appendix H.</p>\n<p><strong>Branch B multicell on hard50: 27/50 (54.0%), mean 233 s/problem, total 194 min.</strong> Figure 9 shows the per-problem timing (top) and cumulative accuracy (bottom). No problem hit the 900 s cap; the run finished comfortably inside a notional 5-hour budget at 3.24 h total.</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig9_branch_b_hard50.png\" alt=\"Figure 9: Branch B multicell full hard50 run\"></p>\n<p>Accuracy begins at 100% after problem 2, collapses to the mid-60s by problem 10, and bleeds out to 54% by problem 50. The architecture looked competitive early and degraded on the harder back half. Since no problem timed out, 27/50 reflects answer quality, not budget exhaustion.</p>\n<p><strong>Interpretation is constrained.</strong> Branch B multicell's elaborate pairwise-arbitration architecture scored 27 on hard50; <code>final_submission v2</code> scored a mean of 40.78 on AIMO3. If hard50 difficulty were comparable to AIMO3, Branch B would project to ~27 on AIMO3 - 14 points below the simpler approach. But hard50 is not AIMO3: it is community-sourced, intentionally difficult, and may systematically underestimate AIMO3 performance - which is precisely why Branches A3 and C+ were explicitly designed \"not for hard50-only tuning.\" We also never ran a variance experiment on hard50 analogous to our n = 9 experiment, so we cannot say whether 27/50 is itself ±2 points of noise.</p>\n<p>Even with those caveats, the directional signal was clear: <strong>our only offline-executed elaborate architecture predicted a losing Kaggle score, and the simpler baseline outperformed it.</strong> The writeup-prize rubric asks <em>\"did you use any internal benchmarks?\"</em> - yes, but less effectively than we should have. Nine of our 15 research notebooks never finished a run; we never calibrated hard50 against AIMO3; and the one completed offline run told a story that should have killed Branch B's lineage earlier than it did. <strong>Future participants: instrument your offline benchmark the way you instrument your leaderboard submissions, get all your research notebooks across the finish line, and run a variance experiment on the offline set before treating any single offline number as signal.</strong> Appendix H lists all 15 branches with design intent and execution status.</p>\n<hr>\n<h2>5. The converged solution: <code>final_submission v2</code></h2>\n<h3>5.1 Architecture</h3>\n<p><code>final_submission v2</code> is intentionally lean. It does not contain a 5-stage prompt, a router, a verifier, an adversarial pass, GenSelect, multi-strategy prescriptive prompts, or fine-tuned weights. It contains four things. First, the base model: <code>danielhanchen/gpt-oss-120b</code> served by local vLLM (KV-cache fp8_e4m3, gpu_memory_utilization 0.96, max_model_len 65,536). Second, a one-sentence system prompt: <em>\"You are a world-class IMO competitor. The final answer must be a non-negative integer between 0 and 99999. Place your final answer inside <code>\\boxed{}</code>.\"</em> The model is invoked through the openai-harmony format with <code>ReasoningEffort.HIGH</code>, the gpt-oss native reasoning control. Third, tool-augmented parallel self-consistency: 8 attempts dispatched in parallel against a pool of 16 long-lived Jupyter sandboxes (math, numpy, sympy, mpmath, itertools, collections; <code>mpmath.mp.dps = 64</code>), up to 128 harmony turns each, T = 1.0, min_p = 0.02, no top_p, per-attempt seed <code>(global_seed + attempt_index)²</code>. Streams are inspected character-by-character; an attempt short-circuits the moment a <code>\\boxed{...}</code> appears. Fourth, 5-component weighted-entropy voting (Section 5.2); when 4 attempts agree, remaining attempts are cancelled.</p>\n<p>The time budget is computed adaptively per problem: <code>min(max(time_remaining − 270 × problems_remaining, 270), 900)</code> seconds, with <code>notebook_limit = 17400</code> (4h50m, leaving safety margin inside Kaggle's 5h cliff). Appendix A contains the full configuration.</p>\n<h3>5.2 The 5-component weighted entropy</h3>\n<p>Inverse-entropy voting is a known technique: weight each attempt by 1/H, sum weights per answer, return the highest-weighted answer. The novelty in <code>final_submission v2</code> is that the entropy itself is a five-part composite over the attempt's logprob trajectory, rather than a single mean. Reading from the source:</p>\n<pre><code>weighted_entropy = (\n    0.30 * mean_entropy\n  + 0.40 * position_weighted_entropy   # exponential decay 0.995, recent tokens dominate\n  + 0.20 * std_dev_of_entropy          # variance penalty for inconsistent confidence\n  + 0.30 * 3.0 * high_entropy_ratio    # fraction of tokens with H &gt; 2.0 bits, scaled ×3\n  - 0.10 * (max_low_entropy_streak / n)  # bonus for sustained confident stretches\n)\n</code></pre>\n<p>The intuition: position weighting with decay 0.995 means tokens near the final boxed answer count exponentially more than tokens early in the chain of thought - a solution uncertain during exploration but confident at conclusion outranks one that is confident throughout but flinches at the end. The variance penalty punishes oscillating confidence (\"the model kept changing its mind\"). The high-entropy ratio counts tokens where the next-token distribution exceeds 2 bits of Shannon entropy, and the ×3 multiplier inside a 30% weighting makes this term dominant when an attempt has many uncertain stretches. The streak bonus rewards sustained runs of &lt; 1 bit entropy as a marker of \"the model is on a roll.\"</p>\n<p>These weights and thresholds are not from a paper. They were tuned by hand on intermediate submissions in this competition. The core idea of inverse-entropy weighted voting was informed by <a href=\"https://www.kaggle.com/code/pawanmali/chasing-47-50-aimo3-journey-of-60-experiments\" target=\"_blank\">pawanmali's \"Chasing 47/50\" notebook</a>, which demonstrated entropy-based confidence weighting for self-consistency on AIMO3. We do not claim they are optimal - only that this composite produced a stable mean of 40.78 in <code>final_submission v2</code>, while simpler \"mean entropy\" voting in eight other notebooks we submitted produced means in the 33–37 region. Section 6 unpacks that comparison.</p>\n<h3>5.3 What is <em>not</em> in <code>final_submission v2</code></h3>\n<p>For the avoidance of doubt: <code>final_submission v2</code> does not contain the 5-stage UNDERSTAND/EXPLORE/PLAN/EXECUTE/VERIFY scaffold (tested in <code>[15/15] AIME v3</code>, scored 35 and 38), the 8 prescriptive strategy prompts from the <code>aimo3_final</code> family (five submissions, mean ~36.6), the verifier/GenSelect/adversarial scaffolding from the same family, the subject-classifier routed prompts from <code>aimo3_adaptive v4</code> (scored 34), the full adaptive router with posterior voting (scored 28), the increased attempt count from <code>base_submission v2</code> (scored 33, timed out), or the GRPO fine-tuned weights from the v4_grpo submission (scored 13, merge format mismatch). Figures 7 and 8 visualize the same information at the feature and score levels respectively.</p>\n<hr>\n<h2>6. Ablation: every intervention vs. baseline</h2>\n<p>Figure 8 collects every intervention we tried as a horizontal bar chart, compared against the baseline of 39 (the first run of <code>aimo3_final v3</code>, which is the earliest non-debugging submission still in our history).</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig8_ablation_waterfall.png\" alt=\"Figure 8: Ablation waterfall — every intervention vs. starting baseline\"></p>\n<p>Three regions: <strong>inside the noise band</strong> - early <code>aimo3_final</code> iterations, the multi-strategy prompt family, and the 5-stage scaffold sit within ±2σ of the 39 baseline and are indistinguishable from starting fresh (the strategy-prompts family was tested in five submissions and never broke out). <strong>Below the noise band</strong> - the structured-scaffold-plus-classifier branch (−5), V11 timeout (−6), the router with GenSelect/adversarial pass (−11), and GRPO (−26); all real failures with identifiable causes that Section 7 dissects. <strong>Above the noise band</strong> - only <code>final_submission v2</code> at +1.78, with the lower bound of its 95% CI (39.85) itself above baseline. It is the <em>only</em> intervention in the entire competition with statistically defensible upward movement.</p>\n<p>Figure 7 makes the same point feature-by-feature. Each row is a notebook, each column a feature; checkmarks indicate presence.</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig7_feature_comparison.png\" alt=\"Figure 7: Feature presence across 11 submitted notebooks\"></p>\n<p><code>final_submission v2</code> (top row) has <em>fewer</em> features than every other notebook except the most basic, and is the only one with the 5-component weighted entropy. Notebooks with strategy prompts cluster around 36–37; notebooks with verifier/GenSelect/adversarial scaffolding cluster around 28–37; the router is at 28; GRPO at 13. Adding architecture moved us downward; subtracting it and replacing the voting function moved us upward. The honest causal claim we can make is that <strong>stripping the scaffolding AND replacing the voting function with 5-component weighted entropy together produced a defensible improvement above noise</strong>. We cannot say which change was load-bearing on its own - that would require an isolated ablation we did not run before the deadline.</p>\n<hr>\n<h2>7. Failed interventions, in detail</h2>\n<h3>7.1 Multi-strategy prescriptive prompts (V10 family, scored 36–37)</h3>\n<p>The <code>aimo3_final</code> v7/v9/v22 family launches eight parallel attempts, each with a different prescriptive system prompt instructing the model to use a specific mathematical technique - <em>analytic, computational, small-cases, work-backwards, algebraic, modular, geometric, random-testing-and-verification</em>. The hypothesis was that prompt-induced strategy diversity would produce a more diverse candidate pool for self-consistency voting to exploit, extending the DIPPER intuition that framing diversity beats temperature diversity alone.</p>\n<p>It failed because <code>gpt-oss-120b</code> at <code>ReasoningEffort.HIGH</code> complies with prescribed techniques even when they are poorly suited - a geometry problem given a \"modular arithmetic\" prompt produced attempts that contorted themselves toward modular methods and failed. The base model already selects appropriate techniques at T = 1.0; external prescription overrides this selection in the wrong direction about as often as the right one. Across five submissions, the mean was approximately 36.6 - Δ ≈ −2.4 vs. baseline, just inside the lower noise edge but directionally negative. The methodological distinction we carried forward: prescribing solution <em>content</em> hurts, prescribing reasoning <em>form</em> (Section 7.2) is roughly neutral.</p>\n<h3>7.2 5-stage structured scaffold (<code>[15/15] AIME v3</code>, scored 35 and 38)</h3>\n<p>The <code>[15/15] AIME 2026 I 120b in 20mins</code> notebook v3 uses the full 5-stage UNDERSTAND → EXPLORE → PLAN → EXECUTE → VERIFY scaffold popular in CoT prompting research, with a verbose ~1500-character system prompt detailing reasoning principles and verification requirements. The hypothesis was that even a strong base model would benefit from being forced to plan before executing.</p>\n<p>The two submissions scored 35 and 38 - squarely inside the ±2σ noise band of baseline. We cannot reject the null hypothesis that the scaffold has zero effect on <code>gpt-oss-120b</code>. A plausible explanation is that <code>ReasoningEffort.HIGH</code> already imposes a reasoning structure that the prompt-level scaffold duplicates without adding signal. <strong>Technique transfer from smaller-model prompting research does not automatically apply to gpt-oss-120b at high reasoning effort.</strong></p>\n<h3>7.3 The adaptive router (<code>AIMO3_Adaptive_Router_Confidence_Vote_v1</code>, scored 28)</h3>\n<p>A multi-stage system: a subject classifier routed each problem to one of four prompt families (geometry, number theory, combinatorics, algebra); a \"quick stage\" issued 2 cheap attempts (T = 0.55 and 0.80, max 2200 tokens, 24 turns); if those agreed with high posterior confidence, return immediately, otherwise an \"explore stage\" issued more attempts at higher temperature with longer budgets; weak candidates were routed through verifier, GenSelect, and adversarial passes; <code>high_problem_timeout = 840</code> s per problem. The hypothesis was the standard one: easy problems should consume little budget, hard problems more; an adaptive system should outperform a flat-budget system under heterogeneous difficulty.</p>\n<p>It failed structurally. The first problem consumed 840 s. The second consumed approximately 825 s. The router had burned 28% of the entire 5-hour notebook budget on two problems, and the remaining 48 problems shared the rest. Many timed out or returned 0. Final score: 28 - fully twelve points below baseline, the second-largest single-intervention drop in the competition. The router's adaptive logic correctly identified problems 1 and 2 as hard and allocated them more time; it then found nothing useful in the extra time. The correct behavior under those conditions is to give up early and conserve budget for problems where extra time might actually help - we did not implement that. A v2 with reduced timeouts reached 19/30 on an offline slice but we did not submit it; the converged <code>final_submission v2</code> was already outperforming it. <strong>Adaptive complexity is only valuable when the marginal value of extra time on a hard problem is positive. For hard olympiad problems in the AIMO3 distribution against gpt-oss-120b, that marginal value appears to be approximately zero past 5–6 minutes.</strong></p>\n<h3>7.4 More attempts on stock weights (<code>base_submission v2</code>, scored 33)</h3>\n<p>This is the team's fork of the public <code>AIMO 3 | GPT-OSS-120B (with tools)</code> notebook (\"the 42-notebook\" in community discussion), with three modifications: <code>attempts</code> raised from 8 to 12, <code>early_stop</code> raised from 4 to 5, and a \"Be concise. Stop immediately after <code>\\boxed{}</code>\" instruction added. The notebook also uses the stock OpenAI <code>gpt-oss-120b</code> weights rather than Daniel Hanchen's variant. Hypothesis: more samples → stronger voting → higher score, up to the point where the time budget binds.</p>\n<p>It exceeded the 5-hour budget. Twelve attempts × 50 problems with a verbose chain-of-thought trajectory pushed total runtime past the cliff; problems processed after timeout returned 0. Final score: 33. The experiment is <strong>confounded</strong> because we changed three variables at once and cannot cleanly attribute the −6 to \"more attempts\" alone. Operational lesson: <strong>if you push N upward, run a wall-clock experiment first, and budget for the slowest model variant.</strong></p>\n<h3>7.5 GRPO LoRA fine-tuning ([15/15] AIME v4_grpo, scored 13)</h3>\n<p>This is the largest and most expensive negative result in the writeup, and the most generally useful for the community. We approached it in two phases.</p>\n<p><strong>Phase A: TRL GRPOTrainer (collapsed at step 16, $101.73 sunk).</strong> Our first attempt used Hugging Face TRL's <code>GRPOTrainer</code> with Unsloth on a RunPod B200 ($5.03/hr). Configuration: LR 5e-6, max_grad_norm 1.0, β = 0.0, 8 generations per problem, <code>use_vllm=False</code> (because TRL's vLLM integration crashed at startup against gpt-oss-120b). Each step took ≈76 minutes. The training collapsed:</p>\n<ul>\n<li>Step 1: loss 0.0513, reward 0.375.</li>\n<li>Steps 8–9: KL divergence to reference policy reached <strong>87</strong>, gradient norm reached <strong>133</strong>.</li>\n<li>Step 13: peak reward 0.5625 - but loss had already climbed to 280.</li>\n<li>Step 16: loss reached <strong>19,751,736</strong>. Model destroyed. Killed.</li>\n</ul>\n<p>Figure 6 shows the trajectory.</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig6_trl_collapse.png\" alt=\"Figure 6: TRL GRPOTrainer collapse on Unsloth + gpt-oss-120b\"></p>\n<p>The diagnosis is straightforward: LR 5e-6 was too aggressive for an MoE model at 117B parameters, and <code>max_grad_norm</code> 1.0 was too loose to clip the gradient explosions that began once the policy started drifting from the reference.</p>\n<p><strong>Phase B: Custom vLLM + Unsloth loop (v6) - trained stably, deployed catastrophically.</strong> We rebuilt the training loop from scratch to avoid TRL's vLLM integration: each cycle launched vLLM with the current adapter, generated 8 completions per problem for 5 problems, killed vLLM to free GPU memory, applied a GRPO update via Unsloth, saved the adapter, restarted. We tightened the configuration substantially (LR 2e-6 with cosine decay, max_grad_norm 0.3, Dr.GRPO advantage normalization, DAPO-style overlong filtering, binary reward, β = 0, off-policy generation with vLLM on the base model and adapter trained separately; see Appendix B for the full config).</p>\n<p>We have telemetry for <strong>190 problems across 38 cycles</strong> (cycles 62–99, problems 310–499). The training was <strong>stable</strong> - zero loss collapses, loss values mostly in [0, 0.3], gradient norms cleanly bounded by the 0.3 clip. Figure 3 shows the per-cycle reward trajectory:</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig3_grpo_reward_trajectory.png\" alt=\"Figure 3: GRPO v6 reward trajectory\"></p>\n<p>The reward signal tells the second half of the story. The overall mean reward across all 190 problems was <strong>+0.033</strong> - barely above zero, after 38 cycles of training. Only <strong>4 problems out of 190 (2.1%)</strong> achieved reward 1.0 (all 8 generations correct): problems 329, 333, 379, 468. Three of those four had near-zero completion length, suggesting trivially short correct answers. Figure 5 shows the full reward distribution:</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig5_grpo_reward_histogram.png\" alt=\"Figure 5: GRPO v6 problem-level reward distribution\"></p>\n<p>Forty-seven percent of training problems received net negative reward. Eighteen percent received exactly zero (all 8 generations wrong, or all 8 right) - these are filtered from the gradient by Dr.GRPO's advantage normalization, contributing nothing. Thirty-three percent were partial wins. Only 2% were complete wins. This is the hardest possible shape for GRPO: the model is below 50% on the training distribution, and the reward signal is sparse and noisy. Even a stable training loop cannot extract much policy improvement from this.</p>\n<p><strong>The deployment failure.</strong> We merged the trained adapter using Unsloth's <code>merged_4bit_forced</code> method. The submission scored <strong>13/50</strong> - a 27-point drop from baseline. The root cause is a <strong>quantization format mismatch</strong>: <code>gpt-oss-120b</code>'s native weight format is <strong>MXFP4</strong> (E2M1 with E8M0 block scaling), but <code>merged_4bit_forced</code> produces <strong>BitsAndBytes NF4</strong>. vLLM routes the merged weights through its BitsAndBytes loader rather than the MXFP4 kernels, producing severely degraded output. The fix - which we discovered post-mortem from Unsloth documentation and vLLM GitHub issues #19361 and #21932 - is to merge with <code>merged_16bit</code> or save with <code>save_method=\"mxfp4\"</code>. A community member elsewhere in the AIMO3 forum reportedly spent <strong>$500</strong> on SFT+RL with a similar pipeline and scored 36, attributing it to the same issue. We spent approximately <strong>$300</strong> total on GRPO across all phases (Figure 4): TRL crash $102, v1–v5 debugging $100, v6 $62, idle $40.</p>\n<p><img src=\"https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig4_grpo_cost.png\" alt=\"Figure 4: GRPO v6 cumulative compute cost\"></p>\n<p>The actionable takeaway: <strong>never use <code>merged_4bit_forced</code> to deploy a fine-tuned <code>gpt-oss-120b</code> LoRA to vLLM.</strong> Use <code>merged_16bit</code>, <code>save_method=\"mxfp4\"</code>, or NVIDIA's QAT pipeline.</p>\n<hr>\n<h2>8. Comparison with state of the art</h2>\n<p>We benchmarked exclusively against the open-weight setting because that is what AIMO3's hardware budget allows. The relevant SOTA points are:</p>\n<ul>\n<li><strong>AIMO2 winner (NemoSkills, 2025):</strong> 34/50 on 4×L4 GPUs, using a Qwen2.5-14B model fine-tuned on 540K custom problems with 3.2M CoT solutions and 1.7M tool-integrated reasoning traces, plus GenSelect at inference time. Documented in arXiv:2504.16891.</li>\n<li><strong>Public community baselines on <code>gpt-oss-120b</code> for AIMO3:</strong> Reported in the high 30s to low 40s with simple self-consistency setups.</li>\n<li><strong>Our submission:</strong> 40.78 mean (n=9, σ=1.20, best 43) with no fine-tuning, no scaffolding, and a 5-component weighted entropy voting function.</li>\n<li><strong>The top of the AIMO3 public leaderboard at writeup time:</strong> ≥46/50, presumably achieved through inference acceleration (EAGLE-3 speculative decoding has been discussed publicly), correct fine-tuning pipelines that avoid the MXFP4 mismatch, or both.</li>\n<li>The top of the AIMO3 public leaderboard at writeup time: ≥46/50, presumably achieved through inference acceleration (EAGLE-3 speculative decoding has been discussed publicly), correct fine-tuning pipelines that avoid the MXFP4 mismatch, or both.</li>\n</ul>\n<p>The host shared pass@N analysis on X showing gpt-oss-120b achieves pass@8 ≈ 44 and pass@20 ≈ 45.5 on the private set (95% CI [43, 48]), indicating that the correct answer appears in at least one of 8 attempts for approximately 44 of 50 problems. Our mean of 40.78 implies we correctly select the right answer from the pool approximately 93% of the time (40.78/44), with the remaining ~3 problems per run representing pure selection loss.</p>\n<p>The structural shift from AIMO2 to AIMO3 is striking. AIMO2 was won by a team that invested heavily in training-time compute and produced a 14B-parameter model that scored 34. AIMO3 allows H100 hardware, which makes <code>gpt-oss-120b</code> runnable, and the <em>unmodified</em> base model with a sensible voting function reaches 40.78 - six points above the AIMO2 winner with zero training-time investment. <strong>Base model capability dominates the AIMO3 landscape in a way it did not dominate AIMO2.</strong> Our negative GRPO result is consistent with this: training-time interventions face an uphill battle against a base model that is already near the ceiling of the inference-constrained accuracy distribution.</p>\n<p>We did not benchmark against commercial models (GPT-4, Claude, Gemini) because the AIMO3 rules require self-contained Kaggle notebook execution and commercial API calls are not permitted in the competition pipeline. </p>\n<hr>\n<h2>9. Lessons and recommendations</h2>\n<p>The competition produced eight findings we believe will help future participants more than another point on the leaderboard would.</p>\n<ol>\n<li><p><strong>Establish the noise floor first.</strong> Submit the same notebook 5–10 times before iterating on architecture. σ = 1.20 means any 1–2 point \"improvement\" is invisible to single-shot comparison. Every other recommendation depends on this one.</p></li>\n<li><p><strong>Per-problem time budgets are absolute.</strong> The 5-hour cliff is hard-enforced. Any architecture that <em>can</em> spend more time on a problem must have a hard cap well below what the budget would technically allow - hard problems do not pay you back for extra time.</p></li>\n<li><p><strong>Strategy-prompt diversity hurts a strong base model.</strong> When <code>gpt-oss-120b</code> at <code>ReasoningEffort.HIGH</code> is told to use a specific technique, it complies even when the technique is wrong. Sampling-temperature diversity at T = 1.0 produces enough variance for self-consistency voting without prescriptive prompts.</p></li>\n<li><p><strong>Confidence estimation matters more than sample count.</strong> Our single defensible improvement above noise came from changing the <em>voting function</em>, not from generating more samples. Treat the voting function as a first-class optimization target.</p></li>\n<li><p><strong><code>merged_4bit_forced</code> is a trap for <code>gpt-oss-120b</code>.</strong> The Unsloth → vLLM pipeline silently produces a BitsAndBytes-quantized model that vLLM cannot run efficiently. Use <code>merged_16bit</code> or <code>save_method=\"mxfp4\"</code>.</p></li>\n<li><p><strong>Stable GRPO training is necessary but not sufficient.</strong> Our v6 loop trained stably for 38 cycles with no collapses, but the deployed model scored 13 because of the merge format issue, and the reward signal during training (mean +0.033) was too sparse for meaningful policy improvement.</p></li>\n<li><p><strong>Instrument your offline benchmark like your leaderboard.</strong> We ran 15 offline research branches but only one completed a verifiable end-to-end run. We never calibrated hard50 difficulty against AIMO3. Subtraction beats addition: every architectural addition we tested was neutral or harmful.</p></li>\n<li><p><strong>Document the negative results.</strong> We invested ~$300 of B200 GPU time and three weeks of architectural iteration in directions that did not work. If this writeup helps even one future team avoid the <code>merged_4bit_forced</code> trap or the strategy-prompt-diversity dead end, it has paid for itself many times over.</p></li>\n</ol>\n<hr>\n<h2>10. Conclusion</h2>\n<p>We did not win AIMO3. Our private-leaderboard score of 41.5/50 and rank 828th / 4,138 (public-leaderboard best score of 43/50 and rank 86th / 4,138) falls squarely within our predicted 95% CI of [39.85, 41.70], validating the variance methodology, well above naive baselines but below the top of the leaderboard. What we contribute to the community is not a higher score but a documented, statistically defensible characterization of the AIMO3 inference problem with <code>gpt-oss-120b</code>: the base model is strong enough that most engineering interventions are dominated by run-to-run noise; the few interventions that move the score appreciably move it <em>downward</em>; and the single defensible upward move we found was a more careful confidence-estimation function for self-consistency voting. The expensive failure modes - strategy-prompt prescription, multi-stage routing, and most importantly GRPO with broken deployment - are all reproducible from the configurations and telemetry in the appendices. Every score in this paper is from an actual public-leaderboard submission, every configuration is from actual source code, and every causal claim is hedged to the strength of the evidence we have.</p>\n<p>If you take one thing from this writeup, take this: <strong>before you spend a week building a router, submit the same notebook many times and look at the variance.</strong></p>\n<hr>\n<h2>11. Private Leaderboard Result</h2>\n<p>Our selected submission (<code>final_submission v2</code>) scored <strong>41.5/50</strong> on the private leaderboard (rank 828 / 4,138). Under the double-run scoring rule - where each problem receives 1.0 if both runs are correct, 0.5 if one is correct, and 0.0 if neither is - this score is consistent with a per-run accuracy of approximately 41–42, directly in line with our public-LB mean of 40.78 (σ=1.20, n=9).</p>\n<p>The private score falls within our predicted 95% confidence interval of [39.85, 41.70], confirming that the variance methodology in Section 3 generalizes from public to private evaluation. The noise floor finding - that σ=1.20 across identical runs means any sub-2.4-point \"improvement\" is statistically indistinguishable from noise - is validated by this out-of-sample result.</p>\n<p>Our rank shifted from 86th (public, based on best single submission of 43) to 828th (private, based on the selected submission's double-run average). This rank compression is itself evidence for the noise-floor thesis: teams whose public rank was inflated by a single lucky run regressed toward their true mean on the private set, while our pre-registered variance estimate correctly predicted our private performance.</p>\n<h2>---</h2>\n<h1>Appendices</h1>\n<h2>Appendix A: Full configuration of <code>final_submission v2</code></h2>\n<p>This is the verbatim configuration from the <code>CFG</code> class in the submitted notebook.</p>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Base model</strong></td>\n<td><code>/kaggle/input/models/danielhanchen/gpt-oss-120b/transformers/default/1</code></td>\n</tr>\n<tr>\n<td><strong>Served model name (vLLM)</strong></td>\n<td><code>gpt-oss</code></td>\n</tr>\n<tr>\n<td><strong>Quantization</strong></td>\n<td>Native MXFP4</td>\n</tr>\n<tr>\n<td><strong>Tensor parallel size</strong></td>\n<td>1</td>\n</tr>\n<tr>\n<td><strong>gpu_memory_utilization</strong></td>\n<td>0.96</td>\n</tr>\n<tr>\n<td><strong>kv_cache_dtype</strong></td>\n<td><code>fp8_e4m3</code></td>\n</tr>\n<tr>\n<td><strong>dtype</strong></td>\n<td><code>auto</code></td>\n</tr>\n<tr>\n<td><strong>context_tokens (max_model_len)</strong></td>\n<td>65,536</td>\n</tr>\n<tr>\n<td><strong>batch_size (max_num_seqs)</strong></td>\n<td>256</td>\n</tr>\n<tr>\n<td><strong>stream_interval</strong></td>\n<td>200</td>\n</tr>\n<tr>\n<td><strong>enable_prefix_caching</strong></td>\n<td>True</td>\n</tr>\n<tr>\n<td><strong>async_scheduling</strong></td>\n<td>True</td>\n</tr>\n<tr>\n<td><strong>System prompt</strong></td>\n<td><em>\"You are a world-class IMO competitor. The final answer must be a non-negative integer between 0 and 99999. Place your final answer inside <code>\\boxed{}</code>.\"</em></td>\n</tr>\n<tr>\n<td><strong>Tool prompt</strong></td>\n<td><em>\"Use this tool to execute Python code. The environment is a stateful Jupyter notebook. Always use print() to output results.\"</em></td>\n</tr>\n<tr>\n<td><strong>Preference prompt</strong></td>\n<td><em>\"You have access to math, numpy, sympy, and mpmath.\"</em></td>\n</tr>\n<tr>\n<td><strong>Reasoning effort</strong></td>\n<td><code>ReasoningEffort.HIGH</code> (set on harmony SystemContent)</td>\n</tr>\n<tr>\n<td><strong>Tool format</strong></td>\n<td>openai-harmony Conversation API</td>\n</tr>\n<tr>\n<td><strong>Available libraries in sandbox</strong></td>\n<td>math, numpy, sympy, mpmath, itertools, collections; <code>mpmath.mp.dps = 64</code></td>\n</tr>\n<tr>\n<td><strong>temperature</strong></td>\n<td>1.0</td>\n</tr>\n<tr>\n<td><strong>min_p</strong></td>\n<td>0.02</td>\n</tr>\n<tr>\n<td><strong>top_p</strong></td>\n<td>not set (intentionally - top_p = 0.9 was tested and caused a regression in earlier iterations)</td>\n</tr>\n<tr>\n<td><strong>top_logprobs</strong></td>\n<td>5</td>\n</tr>\n<tr>\n<td><strong>attempts</strong></td>\n<td>8</td>\n</tr>\n<tr>\n<td><strong>workers (parallel sandboxes)</strong></td>\n<td>16</td>\n</tr>\n<tr>\n<td><strong>early_stop</strong></td>\n<td>4 (cancel remaining attempts when 4 agree)</td>\n</tr>\n<tr>\n<td><strong>turns (max harmony turns per attempt)</strong></td>\n<td>128</td>\n</tr>\n<tr>\n<td><strong>seed (global)</strong></td>\n<td>42</td>\n</tr>\n<tr>\n<td><strong>per-attempt seed</strong></td>\n<td><code>(seed + attempt_index) ** 2</code></td>\n</tr>\n<tr>\n<td><strong>buffer_tokens</strong></td>\n<td>512</td>\n</tr>\n<tr>\n<td><strong>search_tokens (streaming <code>\\boxed{}</code> window)</strong></td>\n<td>32</td>\n</tr>\n<tr>\n<td><strong>notebook_limit</strong></td>\n<td>17,400 s (4h50m)</td>\n</tr>\n<tr>\n<td><strong>base_problem_timeout</strong></td>\n<td>270 s</td>\n</tr>\n<tr>\n<td><strong>high_problem_timeout</strong></td>\n<td>900 s</td>\n</tr>\n<tr>\n<td><strong>server_timeout</strong></td>\n<td>180 s</td>\n</tr>\n<tr>\n<td><strong>session_timeout</strong></td>\n<td>960 s</td>\n</tr>\n<tr>\n<td><strong>jupyter_timeout</strong></td>\n<td>6 s</td>\n</tr>\n<tr>\n<td><strong>sandbox_timeout</strong></td>\n<td>3 s</td>\n</tr>\n<tr>\n<td><strong>per-problem budget formula</strong></td>\n<td><code>min(max(time_remaining − 270 × (problems_remaining − 1), 270), 900)</code></td>\n</tr>\n</tbody>\n</table>\n<h3>A.1 Voting function source</h3>\n<pre><code>def _compute_weighted_entropy(self, logprobs_buffer):\n    \"\"\"5-component weighted entropy.\"\"\"\n    if not logprobs_buffer:\n        return float('inf')\n\n    entropies = []\n    for top_lp in logprobs_buffer:\n        if not isinstance(top_lp, dict) or not top_lp:\n            continue\n        h = 0.0\n        for _, lp in top_lp.items():\n            p = math.exp(lp)\n            if p &gt; 0:\n                h -= p * math.log2(p)\n        entropies.append(h)\n\n    if not entropies:\n        return float('inf')\n\n    n = len(entropies)\n    mean_ent = sum(entropies) / n\n\n    # Variance penalty\n    if n &gt; 1:\n        variance = sum((e - mean_ent) ** 2 for e in entropies) / (n - 1)\n        std_dev = math.sqrt(variance)\n    else:\n        std_dev = 0.0\n\n    # Position-weighted (recent tokens dominate, decay 0.995)\n    decay = 0.995\n    weights = [decay ** (n - 1 - i) for i in range(n)]\n    total_weight = sum(weights)\n    position_weighted = (\n        sum(w * e for w, e in zip(weights, entropies)) / total_weight\n        if total_weight &gt; 0 else mean_ent\n    )\n\n    # High-entropy ratio (tokens with H &gt; 2.0 bits)\n    high_ent_count = sum(1 for e in entropies if e &gt; 2.0)\n    high_ent_ratio = high_ent_count / n\n\n    # Low-entropy streak bonus (sustained &lt; 1.0 bit)\n    max_streak = 0\n    current_streak = 0\n    for e in entropies:\n        if e &lt; 1.0:\n            current_streak += 1\n            max_streak = max(max_streak, current_streak)\n        else:\n            current_streak = 0\n    streak_bonus = -0.1 * (max_streak / n) if n &gt; 0 else 0.0\n\n    weighted = (\n        0.3 * mean_ent\n      + 0.4 * position_weighted\n      + 0.2 * std_dev\n      + 0.3 * high_ent_ratio * 3.0\n      + streak_bonus\n    )\n    return max(weighted, 1e-9)\n\n\ndef _select_answer(self, detailed_results):\n    \"\"\"Inverse-entropy weighted voting.\"\"\"\n    answer_weights = defaultdict(float)\n    answer_votes = defaultdict(int)\n    for r in detailed_results:\n        a = r['Answer']\n        e = r['Entropy']\n        if a is not None:\n            answer_weights[a] += 1.0 / max(e, 1e-9)\n            answer_votes[a] += 1\n    if not answer_weights:\n        return 0\n    scored = sorted(\n        [{'answer': a, 'votes': answer_votes[a], 'score': w}\n         for a, w in answer_weights.items()],\n        key=lambda x: x['score'], reverse=True\n    )\n    return scored[0]['answer']\n</code></pre>\n<h3>A.2 Boxed-answer scanner</h3>\n<pre><code>def _scan_for_answer(self, text):\n    pattern = r'\\\\boxed\\s*\\{\\s*([0-9,]+)\\s*\\}'\n    matches = re.findall(pattern, text)\n    if matches:\n        try:\n            val = int(matches[-1].replace(',', ''))\n            if 0 &lt;= val &lt;= 99999:\n                return val\n        except ValueError:\n            pass\n    pattern = r'final\\s+answer\\s+is\\s*([0-9,]+)'\n    matches = re.findall(pattern, text, re.IGNORECASE)\n    if matches:\n        try:\n            val = int(matches[-1].replace(',', ''))\n            if 0 &lt;= val &lt;= 99999:\n                return val\n        except ValueError:\n            pass\n    return None\n</code></pre>\n<p>The streaming inspection happens inside <code>_process_attempt</code>: after each chunk of streamed text, the last <code>search_tokens = 32</code> tokens worth of text are scanned for <code>\\boxed{...}</code>, and if found, the attempt short-circuits without consuming additional turns.</p>\n<h3>A.3 Provenance and credit</h3>\n<p>The 5-component weighted entropy formula builds on the multi-component entropy scoring framework from <a href=\"https://www.kaggle.com/code/pawanmali/chasing-47-50-aimo3-journey-of-60-experiments\" target=\"_blank\">pawanmali's \"Chasing 47/50\" notebook</a>, which demonstrated that position-weighted entropy with variance and streak components substantially outperforms simple mean entropy on AIMO3. Our contribution is the specific tuning of weights and thresholds across intermediate submissions; the structural design of which components to include follows pawanmali's framework.</p>\n<hr>\n<h2>Appendix B: GRPO v6 configuration</h2>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Hardware</strong></td>\n<td>RunPod B200 (1 GPU, 191.5 GB VRAM)</td>\n</tr>\n<tr>\n<td><strong>Cost rate</strong></td>\n<td>$5.03/hr</td>\n</tr>\n<tr>\n<td><strong>Base model</strong></td>\n<td><code>danielhanchen/gpt-oss-120b</code> loaded via Unsloth with <code>load_in_4bit=True</code></td>\n</tr>\n<tr>\n<td><strong>Quantization during training</strong></td>\n<td>BitsAndBytes NF4 (Unsloth converts MXFP4 → NF4 on load)</td>\n</tr>\n<tr>\n<td><strong>Architecture</strong></td>\n<td>Off-policy: vLLM serves base model; Unsloth trains LoRA adapter separately; vLLM restarted between cycles</td>\n</tr>\n<tr>\n<td><strong>Learning rate</strong></td>\n<td>2e-6 with cosine decay</td>\n</tr>\n<tr>\n<td><strong>max_grad_norm</strong></td>\n<td>0.3</td>\n</tr>\n<tr>\n<td><strong>Generations per problem</strong></td>\n<td>8</td>\n</tr>\n<tr>\n<td><strong>Temperature (rollouts)</strong></td>\n<td>1.0</td>\n</tr>\n<tr>\n<td><strong>top_p (rollouts)</strong></td>\n<td>0.98</td>\n</tr>\n<tr>\n<td><strong>max_completion_tokens</strong></td>\n<td>6,144</td>\n</tr>\n<tr>\n<td><strong>Advantage</strong></td>\n<td>Dr.GRPO (mean subtraction, no std division)</td>\n</tr>\n<tr>\n<td><strong>Overlong filtering</strong></td>\n<td>DAPO-style (truncated completions removed from gradient)</td>\n</tr>\n<tr>\n<td><strong>KL coefficient (β)</strong></td>\n<td>0.0</td>\n</tr>\n<tr>\n<td><strong>Reward function</strong></td>\n<td>Binary: 1.0 if extracted boxed answer matches ground truth, 0.0 otherwise</td>\n</tr>\n<tr>\n<td><strong>Problems per cycle</strong></td>\n<td>5</td>\n</tr>\n<tr>\n<td><strong>Cycles captured in telemetry</strong></td>\n<td>38 (cycles 62–99)</td>\n</tr>\n<tr>\n<td><strong>Problems captured in telemetry</strong></td>\n<td>190 (problems 310–499)</td>\n</tr>\n<tr>\n<td><strong>Mean cycle time</strong></td>\n<td>~1,170 s (gen ~720s + train ~440s)</td>\n</tr>\n<tr>\n<td><strong>Cost in v6 logged segment</strong></td>\n<td>$61.87</td>\n</tr>\n<tr>\n<td><strong>Total GRPO project cost (all phases)</strong></td>\n<td>≈$300</td>\n</tr>\n<tr>\n<td><strong>Merge method used (the bug)</strong></td>\n<td><code>merged_4bit_forced</code> → produces BnB NF4</td>\n</tr>\n<tr>\n<td><strong>Merge method that should have been used</strong></td>\n<td><code>merged_16bit</code> or <code>save_method=\"mxfp4\"</code></td>\n</tr>\n<tr>\n<td><strong>Submission score</strong></td>\n<td>13/50</td>\n</tr>\n</tbody>\n</table>\n<h3>B.1 TRL Phase A (collapsed) configuration</h3>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Framework</strong></td>\n<td>Hugging Face TRL <code>GRPOTrainer</code> + Unsloth</td>\n</tr>\n<tr>\n<td><strong>use_vllm</strong></td>\n<td>False (TRL+vLLM crashed at startup)</td>\n</tr>\n<tr>\n<td><strong>Learning rate</strong></td>\n<td>5e-6</td>\n</tr>\n<tr>\n<td><strong>max_grad_norm</strong></td>\n<td>1.0</td>\n</tr>\n<tr>\n<td><strong>β (KL coefficient)</strong></td>\n<td>0.0</td>\n</tr>\n<tr>\n<td><strong>Generations per problem</strong></td>\n<td>8</td>\n</tr>\n<tr>\n<td><strong>Steps completed</strong></td>\n<td>16 (model destroyed at step 16)</td>\n</tr>\n<tr>\n<td><strong>Time per step</strong></td>\n<td>≈76 minutes</td>\n</tr>\n<tr>\n<td><strong>Cost</strong></td>\n<td>$101.73</td>\n</tr>\n<tr>\n<td><strong>Loss at step 1</strong></td>\n<td>0.0513</td>\n</tr>\n<tr>\n<td><strong>KL at steps 8–9</strong></td>\n<td>87</td>\n</tr>\n<tr>\n<td><strong>Gradient norm at steps 8–9</strong></td>\n<td>133</td>\n</tr>\n<tr>\n<td><strong>Reward at step 13</strong></td>\n<td>0.5625 (peak)</td>\n</tr>\n<tr>\n<td><strong>Loss at step 16</strong></td>\n<td>19,751,736</td>\n</tr>\n</tbody>\n</table>\n<h3>B.2 SFT (uploaded but not submitted)</h3>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Method</strong></td>\n<td>QLoRA, rank 128</td>\n</tr>\n<tr>\n<td><strong>Training data</strong></td>\n<td>63,959 tool-integrated reasoning (TIR) traces</td>\n</tr>\n<tr>\n<td><strong>Steps</strong></td>\n<td>1,000</td>\n</tr>\n<tr>\n<td><strong>Final loss</strong></td>\n<td>0.69 (plateau)</td>\n</tr>\n<tr>\n<td><strong>Uploaded model</strong></td>\n<td><code>flamingice2801/gpt-oss-120b-aimo3-tir-sft</code> (Kaggle Models)</td>\n</tr>\n<tr>\n<td><strong>Submitted to AIMO3?</strong></td>\n<td>No - abandoned after GRPO deployment failure exposed the merge format issue</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Appendix C: Full Kaggle submission history</h2>\n<p>Twenty-five successful submissions plus three early debug parquet uploads (score 0) and one notebook exception. Listed in chronological order (oldest first).</p>\n<table>\n<thead>\n<tr>\n<th>#</th>\n<th>Days ago at writeup</th>\n<th>Notebook</th>\n<th>Version</th>\n<th>Score</th>\n<th>Phase</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>24</td>\n<td><code>aimo3_final</code></td>\n<td>v3</td>\n<td>39</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>2</td>\n<td>23</td>\n<td><code>aimo3_final</code></td>\n<td>v4_tweaked_temp&amp;model</td>\n<td>11</td>\n<td>Debugging</td>\n</tr>\n<tr>\n<td>3</td>\n<td>22</td>\n<td><code>aimo3_final</code></td>\n<td>v5_tweaked_temp</td>\n<td>0</td>\n<td>Debugging</td>\n</tr>\n<tr>\n<td>4</td>\n<td>21</td>\n<td><code>aimo3_final</code></td>\n<td>v7</td>\n<td>36</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>5</td>\n<td>20</td>\n<td><code>aimo3_final</code></td>\n<td>v9</td>\n<td>37</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>6</td>\n<td>19</td>\n<td><code>aimo3_final</code></td>\n<td>v22</td>\n<td>36</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>7</td>\n<td>18</td>\n<td><code>base_submission</code></td>\n<td>v2</td>\n<td>33</td>\n<td>Failure (V11 timeout)</td>\n</tr>\n<tr>\n<td>8</td>\n<td>17</td>\n<td><code>[15/15] AIME 2026 I 120b in 20mins</code></td>\n<td>v4_grpo</td>\n<td><strong>13</strong></td>\n<td><strong>Failure (GRPO)</strong></td>\n</tr>\n<tr>\n<td>9</td>\n<td>16</td>\n<td><code>[15/15] AIME 2026 I 120b in 20mins</code></td>\n<td>v3</td>\n<td>38</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>10</td>\n<td>15</td>\n<td><code>aimo3_final</code></td>\n<td>v3 (re-run)</td>\n<td>34</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>11</td>\n<td>14</td>\n<td><code>AIMO3_Adaptive_Router_Confidence_Vote_v1</code></td>\n<td>v1</td>\n<td><strong>28</strong></td>\n<td><strong>Failure (router)</strong></td>\n</tr>\n<tr>\n<td>12</td>\n<td>13</td>\n<td><code>[15/15] AIME 2026 I 120b in 20mins</code></td>\n<td>v3 (re-run)</td>\n<td>35</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>13</td>\n<td>12</td>\n<td><code>aimo3_final</code></td>\n<td>v9 (re-run)</td>\n<td>37</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>14</td>\n<td>11</td>\n<td><code>aimo3_final</code></td>\n<td>v9 (re-run)</td>\n<td>37</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>15</td>\n<td>10</td>\n<td><code>aimo3_adaptive</code></td>\n<td>_v4</td>\n<td>34</td>\n<td>Failure</td>\n</tr>\n<tr>\n<td>16</td>\n<td>9</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>39</strong></td>\n<td><strong>Final (run 1)</strong></td>\n</tr>\n<tr>\n<td>17</td>\n<td>8</td>\n<td><code>aimo_tester</code></td>\n<td>v2</td>\n<td>34</td>\n<td>Iteration</td>\n</tr>\n<tr>\n<td>18</td>\n<td>7</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>40</strong></td>\n<td><strong>Final (run 2)</strong></td>\n</tr>\n<tr>\n<td>19</td>\n<td>6</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>43</strong></td>\n<td><strong>Final (run 3)</strong></td>\n</tr>\n<tr>\n<td>20</td>\n<td>4</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>40</strong></td>\n<td><strong>Final (run 4)</strong></td>\n</tr>\n<tr>\n<td>21</td>\n<td>3</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>42</strong></td>\n<td><strong>Final (run 5)</strong></td>\n</tr>\n<tr>\n<td>22</td>\n<td>3</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>40</strong></td>\n<td><strong>Final (run 6)</strong></td>\n</tr>\n<tr>\n<td>23</td>\n<td>2</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>41</strong></td>\n<td><strong>Final (run 7)</strong></td>\n</tr>\n<tr>\n<td>24</td>\n<td>1</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>41</strong></td>\n<td><strong>Final (run 8)</strong></td>\n</tr>\n<tr>\n<td>25</td>\n<td>0</td>\n<td><strong><code>final_submission</code></strong></td>\n<td><strong>v2</strong></td>\n<td><strong>41</strong></td>\n<td><strong>Final (run 9)</strong></td>\n</tr>\n</tbody>\n</table>\n<p><code>final_submission v2</code> distribution: {39, 40, 40, 40, 41, 41, 41, 42, 43}, n = 9, mean 40.778, median 41, σ = 1.202, 95% CI [39.85, 41.70], best 43.</p>\n<hr>\n<h2>Appendix D: GRPO v6 telemetry summary</h2>\n<p>The full per-problem telemetry CSV (190 rows × 14 columns) is provided as a supplementary artifact. Summary statistics:</p>\n<table>\n<thead>\n<tr>\n<th>Statistic</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Total rows</td>\n<td>190</td>\n</tr>\n<tr>\n<td>Cycle range</td>\n<td>62 – 99 (38 cycles)</td>\n</tr>\n<tr>\n<td>Problem range</td>\n<td>310 – 499</td>\n</tr>\n<tr>\n<td>Generations per problem</td>\n<td>8 (constant)</td>\n</tr>\n<tr>\n<td>Mean generation time per cycle</td>\n<td>720 s</td>\n</tr>\n<tr>\n<td>Mean training time per cycle</td>\n<td>440 s</td>\n</tr>\n<tr>\n<td>Mean cycle time</td>\n<td>1,170 s</td>\n</tr>\n<tr>\n<td>Cost at cycle 62</td>\n<td>$2.34</td>\n</tr>\n<tr>\n<td>Cost at cycle 99</td>\n<td>$61.87</td>\n</tr>\n<tr>\n<td>Mean reward (all 190 problems)</td>\n<td>+0.033</td>\n</tr>\n<tr>\n<td>Problems with reward &lt; 0</td>\n<td>90 (47.4%)</td>\n</tr>\n<tr>\n<td>Problems with reward = 0 (filtered)</td>\n<td>34 (17.9%)</td>\n</tr>\n<tr>\n<td>Problems with 0 &lt; reward &lt; 1</td>\n<td>62 (32.6%)</td>\n</tr>\n<tr>\n<td>Problems with reward = 1.0 (all 8 correct)</td>\n<td>4 (2.1%)</td>\n</tr>\n<tr>\n<td>Problem IDs achieving reward = 1.0</td>\n<td>329, 333, 379, 468</td>\n</tr>\n<tr>\n<td>Loss range</td>\n<td>[0.0, ~0.7]</td>\n</tr>\n<tr>\n<td>Loss collapses</td>\n<td>0</td>\n</tr>\n<tr>\n<td>Mean completion length</td>\n<td>~3,500 tokens</td>\n</tr>\n<tr>\n<td>Max completion length observed</td>\n<td>~6,400 tokens (binding against 6,144 cap)</td>\n</tr>\n</tbody>\n</table>\n<p>The full CSV columns are: <code>cycle, problem_idx, gen_time_sec, train_time_sec, total_sec, reward_mean, reward_std, num_correct, num_total, loss, completion_len_mean, clipped_ratio, gpu_mem, cost</code>.</p>\n<hr>\n<h2>Appendix E: Variance experiment statistical details</h2>\n<p>The 9-run variance experiment for <code>final_submission v2</code> produced scores {39, 40, 40, 40, 41, 41, 41, 42, 43}. Descriptive statistics:</p>\n<table>\n<thead>\n<tr>\n<th>Statistic</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>n</td>\n<td>9</td>\n</tr>\n<tr>\n<td>Sum</td>\n<td>367</td>\n</tr>\n<tr>\n<td>Mean</td>\n<td>40.778</td>\n</tr>\n<tr>\n<td>Median</td>\n<td>41</td>\n</tr>\n<tr>\n<td>Mode</td>\n<td>40 and 41 (each appear 3 times)</td>\n</tr>\n<tr>\n<td>Min</td>\n<td>39</td>\n</tr>\n<tr>\n<td>Max</td>\n<td>43</td>\n</tr>\n<tr>\n<td>Range</td>\n<td>4</td>\n</tr>\n<tr>\n<td>Sample variance s²</td>\n<td>1.444</td>\n</tr>\n<tr>\n<td>Sample standard deviation s</td>\n<td>1.202</td>\n</tr>\n<tr>\n<td>Standard error of the mean</td>\n<td>0.401</td>\n</tr>\n<tr>\n<td>t-critical (df=8, 95%)</td>\n<td>2.306</td>\n</tr>\n<tr>\n<td>95% CI for mean</td>\n<td>[39.854, 41.702]</td>\n</tr>\n<tr>\n<td>Coefficient of variation</td>\n<td>2.95%</td>\n</tr>\n</tbody>\n</table>\n<p>Under the assumption that each problem is solved with effective probability <em>p_eff</em> after voting, the score X ~ Binomial(50, <em>p_eff</em>). From mean = 40.778, <em>p_eff</em> ≈ 0.816, predicting a theoretical Binomial standard deviation of √(50 · 0.816 · 0.184) ≈ 2.74. <strong>Our observed σ = 1.20 is meaningfully lower than the Binomial prediction</strong>, suggesting positive correlation between problems within a single run (i.e., when the model is \"having a good run,\" it tends to solve more problems than independent sampling would predict). Plausible mechanisms include vLLM batching state, KV-cache hit patterns, and GPU thermal/scheduling effects that affect attempts within a single notebook run more than across runs.</p>\n<p>For two independent runs from the same configuration with σ = 1.20:</p>\n<ul>\n<li>Expected difference E[|X₁ − X₂|] ≈ 1.35</li>\n<li>P(|X₁ − X₂| ≥ 3) ≈ 0.07</li>\n<li>P(|X₁ − X₂| ≥ 4) ≈ 0.02</li>\n</ul>\n<p>A 3-point single-shot difference between two notebooks therefore has approximately a 1-in-14 chance of being pure noise. A 4-point difference reaches conventional statistical significance (p &lt; 0.05) only with this much variance assumed. <strong>Differences smaller than 3 points should not be acted on without replication.</strong></p>\n<hr>\n<h2>Appendix F: Why the public 42-notebook is not a clean baseline in our results</h2>\n<p>The public Kaggle notebook <code>AIMO 3 | GPT-OSS-120B (with tools)</code> (\"the 42-notebook\" in community discussion) is reported to score 42/50 by its authors with default settings. We never submitted the unmodified 42-notebook. Our <code>base_submission v2</code> is a <strong>fork</strong> of it with three modifications:</p>\n<ol>\n<li><code>attempts</code> raised from 8 to 12</li>\n<li><code>early_stop</code> raised from 4 to 5</li>\n<li><code>\"Be concise. Stop immediately after \\boxed{}\"</code> added to the preference prompt</li>\n</ol>\n<p><code>base_submission v2</code> scored 33 - six points below baseline - primarily due to the wall-clock overrun caused by modification #1. Because we changed three variables at once, <strong>we cannot attribute the −6 to \"more attempts\" alone</strong>, and we cannot use this submission as a measurement of the unmodified 42-notebook's performance in our environment. The 42-notebook's score in our hands is, strictly speaking, unknown. We list this as a methodological limitation rather than a result.</p>\n<hr>\n<h2>Appendix G: What we would do differently</h2>\n<p>If we were starting AIMO3 again with what we know now, in priority order:</p>\n<ol>\n<li><strong>Day 1, before any architectural work:</strong> Submit the same baseline notebook 9 times. Plot the distribution. Compute σ. <em>Then</em> decide what counts as a meaningful improvement.</li>\n<li><strong>Day 2:</strong> Read every Unsloth and vLLM doc page about merging fine-tuned LoRA adapters for <code>gpt-oss-120b</code>. Specifically search for \"MXFP4\" and \"merged_4bit\". This would have saved the ≈$300 GRPO sunk cost.</li>\n<li><strong>Day 3 onward, if time allows:</strong> Investigate inference-acceleration paths (EAGLE-3 speculative decoding, smaller-N with smarter voting, parallel sandbox pool tuning) before investigating training-time interventions. The base model is strong; the binding constraint is throughput.</li>\n<li><strong>Throughout:</strong> Treat the voting function as a first-class variable. A more refined confidence estimator was the only thing that produced a defensible improvement above noise in our experiments.</li>\n<li><strong>Never:</strong> Add a multi-stage router with verifier / GenSelect / adversarial passes without measuring its time cost on a wall-clock simulation first.</li>\n</ol>\n<hr>\n<h2>Appendix H: Offline research branch catalog</h2>\n<p>Fifteen offline research branches were authored during the competition to explore architectures that we were not willing to spend Kaggle submission slots on. <strong>None of the 15 were submitted to the AIMO3 leaderboard.</strong> Their target benchmark was the community-sourced <code>hard_50_math_problems_set_v6.csv</code> dataset (Kaggle dataset <code>zfturbo/hard-math-problems-for-aimo-3</code>). This appendix documents each branch with its design intent (taken verbatim from the top-of-notebook docstring or markdown cell where available), its execution status, and what the preserved notebook outputs actually verify.</p>\n<h3>H.1 Execution status summary</h3>\n<table>\n<thead>\n<tr>\n<th>Branch file</th>\n<th>Execution status</th>\n<th>Verifiable score</th>\n<th>Mean time/problem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>aimo3_branch_a_contested_resolver</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_a_contested_resolver_rebuilt</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3-contested-resolver</code></td>\n<td>Ran 50 problems; <strong>no correctness logging</strong></td>\n<td>Cannot verify</td>\n<td>216 s</td>\n</tr>\n<tr>\n<td><code>aimo3_contested_resolver_conservative</code> (A2)</td>\n<td>Ran 50 problems; <strong>no correctness logging</strong></td>\n<td>Cannot verify</td>\n<td>216 s</td>\n</tr>\n<tr>\n<td><code>aimo3_A3_1_clean_multicell</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3_A3_2_candidategen_multicell</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3_A3_2_patch_multicell</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><strong><code>aimo3_branch_B_multicell</code></strong></td>\n<td><strong>Complete 50-problem run with inline grading</strong></td>\n<td><strong>27/50 (54.0%)</strong></td>\n<td><strong>233 s</strong></td>\n</tr>\n<tr>\n<td><code>aimo3_branch_B_fixed</code></td>\n<td>Shares stale truncated run with C_final</td>\n<td>19/29 (ambiguous)</td>\n<td>218 s</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_B_updated</code></td>\n<td>Shares stale truncated run with C_final</td>\n<td>19/29 (ambiguous)</td>\n<td>218 s</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_C_final</code></td>\n<td>Shares stale truncated run with B_fixed/updated</td>\n<td>19/29 (ambiguous)</td>\n<td>218 s</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_C_fixed2</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_C_c2</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_C_trust_patch</code></td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n<tr>\n<td><code>aimo3_branch_C_plus_final</code> (C+)</td>\n<td>Authored, never executed to completion</td>\n<td>-</td>\n<td>-</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Critical caveat on the 19/29 row.</strong> Three notebooks (<code>B_fixed</code>, <code>B_updated</code>, <code>C_final</code>) have different code but identical saved outputs - same per-problem trace, same cumulative markers, same trace zip timestamp <code>20260409_092715</code>. The outputs come from a single Colab run that was saved into three different notebook files during iteration. We cannot attribute 19/29 to any specific architecture and therefore do not cite it as a score for any named branch in the main paper. The run terminated at problem 30 - we do not know whether termination was voluntary (user stopped) or involuntary (Colab session died).</p>\n<p><strong>The only offline number that survives full provenance audit is Branch B multicell: 27/50 on hard50.</strong> All per-problem <code>[EVAL] id=&lt;X&gt; pred=&lt;Y&gt; actual=&lt;Z&gt; correct=&lt;bool&gt; cumulative=&lt;N&gt;/&lt;M&gt;</code> lines are preserved inline in the notebook output cells.</p>\n<h3>H.2 Branch A - Trunk + Contested Resolver</h3>\n<p><strong>Files:</strong> <code>aimo3_branch_a_contested_resolver</code>, <code>aimo3_branch_a_contested_resolver_rebuilt</code>, <code>aimo3-contested-resolver</code></p>\n<p><strong>Design intent (verbatim from the notebook docstring):</strong></p>\n<blockquote>\n  <p>\"This notebook starts from the stable <code>final_submission</code> baseline rather than the experimental branches. The baseline kept the proven ingredients that were strongest in prior AIMO3 experiments: simple prompts, T=1.0 generation, 8 attempts, weighted entropy, 65k context, and no large bundles of interacting heuristics.\"</p>\n  <p>Motivation: hard50 analysis showed two failure classes - <em>rerankable</em> (correct answer appears in the candidate pool but a plurality of wrong attempts shipped it) and <em>exploration</em> (correct answer never generated). Branch A targets only the first class.</p>\n</blockquote>\n<p><strong>Key changes from <code>final_submission</code>:</strong></p>\n<ol>\n<li>Quick-unanimous exit (3/3 agree) removed as over-confident on genuinely hard problems.</li>\n<li>Early stop means \"stop further generation only\" - still build full candidate table; never auto-ship solely because generation stopped early.</li>\n<li>Candidate aggregation table with support, inverse-entropy weight, mean entropy, mean Python calls/errors, Python error rate.</li>\n<li>Conservative stage-1 winner ordering: <code>support DESC → inverse-entropy DESC → mean entropy ASC → Python error rate ASC</code>.</li>\n<li>Contest detector fires when any of: top support ≤ 3; runner-up support ≥ 2; top/runner weight ratio &lt; 1.35; stage-1 winner not \"safe to ship\"; a structured nearby rival (off-by-one / off-by-two / double-half) exists.</li>\n<li>Rerank score used only inside contested handling: <code>rerank = log1p(avg_inv_entropy) − 0.15 × py_err_rate − 0.03 × log1p(mean_py_calls)</code>. Constants drawn from hard50 failure taxonomies (66 vs 69, 570 vs 285, 24 vs 25, 2000 vs 1999, 105 vs 106) and explicitly labeled \"heuristic and intentionally mild; not claimed to be optimal.\"</li>\n</ol>\n<p><strong>Execution status:</strong> The two <code>aimo3_branch_a_*</code> variants have zero outputs (never ran end-to-end). <code>aimo3-contested-resolver</code> ran 50 problems on hard50 but only logged <code>answer=X</code> per problem, never <code>pred=X actual=Y correct=bool</code>, so correctness is not inline-verifiable. Mean time 215.9 s/problem, max 710 s.</p>\n<h3>H.3 Branch A2 - Trunk + Conservative Challenger + Pairwise Resolver</h3>\n<p><strong>File:</strong> <code>aimo3_contested_resolver_conservative</code></p>\n<p><strong>Design intent (verbatim):</strong></p>\n<blockquote>\n  <p>\"The first Branch A run clarified four things: (1) Candidate tables are useful. They make it obvious when the correct answer is already in the pool. (2) The resolver is NOT reliable enough to hard-override the pipeline. In several cases the rerank or stage-1 winner was better than the resolver. (3) Single-cluster early agreement is still dangerous. Some hard problems produced 4 quick agreements on one wrong answer with no serious alternative exploration. (4) The reranker is better used to nominate a challenger than to become the final answer.\"</p>\n</blockquote>\n<p><strong>Key changes from Branch A:</strong></p>\n<ol>\n<li>Single-cluster challenge mode: if generation stops early with only one candidate, run up to two extra challenge attempts (one diversity-oriented, one exact-check-oriented), each with a hard cap.</li>\n<li>Stricter <code>safe_to_ship</code>: requires single-cluster challenge to have passed when applicable.</li>\n<li>Suspicion-based contested detector: does not trigger on one weak signal alone; accumulates a suspicion score from multiple evidence sources.</li>\n<li>Rerank only nominates a challenger (never auto-ships).</li>\n<li>Pairwise resolver: compares only incumbent vs challenger; forbidden to invent a third answer; may flip only if it explicitly chooses the challenger; if undecided or chooses incumbent, keeps incumbent.</li>\n<li><code>safe_weight_share = 0.70</code> - explicitly labeled \"heuristic, not hidden-set tuned, not paper-derived optima.\"</li>\n</ol>\n<p><strong>Execution status:</strong> Same as <code>aimo3-contested-resolver</code> - ran 50 problems on hard50 but without per-problem correctness logging. The outputs are byte-identical to the earlier contested-resolver run (same output hash), suggesting this notebook saved the same run's outputs without re-executing.</p>\n<h3>H.4 Branch A3 - Trunk + Closure-Aware Challenge + Dual-Check Flip Gate</h3>\n<p><strong>Files:</strong> <code>aimo3_A3_1_clean_multicell</code>, <code>aimo3_A3_2_candidategen_multicell</code>, <code>aimo3_A3_2_patch_multicell</code></p>\n<p><strong>Design intent (verbatim from markdown cell):</strong></p>\n<blockquote>\n  <p>\"Preserve the stable baseline generator while making post-generation decisions much more conservative and closure-aware. <strong>The design is intended for AIMO3 itself, not for hard50-only optimization.</strong>\"</p>\n</blockquote>\n<p><strong>Key changes from Branch A2:</strong></p>\n<ol>\n<li>Do NOT stop an attempt at the first <code>\\boxed{}</code> - collect all boxed integers seen in an attempt and use the LAST one; record box instability signals (multiple boxed values, box_changed flag, last-box position). Targets premature-boxing / double-counting / off-by-one failures.</li>\n<li>De-anchored single-cluster challenge: if only one answer cluster exists, run two fresh-from-scratch extra attempts - (a) diverse solve with no incumbent mentioned, (b) closure-audit solve with no incumbent mentioned. Both prompts explicitly remind the model to check symmetry, ordered-vs-unordered counting, endpoint inclusion, and final-step closure before boxing.</li>\n<li>Strict safe-to-ship: safe only if exactly one candidate remains after challenge, support is strong, and the cluster is box-stable.</li>\n<li>Challengers must have support ≥ 2 (unless stage-1 support ≤ 2) - prevents noisy singleton challengers from overturning healthy incumbents.</li>\n<li>Flips require TWO independent checks: pairwise exact check (incumbent vs challenger only, cannot invent a third answer) AND an independent fresh audit (solve from scratch without seeing the candidates). Flip only if both checks agree on the challenger.</li>\n<li>Time discipline preserved: hard problems still get up to 900 s; extra auditing capped and skipped when time is tight.</li>\n</ol>\n<p><strong>Constants explicitly labeled:</strong> \"not hard50-fit coefficients. They are conservative priors chosen from observed failure classes.\"</p>\n<p><strong>Execution status:</strong> All three A3 notebooks have zero outputs. Never executed end-to-end.</p>\n<h3>H.5 Branch B - Trunk + Pairwise-Authorized Arbitration + Bounded Checks</h3>\n<p><strong>Files:</strong> <code>aimo3_branch_B_fixed</code>, <code>aimo3_branch_B_updated</code>, <strong><code>aimo3_branch_B_multicell</code></strong></p>\n<p><strong>Design intent (verbatim from markdown cell):</strong></p>\n<blockquote>\n  <p>\"Preserve the stable AIMO3 generator while making post-generation arbitration stricter and more faithful to the candidate pool. <strong>This branch is intended for AIMO3-level problems, not hard50-only tuning.</strong>\"</p>\n</blockquote>\n<p><strong>Key changes:</strong></p>\n<ol>\n<li><strong>Pairwise becomes the only component that can authorize a challenger flip.</strong></li>\n<li>Pressure becomes a challenger stress-test / veto, not an independent flip engine.</li>\n<li>Audit remains candidate-bounded and can only confirm or veto a pairwise-authorized challenger.</li>\n<li>Narrow strong-challenger override: allowed only when pairwise already picked the challenger AND the incumbent does not dominate support.</li>\n<li>Challenge-created rivals still force escalation, but adjacency / double-half only trigger extra checking, not easier flips.</li>\n<li>Trace writing remains non-fatal; final cell zips the trace folder for download.</li>\n</ol>\n<p><strong>Execution status - this is the one verified data point:</strong></p>\n<ul>\n<li><code>aimo3_branch_B_multicell</code>: <strong>Completed a full 50-problem hard50 run.</strong> 27 correct, 23 wrong, <strong>27/50 = 54.0%</strong>. Total wall-clock: 194.4 min. Mean time per problem: 233.3 s, median 188 s, max 659 s, min 27 s. 10 problems took ≥ 400 s. <strong>Zero problems hit the 900 s cap</strong> - the 27/50 is not a timeout artifact, it reflects actual answer quality on the hard50 distribution. All per-problem <code>[EVAL]</code> lines with <code>pred</code>, <code>actual</code>, <code>correct</code>, and <code>cumulative</code> are preserved inline in the notebook outputs.</li>\n<li><code>aimo3_branch_B_fixed</code>, <code>aimo3_branch_B_updated</code>: Share stale identical outputs with <code>aimo3_branch_C_final</code> from a Colab run with trace timestamp <code>20260409_092715</code>, truncated at problem 30, cumulative 19/29 (65.5%). Different code bodies, same saved outputs - we cannot attribute the 19/29 to any specific architecture.</li>\n</ul>\n<p><strong>Figure 9 in the main paper is based on the Branch B multicell run.</strong></p>\n<h3>H.6 Branch C - Controller + Code Rescue + Provenance-Aware Arbitration</h3>\n<p><strong>Files:</strong> <code>aimo3_branch_C_final</code>, <code>aimo3_branch_C_c2</code>, <code>aimo3_branch_C_trust_patch</code>, <code>aimo3_branch_C_fixed2</code></p>\n<p><strong>Design intent (verbatim from <code>CFG</code> docstring):</strong></p>\n<blockquote>\n  <p>\"Branch C keeps the stable Branch B generator and pairwise-centered arbitration, but adds four portable ideas motivated by the AIMO2 analysis and the recent Branch B traces…\"</p>\n</blockquote>\n<p><strong>Key changes from Branch B:</strong></p>\n<ol>\n<li><strong>Convergence / divergence / broken-state controller</strong> - after the first few attempts, detect whether the candidate pool has already converged, fragmented, or broken (invalid-heavy / no useful generation). Stop spending more budget on repeated plain-text attempts when the pool is obviously converged or broken.</li>\n<li><strong>Targeted code rescue</strong> - when the pool is broken, fragmented, or definition-ambiguous, switch to an exact tool-backed rescue path rather than more of the same text sampling.</li>\n<li><strong>One-step code repair</strong> - if the rescue path reaches Python but fails to finish cleanly, one repair attempt that fixes the prior code / extraction instead of restarting.</li>\n<li><strong>Provenance-aware weighting</strong> - candidates supported by multiple evidence modes (main pool, challenge, code rescue, repair) are stronger than plain text-only singleton rivals. Verifier-only candidates are kept weak unless also supported elsewhere.</li>\n<li>Pairwise remains the main discriminator; audit is weakened when pairwise + pressure already align.</li>\n<li>Larger reserve and lighter verification spending to protect tail problems.</li>\n</ol>\n<p><strong>Execution status:</strong> <code>C_final</code> shares stale outputs with <code>B_fixed/B_updated</code> (see H.5 caveat). <code>C_c2</code>, <code>C_trust_patch</code>, and <code>C_fixed2</code> have zero outputs - never executed end-to-end. No new verifiable score.</p>\n<h3>H.7 Branch C+ - Trusted Main-Pool Arbitration + Routed Micro-Prompts + Typed Verifiers</h3>\n<p><strong>File:</strong> <code>aimo3_branch_C_plus_final</code></p>\n<p><strong>Design intent (verbatim from <code>CFG</code> docstring):</strong></p>\n<blockquote>\n  <p>\"Design constraints: <strong>This branch is intended for AIMO3-level problems, not hard50-only tuning.</strong> Pairwise remains the main discriminator in binary contests. Audit is weakened relative to Branch B when pairwise + pressure already align. Tail problems are protected by a larger reserve and by lighter verification spending on already-settled problems.\"</p>\n</blockquote>\n<p><strong>Key changes:</strong> Inherits the full Branch C controller + code rescue + repair + provenance weighting, then adds:</p>\n<ul>\n<li>Trusted main-pool arbitration: the main pool is trusted more strongly; other stages become confirmatory.</li>\n<li>Routed micro-prompts: short targeted prompts routed by inferred failure class.</li>\n<li>Typed verifiers: verifiers specialized for specific failure classes observed in earlier traces.</li>\n</ul>\n<p>This is the most elaborate architecture in the 15-branch catalog.</p>\n<p><strong>Execution status:</strong> Zero outputs. Authored but never executed to completion.</p>\n<h3>H.8 What the catalog tells us about our workflow</h3>\n<p>Of 15 offline research branches authored over the course of the competition:</p>\n<ul>\n<li><strong>1 produced a verified inline-graded hard50 score</strong> (Branch B multicell: 27/50, 54%)</li>\n<li><strong>2 ran 50 problems without correctness logging</strong> (contested resolver A / A2 - no verifiable score)</li>\n<li><strong>3 share stale outputs from one truncated Colab session</strong> (B_fixed, B_updated, C_final - 19/29 ambiguous attribution)</li>\n<li><strong>9 were authored but never executed to completion</strong> (the two <code>branch_a</code> variants, all three A3 notebooks, C_c2, C_fixed2, C_trust_patch, C_plus_final)</li>\n</ul>\n<p>In other words, <strong>60% of our offline research architecture never produced a single hard50 data point</strong>. The ones that did were either non-graded (40% of the remaining six) or attribution-ambiguous (50% of the remaining six). We learned a lot from reading the traces and tuning heuristics, but we did not run a clean offline benchmark loop, and the result was that the only number we can defend in this paper is the one Branch B multicell saved inline. The methodological finding in Section 4 stands on that single data point plus the nine \"intended for AIMO3, not hard50\" design-intent statements preserved verbatim above.</p>\n<p>The full verbatim docstrings and markdown cells quoted in this appendix are reproduced from the actual <code>.ipynb</code> files and can be verified byte-for-byte against the notebook sources supplied with this writeup.</p>\n<h2>---</h2>\n<h1>Streamlined branch naming guide</h1>\n<p>For consistency in this writeup, the team's notebook history has been mapped to canonical names. The mapping is as follows:</p>\n<table>\n<thead>\n<tr>\n<th>Canonical name (used in writeup)</th>\n<th>Kaggle notebook name &amp; version</th>\n<th>Submitted?</th>\n<th>Score(s)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Final submission</strong></td>\n<td><code>final_submission v2</code></td>\n<td>Yes (×9)</td>\n<td>39, 40, 40, 40, 41, 41, 41, 42, 43</td>\n</tr>\n<tr>\n<td><strong>42-notebook fork (V11)</strong></td>\n<td><code>base_submission v2</code></td>\n<td>Yes (×1)</td>\n<td>33</td>\n</tr>\n<tr>\n<td><strong>GRPO submission</strong></td>\n<td><code>[15/15] AIME 2026 I 120b in 20mins v4_grpo</code></td>\n<td>Yes (×1)</td>\n<td>13</td>\n</tr>\n<tr>\n<td><strong>Adaptive router</strong></td>\n<td><code>AIMO3_Adaptive_Router_Confidence_Vote_v1</code></td>\n<td>Yes (×1)</td>\n<td>28</td>\n</tr>\n<tr>\n<td><strong>5-stage AIME scaffold</strong></td>\n<td><code>[15/15] AIME 2026 I 120b in 20mins v3</code></td>\n<td>Yes (×2)</td>\n<td>35, 38</td>\n</tr>\n<tr>\n<td><strong>Strategy-prompt family</strong></td>\n<td><code>aimo3_final v7 / v9 / v22</code></td>\n<td>Yes (×5)</td>\n<td>36, 37, 37, 37, 36</td>\n</tr>\n<tr>\n<td><strong>UNDERSTAND/EXPLORE adaptive</strong></td>\n<td><code>aimo3_adaptive _v4</code></td>\n<td>Yes (×1)</td>\n<td>34</td>\n</tr>\n<tr>\n<td><strong>Multi-temperature tester</strong></td>\n<td><code>aimo_tester v2</code></td>\n<td>Yes (×1)</td>\n<td>34</td>\n</tr>\n<tr>\n<td><strong>Early iteration</strong></td>\n<td><code>aimo3_final v3</code></td>\n<td>Yes (×2)</td>\n<td>39, 34</td>\n</tr>\n<tr>\n<td><strong>Debug / temp tweaks</strong></td>\n<td><code>aimo3_final v4_tweaked_temp&amp;model</code>, <code>v5_tweaked_temp</code></td>\n<td>Yes (×2)</td>\n<td>11, 0</td>\n</tr>\n</tbody>\n</table>\n<p>The name <code>final_submission v2</code> is preserved as-is per team preference. Submissions earlier than 25 days before writeup (3 × <code>submission.parquet</code> uploads at score 0) and one notebook exception (<code>aimo_check v4</code>) are excluded from analysis.</p>\n<hr>\n<p><em>End of writeup. All scores are from the public AIMO3 leaderboard. Configurations are reproduced from the verbatim source code of each submitted notebook. The GRPO telemetry CSV (190 rows) is provided as a supplementary artifact alongside this writeup.</em></p>\n<h2>References</h2>\n<ol>\n<li><p>S. Frieder et al., \"AI Mathematical Olympiad - Progress Prize 3,\" Kaggle Competition, 2025. <a href=\"https://kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3\" target=\"_blank\">https://kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3</a></p></li>\n<li><p>I. Moshkov et al., \"AIMO-2 Winning Solution: Building State-of-the-Art Mathematical Reasoning Models with OpenMathReasoning Dataset,\" arXiv:2504.16891, 2025.</p></li>\n<li><p>P. Mali, \"Scaling Inference-Time Compute for Mathematical Reasoning,\" AIMO3 Writeup, Kaggle, 2026. <a href=\"https://www.kaggle.com/code/pawanmali/chasing-47-50-aimo3-journey-of-60-experiments\" target=\"_blank\">https://www.kaggle.com/code/pawanmali/chasing-47-50-aimo3-journey-of-60-experiments</a></p></li>\n<li><p>N. Nitarach, \"Model Capability Dominates: Inference-Time Optimization Lessons from AIMO 3,\" arXiv:2603.27844, 2026.</p></li>\n<li><p>X. Wang et al., \"Self-Consistency Improves Chain of Thought Reasoning in Language Models,\" ICLR, 2023.</p></li>\n<li><p>W. Kwon et al., \"Efficient Memory Management for Large Language Model Serving with PagedAttention,\" SOSP, 2023.</p></li>\n<li><p>OpenAI, \"gpt-oss-120b Model Card,\" 2025. <a href=\"https://huggingface.co/openai/gpt-oss-120b\" target=\"_blank\">https://huggingface.co/openai/gpt-oss-120b</a></p></li>\n</ol>",
      "rawMarkdown": "# A Negative-Results Report on Inference and Fine-Tuning Interventions for gpt-oss-120b on AIMO3\n\n**Team:** flamingice (solo) · **Competition:** AI Mathematical Olympiad - Progress Prize 3 · **Submission for the Writeup Prize**\n\n---\n\n## Abstract\n\nWe report a negative-results-dominated investigation of inference-time and training-time interventions for `gpt-oss-120b` on the AIMO3 competition. Our private-leaderboard submission, `final_submission v2`, achieved a public-leaderboard mean of **40.78** (σ = 1.20, n = 9 identical runs, best 43) and a **private-leaderboard score of 41.5/50** using parallel self-consistency over 8 attempts with a 5-component weighted-entropy voting function and a one-sentence system prompt. We submitted **25 successful runs across 11 distinct notebook configurations** over 25 days. With one exception, every architectural addition we attempted - multi-strategy prescriptive prompts, structured 5-stage scaffolding, subject-routed multi-stage arbitration with verifier/GenSelect/adversarial passes, and GRPO LoRA fine-tuning - either fell *within* run-to-run noise or fell *catastrophically* below it. The most expensive failure (≈$300 of B200 GPU time on GRPO experiments) is documented with 190 rows of training telemetry and traces to a known Unsloth `merged_4bit_forced` → vLLM MXFP4 deployment pipeline incompatibility. Our central methodological contribution is the **noise floor**: with σ = 1.20 across identical runs, any apparent improvement smaller than ≈2.4 points cannot be distinguished from running the same notebook twice. We argue that for inference-constrained math competitions, this noise dominates almost all engineering decisions, and that future participants should establish their own variance baselines *before* iterating on architecture.\n\n---\n\n## 1. Introduction\n\nThe AIMO3 competition required solving 50 private-set olympiad-level problems with non-negative integer answers in [0, 99999], inside a single Kaggle notebook constrained to **≈5 hours of H100 GPU time**. The runtime constraint transforms the optimization target: the goal is not \"maximize per-problem accuracy\" but \"maximize the joint expectation of accuracy and successful completion under a wall-clock cliff.\" This distinction kills nearly every intuition borrowed from offline pass@*N* experiments.\n\n`gpt-oss-120b` (released in 2025, 117B total parameters with ≈5.1B active per token via mixture-of-experts, native MXFP4 weights) is strong enough on olympiad math that the AIMO3 leaderboard is plausibly bottlenecked by inference orchestration rather than reasoning capacity. Public community notebooks built on `gpt-oss-120b` were reported to score in the high 30s and low 40s out of 50 with relatively simple self-consistency setups. Against that background, our research question was: **starting from a strong base model, where do additional engineering investments actually move the score?**\n\nWe tested four classes of intervention:\n\n1. **Prompt engineering** - prescriptive multi-strategy prompts and structured 5-stage scaffolds (UNDERSTAND → EXPLORE → PLAN → EXECUTE → VERIFY).\n2. **Inference-time orchestration** - adaptive routing, multi-stage solving, posterior voting, GenSelect, adversarial verification.\n3. **More attempts** - pushing N from 8 to 12.\n4. **Reinforcement learning** - GRPO LoRA fine-tuning with a custom vLLM + Unsloth training loop.\n\nEvery one of them either left the score within statistical noise of where we started, or made it dramatically worse. The single intervention that produced a stable mean above the noise floor was a **5-component weighted entropy formula** for self-consistency voting, combined with deliberate stripping of every other piece of scaffolding. This paper documents what we tried, why we tried it, and - more importantly - why the things that didn't work didn't work.\n\n**Reproducibility note.** All code, prompts, and configurations are reported exactly as run. The full submission history (Appendix C), the GRPO training telemetry CSV (Appendix D), the offline research branch catalog (Appendix H), and the verbatim source of every notebook discussed here are available with this writeup.\n\n---\n\n## 2. The submission landscape\n\nWe made **25 successful submissions across 11 notebook configurations** between competition entry and the April 15 deadline. Figure 1 shows the chronological trajectory.\n\n![Figure 1: Leaderboard trajectory across 25 submissions](https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig1_leaderboard_trajectory.png)\n\nThree structural features of this trajectory motivate the rest of the paper:\n\n**The ramp-and-plateau shape.** Scores rise from the high 20s to the high 30s as obvious bugs are removed, then plateau in a narrow band centered around 40 with substantial variance. No single architectural change moves us *out* of this band on the upside.\n\n**The catastrophic dips.** Three submissions fall well below the band: GRPO at 13, the adaptive router at 28, and the V11 timeout at 33. Each represents a different failure mode (deployment pipeline corruption, time-budget collapse from per-problem complexity, raw wall-clock overrun). All three are documented in detail below.\n\n**The final cluster.** The last nine submissions on the right are repeated runs of `final_submission v2` - the same notebook, the same seed, the same code - submitted to measure run-to-run variance. They span 39 to 43 with a mean of 40.78 and σ = 1.20.\n\nThis last cluster is the load-bearing observation of the entire writeup. We turn to it next.\n\n---\n\n## 3. The noise floor\n\nWe submitted `final_submission v2` nine times without modification. The scores were:\n\n> **39, 40, 43, 40, 42, 40, 41, 41, 41**\n\nMean = 40.778. Median = 41. σ = 1.202. Range = 4 points. 95% CI for the mean = [39.85, 41.70]. Figure 2 shows the distribution.\n\n![Figure 2: Run-to-run variance establishes the noise floor](https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig2_score_distribution.png)\n\nThis variance has two sources we cannot fully separate. First, the gpt-oss-120b decoder produces non-deterministic output even with a fixed seed, because the parallel attempts are issued asynchronously to a vLLM server whose batching schedule depends on real-time CUDA kernel timing and KV-cache state. Second, Kaggle's grading is deterministic but the scheduling of which problems hit which attempt order is not. Whatever the underlying mechanism, **the operationally relevant fact is that nine runs of identical code spanned four points**.\n\nThe implication for our research methodology is severe and one-directional:\n\n> **Any single comparison between two notebooks that differs by less than ≈2σ ≈ 2.4 points is statistically indistinguishable from running the same notebook twice.**\n\nIn retrospect, the most important methodological mistake we made early in the competition was treating single-shot leaderboard scores as ground truth. When `aimo3_final v9` returned 37 three times in a row and `[15/15] AIME v3` returned 35 and 38, we read those as meaningful differences and chased the apparent winner. They are not meaningful differences. They are draws from the same noisy distribution.\n\nWe did not realize this until the final week, when a deliberate variance experiment on the converged notebook produced the n = 9 distribution above. Had we run such an experiment on day one, we would have saved ≈$300 of GPU spend and three weeks of architectural iteration. **This is recommendation #1 of the paper: future AIMO3-style participants should establish a noise floor before iterating on architecture.**\n\n---\n\n## 4. Offline evaluation on hard50\n\nThroughout the competition we maintained an offline evaluation loop against the Kaggle community dataset **`hard_50_math_problems_set_v6.csv`** (published by user `zfturbo` as `hard-math-problems-for-aimo-3`) - a 50-problem benchmark of olympiad-level questions with known integer answers. Offline evaluation served as a debugging sanity check and as a relative-performance gauge for architectures we were not yet willing to spend a submission slot on.\n\nWe authored **15 offline research branches** during the competition, organized into five families, each targeting a specific failure class observed in earlier runs:\n\n- **Branch A / A2 (contested resolver)** - trunk + candidate aggregation table + pairwise resolver. Motivation: hard50 showed that many wrong answers were *rerankable* - the correct answer was in the candidate pool but a weak plurality of wrong attempts shipped it. Heuristic constants were drawn from observed failure patterns (66 vs 69, 570 vs 285, 24 vs 25, 2000 vs 1999, 105 vs 106).\n- **Branch A3 (closure-aware challenge + dual-check flip gate)** - collect *all* boxed integers in an attempt and use the last to defend against premature boxing; flips require two independent checks. Authors explicitly noted A3 was \"*intended for AIMO3, not hard50-only optimization.*\"\n- **Branch B (pairwise-authorized arbitration)** - pairwise becomes the only component that can authorize a challenger flip; pressure and audit become veto layers only.\n- **Branch C (controller + code rescue + provenance-aware weighting)** - state controller that stops spending budget on already-converged or broken pools; code rescue for broken pools; candidates supported by multiple evidence modes weigh more than plain-text singletons.\n- **Branch C+ (trusted main-pool arbitration + routed micro-prompts + typed verifiers)** - the most elaborate research branch. Authors again stated it was \"*intended for AIMO3-level problems, not hard50-only tuning.*\"\n\n**None of these 15 branches were ever submitted to the Kaggle leaderboard.** Of the 15, **nine were never executed to completion** due to infrastructure and wiring bugs. Two contested-resolver branches ran 50 problems on hard50 but never logged per-problem correctness. Three Branch B/C variants share a single stale truncated run (cumulative 19/29 at problem 30) that we cannot attribute to a specific architecture because the three notebooks have different code but identical saved outputs from one Colab session. **One notebook - `aimo3_branch_B_multicell` - completed a full, inline-graded 50-problem hard50 run.** That is the only offline number we can cite with full verification. Full per-branch execution status is catalogued in Appendix H.\n\n**Branch B multicell on hard50: 27/50 (54.0%), mean 233 s/problem, total 194 min.** Figure 9 shows the per-problem timing (top) and cumulative accuracy (bottom). No problem hit the 900 s cap; the run finished comfortably inside a notional 5-hour budget at 3.24 h total.\n\n![Figure 9: Branch B multicell full hard50 run](https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig9_branch_b_hard50.png)\n\nAccuracy begins at 100% after problem 2, collapses to the mid-60s by problem 10, and bleeds out to 54% by problem 50. The architecture looked competitive early and degraded on the harder back half. Since no problem timed out, 27/50 reflects answer quality, not budget exhaustion.\n\n**Interpretation is constrained.** Branch B multicell's elaborate pairwise-arbitration architecture scored 27 on hard50; `final_submission v2` scored a mean of 40.78 on AIMO3. If hard50 difficulty were comparable to AIMO3, Branch B would project to ~27 on AIMO3 - 14 points below the simpler approach. But hard50 is not AIMO3: it is community-sourced, intentionally difficult, and may systematically underestimate AIMO3 performance - which is precisely why Branches A3 and C+ were explicitly designed \"not for hard50-only tuning.\" We also never ran a variance experiment on hard50 analogous to our n = 9 experiment, so we cannot say whether 27/50 is itself ±2 points of noise.\n\nEven with those caveats, the directional signal was clear: **our only offline-executed elaborate architecture predicted a losing Kaggle score, and the simpler baseline outperformed it.** The writeup-prize rubric asks *\"did you use any internal benchmarks?\"* - yes, but less effectively than we should have. Nine of our 15 research notebooks never finished a run; we never calibrated hard50 against AIMO3; and the one completed offline run told a story that should have killed Branch B's lineage earlier than it did. **Future participants: instrument your offline benchmark the way you instrument your leaderboard submissions, get all your research notebooks across the finish line, and run a variance experiment on the offline set before treating any single offline number as signal.** Appendix H lists all 15 branches with design intent and execution status.\n\n---\n\n## 5. The converged solution: `final_submission v2`\n\n### 5.1 Architecture\n\n`final_submission v2` is intentionally lean. It does not contain a 5-stage prompt, a router, a verifier, an adversarial pass, GenSelect, multi-strategy prescriptive prompts, or fine-tuned weights. It contains four things. First, the base model: `danielhanchen/gpt-oss-120b` served by local vLLM (KV-cache fp8_e4m3, gpu_memory_utilization 0.96, max_model_len 65,536). Second, a one-sentence system prompt: *\"You are a world-class IMO competitor. The final answer must be a non-negative integer between 0 and 99999. Place your final answer inside `\\boxed{}`.\"* The model is invoked through the openai-harmony format with `ReasoningEffort.HIGH`, the gpt-oss native reasoning control. Third, tool-augmented parallel self-consistency: 8 attempts dispatched in parallel against a pool of 16 long-lived Jupyter sandboxes (math, numpy, sympy, mpmath, itertools, collections; `mpmath.mp.dps = 64`), up to 128 harmony turns each, T = 1.0, min_p = 0.02, no top_p, per-attempt seed `(global_seed + attempt_index)²`. Streams are inspected character-by-character; an attempt short-circuits the moment a `\\boxed{...}` appears. Fourth, 5-component weighted-entropy voting (Section 5.2); when 4 attempts agree, remaining attempts are cancelled.\n\nThe time budget is computed adaptively per problem: `min(max(time_remaining − 270 × problems_remaining, 270), 900)` seconds, with `notebook_limit = 17400` (4h50m, leaving safety margin inside Kaggle's 5h cliff). Appendix A contains the full configuration.\n\n### 5.2 The 5-component weighted entropy\n\nInverse-entropy voting is a known technique: weight each attempt by 1/H, sum weights per answer, return the highest-weighted answer. The novelty in `final_submission v2` is that the entropy itself is a five-part composite over the attempt's logprob trajectory, rather than a single mean. Reading from the source:\n\n```python\nweighted_entropy = (\n    0.30 * mean_entropy\n  + 0.40 * position_weighted_entropy   # exponential decay 0.995, recent tokens dominate\n  + 0.20 * std_dev_of_entropy          # variance penalty for inconsistent confidence\n  + 0.30 * 3.0 * high_entropy_ratio    # fraction of tokens with H > 2.0 bits, scaled ×3\n  - 0.10 * (max_low_entropy_streak / n)  # bonus for sustained confident stretches\n)\n```\n\nThe intuition: position weighting with decay 0.995 means tokens near the final boxed answer count exponentially more than tokens early in the chain of thought - a solution uncertain during exploration but confident at conclusion outranks one that is confident throughout but flinches at the end. The variance penalty punishes oscillating confidence (\"the model kept changing its mind\"). The high-entropy ratio counts tokens where the next-token distribution exceeds 2 bits of Shannon entropy, and the ×3 multiplier inside a 30% weighting makes this term dominant when an attempt has many uncertain stretches. The streak bonus rewards sustained runs of < 1 bit entropy as a marker of \"the model is on a roll.\"\n\nThese weights and thresholds are not from a paper. They were tuned by hand on intermediate submissions in this competition. The core idea of inverse-entropy weighted voting was informed by [pawanmali's \"Chasing 47/50\" notebook](https://www.kaggle.com/code/pawanmali/chasing-47-50-aimo3-journey-of-60-experiments), which demonstrated entropy-based confidence weighting for self-consistency on AIMO3. We do not claim they are optimal - only that this composite produced a stable mean of 40.78 in `final_submission v2`, while simpler \"mean entropy\" voting in eight other notebooks we submitted produced means in the 33–37 region. Section 6 unpacks that comparison.\n\n### 5.3 What is *not* in `final_submission v2`\n\nFor the avoidance of doubt: `final_submission v2` does not contain the 5-stage UNDERSTAND/EXPLORE/PLAN/EXECUTE/VERIFY scaffold (tested in `[15/15] AIME v3`, scored 35 and 38), the 8 prescriptive strategy prompts from the `aimo3_final` family (five submissions, mean ~36.6), the verifier/GenSelect/adversarial scaffolding from the same family, the subject-classifier routed prompts from `aimo3_adaptive v4` (scored 34), the full adaptive router with posterior voting (scored 28), the increased attempt count from `base_submission v2` (scored 33, timed out), or the GRPO fine-tuned weights from the v4_grpo submission (scored 13, merge format mismatch). Figures 7 and 8 visualize the same information at the feature and score levels respectively.\n\n---\n\n## 6. Ablation: every intervention vs. baseline\n\nFigure 8 collects every intervention we tried as a horizontal bar chart, compared against the baseline of 39 (the first run of `aimo3_final v3`, which is the earliest non-debugging submission still in our history).\n\n![Figure 8: Ablation waterfall — every intervention vs. starting baseline](https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig8_ablation_waterfall.png)\n\nThree regions: **inside the noise band** - early `aimo3_final` iterations, the multi-strategy prompt family, and the 5-stage scaffold sit within ±2σ of the 39 baseline and are indistinguishable from starting fresh (the strategy-prompts family was tested in five submissions and never broke out). **Below the noise band** - the structured-scaffold-plus-classifier branch (−5), V11 timeout (−6), the router with GenSelect/adversarial pass (−11), and GRPO (−26); all real failures with identifiable causes that Section 7 dissects. **Above the noise band** - only `final_submission v2` at +1.78, with the lower bound of its 95% CI (39.85) itself above baseline. It is the *only* intervention in the entire competition with statistically defensible upward movement.\n\nFigure 7 makes the same point feature-by-feature. Each row is a notebook, each column a feature; checkmarks indicate presence.\n\n![Figure 7: Feature presence across 11 submitted notebooks](https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig7_feature_comparison.png)\n\n`final_submission v2` (top row) has *fewer* features than every other notebook except the most basic, and is the only one with the 5-component weighted entropy. Notebooks with strategy prompts cluster around 36–37; notebooks with verifier/GenSelect/adversarial scaffolding cluster around 28–37; the router is at 28; GRPO at 13. Adding architecture moved us downward; subtracting it and replacing the voting function moved us upward. The honest causal claim we can make is that **stripping the scaffolding AND replacing the voting function with 5-component weighted entropy together produced a defensible improvement above noise**. We cannot say which change was load-bearing on its own - that would require an isolated ablation we did not run before the deadline.\n\n---\n\n## 7. Failed interventions, in detail\n\n### 7.1 Multi-strategy prescriptive prompts (V10 family, scored 36–37)\n\nThe `aimo3_final` v7/v9/v22 family launches eight parallel attempts, each with a different prescriptive system prompt instructing the model to use a specific mathematical technique - *analytic, computational, small-cases, work-backwards, algebraic, modular, geometric, random-testing-and-verification*. The hypothesis was that prompt-induced strategy diversity would produce a more diverse candidate pool for self-consistency voting to exploit, extending the DIPPER intuition that framing diversity beats temperature diversity alone.\n\nIt failed because `gpt-oss-120b` at `ReasoningEffort.HIGH` complies with prescribed techniques even when they are poorly suited - a geometry problem given a \"modular arithmetic\" prompt produced attempts that contorted themselves toward modular methods and failed. The base model already selects appropriate techniques at T = 1.0; external prescription overrides this selection in the wrong direction about as often as the right one. Across five submissions, the mean was approximately 36.6 - Δ ≈ −2.4 vs. baseline, just inside the lower noise edge but directionally negative. The methodological distinction we carried forward: prescribing solution *content* hurts, prescribing reasoning *form* (Section 7.2) is roughly neutral.\n\n### 7.2 5-stage structured scaffold (`[15/15] AIME v3`, scored 35 and 38)\n\nThe `[15/15] AIME 2026 I 120b in 20mins` notebook v3 uses the full 5-stage UNDERSTAND → EXPLORE → PLAN → EXECUTE → VERIFY scaffold popular in CoT prompting research, with a verbose ~1500-character system prompt detailing reasoning principles and verification requirements. The hypothesis was that even a strong base model would benefit from being forced to plan before executing.\n\nThe two submissions scored 35 and 38 - squarely inside the ±2σ noise band of baseline. We cannot reject the null hypothesis that the scaffold has zero effect on `gpt-oss-120b`. A plausible explanation is that `ReasoningEffort.HIGH` already imposes a reasoning structure that the prompt-level scaffold duplicates without adding signal. **Technique transfer from smaller-model prompting research does not automatically apply to gpt-oss-120b at high reasoning effort.**\n\n### 7.3 The adaptive router (`AIMO3_Adaptive_Router_Confidence_Vote_v1`, scored 28)\n\nA multi-stage system: a subject classifier routed each problem to one of four prompt families (geometry, number theory, combinatorics, algebra); a \"quick stage\" issued 2 cheap attempts (T = 0.55 and 0.80, max 2200 tokens, 24 turns); if those agreed with high posterior confidence, return immediately, otherwise an \"explore stage\" issued more attempts at higher temperature with longer budgets; weak candidates were routed through verifier, GenSelect, and adversarial passes; `high_problem_timeout = 840` s per problem. The hypothesis was the standard one: easy problems should consume little budget, hard problems more; an adaptive system should outperform a flat-budget system under heterogeneous difficulty.\n\nIt failed structurally. The first problem consumed 840 s. The second consumed approximately 825 s. The router had burned 28% of the entire 5-hour notebook budget on two problems, and the remaining 48 problems shared the rest. Many timed out or returned 0. Final score: 28 - fully twelve points below baseline, the second-largest single-intervention drop in the competition. The router's adaptive logic correctly identified problems 1 and 2 as hard and allocated them more time; it then found nothing useful in the extra time. The correct behavior under those conditions is to give up early and conserve budget for problems where extra time might actually help - we did not implement that. A v2 with reduced timeouts reached 19/30 on an offline slice but we did not submit it; the converged `final_submission v2` was already outperforming it. **Adaptive complexity is only valuable when the marginal value of extra time on a hard problem is positive. For hard olympiad problems in the AIMO3 distribution against gpt-oss-120b, that marginal value appears to be approximately zero past 5–6 minutes.**\n\n### 7.4 More attempts on stock weights (`base_submission v2`, scored 33)\n\nThis is the team's fork of the public `AIMO 3 | GPT-OSS-120B (with tools)` notebook (\"the 42-notebook\" in community discussion), with three modifications: `attempts` raised from 8 to 12, `early_stop` raised from 4 to 5, and a \"Be concise. Stop immediately after `\\boxed{}`\" instruction added. The notebook also uses the stock OpenAI `gpt-oss-120b` weights rather than Daniel Hanchen's variant. Hypothesis: more samples → stronger voting → higher score, up to the point where the time budget binds.\n\nIt exceeded the 5-hour budget. Twelve attempts × 50 problems with a verbose chain-of-thought trajectory pushed total runtime past the cliff; problems processed after timeout returned 0. Final score: 33. The experiment is **confounded** because we changed three variables at once and cannot cleanly attribute the −6 to \"more attempts\" alone. Operational lesson: **if you push N upward, run a wall-clock experiment first, and budget for the slowest model variant.**\n\n### 7.5 GRPO LoRA fine-tuning ([15/15] AIME v4_grpo, scored 13)\n\nThis is the largest and most expensive negative result in the writeup, and the most generally useful for the community. We approached it in two phases.\n\n**Phase A: TRL GRPOTrainer (collapsed at step 16, $101.73 sunk).** Our first attempt used Hugging Face TRL's `GRPOTrainer` with Unsloth on a RunPod B200 ($5.03/hr). Configuration: LR 5e-6, max_grad_norm 1.0, β = 0.0, 8 generations per problem, `use_vllm=False` (because TRL's vLLM integration crashed at startup against gpt-oss-120b). Each step took ≈76 minutes. The training collapsed:\n\n- Step 1: loss 0.0513, reward 0.375.\n- Steps 8–9: KL divergence to reference policy reached **87**, gradient norm reached **133**.\n- Step 13: peak reward 0.5625 - but loss had already climbed to 280.\n- Step 16: loss reached **19,751,736**. Model destroyed. Killed.\n\nFigure 6 shows the trajectory.\n\n![Figure 6: TRL GRPOTrainer collapse on Unsloth + gpt-oss-120b](https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig6_trl_collapse.png)\n\nThe diagnosis is straightforward: LR 5e-6 was too aggressive for an MoE model at 117B parameters, and `max_grad_norm` 1.0 was too loose to clip the gradient explosions that began once the policy started drifting from the reference.\n\n**Phase B: Custom vLLM + Unsloth loop (v6) - trained stably, deployed catastrophically.** We rebuilt the training loop from scratch to avoid TRL's vLLM integration: each cycle launched vLLM with the current adapter, generated 8 completions per problem for 5 problems, killed vLLM to free GPU memory, applied a GRPO update via Unsloth, saved the adapter, restarted. We tightened the configuration substantially (LR 2e-6 with cosine decay, max_grad_norm 0.3, Dr.GRPO advantage normalization, DAPO-style overlong filtering, binary reward, β = 0, off-policy generation with vLLM on the base model and adapter trained separately; see Appendix B for the full config).\n\nWe have telemetry for **190 problems across 38 cycles** (cycles 62–99, problems 310–499). The training was **stable** - zero loss collapses, loss values mostly in [0, 0.3], gradient norms cleanly bounded by the 0.3 clip. Figure 3 shows the per-cycle reward trajectory:\n\n![Figure 3: GRPO v6 reward trajectory](https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig3_grpo_reward_trajectory.png)\n\nThe reward signal tells the second half of the story. The overall mean reward across all 190 problems was **+0.033** - barely above zero, after 38 cycles of training. Only **4 problems out of 190 (2.1%)** achieved reward 1.0 (all 8 generations correct): problems 329, 333, 379, 468. Three of those four had near-zero completion length, suggesting trivially short correct answers. Figure 5 shows the full reward distribution:\n\n![Figure 5: GRPO v6 problem-level reward distribution](https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig5_grpo_reward_histogram.png)\n\nForty-seven percent of training problems received net negative reward. Eighteen percent received exactly zero (all 8 generations wrong, or all 8 right) - these are filtered from the gradient by Dr.GRPO's advantage normalization, contributing nothing. Thirty-three percent were partial wins. Only 2% were complete wins. This is the hardest possible shape for GRPO: the model is below 50% on the training distribution, and the reward signal is sparse and noisy. Even a stable training loop cannot extract much policy improvement from this.\n\n**The deployment failure.** We merged the trained adapter using Unsloth's `merged_4bit_forced` method. The submission scored **13/50** - a 27-point drop from baseline. The root cause is a **quantization format mismatch**: `gpt-oss-120b`'s native weight format is **MXFP4** (E2M1 with E8M0 block scaling), but `merged_4bit_forced` produces **BitsAndBytes NF4**. vLLM routes the merged weights through its BitsAndBytes loader rather than the MXFP4 kernels, producing severely degraded output. The fix - which we discovered post-mortem from Unsloth documentation and vLLM GitHub issues #19361 and #21932 - is to merge with `merged_16bit` or save with `save_method=\"mxfp4\"`. A community member elsewhere in the AIMO3 forum reportedly spent **$500** on SFT+RL with a similar pipeline and scored 36, attributing it to the same issue. We spent approximately **$300** total on GRPO across all phases (Figure 4): TRL crash $102, v1–v5 debugging $100, v6 $62, idle $40.\n\n![Figure 4: GRPO v6 cumulative compute cost](https://raw.githubusercontent.com/utkarshsharma00/aimo3/main/figures/fig4_grpo_cost.png)\n\nThe actionable takeaway: **never use `merged_4bit_forced` to deploy a fine-tuned `gpt-oss-120b` LoRA to vLLM.** Use `merged_16bit`, `save_method=\"mxfp4\"`, or NVIDIA's QAT pipeline.\n\n---\n\n## 8. Comparison with state of the art\n\nWe benchmarked exclusively against the open-weight setting because that is what AIMO3's hardware budget allows. The relevant SOTA points are:\n\n- **AIMO2 winner (NemoSkills, 2025):** 34/50 on 4×L4 GPUs, using a Qwen2.5-14B model fine-tuned on 540K custom problems with 3.2M CoT solutions and 1.7M tool-integrated reasoning traces, plus GenSelect at inference time. Documented in arXiv:2504.16891.\n- **Public community baselines on `gpt-oss-120b` for AIMO3:** Reported in the high 30s to low 40s with simple self-consistency setups.\n- **Our submission:** 40.78 mean (n=9, σ=1.20, best 43) with no fine-tuning, no scaffolding, and a 5-component weighted entropy voting function.\n- **The top of the AIMO3 public leaderboard at writeup time:** ≥46/50, presumably achieved through inference acceleration (EAGLE-3 speculative decoding has been discussed publicly), correct fine-tuning pipelines that avoid the MXFP4 mismatch, or both.\n* The top of the AIMO3 public leaderboard at writeup time: ≥46/50, presumably achieved through inference acceleration (EAGLE-3 speculative decoding has been discussed publicly), correct fine-tuning pipelines that avoid the MXFP4 mismatch, or both.\n\nThe host shared pass@N analysis on X showing gpt-oss-120b achieves pass@8 ≈ 44 and pass@20 ≈ 45.5 on the private set (95% CI [43, 48]), indicating that the correct answer appears in at least one of 8 attempts for approximately 44 of 50 problems. Our mean of 40.78 implies we correctly select the right answer from the pool approximately 93% of the time (40.78/44), with the remaining ~3 problems per run representing pure selection loss.\n\nThe structural shift from AIMO2 to AIMO3 is striking. AIMO2 was won by a team that invested heavily in training-time compute and produced a 14B-parameter model that scored 34. AIMO3 allows H100 hardware, which makes `gpt-oss-120b` runnable, and the *unmodified* base model with a sensible voting function reaches 40.78 - six points above the AIMO2 winner with zero training-time investment. **Base model capability dominates the AIMO3 landscape in a way it did not dominate AIMO2.** Our negative GRPO result is consistent with this: training-time interventions face an uphill battle against a base model that is already near the ceiling of the inference-constrained accuracy distribution.\n\nWe did not benchmark against commercial models (GPT-4, Claude, Gemini) because the AIMO3 rules require self-contained Kaggle notebook execution and commercial API calls are not permitted in the competition pipeline. \n \n\n---\n\n## 9. Lessons and recommendations\n\nThe competition produced eight findings we believe will help future participants more than another point on the leaderboard would.\n\n1. **Establish the noise floor first.** Submit the same notebook 5–10 times before iterating on architecture. σ = 1.20 means any 1–2 point \"improvement\" is invisible to single-shot comparison. Every other recommendation depends on this one.\n\n2. **Per-problem time budgets are absolute.** The 5-hour cliff is hard-enforced. Any architecture that *can* spend more time on a problem must have a hard cap well below what the budget would technically allow - hard problems do not pay you back for extra time.\n\n3. **Strategy-prompt diversity hurts a strong base model.** When `gpt-oss-120b` at `ReasoningEffort.HIGH` is told to use a specific technique, it complies even when the technique is wrong. Sampling-temperature diversity at T = 1.0 produces enough variance for self-consistency voting without prescriptive prompts.\n\n4. **Confidence estimation matters more than sample count.** Our single defensible improvement above noise came from changing the *voting function*, not from generating more samples. Treat the voting function as a first-class optimization target.\n\n5. **`merged_4bit_forced` is a trap for `gpt-oss-120b`.** The Unsloth → vLLM pipeline silently produces a BitsAndBytes-quantized model that vLLM cannot run efficiently. Use `merged_16bit` or `save_method=\"mxfp4\"`.\n\n6. **Stable GRPO training is necessary but not sufficient.** Our v6 loop trained stably for 38 cycles with no collapses, but the deployed model scored 13 because of the merge format issue, and the reward signal during training (mean +0.033) was too sparse for meaningful policy improvement.\n\n7. **Instrument your offline benchmark like your leaderboard.** We ran 15 offline research branches but only one completed a verifiable end-to-end run. We never calibrated hard50 difficulty against AIMO3. Subtraction beats addition: every architectural addition we tested was neutral or harmful.\n\n8. **Document the negative results.** We invested ~$300 of B200 GPU time and three weeks of architectural iteration in directions that did not work. If this writeup helps even one future team avoid the `merged_4bit_forced` trap or the strategy-prompt-diversity dead end, it has paid for itself many times over.\n\n---\n\n## 10. Conclusion\n\nWe did not win AIMO3. Our private-leaderboard score of 41.5/50 and rank 828th / 4,138 (public-leaderboard best score of 43/50 and rank 86th / 4,138) falls squarely within our predicted 95% CI of [39.85, 41.70], validating the variance methodology, well above naive baselines but below the top of the leaderboard. What we contribute to the community is not a higher score but a documented, statistically defensible characterization of the AIMO3 inference problem with `gpt-oss-120b`: the base model is strong enough that most engineering interventions are dominated by run-to-run noise; the few interventions that move the score appreciably move it *downward*; and the single defensible upward move we found was a more careful confidence-estimation function for self-consistency voting. The expensive failure modes - strategy-prompt prescription, multi-stage routing, and most importantly GRPO with broken deployment - are all reproducible from the configurations and telemetry in the appendices. Every score in this paper is from an actual public-leaderboard submission, every configuration is from actual source code, and every causal claim is hedged to the strength of the evidence we have.\n\nIf you take one thing from this writeup, take this: **before you spend a week building a router, submit the same notebook many times and look at the variance.**\n\n---\n\n## 11. Private Leaderboard Result\n\nOur selected submission (`final_submission v2`) scored **41.5/50** on the private leaderboard (rank 828 / 4,138). Under the double-run scoring rule - where each problem receives 1.0 if both runs are correct, 0.5 if one is correct, and 0.0 if neither is - this score is consistent with a per-run accuracy of approximately 41–42, directly in line with our public-LB mean of 40.78 (σ=1.20, n=9).\n\nThe private score falls within our predicted 95% confidence interval of [39.85, 41.70], confirming that the variance methodology in Section 3 generalizes from public to private evaluation. The noise floor finding - that σ=1.20 across identical runs means any sub-2.4-point \"improvement\" is statistically indistinguishable from noise - is validated by this out-of-sample result.\n\nOur rank shifted from 86th (public, based on best single submission of 43) to 828th (private, based on the selected submission's double-run average). This rank compression is itself evidence for the noise-floor thesis: teams whose public rank was inflated by a single lucky run regressed toward their true mean on the private set, while our pre-registered variance estimate correctly predicted our private performance.\n\n---\n---\n\n# Appendices\n\n## Appendix A: Full configuration of `final_submission v2`\n\nThis is the verbatim configuration from the `CFG` class in the submitted notebook.\n\n| Parameter | Value |\n|---|---|\n| **Base model** | `/kaggle/input/models/danielhanchen/gpt-oss-120b/transformers/default/1` |\n| **Served model name (vLLM)** | `gpt-oss` |\n| **Quantization** | Native MXFP4 |\n| **Tensor parallel size** | 1 |\n| **gpu_memory_utilization** | 0.96 |\n| **kv_cache_dtype** | `fp8_e4m3` |\n| **dtype** | `auto` |\n| **context_tokens (max_model_len)** | 65,536 |\n| **batch_size (max_num_seqs)** | 256 |\n| **stream_interval** | 200 |\n| **enable_prefix_caching** | True |\n| **async_scheduling** | True |\n| **System prompt** | *\"You are a world-class IMO competitor. The final answer must be a non-negative integer between 0 and 99999. Place your final answer inside `\\boxed{}`.\"* |\n| **Tool prompt** | *\"Use this tool to execute Python code. The environment is a stateful Jupyter notebook. Always use print() to output results.\"* |\n| **Preference prompt** | *\"You have access to math, numpy, sympy, and mpmath.\"* |\n| **Reasoning effort** | `ReasoningEffort.HIGH` (set on harmony SystemContent) |\n| **Tool format** | openai-harmony Conversation API |\n| **Available libraries in sandbox** | math, numpy, sympy, mpmath, itertools, collections; `mpmath.mp.dps = 64` |\n| **temperature** | 1.0 |\n| **min_p** | 0.02 |\n| **top_p** | not set (intentionally - top_p = 0.9 was tested and caused a regression in earlier iterations) |\n| **top_logprobs** | 5 |\n| **attempts** | 8 |\n| **workers (parallel sandboxes)** | 16 |\n| **early_stop** | 4 (cancel remaining attempts when 4 agree) |\n| **turns (max harmony turns per attempt)** | 128 |\n| **seed (global)** | 42 |\n| **per-attempt seed** | `(seed + attempt_index) ** 2` |\n| **buffer_tokens** | 512 |\n| **search_tokens (streaming `\\boxed{}` window)** | 32 |\n| **notebook_limit** | 17,400 s (4h50m) |\n| **base_problem_timeout** | 270 s |\n| **high_problem_timeout** | 900 s |\n| **server_timeout** | 180 s |\n| **session_timeout** | 960 s |\n| **jupyter_timeout** | 6 s |\n| **sandbox_timeout** | 3 s |\n| **per-problem budget formula** | `min(max(time_remaining − 270 × (problems_remaining − 1), 270), 900)` |\n\n### A.1 Voting function source\n\n```python\ndef _compute_weighted_entropy(self, logprobs_buffer):\n    \"\"\"5-component weighted entropy.\"\"\"\n    if not logprobs_buffer:\n        return float('inf')\n\n    entropies = []\n    for top_lp in logprobs_buffer:\n        if not isinstance(top_lp, dict) or not top_lp:\n            continue\n        h = 0.0\n        for _, lp in top_lp.items():\n            p = math.exp(lp)\n            if p > 0:\n                h -= p * math.log2(p)\n        entropies.append(h)\n\n    if not entropies:\n        return float('inf')\n\n    n = len(entropies)\n    mean_ent = sum(entropies) / n\n\n    # Variance penalty\n    if n > 1:\n        variance = sum((e - mean_ent) ** 2 for e in entropies) / (n - 1)\n        std_dev = math.sqrt(variance)\n    else:\n        std_dev = 0.0\n\n    # Position-weighted (recent tokens dominate, decay 0.995)\n    decay = 0.995\n    weights = [decay ** (n - 1 - i) for i in range(n)]\n    total_weight = sum(weights)\n    position_weighted = (\n        sum(w * e for w, e in zip(weights, entropies)) / total_weight\n        if total_weight > 0 else mean_ent\n    )\n\n    # High-entropy ratio (tokens with H > 2.0 bits)\n    high_ent_count = sum(1 for e in entropies if e > 2.0)\n    high_ent_ratio = high_ent_count / n\n\n    # Low-entropy streak bonus (sustained < 1.0 bit)\n    max_streak = 0\n    current_streak = 0\n    for e in entropies:\n        if e < 1.0:\n            current_streak += 1\n            max_streak = max(max_streak, current_streak)\n        else:\n            current_streak = 0\n    streak_bonus = -0.1 * (max_streak / n) if n > 0 else 0.0\n\n    weighted = (\n        0.3 * mean_ent\n      + 0.4 * position_weighted\n      + 0.2 * std_dev\n      + 0.3 * high_ent_ratio * 3.0\n      + streak_bonus\n    )\n    return max(weighted, 1e-9)\n\n\ndef _select_answer(self, detailed_results):\n    \"\"\"Inverse-entropy weighted voting.\"\"\"\n    answer_weights = defaultdict(float)\n    answer_votes = defaultdict(int)\n    for r in detailed_results:\n        a = r['Answer']\n        e = r['Entropy']\n        if a is not None:\n            answer_weights[a] += 1.0 / max(e, 1e-9)\n            answer_votes[a] += 1\n    if not answer_weights:\n        return 0\n    scored = sorted(\n        [{'answer': a, 'votes': answer_votes[a], 'score': w}\n         for a, w in answer_weights.items()],\n        key=lambda x: x['score'], reverse=True\n    )\n    return scored[0]['answer']\n```\n\n### A.2 Boxed-answer scanner\n\n```python\ndef _scan_for_answer(self, text):\n    pattern = r'\\\\boxed\\s*\\{\\s*([0-9,]+)\\s*\\}'\n    matches = re.findall(pattern, text)\n    if matches:\n        try:\n            val = int(matches[-1].replace(',', ''))\n            if 0 <= val <= 99999:\n                return val\n        except ValueError:\n            pass\n    pattern = r'final\\s+answer\\s+is\\s*([0-9,]+)'\n    matches = re.findall(pattern, text, re.IGNORECASE)\n    if matches:\n        try:\n            val = int(matches[-1].replace(',', ''))\n            if 0 <= val <= 99999:\n                return val\n        except ValueError:\n            pass\n    return None\n```\n\nThe streaming inspection happens inside `_process_attempt`: after each chunk of streamed text, the last `search_tokens = 32` tokens worth of text are scanned for `\\boxed{...}`, and if found, the attempt short-circuits without consuming additional turns.\n\n### A.3 Provenance and credit\n\nThe 5-component weighted entropy formula builds on the multi-component entropy scoring framework from [pawanmali's \"Chasing 47/50\" notebook](https://www.kaggle.com/code/pawanmali/chasing-47-50-aimo3-journey-of-60-experiments), which demonstrated that position-weighted entropy with variance and streak components substantially outperforms simple mean entropy on AIMO3. Our contribution is the specific tuning of weights and thresholds across intermediate submissions; the structural design of which components to include follows pawanmali's framework.\n\n---\n\n## Appendix B: GRPO v6 configuration\n\n| Parameter | Value |\n|---|---|\n| **Hardware** | RunPod B200 (1 GPU, 191.5 GB VRAM) |\n| **Cost rate** | $5.03/hr |\n| **Base model** | `danielhanchen/gpt-oss-120b` loaded via Unsloth with `load_in_4bit=True` |\n| **Quantization during training** | BitsAndBytes NF4 (Unsloth converts MXFP4 → NF4 on load) |\n| **Architecture** | Off-policy: vLLM serves base model; Unsloth trains LoRA adapter separately; vLLM restarted between cycles |\n| **Learning rate** | 2e-6 with cosine decay |\n| **max_grad_norm** | 0.3 |\n| **Generations per problem** | 8 |\n| **Temperature (rollouts)** | 1.0 |\n| **top_p (rollouts)** | 0.98 |\n| **max_completion_tokens** | 6,144 |\n| **Advantage** | Dr.GRPO (mean subtraction, no std division) |\n| **Overlong filtering** | DAPO-style (truncated completions removed from gradient) |\n| **KL coefficient (β)** | 0.0 |\n| **Reward function** | Binary: 1.0 if extracted boxed answer matches ground truth, 0.0 otherwise |\n| **Problems per cycle** | 5 |\n| **Cycles captured in telemetry** | 38 (cycles 62–99) |\n| **Problems captured in telemetry** | 190 (problems 310–499) |\n| **Mean cycle time** | ~1,170 s (gen ~720s + train ~440s) |\n| **Cost in v6 logged segment** | $61.87 |\n| **Total GRPO project cost (all phases)** | ≈$300 |\n| **Merge method used (the bug)** | `merged_4bit_forced` → produces BnB NF4 |\n| **Merge method that should have been used** | `merged_16bit` or `save_method=\"mxfp4\"` |\n| **Submission score** | 13/50 |\n\n### B.1 TRL Phase A (collapsed) configuration\n\n| Parameter | Value |\n|---|---|\n| **Framework** | Hugging Face TRL `GRPOTrainer` + Unsloth |\n| **use_vllm** | False (TRL+vLLM crashed at startup) |\n| **Learning rate** | 5e-6 |\n| **max_grad_norm** | 1.0 |\n| **β (KL coefficient)** | 0.0 |\n| **Generations per problem** | 8 |\n| **Steps completed** | 16 (model destroyed at step 16) |\n| **Time per step** | ≈76 minutes |\n| **Cost** | $101.73 |\n| **Loss at step 1** | 0.0513 |\n| **KL at steps 8–9** | 87 |\n| **Gradient norm at steps 8–9** | 133 |\n| **Reward at step 13** | 0.5625 (peak) |\n| **Loss at step 16** | 19,751,736 |\n\n### B.2 SFT (uploaded but not submitted)\n\n| Parameter | Value |\n|---|---|\n| **Method** | QLoRA, rank 128 |\n| **Training data** | 63,959 tool-integrated reasoning (TIR) traces |\n| **Steps** | 1,000 |\n| **Final loss** | 0.69 (plateau) |\n| **Uploaded model** | `flamingice2801/gpt-oss-120b-aimo3-tir-sft` (Kaggle Models) |\n| **Submitted to AIMO3?** | No - abandoned after GRPO deployment failure exposed the merge format issue |\n\n---\n\n## Appendix C: Full Kaggle submission history\n\nTwenty-five successful submissions plus three early debug parquet uploads (score 0) and one notebook exception. Listed in chronological order (oldest first).\n\n| # | Days ago at writeup | Notebook | Version | Score | Phase |\n|---|---|---|---|---|---|\n| 1 | 24 | `aimo3_final` | v3 | 39 | Iteration |\n| 2 | 23 | `aimo3_final` | v4_tweaked_temp&model | 11 | Debugging |\n| 3 | 22 | `aimo3_final` | v5_tweaked_temp | 0 | Debugging |\n| 4 | 21 | `aimo3_final` | v7 | 36 | Iteration |\n| 5 | 20 | `aimo3_final` | v9 | 37 | Iteration |\n| 6 | 19 | `aimo3_final` | v22 | 36 | Iteration |\n| 7 | 18 | `base_submission` | v2 | 33 | Failure (V11 timeout) |\n| 8 | 17 | `[15/15] AIME 2026 I 120b in 20mins` | v4_grpo | **13** | **Failure (GRPO)** |\n| 9 | 16 | `[15/15] AIME 2026 I 120b in 20mins` | v3 | 38 | Iteration |\n| 10 | 15 | `aimo3_final` | v3 (re-run) | 34 | Iteration |\n| 11 | 14 | `AIMO3_Adaptive_Router_Confidence_Vote_v1` | v1 | **28** | **Failure (router)** |\n| 12 | 13 | `[15/15] AIME 2026 I 120b in 20mins` | v3 (re-run) | 35 | Iteration |\n| 13 | 12 | `aimo3_final` | v9 (re-run) | 37 | Iteration |\n| 14 | 11 | `aimo3_final` | v9 (re-run) | 37 | Iteration |\n| 15 | 10 | `aimo3_adaptive` | _v4 | 34 | Failure |\n| 16 | 9 | **`final_submission`** | **v2** | **39** | **Final (run 1)** |\n| 17 | 8 | `aimo_tester` | v2 | 34 | Iteration |\n| 18 | 7 | **`final_submission`** | **v2** | **40** | **Final (run 2)** |\n| 19 | 6 | **`final_submission`** | **v2** | **43** | **Final (run 3)** |\n| 20 | 4 | **`final_submission`** | **v2** | **40** | **Final (run 4)** |\n| 21 | 3 | **`final_submission`** | **v2** | **42** | **Final (run 5)** |\n| 22 | 3 | **`final_submission`** | **v2** | **40** | **Final (run 6)** |\n| 23 | 2 | **`final_submission`** | **v2** | **41** | **Final (run 7)** |\n| 24 | 1 | **`final_submission`** | **v2** | **41** | **Final (run 8)** |\n| 25 | 0 | **`final_submission`** | **v2** | **41** | **Final (run 9)** |\n\n`final_submission v2` distribution: {39, 40, 40, 40, 41, 41, 41, 42, 43}, n = 9, mean 40.778, median 41, σ = 1.202, 95% CI [39.85, 41.70], best 43.\n\n---\n\n## Appendix D: GRPO v6 telemetry summary\n\nThe full per-problem telemetry CSV (190 rows × 14 columns) is provided as a supplementary artifact. Summary statistics:\n\n| Statistic | Value |\n|---|---|\n| Total rows | 190 |\n| Cycle range | 62 – 99 (38 cycles) |\n| Problem range | 310 – 499 |\n| Generations per problem | 8 (constant) |\n| Mean generation time per cycle | 720 s |\n| Mean training time per cycle | 440 s |\n| Mean cycle time | 1,170 s |\n| Cost at cycle 62 | $2.34 |\n| Cost at cycle 99 | $61.87 |\n| Mean reward (all 190 problems) | +0.033 |\n| Problems with reward < 0 | 90 (47.4%) |\n| Problems with reward = 0 (filtered) | 34 (17.9%) |\n| Problems with 0 < reward < 1 | 62 (32.6%) |\n| Problems with reward = 1.0 (all 8 correct) | 4 (2.1%) |\n| Problem IDs achieving reward = 1.0 | 329, 333, 379, 468 |\n| Loss range | [0.0, ~0.7] |\n| Loss collapses | 0 |\n| Mean completion length | ~3,500 tokens |\n| Max completion length observed | ~6,400 tokens (binding against 6,144 cap) |\n\nThe full CSV columns are: `cycle, problem_idx, gen_time_sec, train_time_sec, total_sec, reward_mean, reward_std, num_correct, num_total, loss, completion_len_mean, clipped_ratio, gpu_mem, cost`.\n\n---\n\n## Appendix E: Variance experiment statistical details\n\nThe 9-run variance experiment for `final_submission v2` produced scores {39, 40, 40, 40, 41, 41, 41, 42, 43}. Descriptive statistics:\n\n| Statistic | Value |\n|---|---|\n| n | 9 |\n| Sum | 367 |\n| Mean | 40.778 |\n| Median | 41 |\n| Mode | 40 and 41 (each appear 3 times) |\n| Min | 39 |\n| Max | 43 |\n| Range | 4 |\n| Sample variance s² | 1.444 |\n| Sample standard deviation s | 1.202 |\n| Standard error of the mean | 0.401 |\n| t-critical (df=8, 95%) | 2.306 |\n| 95% CI for mean | [39.854, 41.702] |\n| Coefficient of variation | 2.95% |\n\nUnder the assumption that each problem is solved with effective probability *p_eff* after voting, the score X ~ Binomial(50, *p_eff*). From mean = 40.778, *p_eff* ≈ 0.816, predicting a theoretical Binomial standard deviation of √(50 · 0.816 · 0.184) ≈ 2.74. **Our observed σ = 1.20 is meaningfully lower than the Binomial prediction**, suggesting positive correlation between problems within a single run (i.e., when the model is \"having a good run,\" it tends to solve more problems than independent sampling would predict). Plausible mechanisms include vLLM batching state, KV-cache hit patterns, and GPU thermal/scheduling effects that affect attempts within a single notebook run more than across runs.\n\nFor two independent runs from the same configuration with σ = 1.20:\n- Expected difference E[|X₁ − X₂|] ≈ 1.35\n- P(|X₁ − X₂| ≥ 3) ≈ 0.07\n- P(|X₁ − X₂| ≥ 4) ≈ 0.02\n\nA 3-point single-shot difference between two notebooks therefore has approximately a 1-in-14 chance of being pure noise. A 4-point difference reaches conventional statistical significance (p < 0.05) only with this much variance assumed. **Differences smaller than 3 points should not be acted on without replication.**\n\n---\n\n## Appendix F: Why the public 42-notebook is not a clean baseline in our results\n\nThe public Kaggle notebook `AIMO 3 | GPT-OSS-120B (with tools)` (\"the 42-notebook\" in community discussion) is reported to score 42/50 by its authors with default settings. We never submitted the unmodified 42-notebook. Our `base_submission v2` is a **fork** of it with three modifications:\n\n1. `attempts` raised from 8 to 12\n2. `early_stop` raised from 4 to 5\n3. `\"Be concise. Stop immediately after \\boxed{}\"` added to the preference prompt\n\n`base_submission v2` scored 33 - six points below baseline - primarily due to the wall-clock overrun caused by modification #1. Because we changed three variables at once, **we cannot attribute the −6 to \"more attempts\" alone**, and we cannot use this submission as a measurement of the unmodified 42-notebook's performance in our environment. The 42-notebook's score in our hands is, strictly speaking, unknown. We list this as a methodological limitation rather than a result.\n\n---\n\n## Appendix G: What we would do differently\n\nIf we were starting AIMO3 again with what we know now, in priority order:\n\n1. **Day 1, before any architectural work:** Submit the same baseline notebook 9 times. Plot the distribution. Compute σ. *Then* decide what counts as a meaningful improvement.\n2. **Day 2:** Read every Unsloth and vLLM doc page about merging fine-tuned LoRA adapters for `gpt-oss-120b`. Specifically search for \"MXFP4\" and \"merged_4bit\". This would have saved the ≈$300 GRPO sunk cost.\n3. **Day 3 onward, if time allows:** Investigate inference-acceleration paths (EAGLE-3 speculative decoding, smaller-N with smarter voting, parallel sandbox pool tuning) before investigating training-time interventions. The base model is strong; the binding constraint is throughput.\n4. **Throughout:** Treat the voting function as a first-class variable. A more refined confidence estimator was the only thing that produced a defensible improvement above noise in our experiments.\n5. **Never:** Add a multi-stage router with verifier / GenSelect / adversarial passes without measuring its time cost on a wall-clock simulation first.\n\n---\n\n## Appendix H: Offline research branch catalog\n\nFifteen offline research branches were authored during the competition to explore architectures that we were not willing to spend Kaggle submission slots on. **None of the 15 were submitted to the AIMO3 leaderboard.** Their target benchmark was the community-sourced `hard_50_math_problems_set_v6.csv` dataset (Kaggle dataset `zfturbo/hard-math-problems-for-aimo-3`). This appendix documents each branch with its design intent (taken verbatim from the top-of-notebook docstring or markdown cell where available), its execution status, and what the preserved notebook outputs actually verify.\n\n### H.1 Execution status summary\n\n| Branch file                                         | Execution status                               | Verifiable score        | Mean time/problem |\n|------------------------------------------------------|------------------------------------------------|-------------------------|-------------------|\n| `aimo3_branch_a_contested_resolver`                  | Authored, never executed to completion         | -                       | -                 |\n| `aimo3_branch_a_contested_resolver_rebuilt`          | Authored, never executed to completion         | -                       | -                 |\n| `aimo3-contested-resolver`                           | Ran 50 problems; **no correctness logging**    | Cannot verify           | 216 s             |\n| `aimo3_contested_resolver_conservative` (A2)         | Ran 50 problems; **no correctness logging**    | Cannot verify           | 216 s             |\n| `aimo3_A3_1_clean_multicell`                         | Authored, never executed to completion         | -                       | -                 |\n| `aimo3_A3_2_candidategen_multicell`                  | Authored, never executed to completion         | -                       | -                 |\n| `aimo3_A3_2_patch_multicell`                         | Authored, never executed to completion         | -                       | -                 |\n| **`aimo3_branch_B_multicell`**                       | **Complete 50-problem run with inline grading**| **27/50 (54.0%)**       | **233 s**         |\n| `aimo3_branch_B_fixed`                               | Shares stale truncated run with C_final        | 19/29 (ambiguous)       | 218 s             |\n| `aimo3_branch_B_updated`                             | Shares stale truncated run with C_final        | 19/29 (ambiguous)       | 218 s             |\n| `aimo3_branch_C_final`                               | Shares stale truncated run with B_fixed/updated| 19/29 (ambiguous)       | 218 s             |\n| `aimo3_branch_C_fixed2`                              | Authored, never executed to completion         | -                       | -                 |\n| `aimo3_branch_C_c2`                                  | Authored, never executed to completion         | -                       | -                 |\n| `aimo3_branch_C_trust_patch`                         | Authored, never executed to completion         | -                       | -                 |\n| `aimo3_branch_C_plus_final` (C+)                     | Authored, never executed to completion         | -                       | -                 |\n\n**Critical caveat on the 19/29 row.** Three notebooks (`B_fixed`, `B_updated`, `C_final`) have different code but identical saved outputs - same per-problem trace, same cumulative markers, same trace zip timestamp `20260409_092715`. The outputs come from a single Colab run that was saved into three different notebook files during iteration. We cannot attribute 19/29 to any specific architecture and therefore do not cite it as a score for any named branch in the main paper. The run terminated at problem 30 - we do not know whether termination was voluntary (user stopped) or involuntary (Colab session died).\n\n**The only offline number that survives full provenance audit is Branch B multicell: 27/50 on hard50.** All per-problem `[EVAL] id=<X> pred=<Y> actual=<Z> correct=<bool> cumulative=<N>/<M>` lines are preserved inline in the notebook output cells.\n\n### H.2 Branch A - Trunk + Contested Resolver\n\n**Files:** `aimo3_branch_a_contested_resolver`, `aimo3_branch_a_contested_resolver_rebuilt`, `aimo3-contested-resolver`\n\n**Design intent (verbatim from the notebook docstring):**\n\n> \"This notebook starts from the stable `final_submission` baseline rather than the experimental branches. The baseline kept the proven ingredients that were strongest in prior AIMO3 experiments: simple prompts, T=1.0 generation, 8 attempts, weighted entropy, 65k context, and no large bundles of interacting heuristics.\"\n>\n> Motivation: hard50 analysis showed two failure classes - *rerankable* (correct answer appears in the candidate pool but a plurality of wrong attempts shipped it) and *exploration* (correct answer never generated). Branch A targets only the first class.\n\n**Key changes from `final_submission`:**\n1. Quick-unanimous exit (3/3 agree) removed as over-confident on genuinely hard problems.\n2. Early stop means \"stop further generation only\" - still build full candidate table; never auto-ship solely because generation stopped early.\n3. Candidate aggregation table with support, inverse-entropy weight, mean entropy, mean Python calls/errors, Python error rate.\n4. Conservative stage-1 winner ordering: `support DESC → inverse-entropy DESC → mean entropy ASC → Python error rate ASC`.\n5. Contest detector fires when any of: top support ≤ 3; runner-up support ≥ 2; top/runner weight ratio < 1.35; stage-1 winner not \"safe to ship\"; a structured nearby rival (off-by-one / off-by-two / double-half) exists.\n6. Rerank score used only inside contested handling: `rerank = log1p(avg_inv_entropy) − 0.15 × py_err_rate − 0.03 × log1p(mean_py_calls)`. Constants drawn from hard50 failure taxonomies (66 vs 69, 570 vs 285, 24 vs 25, 2000 vs 1999, 105 vs 106) and explicitly labeled \"heuristic and intentionally mild; not claimed to be optimal.\"\n\n**Execution status:** The two `aimo3_branch_a_*` variants have zero outputs (never ran end-to-end). `aimo3-contested-resolver` ran 50 problems on hard50 but only logged `answer=X` per problem, never `pred=X actual=Y correct=bool`, so correctness is not inline-verifiable. Mean time 215.9 s/problem, max 710 s.\n\n### H.3 Branch A2 - Trunk + Conservative Challenger + Pairwise Resolver\n\n**File:** `aimo3_contested_resolver_conservative`\n\n**Design intent (verbatim):**\n\n> \"The first Branch A run clarified four things: (1) Candidate tables are useful. They make it obvious when the correct answer is already in the pool. (2) The resolver is NOT reliable enough to hard-override the pipeline. In several cases the rerank or stage-1 winner was better than the resolver. (3) Single-cluster early agreement is still dangerous. Some hard problems produced 4 quick agreements on one wrong answer with no serious alternative exploration. (4) The reranker is better used to nominate a challenger than to become the final answer.\"\n\n**Key changes from Branch A:**\n1. Single-cluster challenge mode: if generation stops early with only one candidate, run up to two extra challenge attempts (one diversity-oriented, one exact-check-oriented), each with a hard cap.\n2. Stricter `safe_to_ship`: requires single-cluster challenge to have passed when applicable.\n3. Suspicion-based contested detector: does not trigger on one weak signal alone; accumulates a suspicion score from multiple evidence sources.\n4. Rerank only nominates a challenger (never auto-ships).\n5. Pairwise resolver: compares only incumbent vs challenger; forbidden to invent a third answer; may flip only if it explicitly chooses the challenger; if undecided or chooses incumbent, keeps incumbent.\n6. `safe_weight_share = 0.70` - explicitly labeled \"heuristic, not hidden-set tuned, not paper-derived optima.\"\n\n**Execution status:** Same as `aimo3-contested-resolver` - ran 50 problems on hard50 but without per-problem correctness logging. The outputs are byte-identical to the earlier contested-resolver run (same output hash), suggesting this notebook saved the same run's outputs without re-executing.\n\n### H.4 Branch A3 - Trunk + Closure-Aware Challenge + Dual-Check Flip Gate\n\n**Files:** `aimo3_A3_1_clean_multicell`, `aimo3_A3_2_candidategen_multicell`, `aimo3_A3_2_patch_multicell`\n\n**Design intent (verbatim from markdown cell):**\n\n> \"Preserve the stable baseline generator while making post-generation decisions much more conservative and closure-aware. **The design is intended for AIMO3 itself, not for hard50-only optimization.**\"\n\n**Key changes from Branch A2:**\n1. Do NOT stop an attempt at the first `\\boxed{}` - collect all boxed integers seen in an attempt and use the LAST one; record box instability signals (multiple boxed values, box_changed flag, last-box position). Targets premature-boxing / double-counting / off-by-one failures.\n2. De-anchored single-cluster challenge: if only one answer cluster exists, run two fresh-from-scratch extra attempts - (a) diverse solve with no incumbent mentioned, (b) closure-audit solve with no incumbent mentioned. Both prompts explicitly remind the model to check symmetry, ordered-vs-unordered counting, endpoint inclusion, and final-step closure before boxing.\n3. Strict safe-to-ship: safe only if exactly one candidate remains after challenge, support is strong, and the cluster is box-stable.\n4. Challengers must have support ≥ 2 (unless stage-1 support ≤ 2) - prevents noisy singleton challengers from overturning healthy incumbents.\n5. Flips require TWO independent checks: pairwise exact check (incumbent vs challenger only, cannot invent a third answer) AND an independent fresh audit (solve from scratch without seeing the candidates). Flip only if both checks agree on the challenger.\n6. Time discipline preserved: hard problems still get up to 900 s; extra auditing capped and skipped when time is tight.\n\n**Constants explicitly labeled:** \"not hard50-fit coefficients. They are conservative priors chosen from observed failure classes.\"\n\n**Execution status:** All three A3 notebooks have zero outputs. Never executed end-to-end.\n\n### H.5 Branch B - Trunk + Pairwise-Authorized Arbitration + Bounded Checks\n\n**Files:** `aimo3_branch_B_fixed`, `aimo3_branch_B_updated`, **`aimo3_branch_B_multicell`**\n\n**Design intent (verbatim from markdown cell):**\n\n> \"Preserve the stable AIMO3 generator while making post-generation arbitration stricter and more faithful to the candidate pool. **This branch is intended for AIMO3-level problems, not hard50-only tuning.**\"\n\n**Key changes:**\n1. **Pairwise becomes the only component that can authorize a challenger flip.**\n2. Pressure becomes a challenger stress-test / veto, not an independent flip engine.\n3. Audit remains candidate-bounded and can only confirm or veto a pairwise-authorized challenger.\n4. Narrow strong-challenger override: allowed only when pairwise already picked the challenger AND the incumbent does not dominate support.\n5. Challenge-created rivals still force escalation, but adjacency / double-half only trigger extra checking, not easier flips.\n6. Trace writing remains non-fatal; final cell zips the trace folder for download.\n\n**Execution status - this is the one verified data point:**\n- `aimo3_branch_B_multicell`: **Completed a full 50-problem hard50 run.** 27 correct, 23 wrong, **27/50 = 54.0%**. Total wall-clock: 194.4 min. Mean time per problem: 233.3 s, median 188 s, max 659 s, min 27 s. 10 problems took ≥ 400 s. **Zero problems hit the 900 s cap** - the 27/50 is not a timeout artifact, it reflects actual answer quality on the hard50 distribution. All per-problem `[EVAL]` lines with `pred`, `actual`, `correct`, and `cumulative` are preserved inline in the notebook outputs.\n- `aimo3_branch_B_fixed`, `aimo3_branch_B_updated`: Share stale identical outputs with `aimo3_branch_C_final` from a Colab run with trace timestamp `20260409_092715`, truncated at problem 30, cumulative 19/29 (65.5%). Different code bodies, same saved outputs - we cannot attribute the 19/29 to any specific architecture.\n\n**Figure 9 in the main paper is based on the Branch B multicell run.**\n\n### H.6 Branch C - Controller + Code Rescue + Provenance-Aware Arbitration\n\n**Files:** `aimo3_branch_C_final`, `aimo3_branch_C_c2`, `aimo3_branch_C_trust_patch`, `aimo3_branch_C_fixed2`\n\n**Design intent (verbatim from `CFG` docstring):**\n\n> \"Branch C keeps the stable Branch B generator and pairwise-centered arbitration, but adds four portable ideas motivated by the AIMO2 analysis and the recent Branch B traces...\"\n\n**Key changes from Branch B:**\n1. **Convergence / divergence / broken-state controller** - after the first few attempts, detect whether the candidate pool has already converged, fragmented, or broken (invalid-heavy / no useful generation). Stop spending more budget on repeated plain-text attempts when the pool is obviously converged or broken.\n2. **Targeted code rescue** - when the pool is broken, fragmented, or definition-ambiguous, switch to an exact tool-backed rescue path rather than more of the same text sampling.\n3. **One-step code repair** - if the rescue path reaches Python but fails to finish cleanly, one repair attempt that fixes the prior code / extraction instead of restarting.\n4. **Provenance-aware weighting** - candidates supported by multiple evidence modes (main pool, challenge, code rescue, repair) are stronger than plain text-only singleton rivals. Verifier-only candidates are kept weak unless also supported elsewhere.\n5. Pairwise remains the main discriminator; audit is weakened when pairwise + pressure already align.\n6. Larger reserve and lighter verification spending to protect tail problems.\n\n**Execution status:** `C_final` shares stale outputs with `B_fixed/B_updated` (see H.5 caveat). `C_c2`, `C_trust_patch`, and `C_fixed2` have zero outputs - never executed end-to-end. No new verifiable score.\n\n### H.7 Branch C+ - Trusted Main-Pool Arbitration + Routed Micro-Prompts + Typed Verifiers\n\n**File:** `aimo3_branch_C_plus_final`\n\n**Design intent (verbatim from `CFG` docstring):**\n\n> \"Design constraints: **This branch is intended for AIMO3-level problems, not hard50-only tuning.** Pairwise remains the main discriminator in binary contests. Audit is weakened relative to Branch B when pairwise + pressure already align. Tail problems are protected by a larger reserve and by lighter verification spending on already-settled problems.\"\n\n**Key changes:** Inherits the full Branch C controller + code rescue + repair + provenance weighting, then adds:\n- Trusted main-pool arbitration: the main pool is trusted more strongly; other stages become confirmatory.\n- Routed micro-prompts: short targeted prompts routed by inferred failure class.\n- Typed verifiers: verifiers specialized for specific failure classes observed in earlier traces.\n\nThis is the most elaborate architecture in the 15-branch catalog.\n\n**Execution status:** Zero outputs. Authored but never executed to completion.\n\n### H.8 What the catalog tells us about our workflow\n\nOf 15 offline research branches authored over the course of the competition:\n\n- **1 produced a verified inline-graded hard50 score** (Branch B multicell: 27/50, 54%)\n- **2 ran 50 problems without correctness logging** (contested resolver A / A2 - no verifiable score)\n- **3 share stale outputs from one truncated Colab session** (B_fixed, B_updated, C_final - 19/29 ambiguous attribution)\n- **9 were authored but never executed to completion** (the two `branch_a` variants, all three A3 notebooks, C_c2, C_fixed2, C_trust_patch, C_plus_final)\n\nIn other words, **60% of our offline research architecture never produced a single hard50 data point**. The ones that did were either non-graded (40% of the remaining six) or attribution-ambiguous (50% of the remaining six). We learned a lot from reading the traces and tuning heuristics, but we did not run a clean offline benchmark loop, and the result was that the only number we can defend in this paper is the one Branch B multicell saved inline. The methodological finding in Section 4 stands on that single data point plus the nine \"intended for AIMO3, not hard50\" design-intent statements preserved verbatim above.\n\nThe full verbatim docstrings and markdown cells quoted in this appendix are reproduced from the actual `.ipynb` files and can be verified byte-for-byte against the notebook sources supplied with this writeup.\n\n---\n---\n\n# Streamlined branch naming guide\n\nFor consistency in this writeup, the team's notebook history has been mapped to canonical names. The mapping is as follows:\n\n| Canonical name (used in writeup) | Kaggle notebook name & version | Submitted? | Score(s) |\n|---|---|---|---|\n| **Final submission** | `final_submission v2` | Yes (×9) | 39, 40, 40, 40, 41, 41, 41, 42, 43 |\n| **42-notebook fork (V11)** | `base_submission v2` | Yes (×1) | 33 |\n| **GRPO submission** | `[15/15] AIME 2026 I 120b in 20mins v4_grpo` | Yes (×1) | 13 |\n| **Adaptive router** | `AIMO3_Adaptive_Router_Confidence_Vote_v1` | Yes (×1) | 28 |\n| **5-stage AIME scaffold** | `[15/15] AIME 2026 I 120b in 20mins v3` | Yes (×2) | 35, 38 |\n| **Strategy-prompt family** | `aimo3_final v7 / v9 / v22` | Yes (×5) | 36, 37, 37, 37, 36 |\n| **UNDERSTAND/EXPLORE adaptive** | `aimo3_adaptive _v4` | Yes (×1) | 34 |\n| **Multi-temperature tester** | `aimo_tester v2` | Yes (×1) | 34 |\n| **Early iteration** | `aimo3_final v3` | Yes (×2) | 39, 34 |\n| **Debug / temp tweaks** | `aimo3_final v4_tweaked_temp&model`, `v5_tweaked_temp` | Yes (×2) | 11, 0 |\n\nThe name `final_submission v2` is preserved as-is per team preference. Submissions earlier than 25 days before writeup (3 × `submission.parquet` uploads at score 0) and one notebook exception (`aimo_check v4`) are excluded from analysis.\n\n---\n\n*End of writeup. All scores are from the public AIMO3 leaderboard. Configurations are reproduced from the verbatim source code of each submitted notebook. The GRPO telemetry CSV (190 rows) is provided as a supplementary artifact alongside this writeup.*\n\n## References\n\n1. S. Frieder et al., \"AI Mathematical Olympiad - Progress Prize 3,\" Kaggle Competition, 2025. https://kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3\n\n2. I. Moshkov et al., \"AIMO-2 Winning Solution: Building State-of-the-Art Mathematical Reasoning Models with OpenMathReasoning Dataset,\" arXiv:2504.16891, 2025.\n\n3. P. Mali, \"Scaling Inference-Time Compute for Mathematical Reasoning,\" AIMO3 Writeup, Kaggle, 2026. https://www.kaggle.com/code/pawanmali/chasing-47-50-aimo3-journey-of-60-experiments\n\n4. N. Nitarach, \"Model Capability Dominates: Inference-Time Optimization Lessons from AIMO 3,\" arXiv:2603.27844, 2026.\n\n5. X. Wang et al., \"Self-Consistency Improves Chain of Thought Reasoning in Language Models,\" ICLR, 2023.\n\n6. W. Kwon et al., \"Efficient Memory Management for Large Language Model Serving with PagedAttention,\" SOSP, 2023.\n\n7. OpenAI, \"gpt-oss-120b Model Card,\" 2025. https://huggingface.co/openai/gpt-oss-120b",
      "votes": 14
    },
    {
      "id": 3458585,
      "postDate": "2026-05-16T08:07:00.963Z",
      "content": "<p>Following up on the questions from <a href=\"https://www.kaggle.com/philipvonderlind\" target=\"_blank\">@philipvonderlind</a> (and thanks for the very thorough response), here are some additional questions to help us assess your submission:</p>\n<ol>\n<li><strong>Sensitivity of the 5-component formula:</strong> Your entropy formula uses specific weights. Given the σ=1.20 noise you measured, are these constants informally tuned to your dev set, or did you do any sensitivity analysis showing the formula's apparent gain survives perturbations? <a href=\"https://www.kaggle.com/pawanmali\" target=\"_blank\">@pawanmali</a>'s evidence supports position weighting in principle, but not necessarily these particular weights.</li>\n<li><strong>Offline branches that didn't complete:</strong> You note 9 of 15 offline branches didn't execute to completion. Were there any that you would have liked to resurrect if you had more time?</li>\n</ol>\n<p>Look forward to reading your responses on these.</p>",
      "rawMarkdown": "Following up on the questions from @philipvonderlind (and thanks for the very thorough response), here are some additional questions to help us assess your submission:\n\n1. **Sensitivity of the 5-component formula:** Your entropy formula uses specific weights. Given the σ=1.20 noise you measured, are these constants informally tuned to your dev set, or did you do any sensitivity analysis showing the formula's apparent gain survives perturbations? @pawanmali's evidence supports position weighting in principle, but not necessarily these particular weights.\n2. **Offline branches that didn't complete:** You note 9 of 15 offline branches didn't execute to completion. Were there any that you would have liked to resurrect if you had more time?\n\nLook forward to reading your responses on these.",
      "replies": [
        {
          "id": 3458923,
          "postDate": "2026-05-16T23:59:20.207Z",
          "content": "<p>Thank you <a href=\"https://www.kaggle.com/sambealing\" target=\"_blank\">@sambealing</a> - excellent questions. </p>\n<p><strong>1. Sensitivity of the 5-component formula</strong></p>\n<p>To answer the direct question first: the weights were not tuned against the public leaderboard. The 5-component structure was adopted from pawanmali's framework, and the specific constants (0.30/0.40/0.20/0.30/−0.10, decay 0.995, thresholds 2.0 and 1.0) were set during development and held fixed across all final_submission v2 runs. They were not iterated based on leaderboard feedback - the same formula was used for all 9 variance-measurement runs. However, since there was no separate held-out validation set for the weights either, the question of whether the formula's gain survives perturbation is still worth testing.</p>\n<p>To address this, I built a post-hoc perturbation analysis using 1,500 synthetic problem scenarios calibrated to the AIMO3 difficulty distribution (35% easy with 6-2/7-1 vote splits, 20% medium with 5-3, 10% hard where the correct answer is minority 3-5, 20% exact ties at 4-4, 15% three-way splits at 3-3-2). Entropy profiles were modeled on observed competition patterns: confident solvers (low entropy, especially near conclusion), uncertain solvers (high entropy with spikes), and exploring-then-converging solvers (high early, low late - the profile position weighting is designed to reward). I verified that the sensitivity formula produces identical outputs to the submission code on 4 test sequences before running the analysis.</p>\n<p>The script is public at:\n<a href=\"https://github.com/utkarshsharma00/aimo3/blob/main/sensitivity_analysis.py\" target=\"_blank\">https://github.com/utkarshsharma00/aimo3/blob/main/sensitivity_analysis.py</a></p>\n<p><strong>Key finding: the exact weights barely matter. What matters is using entropy weighting at all.</strong></p>\n<p>The 5-component formula scores 92.5% on the synthetic benchmark. Plain majority vote scores 73.1% - a 19.4-point gap. But all entropy-weighted variants fall within a 3.1-point spread:</p>\n<table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Accuracy</th>\n<th>Δ vs default</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>No std_dev penalty</td>\n<td>93.9%</td>\n<td>+1.4%</td>\n</tr>\n<tr>\n<td>Position-weighted only</td>\n<td>92.7%</td>\n<td>+0.2%</td>\n</tr>\n<tr>\n<td>Double position weight</td>\n<td>92.6%</td>\n<td>+0.1%</td>\n</tr>\n<tr>\n<td><strong>5-comp (our default)</strong></td>\n<td><strong>92.5%</strong></td>\n<td><strong>baseline</strong></td>\n</tr>\n<tr>\n<td>No streak bonus</td>\n<td>92.4%</td>\n<td>−0.1%</td>\n</tr>\n<tr>\n<td>Half position weight</td>\n<td>92.4%</td>\n<td>−0.1%</td>\n</tr>\n<tr>\n<td>Mean + position only</td>\n<td>92.1%</td>\n<td>−0.5%</td>\n</tr>\n<tr>\n<td>No high_ent_ratio</td>\n<td>92.1%</td>\n<td>−0.5%</td>\n</tr>\n<tr>\n<td>Mean entropy only</td>\n<td>90.8%</td>\n<td>−1.7%</td>\n</tr>\n<tr>\n<td><strong>Plain majority vote</strong></td>\n<td><strong>73.1%</strong></td>\n<td><strong>−19.4%</strong></td>\n</tr>\n</tbody>\n</table>\n<p>Even the worst entropy variant (mean entropy only, 90.8%) beats majority vote (73.1%) by 17.7 points. The 3.1pp spread between entropy variants is dwarfed by the 19.4pp gap from majority vote.</p>\n<p>Under individual weight perturbation (each weight scaled by 0.0×, 0.5×, 0.75×, 1.25×, 1.5×, 2.0× independently - 30 perturbations total), the maximum answer flip rate was 1.4% (21/1500 scenarios). Total accuracy range across all 30 perturbations: [92.1%, 93.9%] - a spread of just 1.8 percentage points. Most perturbations caused 0-2 flips out of 1500 (≤0.2%).</p>\n<p>Under Monte Carlo random perturbation (200 trials, all 5 weights simultaneously perturbed by random factors in [0.5, 1.5]), mean accuracy change was +0.08% with a standard deviation of 0.38% and a range of [−0.33%, +1.73%]. Mean flip rate was 0.2%, max 1.7%. No perturbation caused more than 1.73% accuracy change in either direction.</p>\n<p>Where entropy voting concentrates its value (by scenario type):</p>\n<table>\n<thead>\n<tr>\n<th>Scenario type</th>\n<th>5-comp</th>\n<th>Majority</th>\n<th>Δ</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Easy (6-2 split)</td>\n<td>100.0%</td>\n<td>100.0%</td>\n<td>+0.0%</td>\n</tr>\n<tr>\n<td>Medium (5-3 split)</td>\n<td>100.0%</td>\n<td>100.0%</td>\n<td>+0.0%</td>\n</tr>\n<tr>\n<td>Hard (3-5 minority)</td>\n<td>21.7%</td>\n<td>0.0%</td>\n<td>+21.7%</td>\n</tr>\n<tr>\n<td>Tied (4-4 split)</td>\n<td>100.0%</td>\n<td>48.6%</td>\n<td>+51.4%</td>\n</tr>\n<tr>\n<td>Three-way (3-3-2)</td>\n<td>100.0%</td>\n<td>49.5%</td>\n<td>+50.5%</td>\n</tr>\n</tbody>\n</table>\n<p>On uncontested problems (easy/medium), entropy weighting is irrelevant - majority vote already picks the right answer. The entire value concentrates in contested cases: ties, three-way splits, and minority-correct scenarios. This is consistent with our competition experience: on ~35 of 50 problems, all 8 attempts agree and the voting function doesn't matter. On the ~15 contested problems, entropy weighting breaks ties toward the more confident trace.</p>\n<p><strong>An unexpected finding:</strong> The analysis suggests our formula may be slightly over-engineered. \"No std_dev penalty\" (removing the variance component entirely) scored +1.4% better than the full 5-component formula, and \"position-weighted only\" (dropping all 4 other components) scored +0.2% better. The std_dev component may introduce noise rather than signal. This is a finding we did not expect and would not have discovered without this post-hoc analysis.</p>\n<p><strong>Important caveats:</strong> This analysis uses synthetic scenarios, not a replay of actual competition logprobs. The entropy profiles are modeled on observed patterns but make a key assumption: that correct traces tend to have lower position-weighted entropy near the conclusion than incorrect traces. This is the intuition behind position weighting (a solver that reached the correct answer through valid reasoning should be confident at the end), and it's supported by multiple independent findings: pawanmali's multi-run evidence (3-6 point advantage for position-weighted over mean entropy across ~8 runs), Potrhino's empirical result that tail entropy (last 2048 tokens) is the strongest single indicator of incorrect reasoning paths on gpt-oss-120b, outperforming global mean entropy (§4.5.1.3 of their writeup), and the DeepConf framework (Fu et al., 2025), which achieves 99.9% on AIME 2025 by filtering traces using token-level confidence. Conversely, rzatemizel's density analysis shows that mean entropy has near-zero discriminative power - which is precisely why we use position weighting rather than mean entropy. The assumption remains unproven on real gpt-oss-120b logprobs for our specific formula, but the directional evidence across these independent analyses is consistent. A proper validation would require logging per-attempt logprobs during competition runs and replaying them with perturbed weights - data I did not collect. The structural conclusion (any entropy weighting &gt;&gt; majority vote; exact weights don't matter much; position weighting &gt; mean entropy) is robust within this simulation framework.</p>\n<p><strong>2. Offline branches worth resurrecting</strong></p>\n<p>If I had more time, I would prioritize <strong>Branch C (controller + code rescue + provenance-aware arbitration)</strong>. </p>\n<p>The design addresses a failure class that few submitted approaches directly targeted: what to do when the attempt pool is <em>fragmented</em> (multiple incompatible answer clusters with no majority) or <em>broken</em> (most attempts failed to produce valid  answers). AMO's Master Vision pipeline (davidacad10 et al.) is the closest parallel - both detect the absence of consensus and launch a resolution mechanism. Branch C differs in using a deterministic state machine rather than an LLM agent for the detection step.</p>\n<p><strong>Convergence/divergence state controller.</strong> Detects whether the pool has converged (stop early, save budget), fragmented (multiple clusters, need resolution), or broken (most attempts returned no answer). This is strictly better than flat early-stop thresholds because it adapts compute to the observed pool state rather than applying a fixed rule.</p>\n<p><strong>Targeted code rescue.</strong> When text-based reasoning fails, switches to a tool-backed exact computation path. This directly addresses what IceBeam777's RSA writeup calls \"Class 4/5\" problems - where the model converges confidently to a wrong answer and no amount of resampling fixes it.</p>\n<p><strong>Provenance-aware weighting.</strong> Candidates supported by multiple evidence modes (main pool + code rescue + challenge pass) receive higher weight than single-source answers. This is a richer signal than entropy alone.</p>\n<p>What makes Branch C architecturally interesting is how it relates to other competitors' independently developed approaches:</p>\n<p><em>vs. ippeiogawa's Blackboard.</em> The Blackboard shares tool I/O between threads during generation, allowing threads to build on each other's computational discoveries. Branch C's code rescue is complementary - instead of sharing intermediate computations between threads, it launches an entirely separate computation mode when text-based reasoning fails. Both address threads getting stuck in wrong reasoning frames, but from different directions: Blackboard prevents getting stuck by sharing information; code rescue recovers after getting stuck by switching modality.</p>\n<p><em>vs. rzatemizel's Judger.</em> The 3-base/5-judger architecture evaluates completed reasoning traces to select the best answer. Branch C's provenance-aware arbitration is similar in spirit - both use evidence quality rather than raw vote count to weight  answers. The key difference is that rzatemizel's judger is a separate LLM call that evaluates the full reasoning trace, while Branch C's provenance weighting is a lightweight, deterministic function of which evidence modes support each answer - far less compute cost but less nuanced information about reasoning quality.</p>\n<p><em>vs. AMO's Master Vision (davidacad10 et al.).</em> AMO introduces a Master Vision agent that synthesizes findings from competing solvers when no majority exists - essentially a conflict-resolution pipeline. Branch C's convergence controller serves the same role but as a deterministic state machine rather than an LLM agent, avoiding the latency and hallucination risk of another LLM call while sacrificing the flexibility of natural-language synthesis.</p>\n<p>The reason Branch C didn't ship was infrastructure: wiring bugs in the multi-stage pipeline prevented end-to-end execution on Colab. With another week of debugging time, I believe the state controller alone would have been worth integrating - it addresses time allocation more intelligently than any flat threshold. But in a time-constrained competition, architectural ambition must be balanced against execution reliability. Our final submission won not because it was the best architecture we designed, but because it was the best one we <em>shipped</em>.</p>\n<hr>\n<p>Happy to provide additional detail on any of these points.</p>",
          "rawMarkdown": "Thank you @sambealing - excellent questions. \n\n**1. Sensitivity of the 5-component formula**\n\nTo answer the direct question first: the weights were not tuned against the public leaderboard. The 5-component structure was adopted from pawanmali's framework, and the specific constants (0.30/0.40/0.20/0.30/−0.10, decay 0.995, thresholds 2.0 and 1.0) were set during development and held fixed across all final_submission v2 runs. They were not iterated based on leaderboard feedback - the same formula was used for all 9 variance-measurement runs. However, since there was no separate held-out validation set for the weights either, the question of whether the formula's gain survives perturbation is still worth testing.\n\nTo address this, I built a post-hoc perturbation analysis using 1,500 synthetic problem scenarios calibrated to the AIMO3 difficulty distribution (35% easy with 6-2/7-1 vote splits, 20% medium with 5-3, 10% hard where the correct answer is minority 3-5, 20% exact ties at 4-4, 15% three-way splits at 3-3-2). Entropy profiles were modeled on observed competition patterns: confident solvers (low entropy, especially near conclusion), uncertain solvers (high entropy with spikes), and exploring-then-converging solvers (high early, low late - the profile position weighting is designed to reward). I verified that the sensitivity formula produces identical outputs to the submission code on 4 test sequences before running the analysis.\n\nThe script is public at:\nhttps://github.com/utkarshsharma00/aimo3/blob/main/sensitivity_analysis.py\n\n**Key finding: the exact weights barely matter. What matters is using entropy weighting at all.**\n\nThe 5-component formula scores 92.5% on the synthetic benchmark. Plain majority vote scores 73.1% - a 19.4-point gap. But all entropy-weighted variants fall within a 3.1-point spread:\n\n| Method                  | Accuracy | Δ vs default |\n|-------------------------|----------|-------------|\n| No std_dev penalty      | 93.9%    | +1.4%       |\n| Position-weighted only  | 92.7%    | +0.2%       |\n| Double position weight  | 92.6%    | +0.1%       |\n| **5-comp (our default)**| **92.5%**| **baseline** |\n| No streak bonus         | 92.4%    | −0.1%       |\n| Half position weight    | 92.4%    | −0.1%       |\n| Mean + position only    | 92.1%    | −0.5%       |\n| No high_ent_ratio       | 92.1%    | −0.5%       |\n| Mean entropy only       | 90.8%    | −1.7%       |\n| **Plain majority vote** | **73.1%**| **−19.4%**  |\n\nEven the worst entropy variant (mean entropy only, 90.8%) beats majority vote (73.1%) by 17.7 points. The 3.1pp spread between entropy variants is dwarfed by the 19.4pp gap from majority vote.\n\nUnder individual weight perturbation (each weight scaled by 0.0×, 0.5×, 0.75×, 1.25×, 1.5×, 2.0× independently - 30 perturbations total), the maximum answer flip rate was 1.4% (21/1500 scenarios). Total accuracy range across all 30 perturbations: [92.1%, 93.9%] - a spread of just 1.8 percentage points. Most perturbations caused 0-2 flips out of 1500 (≤0.2%).\n\nUnder Monte Carlo random perturbation (200 trials, all 5 weights simultaneously perturbed by random factors in [0.5, 1.5]), mean accuracy change was +0.08% with a standard deviation of 0.38% and a range of [−0.33%, +1.73%]. Mean flip rate was 0.2%, max 1.7%. No perturbation caused more than 1.73% accuracy change in either direction.\n\nWhere entropy voting concentrates its value (by scenario type):\n\n| Scenario type       | 5-comp  | Majority | Δ       |\n|---------------------|---------|----------|---------|\n| Easy (6-2 split)    | 100.0%  | 100.0%   | +0.0%   |\n| Medium (5-3 split)  | 100.0%  | 100.0%   | +0.0%   |\n| Hard (3-5 minority) |  21.7%  |   0.0%   | +21.7%  |\n| Tied (4-4 split)    | 100.0%  |  48.6%   | +51.4%  |\n| Three-way (3-3-2)   | 100.0%  |  49.5%   | +50.5%  |\n\nOn uncontested problems (easy/medium), entropy weighting is irrelevant - majority vote already picks the right answer. The entire value concentrates in contested cases: ties, three-way splits, and minority-correct scenarios. This is consistent with our competition experience: on ~35 of 50 problems, all 8 attempts agree and the voting function doesn't matter. On the ~15 contested problems, entropy weighting breaks ties toward the more confident trace.\n\n**An unexpected finding:** The analysis suggests our formula may be slightly over-engineered. \"No std_dev penalty\" (removing the variance component entirely) scored +1.4% better than the full 5-component formula, and \"position-weighted only\" (dropping all 4 other components) scored +0.2% better. The std_dev component may introduce noise rather than signal. This is a finding we did not expect and would not have discovered without this post-hoc analysis.\n\n**Important caveats:** This analysis uses synthetic scenarios, not a replay of actual competition logprobs. The entropy profiles are modeled on observed patterns but make a key assumption: that correct traces tend to have lower position-weighted entropy near the conclusion than incorrect traces. This is the intuition behind position weighting (a solver that reached the correct answer through valid reasoning should be confident at the end), and it's supported by multiple independent findings: pawanmali's multi-run evidence (3-6 point advantage for position-weighted over mean entropy across ~8 runs), Potrhino's empirical result that tail entropy (last 2048 tokens) is the strongest single indicator of incorrect reasoning paths on gpt-oss-120b, outperforming global mean entropy (§4.5.1.3 of their writeup), and the DeepConf framework (Fu et al., 2025), which achieves 99.9% on AIME 2025 by filtering traces using token-level confidence. Conversely, rzatemizel's density analysis shows that mean entropy has near-zero discriminative power - which is precisely why we use position weighting rather than mean entropy. The assumption remains unproven on real gpt-oss-120b logprobs for our specific formula, but the directional evidence across these independent analyses is consistent. A proper validation would require logging per-attempt logprobs during competition runs and replaying them with perturbed weights - data I did not collect. The structural conclusion (any entropy weighting >> majority vote; exact weights don't matter much; position weighting > mean entropy) is robust within this simulation framework.\n\n**2. Offline branches worth resurrecting**\n\nIf I had more time, I would prioritize **Branch C (controller + code rescue + provenance-aware arbitration)**. \n\nThe design addresses a failure class that few submitted approaches directly targeted: what to do when the attempt pool is *fragmented* (multiple incompatible answer clusters with no majority) or *broken* (most attempts failed to produce valid  answers). AMO's Master Vision pipeline (davidacad10 et al.) is the closest parallel - both detect the absence of consensus and launch a resolution mechanism. Branch C differs in using a deterministic state machine rather than an LLM agent for the detection step.\n\n**Convergence/divergence state controller.** Detects whether the pool has converged (stop early, save budget), fragmented (multiple clusters, need resolution), or broken (most attempts returned no answer). This is strictly better than flat early-stop thresholds because it adapts compute to the observed pool state rather than applying a fixed rule.\n\n**Targeted code rescue.** When text-based reasoning fails, switches to a tool-backed exact computation path. This directly addresses what IceBeam777's RSA writeup calls \"Class 4/5\" problems - where the model converges confidently to a wrong answer and no amount of resampling fixes it.\n\n**Provenance-aware weighting.** Candidates supported by multiple evidence modes (main pool + code rescue + challenge pass) receive higher weight than single-source answers. This is a richer signal than entropy alone.\n\nWhat makes Branch C architecturally interesting is how it relates to other competitors' independently developed approaches:\n\n*vs. ippeiogawa's Blackboard.* The Blackboard shares tool I/O between threads during generation, allowing threads to build on each other's computational discoveries. Branch C's code rescue is complementary - instead of sharing intermediate computations between threads, it launches an entirely separate computation mode when text-based reasoning fails. Both address threads getting stuck in wrong reasoning frames, but from different directions: Blackboard prevents getting stuck by sharing information; code rescue recovers after getting stuck by switching modality.\n\n*vs. rzatemizel's Judger.* The 3-base/5-judger architecture evaluates completed reasoning traces to select the best answer. Branch C's provenance-aware arbitration is similar in spirit - both use evidence quality rather than raw vote count to weight  answers. The key difference is that rzatemizel's judger is a separate LLM call that evaluates the full reasoning trace, while Branch C's provenance weighting is a lightweight, deterministic function of which evidence modes support each answer - far less compute cost but less nuanced information about reasoning quality.\n\n*vs. AMO's Master Vision (davidacad10 et al.).* AMO introduces a Master Vision agent that synthesizes findings from competing solvers when no majority exists - essentially a conflict-resolution pipeline. Branch C's convergence controller serves the same role but as a deterministic state machine rather than an LLM agent, avoiding the latency and hallucination risk of another LLM call while sacrificing the flexibility of natural-language synthesis.\n\nThe reason Branch C didn't ship was infrastructure: wiring bugs in the multi-stage pipeline prevented end-to-end execution on Colab. With another week of debugging time, I believe the state controller alone would have been worth integrating - it addresses time allocation more intelligently than any flat threshold. But in a time-constrained competition, architectural ambition must be balanced against execution reliability. Our final submission won not because it was the best architecture we designed, but because it was the best one we *shipped*.\n\n---\n\nHappy to provide additional detail on any of these points.",
          "replies": [
            {
              "id": 3463165,
              "postDate": "2026-05-26T05:01:58.780Z",
              "content": "<p>Note: After posting this analysis, the 2nd-place solution writeup 'Vote-dominant Ensembling and a Sharper System Prompt' by <a href=\"https://www.kaggle.com/varianceofx\" target=\"_blank\">@varianceofx</a> was published. Their \"tail-windowed entropy\" (Improvement 3) independently converges on the same design as our position weighting - using entropy over only the last 256 tokens rather than the full trace, with the same reasoning that early-trace entropy reflects exploration, not answer confidence. Their ensemble design (Improvement 5) also independently confirms our sensitivity finding: they weight vote_share at 2.0 and confidence at only 0.3, concluding that \"entropy is best used as a tiebreaker, not as the main criterion.\" Two independent teams arriving at the same architectural conclusion strengthens the case that position/tail entropy &gt; mean entropy, and that exact weights are secondary to using entropy weighting at all.</p>",
              "rawMarkdown": "Note: After posting this analysis, the 2nd-place solution writeup 'Vote-dominant Ensembling and a Sharper System Prompt' by @varianceofx was published. Their \"tail-windowed entropy\" (Improvement 3) independently converges on the same design as our position weighting - using entropy over only the last 256 tokens rather than the full trace, with the same reasoning that early-trace entropy reflects exploration, not answer confidence. Their ensemble design (Improvement 5) also independently confirms our sensitivity finding: they weight vote_share at 2.0 and confidence at only 0.3, concluding that \"entropy is best used as a tiebreaker, not as the main criterion.\" Two independent teams arriving at the same architectural conclusion strengthens the case that position/tail entropy > mean entropy, and that exact weights are secondary to using entropy weighting at all."
            }
          ]
        }
      ]
    },
    {
      "id": 3457396,
      "postDate": "2026-05-13T17:44:36.593Z",
      "content": "<p><strong>Edited on May 13th 2026 for the rebuttal phase:</strong></p>\n<p>Changes made:</p>\n<ul>\n<li>Added Section 11 (Private Leaderboard Result): private LB score of 41.5/50, rank 828/4,138, confirming the score falls within our predicted 95% CI of [39.85, 41.70]</li>\n<li>Updated Abstract and Section 10 to include the private LB score</li>\n<li>Responded to <a href=\"https://www.kaggle.com/philipvonderlind\" target=\"_blank\">@philipvonderlind</a>'s three reviewer questions (GRPO reconciliation with outliar's results, local testing methodology, entropy correlation evidence) in a separate comment below</li>\n</ul>\n<p>No architectural claims, experimental results, or methodological conclusions were altered. The private LB result validates the variance methodology described in Section 3 - our pre-registered 95% CI correctly predicted the out-of-sample private score.</p>",
      "rawMarkdown": "**Edited on May 13th 2026 for the rebuttal phase:**\n\nChanges made:\n- Added Section 11 (Private Leaderboard Result): private LB score of 41.5/50, rank 828/4,138, confirming the score falls within our predicted 95% CI of [39.85, 41.70]\n- Updated Abstract and Section 10 to include the private LB score\n- Responded to @philipvonderlind's three reviewer questions (GRPO reconciliation with outliar's results, local testing methodology, entropy correlation evidence) in a separate comment below\n\nNo architectural claims, experimental results, or methodological conclusions were altered. The private LB result validates the variance methodology described in Section 3 - our pre-registered 95% CI correctly predicted the out-of-sample private score."
    },
    {
      "id": 3456831,
      "postDate": "2026-05-12T16:43:16.203Z",
      "content": "<p>Hi, thank you for your submission to the Writeup Prize. <a href=\"https://www.kaggle.com/sambealing\" target=\"_blank\">@sambealing</a> and I will post some questions below that help us in assessing your submission more closely, as described in the updated discussion post.</p>\n<p>I have a few questions regarding some of the ideas proposed and implemented in your writeup:</p>\n<ol>\n<li><p><strong>GRPO</strong>: Other contestants, notably <a href=\"https://www.kaggle.com/outliar\" target=\"_blank\">@outliar</a>, have <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/four-phase-adaptation-of-a-120b-model-for-tool-aug\" target=\"_blank\">reported successful gains</a> using GRPO. You mention that the observed improvements in your pipeline may be attributable to noise, which could certainly also apply to other submissions. How would you explain the GRPO gains reported by other contestants in comparison to your own training results?</p></li>\n<li><p><strong>Local Testing</strong>: Most of your ablations appear to rely on single public leaderboard experiments. Did you also attempt to verify these changes locally, for example, using one of the datasets from the Math Corpus Prize entries? Reporting score distributions across repeated runs, along with variance estimates, would make the results easier for others to interpret.</p></li>\n<li><p><strong>Entropy</strong>: Did you verify that entropy-based voting actually correlates with more mathematically correct traces? Some <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/model-capability-dominates\" target=\"_blank\">other writeups</a> have reported that model confidence does not necessarily correspond to trace correctness.</p></li>\n</ol>\n<p>Looking forward to your response :)</p>",
      "rawMarkdown": "Hi, thank you for your submission to the Writeup Prize. @sambealing and I will post some questions below that help us in assessing your submission more closely, as described in the updated discussion post.\n\nI have a few questions regarding some of the ideas proposed and implemented in your writeup:\n\n1. **GRPO**: Other contestants, notably @outliar, have [reported successful gains](https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/four-phase-adaptation-of-a-120b-model-for-tool-aug) using GRPO. You mention that the observed improvements in your pipeline may be attributable to noise, which could certainly also apply to other submissions. How would you explain the GRPO gains reported by other contestants in comparison to your own training results?\n\n2. **Local Testing**: Most of your ablations appear to rely on single public leaderboard experiments. Did you also attempt to verify these changes locally, for example, using one of the datasets from the Math Corpus Prize entries? Reporting score distributions across repeated runs, along with variance estimates, would make the results easier for others to interpret.\n\n3. **Entropy**: Did you verify that entropy-based voting actually correlates with more mathematically correct traces? Some [other writeups](https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/model-capability-dominates) have reported that model confidence does not necessarily correspond to trace correctness.\n\nLooking forward to your response :)\n",
      "replies": [
        {
          "id": 3456863,
          "postDate": "2026-05-12T17:24:06.790Z",
          "content": "<p>Hi <a href=\"https://www.kaggle.com/philipvonderlind\" target=\"_blank\">@philipvonderlind</a> - thank you for the detailed questions. Happy to address each one.</p>\n<p><strong>1. GRPO: Reconciling our failure with outliar's reported gains</strong></p>\n<p>The critical distinction between our GRPO attempt and outliar's is the deployment path, not the training itself. Our GRPO v6 loop trained stably for 38 cycles with zero loss collapses - the training worked. The failure was at deployment: we used Unsloth's <code>merged_4bit_forced</code> to merge the adapter, which produces BitsAndBytes NF4 weights. gpt-oss-120b's native format is MXFP4. vLLM routes NF4 weights through a different (degraded) kernel path, producing the 13/50 catastrophic score. outliar avoided this by using <code>save_method=\"mxfp4\"</code> - the correct deployment path.</p>\n<p>However, even when GRPO deployment succeeds, the gains appear modest relative to inference-only optimization. outliar's final fine-tuned model (SFT + GRPO + ORPO + MXFP4 bake) achieved μ=38.57 (σ=1.67, n=35) - which is 2.2 points below our inference-only μ=40.78 (σ=1.20, n=9). Their pre-ORPO baseline was μ=36.6, so the total fine-tuning gain was approximately +2 points. Meanwhile, Inoichan et al. (\"Pushing the Limits: Post-Training High-Capability Models under Strict Inference\" writeup, 10 authors, 32 H100s) ran full-parameter SFT for 10 epochs on 10.37 billion tokens and improved pass@1 by only +0.77 percentage points - while actually <em>reducing</em> coverage (Pass@16) from 92.28% to 90.88%. Their RL (GRPO variant) showed a similar pattern: +1.0 pass@1 but −2.11 coverage.</p>\n<p>So our position is nuanced. We do NOT claim GRPO cannot help - outliar's +2 is real. We claim that (a) the deployment pipeline is a documented trap that cost us $300 and that future participants should be aware of, and (b) even when fine-tuning succeeds, the gains are small relative to inference-only optimization on a base model this strong, and coverage (the model's solvable problem space) may actually shrink with training. The latter finding from Inoichan et al. is the strongest independent evidence supporting our thesis.</p>\n<p><strong>2. Local Testing: Variance estimates and offline verification</strong></p>\n<p>You're right that many of our architectural ablations (strategy prompts, 5-stage scaffold, router, etc.) relied on single or few-shot public leaderboard comparisons. This is the most significant methodological limitation of our writeup, and we acknowledge it.</p>\n<p>However, we did two things that go beyond single-shot LB comparison:</p>\n<p><em>The n=9 variance experiment.</em> We submitted <code>final_submission v2</code> nine times without modification, producing scores {39, 40, 43, 40, 42, 40, 41, 41, 41} with μ=40.78 and σ=1.20. This established our noise floor: any Δ &lt; 2σ ≈ 2.4 points is indistinguishable from running the same notebook twice. This measurement is what allows us to claim the strategy-prompt family (5 submissions, mean ~36.6) is directionally negative (Δ ≈ −4.2, outside the ±2σ band) rather than noise.</p>\n<p><em>Offline evaluation on hard50.</em> We ran 15 offline research branches against hard_50_math_problems_set_v6.csv (zfturbo's dataset from the Math Corpus Prize). One branch - aimo3_branch_B_multicell - completed a full 50-problem run with inline grading: 27/50 (54.0%), mean 233s/problem. This is the only verified offline number we cite, and we document honestly that 9 of our 15 offline branches never executed to completion. The offline work is detailed in Section 4 and Appendix H of the writeup.</p>\n<p>We did not use the offline benchmark for per-variant ablation (e.g., running each of our 11 configurations on hard50 multiple times) - which would have been the methodologically stronger approach. The reason was practical: each hard50 run took ~3.5 hours on Colab, and we prioritized leaderboard submissions over systematic offline testing. In hindsight, this was the wrong tradeoff - our Lesson #1 in Section 9 is exactly this: \"Establish the noise floor first. Submit the same notebook 5-10 times before iterating on architecture.\"</p>\n<p>For comparison, sebastiangil00's writeup (\"Three Substrate Traps on gpt-oss-120b-MXFP4\") tested 16 variants on a 199-problem validation set with McNemar paired tests and Benjamini-Hochberg correction - a substantially more rigorous methodology than ours. We consider their statistical approach the gold standard for future competitions.</p>\n<p><strong>3. Entropy: Does it actually correlate with correctness?</strong></p>\n<p>This is the hardest question, and the honest answer is: we don't have conclusive evidence that our specific entropy formula correlates with trace correctness in isolation.</p>\n<p>What we know:</p>\n<p><em>Mean entropy does not discriminate.</em> rzatemizel's density plots (\"Fighting Variance\" writeup) show correct answers have mean entropy 0.7053 vs wrong answers 0.7503 - a gap of 0.045 on almost completely overlapping distributions. Schwyter (arXiv:2603.27844) also found that model confidence does not correspond to trace correctness, as you reference. We agree with this finding for mean entropy.</p>\n<p><em>Our formula is structurally different from mean entropy.</em> The 5-component weighted entropy uses position weighting (40% of the score, exponential decay 0.995 favoring tokens near <code>\\boxed{}</code>), variance penalty, high-entropy ratio, and low-entropy streak bonus. The key intuition is that a solution can be uncertain during exploration but should be confident at the conclusion - position weighting captures this, while mean entropy averages over the entire trace and loses the signal.</p>\n<p><em>rzatemizel confirmed they did not test position-weighted variants.</em> In their reply to our comment on their writeup, they stated: \"I did not check position-weighted entropy or other similar variants, because I lost confidence in logprobs fairly early.\" So the density - overlap finding applies to mean entropy specifically, not necessarily to our position-weighted composite.</p>\n<p><em>pawanmali provides the strongest supporting evidence.</em> In their reply to our comment, they confirmed: \"mean entropy consistently underperformed position-weighted entropy by 3-6 points across ~8 different runs where that was the primary variable.\" This is multi-run directional evidence that position-weighted entropy captures something that mean entropy does not.</p>\n<p><em>Our own comparison is confounded.</em> We changed the voting function AND stripped the scaffolding simultaneously, so we cannot isolate which change was load-bearing. We state this explicitly in the writeup (Section 6, final paragraph). The honest answer is: we don't know whether the entropy formula or the scaffold removal (or both) drove the improvement from ~36.6 to 40.78.</p>\n<p>The bottom line: mean entropy is probably not a useful discriminator (confirmed by rzatemizel and Schwyter). Position-weighted entropy may retain discriminative power at the conclusion of the reasoning trace, supported by pawanmali's multi-run evidence but not conclusively proven by our own data. We consider this an open empirical question that deserves a controlled ablation we were unable to run before the deadline.</p>\n<hr>\n<p>Happy to provide additional detail on any of these points.</p>",
          "rawMarkdown": "Hi @philipvonderlind - thank you for the detailed questions. Happy to address each one.\n\n**1. GRPO: Reconciling our failure with outliar's reported gains**\n\nThe critical distinction between our GRPO attempt and outliar's is the deployment path, not the training itself. Our GRPO v6 loop trained stably for 38 cycles with zero loss collapses - the training worked. The failure was at deployment: we used Unsloth's `merged_4bit_forced` to merge the adapter, which produces BitsAndBytes NF4 weights. gpt-oss-120b's native format is MXFP4. vLLM routes NF4 weights through a different (degraded) kernel path, producing the 13/50 catastrophic score. outliar avoided this by using `save_method=\"mxfp4\"` - the correct deployment path.\n\nHowever, even when GRPO deployment succeeds, the gains appear modest relative to inference-only optimization. outliar's final fine-tuned model (SFT + GRPO + ORPO + MXFP4 bake) achieved μ=38.57 (σ=1.67, n=35) - which is 2.2 points below our inference-only μ=40.78 (σ=1.20, n=9). Their pre-ORPO baseline was μ=36.6, so the total fine-tuning gain was approximately +2 points. Meanwhile, Inoichan et al. (\"Pushing the Limits: Post-Training High-Capability Models under Strict Inference\" writeup, 10 authors, 32 H100s) ran full-parameter SFT for 10 epochs on 10.37 billion tokens and improved pass@1 by only +0.77 percentage points - while actually *reducing* coverage (Pass@16) from 92.28% to 90.88%. Their RL (GRPO variant) showed a similar pattern: +1.0 pass@1 but −2.11 coverage.\n\nSo our position is nuanced. We do NOT claim GRPO cannot help - outliar's +2 is real. We claim that (a) the deployment pipeline is a documented trap that cost us $300 and that future participants should be aware of, and (b) even when fine-tuning succeeds, the gains are small relative to inference-only optimization on a base model this strong, and coverage (the model's solvable problem space) may actually shrink with training. The latter finding from Inoichan et al. is the strongest independent evidence supporting our thesis.\n\n**2. Local Testing: Variance estimates and offline verification**\n\nYou're right that many of our architectural ablations (strategy prompts, 5-stage scaffold, router, etc.) relied on single or few-shot public leaderboard comparisons. This is the most significant methodological limitation of our writeup, and we acknowledge it.\n\nHowever, we did two things that go beyond single-shot LB comparison:\n\n*The n=9 variance experiment.* We submitted `final_submission v2` nine times without modification, producing scores {39, 40, 43, 40, 42, 40, 41, 41, 41} with μ=40.78 and σ=1.20. This established our noise floor: any Δ < 2σ ≈ 2.4 points is indistinguishable from running the same notebook twice. This measurement is what allows us to claim the strategy-prompt family (5 submissions, mean ~36.6) is directionally negative (Δ ≈ −4.2, outside the ±2σ band) rather than noise.\n\n*Offline evaluation on hard50.* We ran 15 offline research branches against hard_50_math_problems_set_v6.csv (zfturbo's dataset from the Math Corpus Prize). One branch - aimo3_branch_B_multicell - completed a full 50-problem run with inline grading: 27/50 (54.0%), mean 233s/problem. This is the only verified offline number we cite, and we document honestly that 9 of our 15 offline branches never executed to completion. The offline work is detailed in Section 4 and Appendix H of the writeup.\n\nWe did not use the offline benchmark for per-variant ablation (e.g., running each of our 11 configurations on hard50 multiple times) - which would have been the methodologically stronger approach. The reason was practical: each hard50 run took ~3.5 hours on Colab, and we prioritized leaderboard submissions over systematic offline testing. In hindsight, this was the wrong tradeoff - our Lesson #1 in Section 9 is exactly this: \"Establish the noise floor first. Submit the same notebook 5-10 times before iterating on architecture.\"\n\nFor comparison, sebastiangil00's writeup (\"Three Substrate Traps on gpt-oss-120b-MXFP4\") tested 16 variants on a 199-problem validation set with McNemar paired tests and Benjamini-Hochberg correction - a substantially more rigorous methodology than ours. We consider their statistical approach the gold standard for future competitions.\n\n**3. Entropy: Does it actually correlate with correctness?**\n\nThis is the hardest question, and the honest answer is: we don't have conclusive evidence that our specific entropy formula correlates with trace correctness in isolation.\n\nWhat we know:\n\n*Mean entropy does not discriminate.* rzatemizel's density plots (\"Fighting Variance\" writeup) show correct answers have mean entropy 0.7053 vs wrong answers 0.7503 - a gap of 0.045 on almost completely overlapping distributions. Schwyter (arXiv:2603.27844) also found that model confidence does not correspond to trace correctness, as you reference. We agree with this finding for mean entropy.\n\n*Our formula is structurally different from mean entropy.* The 5-component weighted entropy uses position weighting (40% of the score, exponential decay 0.995 favoring tokens near `\\boxed{}`), variance penalty, high-entropy ratio, and low-entropy streak bonus. The key intuition is that a solution can be uncertain during exploration but should be confident at the conclusion - position weighting captures this, while mean entropy averages over the entire trace and loses the signal.\n\n*rzatemizel confirmed they did not test position-weighted variants.* In their reply to our comment on their writeup, they stated: \"I did not check position-weighted entropy or other similar variants, because I lost confidence in logprobs fairly early.\" So the density - overlap finding applies to mean entropy specifically, not necessarily to our position-weighted composite.\n\n*pawanmali provides the strongest supporting evidence.* In their reply to our comment, they confirmed: \"mean entropy consistently underperformed position-weighted entropy by 3-6 points across ~8 different runs where that was the primary variable.\" This is multi-run directional evidence that position-weighted entropy captures something that mean entropy does not.\n\n*Our own comparison is confounded.* We changed the voting function AND stripped the scaffolding simultaneously, so we cannot isolate which change was load-bearing. We state this explicitly in the writeup (Section 6, final paragraph). The honest answer is: we don't know whether the entropy formula or the scaffold removal (or both) drove the improvement from ~36.6 to 40.78.\n\nThe bottom line: mean entropy is probably not a useful discriminator (confirmed by rzatemizel and Schwyter). Position-weighted entropy may retain discriminative power at the conclusion of the reasoning trace, supported by pawanmali's multi-run evidence but not conclusively proven by our own data. We consider this an open empirical question that deserves a controlled ablation we were unable to run before the deadline.\n\n---\n\nHappy to provide additional detail on any of these points."
        }
      ]
    },
    {
      "id": 3454392,
      "postDate": "2026-05-07T03:06:55.633Z",
      "content": "<p><strong>Reproducibility Package</strong></p>\n<p><strong>Model:</strong> danielhanchen/gpt-oss-120b (HuggingFace, unmodified - no fine-tuning, no LoRA, no weight patches)\n<a href=\"https://huggingface.co/danielhanchen/gpt-oss-120b\" target=\"_blank\">https://huggingface.co/danielhanchen/gpt-oss-120b</a></p>\n<p><strong>Kaggle submission notebook (final_submission v2):</strong>\n<a href=\"https://www.kaggle.com/code/flamingice2801/final-submission\" target=\"_blank\">https://www.kaggle.com/code/flamingice2801/final-submission</a></p>\n<p><strong>Google Colab notebook (Kaggle-agnostic):</strong>\n<a href=\"https://colab.research.google.com/github/utkarshsharma00/aimo3/blob/main/colab_inference.ipynb\" target=\"_blank\">https://colab.research.google.com/github/utkarshsharma00/aimo3/blob/main/colab_inference.ipynb</a></p>\n<p><strong>Standalone inference script:</strong>\n<a href=\"https://github.com/utkarshsharma00/aimo3/blob/main/run_inference.py\" target=\"_blank\">https://github.com/utkarshsharma00/aimo3/blob/main/run_inference.py</a></p>\n<p><strong>Figure generation script (reproduces all 9 figures):</strong>\n<a href=\"https://github.com/utkarshsharma00/aimo3/blob/main/generate_figures.py\" target=\"_blank\">https://github.com/utkarshsharma00/aimo3/blob/main/generate_figures.py</a></p>\n<p><strong>Full repository:</strong>\n<a href=\"https://github.com/utkarshsharma00/aimo3\" target=\"_blank\">https://github.com/utkarshsharma00/aimo3</a></p>\n<p>The entire contribution is inference-side - no custom model artifacts. The Colab notebook pulls the stock model from HuggingFace and contains the full pipeline (solver, 5-component entropy voting, sandbox pool, streaming parser, adaptive time management). Requires an A100/H100 80GB runtime.</p>",
      "rawMarkdown": "**Reproducibility Package**\n\n**Model:** danielhanchen/gpt-oss-120b (HuggingFace, unmodified - no fine-tuning, no LoRA, no weight patches)\nhttps://huggingface.co/danielhanchen/gpt-oss-120b\n\n**Kaggle submission notebook (final_submission v2):**\nhttps://www.kaggle.com/code/flamingice2801/final-submission\n\n**Google Colab notebook (Kaggle-agnostic):**\nhttps://colab.research.google.com/github/utkarshsharma00/aimo3/blob/main/colab_inference.ipynb\n\n**Standalone inference script:**\nhttps://github.com/utkarshsharma00/aimo3/blob/main/run_inference.py\n\n**Figure generation script (reproduces all 9 figures):**\nhttps://github.com/utkarshsharma00/aimo3/blob/main/generate_figures.py\n\n**Full repository:**\nhttps://github.com/utkarshsharma00/aimo3\n\nThe entire contribution is inference-side - no custom model artifacts. The Colab notebook pulls the stock model from HuggingFace and contains the full pipeline (solver, 5-component entropy voting, sandbox pool, streaming parser, adaptive time management). Requires an A100/H100 80GB runtime.\n"
    },
    {
      "id": 3446698,
      "postDate": "2026-04-22T00:58:51.433Z",
      "content": "<p><strong>Note added after reviewing concurrent writeups (April 21, 2026)</strong></p>\n<p>Several independent writeups have now been published that converge on the same central finding documented here. Schwyter (arXiv:2603.27844, 23 experiments across 3 models) found that model capability dominates all prompt-level optimizations by 4×. <a href=\"https://www.kaggle.com/merkiraz\" target=\"_blank\">@merkiraz</a> (11 controlled submissions) found every modification preserved or degraded performance. <a href=\"https://www.kaggle.com/kolenkovskin\" target=\"_blank\">@kolenkovskin</a> (20+ dead ends across 28 submissions) independently concluded that \"subtraction beats addition.\" <a href=\"https://www.kaggle.com/potrhino\" target=\"_blank\">@potrhino</a> (7 controlled ablation runs on a 75-problem validation set) documented positive contributions from TIR and dynamic time management but found that the remaining gap is compute-constrained. This convergence across 5+ independent teams - each arriving at similar negative conclusions through different experimental paths - is itself evidence that the finding is robust.</p>\n<p>Regarding selection loss: the host's pass@N analysis shows pass@8 ≈ 44 on the private set, meaning the correct answer appears in at least one of our 8 attempts for ~44 of 50 problems. Our mean of 40.78 implies we correctly select the right answer from the pool ~93% of the time. The remaining ~3 problems per run where we have the correct answer but select wrong represent the selection loss that our 5-component entropy voting addresses but does not fully close. <a href=\"https://www.kaggle.com/rzatemizel\" target=\"_blank\">@rzatemizel</a> density-overlap analysis suggests that mean entropy has near-zero discriminative power between correct and incorrect answers; whether our position-weighted variant retains discriminative power where mean entropy does not remains an open empirical question.</p>",
      "rawMarkdown": "**Note added after reviewing concurrent writeups (April 21, 2026)**\n\nSeveral independent writeups have now been published that converge on the same central finding documented here. Schwyter (arXiv:2603.27844, 23 experiments across 3 models) found that model capability dominates all prompt-level optimizations by 4×. @merkiraz (11 controlled submissions) found every modification preserved or degraded performance. @kolenkovskin (20+ dead ends across 28 submissions) independently concluded that \"subtraction beats addition.\" @potrhino (7 controlled ablation runs on a 75-problem validation set) documented positive contributions from TIR and dynamic time management but found that the remaining gap is compute-constrained. This convergence across 5+ independent teams - each arriving at similar negative conclusions through different experimental paths - is itself evidence that the finding is robust.\n\nRegarding selection loss: the host's pass@N analysis shows pass@8 ≈ 44 on the private set, meaning the correct answer appears in at least one of our 8 attempts for ~44 of 50 problems. Our mean of 40.78 implies we correctly select the right answer from the pool ~93% of the time. The remaining ~3 problems per run where we have the correct answer but select wrong represent the selection loss that our 5-component entropy voting addresses but does not fully close. @rzatemizel density-overlap analysis suggests that mean entropy has near-zero discriminative power between correct and incorrect answers; whether our position-weighted variant retains discriminative power where mean entropy does not remains an open empirical question."
    }
  ],
  "complete": true,
  "source": "live",
  "fetched_at": "2026-10-20T04:20:46Z",
  "competition_id": 118448,
  "competition_slug": "ai-mathematical-olympiad-progress-prize-3",
  "team_id": 15409274,
  "solution_url": "/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/every-improvement-failed-aimo3"
}