{
  "id": 693593,
  "title": "Harmony Format, Dead Ends, and Variance in AIMO3",
  "content": "<h1>Solo Agent-Team Approach to AIMO3: Harmony Format Discovery, Negative Results, and Variance Analysis</h1>\n<p><strong>Submission details:</strong></p>\n<ul>\n<li><strong>Leaderboard:</strong> Public LB + Private LB (both final)</li>\n<li><strong>Final submission:</strong> <a href=\"https://www.kaggle.com/code/kolenkovskin/aimo3-v33-fixed?scriptVersionId=306011227\" target=\"_blank\">aimo3-v33-fixed Version 2</a></li>\n<li><strong>Colab notebook (Kaggle-agnostic):</strong> <a href=\"https://colab.research.google.com/drive/1-AHappCM4UvLu3Ud43tYj3opyggyUTge?usp=sharing\" target=\"_blank\">aimo3-v33-colab</a></li>\n<li><strong>Public LB (best):</strong> 39/50 | <strong>Rank:</strong> 1518 / 4,138 teams</li>\n<li><strong>Private LB (final):</strong> 39/50 (matches public score — final submission <code>aimo3-v33-fixed Version 2</code> scored 39 on both leaderboards)</li>\n<li><strong>Variance:</strong> Same code, same prompts, three runs: 39, 33, 34 on public LB</li>\n<li><strong>Team:</strong> Kolenkovskin (solo)</li>\n<li><strong>Base model:</strong> <a href=\"https://www.kaggle.com/models/danielhanchen/gpt-oss-120b\" target=\"_blank\">danielhanchen/gpt-oss-120b</a> (no fine-tuning in final submission)</li>\n<li><strong>Code:</strong> Kaggle notebook linked above (single .ipynb, complete pipeline)</li>\n</ul>\n<hr>\n<h2>Abstract</h2>\n<p>We describe a solo competitor's approach to AIMO3 (AI Mathematical Olympiad Progress Prize 3) using GPT-OSS-120B and a multi-agent AI team. Throughout this writeup, \"we\" refers to the author and the AI agent team used for development.</p>\n<p>Our best score of <strong>39/50</strong> (mean ~34, sigma ~3) came from a single discovery: a Harmony message-format error present in all 19 analyzed public notebooks. Adding the correct ChatGPT identity string and a developer message with code-format rules improved score by +2 points — the only statistically meaningful gain across 28 submissions. The same code (v33-fixed) scored 39, 33, and 34 across three runs, demonstrating the variance in this evaluation.</p>\n<p>We document 20+ dead ends with empirical evidence, including the finding that all post-hoc selection methods collapse to majority voting on IMO-hard problems where the per-attempt success rate falls below 50%. We provide variance analysis (sigma ≥ 3), a failure taxonomy of GPT-OSS-120B, and three LoRA fine-tuning experiments on an MXFP4-quantized MoE model served with adapters via vLLM. All prompts, configurations, and negative results are included for reproducibility.</p>\n<hr>\n<h2>1. Introduction</h2>\n<p>The AI Mathematical Olympiad Progress Prize 3 (AIMO3) challenges participants to solve 50 IMO-level mathematical problems using a single H100 80GB GPU within a 5-hour runtime, with internet disabled and integer answers in [0, 99999]. Scoring uses double-run averaging: each problem is scored 0 or 1 per run, averaged across two independent runs.</p>\n<p>We participated as a solo competitor using a multi-agent AI team: Claude Code (Opus) for implementation, Claude Desktop for strategic oversight, Deep Research for literature investigation, Grok for adversarial analysis, and Chrome Extension for community intelligence. This writeup covers 40 days of development across 25+ sessions.</p>\n<p>Our core model is GPT-OSS-120B, a Mixture-of-Experts model with 116.8B total parameters (5.1B active per token), quantized to MXFP4 (Microscaling FP4) during post-training. We use self-consistency sampling (K=8) with majority voting and Tool-Integrated Reasoning (TIR) via the Harmony message format.</p>\n<p><strong>Key contributions:</strong></p>\n<ol>\n<li>Discovery and fix of the Harmony format error present in all public notebooks (+2 points)</li>\n<li>Empirical negative-results catalog: 20+ dead ends with quantified regressions</li>\n<li>Variance analysis confirming sigma ≥ 3 on identical code (39 and 33 on same submission)</li>\n<li>First documented LoRA fine-tuning of an MXFP4-quantized MoE model served with adapters via vLLM</li>\n<li>Multi-agent AI team methodology for competition problem-solving</li>\n</ol>\n<hr>\n<h2>2. Model Understanding: GPT-OSS-120B</h2>\n<h3>2.1 Architecture</h3>\n<p>GPT-OSS-120B is a Mixture-of-Experts transformer with extreme sparsity:</p>\n<ul>\n<li><strong>Total parameters:</strong> 116.8B (MoE) + routing layers</li>\n<li><strong>Active parameters per token:</strong> 5.1B (4.4% utilization)</li>\n<li><strong>Experts:</strong> 128 per layer, top-4 routing</li>\n<li><strong>Quantization:</strong> MXFP4 (e2m1 format, 1 mantissa bit, 8 representable values per sign)</li>\n<li><strong>VRAM footprint:</strong> ~60.8 GB at gpu_memory_utilization=0.96</li>\n</ul>\n<p>The MXFP4 quantization is applied during post-training (not post-hoc), meaning the model was trained with this precision in mind. However, the BF16 router weights combined with MXFP4 expert weights create routing non-determinism: 1,000 identical requests at T=0 produce 80 unique completions.</p>\n<h3>2.2 Harmony Message Format</h3>\n<p>GPT-OSS uses a proprietary \"Harmony\" encoding with 6 message carriers:</p>\n<table>\n<thead>\n<tr>\n<th>#</th>\n<th>Carrier</th>\n<th>Purpose</th>\n<th>Tunable?</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>SystemContent</td>\n<td>Model identity and personality</td>\n<td>Frozen</td>\n</tr>\n<tr>\n<td>2</td>\n<td>ReasoningEffort</td>\n<td>Controls thinking depth (low/medium/high)</td>\n<td>medium</td>\n</tr>\n<tr>\n<td>3</td>\n<td>ToolNamespaceConfig</td>\n<td>Tool definitions (Python interpreter)</td>\n<td>Load-bearing</td>\n</tr>\n<tr>\n<td>4</td>\n<td>DeveloperContent</td>\n<td>Developer instructions</td>\n<td><strong>+2 points</strong></td>\n</tr>\n<tr>\n<td>5</td>\n<td>UserContent</td>\n<td>Problem statement</td>\n<td>Per-problem</td>\n</tr>\n<tr>\n<td>6</td>\n<td>preference_prompt</td>\n<td>Output format preferences</td>\n<td>Frozen</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Critical discovery (v33, +2 points):</strong> The model expects SystemContent to contain the ChatGPT identity string (\"You are ChatGPT, a large language model trained by OpenAI…\"). All 19 analyzed public notebooks either omit this or replace it with a custom identity. Additionally, the DeveloperContent carrier (exposed by the openai-harmony library as <code>.with_instructions()</code>) accepts code-format rules that tripled the model's Python tool efficiency from 42 to 13 calls per problem, as measured in S12 A/B tests.</p>\n<p><strong>Catastrophic failure mode (v32, score=0):</strong> Using <code>.with_text()</code> instead of <code>.with_instructions()</code> raises <code>AttributeError</code>, caught by a silent try/except, causing all 400 inference attempts to return None.</p>\n<h3>2.3 Output Channels</h3>\n<p>GPT-OSS produces output in 3 channels: <code>analysis</code> (hidden reasoning), <code>commentary</code>, and <code>final</code>. The host pipeline reads only <code>final</code> for answer extraction and routes <code>recipient=python</code> blocks to Jupyter kernels. Analysis content is appended to conversation history but never inspected by host code. All 19 analyzed competitor notebooks follow this same pattern.</p>\n<h3>2.4 Failure Taxonomy on IMO-Level Problems</h3>\n<table>\n<thead>\n<tr>\n<th>Type</th>\n<th>Frequency</th>\n<th>Behavior</th>\n<th>Fixable?</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>E1: Misunderstanding</td>\n<td>~54% of errors</td>\n<td>Wrong mathematical formalization</td>\n<td>LoRA (possibly)</td>\n</tr>\n<tr>\n<td>E2: Arithmetic error</td>\n<td>~15%</td>\n<td>Correct approach, wrong calculation</td>\n<td>No (random)</td>\n</tr>\n<tr>\n<td>E3: Thread loss</td>\n<td>~15%</td>\n<td>Starts correctly, diverges mid-solution</td>\n<td>Possibly</td>\n</tr>\n<tr>\n<td>E4: Wrong approach</td>\n<td>~10%</td>\n<td>Incorrect strategy from start</td>\n<td>LoRA (possibly)</td>\n</tr>\n<tr>\n<td>E5: Cannot begin</td>\n<td>~6%</td>\n<td>Problem too novel for model</td>\n<td>No (ceiling)</td>\n</tr>\n</tbody>\n</table>\n<p>Source: Prism Math taxonomy (4601 examples) applied to our 12-problem hard set.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F23009828%2F8e917ff52333212a15b90b789c1e5e3a%2Ffig3_error_taxonomy.png?generation=1776779735307120&amp;alt=media\" alt=\"\"></p>\n<hr>\n<h2>3. Inference Pipeline (Kaggle Submission)</h2>\n<h3>3.1 Architecture</h3>\n<pre><code>[Problem text] → Harmony encoding → vLLM (GPT-OSS-120B) → TIR loop\n                                                              ↓\n                                          Jupyter kernel ← code blocks\n                                                              ↓\n                                          \\boxed{answer} extraction\n                                                              ↓\n                                          K=8 attempts → majority vote\n</code></pre>\n<h3>3.2 vLLM Configuration</h3>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n<th>Rationale</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>gpu_memory_utilization</td>\n<td>0.96</td>\n<td>Maximum without OOM</td>\n</tr>\n<tr>\n<td>max_model_len</td>\n<td>65536</td>\n<td>Full context for long solutions</td>\n</tr>\n<tr>\n<td>max_num_seqs</td>\n<td>256</td>\n<td>Default; reduction to 8 tested and found neutral</td>\n</tr>\n<tr>\n<td>dtype</td>\n<td>auto (MXFP4)</td>\n<td>Native model precision</td>\n</tr>\n<tr>\n<td>kv_cache_dtype</td>\n<td>fp8_e4m3fn</td>\n<td>Saves VRAM on H100</td>\n</tr>\n<tr>\n<td>enforce_eager</td>\n<td>True</td>\n<td>Avoids CUDA graph issues</td>\n</tr>\n<tr>\n<td>port</td>\n<td>8000</td>\n<td>Local subprocess</td>\n</tr>\n</tbody>\n</table>\n<h3>3.3 TIR Execution</h3>\n<ul>\n<li>16 parallel Jupyter kernels via <code>jupyter_client</code></li>\n<li>Per-kernel timeout: 60 seconds</li>\n<li>Code output truncation: first 300 + last 300 characters</li>\n<li>Bug spiral detection: abort after 3 consecutive errors (saves ~15% compute on hard problems)</li>\n<li>Maximum code executions: not capped (model self-limits at ~6-8)</li>\n</ul>\n<h3>3.4 Sampling and Selection</h3>\n<ul>\n<li><strong>K=8</strong> attempts per problem (K=16 tested, no improvement: v28 = 37 = v24)</li>\n<li><strong>Temperature:</strong> 1.0 (T=0.8 tested in v37, neutral)</li>\n<li><strong>Reasoning effort:</strong> medium</li>\n<li><strong>Selection:</strong> majority vote with longest-trace tiebreak</li>\n<li><strong>Answer extraction:</strong> regex <code>\\boxed{(\\d+)}</code> on final channel output</li>\n<li><strong>Extraction accuracy:</strong> 100% (verified on 100 test cases)</li>\n</ul>\n<h3>3.5 Time Management</h3>\n<ul>\n<li>Total budget: 5 hours (18000 seconds)</li>\n<li>Per-problem allocation: <code>remaining_time / remaining_problems</code></li>\n<li>Startup (vLLM load): ~180 seconds</li>\n<li>Average per-problem: ~4-5 minutes (89% budget slack confirmed v25: 30min/290min)</li>\n<li>search_tokens=1024 for early <code>\\boxed{}</code> detection</li>\n</ul>\n<h3>3.6 Invariants (Breaking Any = Failed Submission)</h3>\n<ol>\n<li>Dummy <code>submission.parquet</code> written before ANY imports (crash protection)</li>\n<li>Version stamp printed as first output line</li>\n<li><code>KAGGLE_IS_COMPETITION_RERUN</code> detection for force-serve mode</li>\n<li>try/except in final cell with parquet fallback</li>\n<li><code>ensure_ascii=True</code> on all <code>json.dump</code> calls (cp1252 encoding protection)</li>\n<li>Dual-path model/wheels resolution for interactive vs rerun environments</li>\n</ol>\n<hr>\n<h2>4. Selection Methods: Negative Results</h2>\n<p>The gap between pass@8 (probability that at least one of 8 attempts is correct) and majority@8 (majority vote accuracy) is large: approximately 80% vs. 40% on our 5-problem measured subset. This coverage-versus-pass-rate (CCPR) gap motivated extensive investigation into selection methods. Every method tested failed to close it.</p>\n<h3>4.1 Methods Tested</h3>\n<table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Result</th>\n<th>Evidence</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Majority voting (baseline)</td>\n<td>37/50</td>\n<td>v24, v25, v28</td>\n</tr>\n<tr>\n<td>IEW entropy weighting</td>\n<td>= majority</td>\n<td>AUC=0.595 (near-random)</td>\n</tr>\n<tr>\n<td>GenSelect (LLM-as-judge)</td>\n<td>-3 points</td>\n<td>v29=34; Harmony format incompatible</td>\n</tr>\n<tr>\n<td>Adaptive routing (difficulty-gated)</td>\n<td>-3 points</td>\n<td>v29=34; complexity = regression</td>\n</tr>\n<tr>\n<td>Self-verification (verify-noDev)</td>\n<td>-3 to -5</td>\n<td>FPR=75% (self-confirmation bias)</td>\n</tr>\n<tr>\n<td>Code trajectory analysis</td>\n<td>= majority</td>\n<td>Signal vanishes on hard problems</td>\n</tr>\n<tr>\n<td>Z3 constraint verification</td>\n<td>0/16 distinguish</td>\n<td>Regex constraints too weak</td>\n</tr>\n<tr>\n<td>ECP evidence mining</td>\n<td>-4 points</td>\n<td>FPR=37%</td>\n</tr>\n<tr>\n<td>ThinkPRM-1.5B (process reward model)</td>\n<td>Inverse scoring</td>\n<td>Wrong=1.0, correct=0.7 on hard</td>\n</tr>\n<tr>\n<td>Longest-trace tiebreak</td>\n<td>+1 (tiebreak only)</td>\n<td>v44+v45: 6/12 vs majority 5/12</td>\n</tr>\n<tr>\n<td>DeepConf (13 methods, K=32)</td>\n<td>= majority</td>\n<td>0/12 at K=32, all methods</td>\n</tr>\n<tr>\n<td>Minority selection</td>\n<td>3/3 on hard</td>\n<td>But 0/3 on easy — not usable</td>\n</tr>\n</tbody>\n</table>\n<h3>4.2 Why Selection Fails on Hard Problems</h3>\n<p>Chen et al. (NeurIPS 2024) prove that when p(correct) &lt; p(wrong) per attempt, increasing K makes majority voting worse, not better. On our hard problems, the model produces the same wrong answer 6–7 out of 8 times. No post-hoc method can recover correctness from a distribution where the correct answer is in the minority.</p>\n<p><strong>Generation quality, not selection quality, is the bottleneck.</strong> This overrides our S14–S20 conclusion that \"selection = THE bottleneck.\" On easy problems (pass@1 &gt; 50%), majority voting works. On hard problems (pass@1 &lt; 20%), the model produces the same wrong answer 6–7 out of 8 times — no post-hoc method recovers from that.</p>\n<h3>4.3 External Confirmation</h3>\n<ul>\n<li>wenliangtlh independently confirms the CCPR gap: pass@128 = 0.867 vs. maj@128 = 0.453</li>\n<li>Top-20 Kaggle teams all use majority voting; no confidence-based selection method appears in the top 20 (per community survey)</li>\n<li>Nitarach (arXiv:2603.27844) analysis confirms that approximately 3 borderline problems at p ≈ 0.50 drive all observed leaderboard variance</li>\n</ul>\n<hr>\n<h2>5. LoRA Fine-tuning Experiments</h2>\n<h3>5.1 Motivation</h3>\n<p>All AIMO1/2 winners used fine-tuning (NuminaMath, NemoSkills). NemoSkills gained ~4 points over vanilla baselines through fine-tuning [3]. Public notebook ceiling is 44/50; leaderboard leader achieved 46/50 with 113 submissions.</p>\n<h3>5.2 Technical Challenge: MXFP4 + LoRA</h3>\n<p>No published results exist for LoRA fine-tuning of MXFP4-quantized MoE models. Key challenges:</p>\n<ul>\n<li>Training uses BNB-4bit quantization; inference uses native MXFP4 (different schemes)</li>\n<li>All model-merge paths fail (safetensors format mismatch, Marlin kernel incompatibility)</li>\n<li><strong>Solution:</strong> vLLM 0.18.1 <code>--enable-lora</code> serves adapter directly on MXFP4 base (no merge needed)</li>\n</ul>\n<h3>5.3 Experiments</h3>\n<table>\n<thead>\n<tr>\n<th>Run</th>\n<th>Data</th>\n<th>Format</th>\n<th>Examples</th>\n<th>seq_len</th>\n<th>Loss</th>\n<th>Result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>v1</td>\n<td>Harmony-filtered (easy)</td>\n<td>Harmony</td>\n<td>987</td>\n<td>2048</td>\n<td>0.64</td>\n<td>5/5 easy, 0/12 hard (= base)</td>\n</tr>\n<tr>\n<td>v2</td>\n<td>OMR hard (DeepSeek format)</td>\n<td>CoT (<code>&lt;think&gt;</code>)</td>\n<td>2000</td>\n<td>2048</td>\n<td>0.52</td>\n<td>1/12; 5/12 extraction errors</td>\n</tr>\n<tr>\n<td>v3</td>\n<td>Nemotron-Math-v2 (GPT-OSS traces)</td>\n<td>Harmony (converted)</td>\n<td>5000</td>\n<td>4096</td>\n<td>0.55</td>\n<td>BNB4/MXFP4 mismatch: code_execs=0</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Key finding:</strong> Format matters more than data quality. v2 trained on hard problems in wrong format (CoT) scored worse than v1 trained on easy problems in correct format (Harmony). v3 had correct format but the BNB4→MXFP4 quantization gap caused the model to lose TIR capability entirely (zero code executions).</p>\n<h3>5.4 Training Configuration (v1, best result)</h3>\n<ul>\n<li><strong>Framework:</strong> Unsloth + PEFT</li>\n<li><strong>Quantization:</strong> BNB-4bit (NF4, double quantization)</li>\n<li><strong>LoRA:</strong> r=16, alpha=32, target_modules=[q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj]</li>\n<li><strong>Optimizer:</strong> adamw_8bit, lr=1e-4, cosine schedule, warmup_ratio=0.03</li>\n<li><strong>Batch:</strong> per_device=2, gradient_accumulation=4</li>\n<li><strong>Hardware:</strong> 1x H100 80GB SXM (RunPod), ~2h training</li>\n<li><strong>Adapter size:</strong> 73 MB</li>\n</ul>\n<h3>5.5 Data Sources</h3>\n<table>\n<thead>\n<tr>\n<th>Dataset</th>\n<th>Size</th>\n<th>Format</th>\n<th>Used</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>nvidia/OpenMathReasoning TIR</td>\n<td>1.7M</td>\n<td>TIR traces</td>\n<td>Filtered to 5000</td>\n</tr>\n<tr>\n<td>nvidia/Nemotron-Math-v2</td>\n<td>3.5M</td>\n<td>GPT-OSS native</td>\n<td>Converted 5000</td>\n</tr>\n<tr>\n<td>Jackrong/Harmony-dataset</td>\n<td>8471</td>\n<td>Harmony format</td>\n<td>Not used (discovered late)</td>\n</tr>\n<tr>\n<td>21 HF AIMO3 finetunes</td>\n<td>varies</td>\n<td>Unknown</td>\n<td>All have empty model cards</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>6. Variance Analysis</h2>\n<h3>6.1 Empirical Evidence</h3>\n<p>Our v33 submission scored <strong>39</strong>, <strong>33</strong>, and <strong>34</strong> on identical code across three separate runs (submitted March 24, March 28, and April 7). This 6-point spread (39 vs 33) from the same codebase is the strongest direct evidence of high variance. The mean of our three runs (35.3) is consistent with sigma ~3.</p>\n<h3>6.2 External Analysis</h3>\n<p>Nitarach (arXiv 2603.27844) ran 13 identical submissions of the same pipeline and found:</p>\n<ul>\n<li>Range: 37–44 (7-point spread)</li>\n<li>Mean: 39.7</li>\n<li>Estimated sigma: ~1.7</li>\n</ul>\n<p>However, our observation (39 vs 33, delta=6) suggests true sigma may be higher (~3), possibly due to:</p>\n<ul>\n<li>MXFP4 routing non-determinism (80 unique completions at T=0)</li>\n<li>Kaggle H100 hardware variation between runs</li>\n<li>~3 borderline problems at p≈0.50 creating bimodal outcomes</li>\n</ul>\n<h3>6.3 Implications for Evaluation</h3>\n<table>\n<thead>\n<tr>\n<th>Delta</th>\n<th>Interpretation</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>&lt; 3</td>\n<td>Noise; do not react</td>\n</tr>\n<tr>\n<td>3-4</td>\n<td>Possibly real; needs 3+ confirmations</td>\n</tr>\n<tr>\n<td>&gt; 4</td>\n<td>Likely real improvement</td>\n</tr>\n</tbody>\n</table>\n<p>This means our 18-submission history contains <strong>one</strong> statistically meaningful finding: v33 (Harmony fix) = +2 over v28 baseline of 37, confirmed by the mechanism (format change has clear causal path). All other deltas are within noise.</p>\n<h3>6.4 Leaderboard Implications</h3>\n<p>The leaderboard leader scored 46/50 from 113 entries. Using winner's curse correction (ML estimate), their true mean is likely ~41.8. The public ceiling of 44/50 from unmodified notebooks is also inflated. True ceiling for vanilla GPT-OSS-120B is approximately 36-38/50.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F23009828%2F3f5372dcd902b5038e1b923620324412%2Ffig4_variance.png?generation=1776780061273863&amp;alt=media\" alt=\"\"></p>\n<hr>\n<h2>7. Competitor Analysis</h2>\n<h3>7.1 Public Notebook Forensics</h3>\n<p>We analyzed 19 public notebooks scoring 36-44 on the leaderboard. Key findings:</p>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Our v33</th>\n<th>Typical competitor</th>\n<th>Best competitor</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Identity</td>\n<td>ChatGPT (correct)</td>\n<td>Custom/omitted</td>\n<td>Custom/omitted</td>\n</tr>\n<tr>\n<td>DeveloperContent</td>\n<td>Code-format rules</td>\n<td>None</td>\n<td>None</td>\n</tr>\n<tr>\n<td>K (attempts)</td>\n<td>8</td>\n<td>8</td>\n<td>8-16</td>\n</tr>\n<tr>\n<td>Temperature</td>\n<td>1.0</td>\n<td>0.6-1.0</td>\n<td>0.6</td>\n</tr>\n<tr>\n<td>gpu_memory_util</td>\n<td>0.96</td>\n<td>0.90</td>\n<td>0.90</td>\n</tr>\n<tr>\n<td>max_num_seqs</td>\n<td>256</td>\n<td>6-8</td>\n<td>64</td>\n</tr>\n<tr>\n<td>Selection</td>\n<td>majority + longest</td>\n<td>majority</td>\n<td>majority</td>\n</tr>\n<tr>\n<td>min_p</td>\n<td>0.02</td>\n<td>0.02-0.05</td>\n<td>0.05</td>\n</tr>\n</tbody>\n</table>\n<h3>7.2 Comparison with SOTA</h3>\n<table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Score</th>\n<th>Notes</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Public baseline (kurianbenoy fork)</td>\n<td>36</td>\n<td>Unmodified</td>\n</tr>\n<tr>\n<td>Best public notebook (ans-verifys)</td>\n<td>44</td>\n<td>Lucky run; likely mean ~38-40</td>\n</tr>\n<tr>\n<td>Leaderboard leader (ippeiogawa)</td>\n<td>46</td>\n<td>113 entries; true mean ~41.8</td>\n</tr>\n<tr>\n<td><strong>Our v33 (final submission)</strong></td>\n<td><strong>39 public / 39 private</strong></td>\n<td><strong>3-run variance (public): 39, 33, 34 — mean 35.3</strong></td>\n</tr>\n<tr>\n<td>AIMO2 winner (NemoSkills, 14B fine-tuned)</td>\n<td>34/50</td>\n<td>AIMO2, not directly comparable (4x L4 hardware)</td>\n</tr>\n<tr>\n<td>DeepSeek-R1 (671B, if available)</td>\n<td>N/A</td>\n<td>Not applicable (too large)</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>8. Multi-Agent Workflow</h2>\n<h3>8.1 Agent Roles</h3>\n<table>\n<thead>\n<tr>\n<th>Agent</th>\n<th>Model</th>\n<th>Role</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>KK (Claude Code)</td>\n<td>Claude Opus</td>\n<td>Implementation, code audit, testing, memory</td>\n</tr>\n<tr>\n<td>KD (Claude Desktop)</td>\n<td>Claude Opus</td>\n<td>Strategy, Deep Research, coordination</td>\n</tr>\n<tr>\n<td>DR (Deep Research)</td>\n<td>Claude Opus</td>\n<td>Literature investigation (86 reports)</td>\n</tr>\n<tr>\n<td>GK (Grok)</td>\n<td>grok-4.20</td>\n<td>Adversarial analysis, RunPod SSH</td>\n</tr>\n<tr>\n<td>KH (Chrome Extension)</td>\n<td>Claude Sonnet</td>\n<td>Community intelligence, leaderboard</td>\n</tr>\n</tbody>\n</table>\n<h3>8.2 Communication Infrastructure</h3>\n<ul>\n<li><strong>Shared filesystem:</strong> <code>theory/</code> (86 .md files), <code>prompts/</code> (45 files), <code>logs/kk-sessions/</code></li>\n<li><strong>Memory mirror:</strong> <code>.claude-memory-mirror/</code> (5 files: rules, dead ends, key files, bugs, verified)</li>\n<li><strong>Journal:</strong> <code>journal_aimo3.txt</code> (prepend-only, reverse chronological)</li>\n<li><strong>Execution contract:</strong> <code>CLAUDE.md</code> with mandatory reads and theory-check protocol</li>\n</ul>\n<h3>8.3 Effective Practices</h3>\n<ol>\n<li><strong>Bug detection:</strong> Pre-submission code review caught 5 critical bugs in v29 before the Kaggle run</li>\n<li><strong>Competitor forensics:</strong> One afternoon analyzing 19 notebooks produced more actionable insight than 86 research investigations</li>\n<li><strong>Test framework:</strong> 69 local tests running in 0.06 s prevented regression without GPU access</li>\n<li><strong>Theory audit:</strong> Classifying all 86 research files, archiving 51, and preserving 35 kept working context focused</li>\n</ol>\n<h3>8.4 Failure Modes</h3>\n<ol>\n<li><strong>Research without measurement:</strong> 0 of 86 deep-research investigations led to a positive code change</li>\n<li><strong>False premise cascade:</strong> One unverified assumption (\"our gap = 7 points\") propagated through 30+ research files over 20 days</li>\n<li><strong>Agent convergence is not evidence:</strong> All three agents agreed that extraction was the bottleneck; the first direct measurement disproved it in under a minute</li>\n</ol>\n<hr>\n<h2>9. Dead Ends Summary</h2>\n<p>We tested 20+ approaches beyond the baseline. None improved the score. The full catalog is in Appendix H; here we summarize the key categories:</p>\n<table>\n<thead>\n<tr>\n<th>Category</th>\n<th>Methods Tested</th>\n<th>Best Result</th>\n<th>Lesson</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Prompt engineering</td>\n<td>3-prompt diversity, minimal prompts</td>\n<td>−3 each</td>\n<td>Prompts are frozen for reasoning-native models</td>\n</tr>\n<tr>\n<td>Sampling</td>\n<td>Multi-temp, SC@16</td>\n<td>0, 0</td>\n<td>Diminishing returns beyond K=8</td>\n</tr>\n<tr>\n<td>Selection (LLM-as-judge)</td>\n<td>GenSelect via chat API</td>\n<td>−3</td>\n<td>Harmony format incompatible with judging</td>\n</tr>\n<tr>\n<td>Selection (statistical)</td>\n<td>IEW, DeepConf (13 methods), LR scoring, Bayesian, CARE</td>\n<td>= majority</td>\n<td>All collapse to majority on hard problems</td>\n</tr>\n<tr>\n<td>Selection (code analysis)</td>\n<td>Trajectory, Z3, ECP mining</td>\n<td>0 to −4</td>\n<td>Signal vanishes on hard</td>\n</tr>\n<tr>\n<td>Verification</td>\n<td>Self-verify, ThinkPRM-1.5B</td>\n<td>−3 to −5, inverse</td>\n<td>Self-confirmation bias; PRM inverts on hard</td>\n</tr>\n<tr>\n<td>Model diversity</td>\n<td>20B dual-model</td>\n<td>−1</td>\n<td>Same wrong answers as 120B</td>\n</tr>\n<tr>\n<td>Prompt diversification</td>\n<td>Prescriptive, \"solve two ways\"</td>\n<td>0</td>\n<td>Model either knows or doesn't</td>\n</tr>\n</tbody>\n</table>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F23009828%2F4ab94f0ffd6b704aebe83024e63b2773%2Ffig2_ablation.png?generation=1776779929510625&amp;alt=media\" alt=\"\"></p>\n<hr>\n<h2>10. Lessons Learned</h2>\n<p><strong>Read competitor code on day 1.</strong> We didn't. That cost 20 days. One afternoon of notebook forensics produced the only +2 gain across 28 submissions. 86 deep-research reports produced zero code changes.</p>\n<p><strong>Measure before theorizing.</strong> Three independent agents converged on \"extraction is the bottleneck.\" First measurement: extraction accuracy = 100%. One number killed an entire research track.</p>\n<p><strong>Subtraction beats addition.</strong> Every feature we added scored zero or negative. The only improvement came from fixing a bug (Harmony format) and removing harmful features (IEW, GenSelect). Simple majority vote at 37/50 beat our most elaborate pipeline at 34/50.</p>\n<p><strong>Ten submissions went to noise.</strong> With sigma ≥ 3, the gap between 33 and 39 is one standard deviation. We needed: delta &gt; 4 plus a mechanistic explanation before reacting. We didn't have that rule until submission 17.</p>\n<p><strong>Off-by-one is systematic, not random.</strong> 44% of wrong answers differ from gold by ±1 or ±2 — the same boundary confusion (inclusive vs. exclusive ranges, base cases) across different problems. This is a training data artifact, not a pipeline issue.</p>\n<hr>\n<h2>11. Discussion</h2>\n<h3>11.1 What We Would Do Differently</h3>\n<p>The optimal strategy for a solo competitor, in hindsight, would be:</p>\n<ol>\n<li>Day 1: Fork best public notebook, submit unmodified (baseline)</li>\n<li>Day 2: Analyze all public notebooks, find the key diffs</li>\n<li>Day 3-5: Fix Harmony format, confirm +2</li>\n<li>Day 6-15: LoRA fine-tuning with Jackrong/Harmony-dataset (correct format, hard problems)</li>\n<li>Remaining days: Submit LoRA variants, collect variance data</li>\n</ol>\n<p>We instead spent 20 days on prompt engineering and selection methods before reading competitor code.</p>\n<h3>11.2 Open Questions</h3>\n<ol>\n<li>Does the analysis channel contain usable confidence signals?</li>\n<li>Can targeted LoRA on off-by-one examples fix boundary confusion?</li>\n<li>What is the true per-problem variance (p_i) for each of the 50 problems?</li>\n<li>Would EAGLE3 speculative decoding (40% throughput gain) enable K=12-16 within budget?</li>\n</ol>\n<h3>11.3 Reproducibility Note</h3>\n<p>All code is contained in a single Jupyter notebook. All prompts are frozen and documented in Appendix A. The only external dependency beyond standard Kaggle environment is the GPT-OSS-120B model and vLLM wheels, both available as Kaggle datasets.</p>\n<p>For Kaggle-agnostic reproducibility, a Google Colab version of the full pipeline is provided: <a href=\"https://colab.research.google.com/drive/1-AHappCM4UvLu3Ud43tYj3opyggyUTge?usp=sharing\" target=\"_blank\">aimo3-v33-colab</a>. It installs the <code>openai-harmony</code> library and <code>vLLM</code> from public PyPI, downloads the <code>gpt-oss-120b</code> weights from Hugging Face, and exposes the same inference harness used in the Kaggle submission (with the <code>kaggle_evaluation</code> gateway import guarded by <code>try/except ImportError</code> so the notebook runs in any environment with a single H100-class GPU).</p>\n<hr>\n<h2>References</h2>\n<p>[1] Nitarach. \"Variance Analysis of AIMO3 Submissions.\" arXiv:2603.27844, 2026.\n[2] Chen et al. \"When Majority Voting Fails.\" NeurIPS, 2024.\n[3] NVIDIA NemoSkills team. \"NemoSkills: AIMO2 Winning Solution.\" arXiv:2504.16891, 2025.\n[4] Prism Math. \"Error Taxonomy for Mathematical Reasoning.\" 4,601 examples, 2025.\n[5] Ai. \"On Correlated Voting.\" Corollary 2 (Dawid-Skene limitation), 2025.</p>\n<hr>\n<h2>Appendix A: Prompts (Verbatim)</h2>\n<p>All prompts are copied exactly from <code>aimo3-v33-fixed.ipynb</code> (CFG class). These produced 39/50. <strong>Any modification causes regression</strong> (confirmed v22, v27).</p>\n<h3>A.1 System Prompt (Frozen)</h3>\n<pre><code>You are a world-class International Mathematical Olympiad (IMO) competitor.\nThe final answer must be a non-negative integer between 0 and 99999.\nYou must place the final integer answer inside \\boxed{}.\n</code></pre>\n<p>Injected into DeveloperContent carrier (not SystemContent). SystemContent carries model identity (A.6).</p>\n<h3>A.2 Tool/Namespace Prompt (Frozen, Load-Bearing)</h3>\n<pre><code>Use this tool to execute Python code.\nThe environment is a stateful Jupyter notebook.\nYou must use print() to output results.\n</code></pre>\n<p><strong>WARNING:</strong> Removing this caused +9pp execution errors (v27).</p>\n<h3>A.3 Developer Message (The +2 Discovery)</h3>\n<pre><code># PROBLEM-SOLVING PROTOCOL\n\ndef solve(problem: str) -&gt; int:\n    problem_type = classify(problem)\n    answer_analytical = solve_analytically(problem, problem_type)\n    answer_numerical = verify_with_python(problem, answer_analytical)\n    if answer_analytical != answer_numerical:\n        answer_analytical = answer_numerical  # trust Python over reasoning\n    return answer_analytical\n\ndef solve_analytically(problem, problem_type):\n    method_1 = pick_method(problem_type)\n    result = attempt(method_1)\n    if result is None:\n        method_2 = pick_different_method(problem_type, exclude=method_1)\n        result = attempt(method_2)\n    return result\n\ndef verify_with_python(problem, claimed_answer):\n    # ALWAYS run. Use INDEPENDENT method from analytical.\n    # counting -&gt; enumerate and count\n    # optimization -&gt; scipy.optimize or brute force\n    # equations -&gt; sympy.solve\n    # NEVER recompute same formula\n    return execute(write_verification_code(problem))\n\ndef on_python_error(code, error):\n    # NEVER debug. ALWAYS delete and rewrite from scratch.\n    return write_completely_new_code()\n\n# HARD RULES:\n# - Final answer inside \\\\boxed{}\n# - Answer: non-negative integer 0-99999\n# - Use math, numpy, sympy, scipy, itertools, collections\n# - If two methods disagree, run THIRD to break tie\n</code></pre>\n<p>Injected via <code>DeveloperContent.new().with_instructions()</code>. Tripled Python tool efficiency: 42 to 13 code calls per problem (S12 A/B test).</p>\n<h3>A.4 Preference Prompt (Frozen)</h3>\n<pre><code>Use `math`, `numpy`,`sympy`,`itertools` and `collections` to solve the problem.\n</code></pre>\n<h3>A.5 User Prompt Template</h3>\n<p>Each problem sent as single UserContent message with raw problem text. No framing, no few-shot, no CoT instructions.</p>\n<h3>A.6 Harmony System Identity (Critical)</h3>\n<pre><code>SystemContent.new()\n    .with_model_identity('You are ChatGPT, a large language model trained by OpenAI.')\n    .with_reasoning_effort(reasoning_effort=ReasoningEffort.HIGH)\n    .with_tools(tool_config)\n</code></pre>\n<p><strong>This is the +2 discovery.</strong> All 19 competitor notebooks omit or replace this identity. The <code>openai-harmony</code> library does NOT auto-inject it.</p>\n<h3>A.7 Message Assembly</h3>\n<pre><code>messages = [\n    Message.from_role_and_content(Role.SYSTEM, system_content),      # Identity + tools\n    Message.from_role_and_content(Role.DEVELOPER, developer_content), # Instructions\n    Message.from_role_and_content(Role.USER, problem_text)            # Problem\n]\n</code></pre>\n<p>Three messages total. No conversation history between problems.</p>\n<hr>\n<h2>Appendix B: Complete Version History</h2>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F23009828%2Fe92268266332e5124bc6f2e1846937b9%2Ffig1_score_history.png?generation=1776780256053758&amp;alt=media\" alt=\"\"></p>\n<table>\n<thead>\n<tr>\n<th>#</th>\n<th>Date</th>\n<th>Version</th>\n<th>Score</th>\n<th>Delta</th>\n<th>Key Change</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>2026-03-06</td>\n<td>DeepSeek-14B v6</td>\n<td>0</td>\n<td>—</td>\n<td>First submit (RERUN detection broken)</td>\n</tr>\n<tr>\n<td>2</td>\n<td>2026-03-07</td>\n<td>QwQ-32B v7</td>\n<td>0</td>\n<td>0</td>\n<td>Infrastructure works, model too weak</td>\n</tr>\n<tr>\n<td>3</td>\n<td>2026-03-11</td>\n<td>GPT-OSS v19</td>\n<td>0</td>\n<td>0</td>\n<td>6 root-cause fixes, still broken</td>\n</tr>\n<tr>\n<td>4</td>\n<td>2026-03-12</td>\n<td>Fork v3 (baseline)</td>\n<td>36</td>\n<td>+36</td>\n<td>Unmodified kurianbenoy fork</td>\n</tr>\n<tr>\n<td>5</td>\n<td>2026-03-13</td>\n<td>v22</td>\n<td>33</td>\n<td>−3</td>\n<td>3-prompt diversity</td>\n</tr>\n<tr>\n<td>6</td>\n<td>2026-03-14</td>\n<td>v23</td>\n<td>36</td>\n<td>+3</td>\n<td>Minimal prompt + multi-temp</td>\n</tr>\n<tr>\n<td>7</td>\n<td>2026-03-15</td>\n<td>v24</td>\n<td>37</td>\n<td>+1</td>\n<td>batch=256, gpu=0.96, ctx=65536</td>\n</tr>\n<tr>\n<td>8</td>\n<td>2026-03-16</td>\n<td>v25</td>\n<td>37</td>\n<td>0</td>\n<td>Variance confirmation</td>\n</tr>\n<tr>\n<td>9</td>\n<td>2026-03-18</td>\n<td>v28</td>\n<td>37</td>\n<td>0</td>\n<td>SC@16 (= SC@8)</td>\n</tr>\n<tr>\n<td>10</td>\n<td>2026-03-19</td>\n<td>v29</td>\n<td>34</td>\n<td>−3</td>\n<td>GenSelect + adaptive</td>\n</tr>\n<tr>\n<td>11</td>\n<td>2026-03-20</td>\n<td>v30</td>\n<td>36</td>\n<td>−1</td>\n<td>Subtraction (K=8, timeout=10)</td>\n</tr>\n<tr>\n<td>12</td>\n<td>2026-03-20</td>\n<td>v31</td>\n<td>34</td>\n<td>−3</td>\n<td>Align with 42-scorer</td>\n</tr>\n<tr>\n<td>13</td>\n<td>2026-03-22</td>\n<td>v32</td>\n<td>0</td>\n<td>−37</td>\n<td>BUG: <code>.with_text()</code> AttributeError — all 400 attempts returned None</td>\n</tr>\n<tr>\n<td>14</td>\n<td>2026-03-24</td>\n<td><strong>v33</strong></td>\n<td><strong>39</strong></td>\n<td><strong>+2</strong></td>\n<td><strong>Harmony fix + developer message</strong></td>\n</tr>\n<tr>\n<td>15</td>\n<td>2026-03-24</td>\n<td>v34</td>\n<td>34</td>\n<td>−5</td>\n<td>PROVE filter + seqs=8</td>\n</tr>\n<tr>\n<td>16</td>\n<td>2026-03-26</td>\n<td>v37b</td>\n<td>31</td>\n<td>−8</td>\n<td>Experimental features</td>\n</tr>\n<tr>\n<td>17</td>\n<td>2026-03-28</td>\n<td>v33 resub #1</td>\n<td>33</td>\n<td>−6</td>\n<td>Same code as row 14; confirms variance</td>\n</tr>\n<tr>\n<td>18</td>\n<td>~2026-03-31</td>\n<td>v35-verify-fresh</td>\n<td>34</td>\n<td>−5</td>\n<td>Self-verification (FPR=75%)</td>\n</tr>\n<tr>\n<td>19</td>\n<td>~2026-04-01</td>\n<td>v31-majority-clean</td>\n<td>0</td>\n<td>−39</td>\n<td>Bug: clean majority rewrite failed</td>\n</tr>\n<tr>\n<td>20</td>\n<td>~2026-04-02</td>\n<td>gptoss-fork-v1.2</td>\n<td>34</td>\n<td>−5</td>\n<td>Fork variant</td>\n</tr>\n<tr>\n<td>21</td>\n<td>~2026-04-03</td>\n<td>v54-mining-longest v1</td>\n<td>0</td>\n<td>−39</td>\n<td>Code mining extraction (broken)</td>\n</tr>\n<tr>\n<td>22</td>\n<td>~2026-04-04</td>\n<td>v54-mining-longest v2</td>\n<td>Error</td>\n<td>—</td>\n<td>Kaggle Error</td>\n</tr>\n<tr>\n<td>23</td>\n<td>~2026-04-04</td>\n<td>v54-code-mining+longest</td>\n<td>32</td>\n<td>−7</td>\n<td>Code mining + longest tiebreak</td>\n</tr>\n<tr>\n<td>24</td>\n<td>~2026-04-05</td>\n<td>v55-eagle3 v2</td>\n<td>1</td>\n<td>−38</td>\n<td>EAGLE3 speculative decoding (VRAM crash)</td>\n</tr>\n<tr>\n<td>25</td>\n<td>~2026-04-07</td>\n<td>v33-fixed resub #2</td>\n<td>34</td>\n<td>−5</td>\n<td>Same code as row 14; third run</td>\n</tr>\n<tr>\n<td>26</td>\n<td>~2026-04-08</td>\n<td>v56-k10-longest</td>\n<td>36</td>\n<td>−3</td>\n<td>K=10 + longest tiebreak</td>\n</tr>\n<tr>\n<td>27</td>\n<td>~2026-04-10</td>\n<td>v57-k12-longest</td>\n<td>32</td>\n<td>−7</td>\n<td>K=12 + longest (over-sampling)</td>\n</tr>\n<tr>\n<td>28</td>\n<td>~2026-04-11</td>\n<td>v58-dsq-lora v3</td>\n<td>23</td>\n<td>−16</td>\n<td>LoRA adapter (BNB4/MXFP4 mismatch)</td>\n</tr>\n<tr>\n<td>—</td>\n<td><strong>2026-04-15</strong></td>\n<td><strong>v33-fixed (final)</strong></td>\n<td><strong>34</strong></td>\n<td>—</td>\n<td><strong>Selected as final submission</strong></td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Appendix C: Reproducibility Checklist</h2>\n<h3>C.1 Environment</h3>\n<ul>\n<li><strong>Kaggle GPU:</strong> 1x H100 80GB SXM, 5h runtime</li>\n<li><strong>Python:</strong> 3.12 (Kaggle default)</li>\n<li><strong>vLLM:</strong> 0.18.1 (installed from Kaggle dataset wheels)</li>\n<li><strong>Model:</strong> danielhanchen/gpt-oss-120b (Kaggle model dataset)</li>\n<li><strong>Library:</strong> openai-harmony (for Harmony encoding)</li>\n</ul>\n<h3>C.2 Exact vLLM Arguments</h3>\n<pre><code>python -m vllm.entrypoints.openai.api_server \\\n    --seed 42 \\\n    --model /kaggle/tmp/setup/model \\\n    --served-model-name gpt-oss \\\n    --tensor-parallel-size 1 \\\n    --max-num-seqs 256 \\\n    --gpu-memory-utilization 0.96 \\\n    --host 0.0.0.0 \\\n    --port 8000 \\\n    --dtype auto \\\n    --kv-cache-dtype fp8_e4m3 \\\n    --max-model-len 65536 \\\n    --stream-interval 200 \\\n    --max-cudagraph-capture-size 64 \\\n    --async-scheduling \\\n    --disable-log-stats \\\n    --enable-prefix-caching\n</code></pre>\n<h3>C.3 Kaggle Dataset Sources</h3>\n<table>\n<thead>\n<tr>\n<th>Type</th>\n<th>Source ID</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>competition</td>\n<td>118448</td>\n<td>aimo-3 competition data</td>\n</tr>\n<tr>\n<td>modelInstanceVersion</td>\n<td>510391 (model 422384, instance 404485)</td>\n<td>danielhanchen/gpt-oss-120b</td>\n</tr>\n<tr>\n<td>kernelVersion</td>\n<td>289055161</td>\n<td>aimo-3-utils (vLLM 0.18.1 wheels + tiktoken encodings)</td>\n</tr>\n</tbody>\n</table>\n<h3>C.4 Seeds</h3>\n<ul>\n<li>Global seed: 42</li>\n<li>Per-attempt seed: <code>pow(seed + attempt_index, 2) % (2**31)</code></li>\n<li>Note: MXFP4 routing is non-deterministic regardless of seed</li>\n</ul>\n<h3>C.5 Critical Code Paths</h3>\n<table>\n<thead>\n<tr>\n<th>Function</th>\n<th>Cell</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>CFG</code> (class)</td>\n<td>9</td>\n<td>All hyperparameters and prompts</td>\n</tr>\n<tr>\n<td><code>AIMO3Template.apply_chat_template()</code></td>\n<td>11</td>\n<td>Harmony message encoding</td>\n</tr>\n<tr>\n<td><code>AIMO3Sandbox</code></td>\n<td>12</td>\n<td>Jupyter kernel pool management</td>\n</tr>\n<tr>\n<td><code>AIMO3Tool</code></td>\n<td>13</td>\n<td>TIR code execution loop</td>\n</tr>\n<tr>\n<td><code>AIMO3Solver.__init__()</code></td>\n<td>14</td>\n<td>vLLM server startup + model preload</td>\n</tr>\n<tr>\n<td><code>AIMO3Solver._start_server()</code></td>\n<td>14</td>\n<td>vLLM subprocess with exact CLI args</td>\n</tr>\n<tr>\n<td><code>predict()</code></td>\n<td>17</td>\n<td>Main entry: K=8 attempts + majority vote</td>\n</tr>\n<tr>\n<td>Pre-flight check</td>\n<td>16</td>\n<td>Developer message rendering verification</td>\n</tr>\n</tbody>\n</table>\n<p>All code in single notebook: <code>aimo3-v33-fixed.ipynb</code> (19 cells).</p>\n<hr>\n<h2>Appendix D: Off-by-One Error Analysis</h2>\n<table>\n<thead>\n<tr>\n<th>Problem</th>\n<th>Gold</th>\n<th>Majority</th>\n<th>Gold − Majority</th>\n<th>Error type</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>olymp-01629</td>\n<td>4950</td>\n<td>4949</td>\n<td>+1</td>\n<td>Boundary inclusive/exclusive</td>\n</tr>\n<tr>\n<td>oda-00425</td>\n<td>3</td>\n<td>4</td>\n<td>−1</td>\n<td>Count boundary</td>\n</tr>\n<tr>\n<td>dapo-15481</td>\n<td>2</td>\n<td>0</td>\n<td>+2</td>\n<td>Base case</td>\n</tr>\n<tr>\n<td>oda-01612</td>\n<td>4</td>\n<td>2</td>\n<td>+2</td>\n<td>Multiplicity</td>\n</tr>\n<tr>\n<td>olymp-02392</td>\n<td>49</td>\n<td>51</td>\n<td>−2</td>\n<td>Range boundary</td>\n</tr>\n<tr>\n<td>dapo-10920</td>\n<td>4022</td>\n<td>4024</td>\n<td>−2</td>\n<td>Coefficient error</td>\n</tr>\n<tr>\n<td>oda-01183</td>\n<td>12</td>\n<td>6</td>\n<td>+6 (×2)</td>\n<td>Factor omission</td>\n</tr>\n</tbody>\n</table>\n<p>7/16 (44%) of hard-problem errors are within ±2 of the correct answer.</p>\n<hr>\n<h2>Appendix E: LoRA Training Logs</h2>\n<h3>E.1 v1 Training (Harmony format, easy data)</h3>\n<ul>\n<li>Steps: 124, Loss: 1.02 → 0.64</li>\n<li>Data: 987 examples, Harmony format, AMC/AIME level</li>\n<li>Config: r=16, alpha=32, seq_len=2048, lr=1e-4, 1 epoch</li>\n<li>Duration: ~2h on 1x H100 80GB</li>\n<li>Result: 5/5 easy (= base), 0/12 hard (= base). No improvement.</li>\n<li>Root cause: training examples too short (≤16K chars), output collapsed to ~14 chars</li>\n</ul>\n<h3>E.2 v2 Training (DeepSeek format, hard data)</h3>\n<ul>\n<li>Steps: 250, Loss: 0.87 → 0.52</li>\n<li>Data: 2000 examples, <code>&lt;think&gt;</code> CoT format (DeepSeek-R1 style)</li>\n<li>Config: r=16, alpha=32, seq_len=2048, lr=1e-4, 1 epoch</li>\n<li>Duration: ~3.8h on 1x H100 80GB</li>\n<li>Result: 1/12 correct (= base). 5/12 NoneType extraction errors.</li>\n<li>Root cause: <strong>Format mismatch.</strong> Model learned <code>&lt;think&gt;</code> format, but inference uses Harmony. Outputs malformed at inference time.</li>\n</ul>\n<h3>E.3 v3 Training (Nemotron traces, Harmony converted)</h3>\n<ul>\n<li>Steps: ~625, Loss: 0.91 → 0.55</li>\n<li>Data: 5000 examples from nvidia/Nemotron-Math-v2 (GPT-OSS native traces), converted to Harmony</li>\n<li>Config: r=16, alpha=32, seq_len=4096, lr=5e-5, 1 epoch</li>\n<li>Duration: ~10h on 1x H100 80GB</li>\n<li>Result: <strong>BNB4/MXFP4 mismatch.</strong> Training uses BNB-4bit quantization; inference uses native MXFP4. The adapter learned on a different numerical representation. At inference: code_execs=0, turns=1 (model lost TIR capability entirely).</li>\n<li>Root cause: Fundamental incompatibility between training-time and inference-time quantization schemes. No known solution short of full model merge (which also fails due to Marlin kernel format).</li>\n</ul>\n<hr>\n<h2>Appendix F: Experiments Not Run</h2>\n<table>\n<thead>\n<tr>\n<th>Experiment</th>\n<th>Why It Matters</th>\n<th>Why Not Run</th>\n<th>Estimated Impact</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Multi-run per problem (12+)</td>\n<td>Per-problem variance</td>\n<td>Max 3 runs available</td>\n<td>Diagnostic</td>\n</tr>\n<tr>\n<td>Reasoning channel analysis</td>\n<td>Hidden confidence signals</td>\n<td>Pipeline not instrumented</td>\n<td>Unknown</td>\n</tr>\n<tr>\n<td>PRM scoring (7B)</td>\n<td>Step-level selection</td>\n<td>VRAM blocked</td>\n<td>+2-4 (literature)</td>\n</tr>\n<tr>\n<td>CodeBERT clustering</td>\n<td>Approach diversity metric</td>\n<td>Not prioritized</td>\n<td>Unknown</td>\n</tr>\n<tr>\n<td>Adaptive K (K=16-32 on hard)</td>\n<td>Budget 89% slack</td>\n<td>Not tested in time</td>\n<td>+1-2</td>\n</tr>\n<tr>\n<td>LoRA on boundary errors</td>\n<td>44% of errors = off-by-one</td>\n<td>Data not curated</td>\n<td>+1-3</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Appendix G: Cost and Timeline</h2>\n<table>\n<thead>\n<tr>\n<th>Resource</th>\n<th>Cost</th>\n<th>Time</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Kaggle submissions</td>\n<td>Free</td>\n<td>28 submissions × 5h = 140h compute</td>\n</tr>\n<tr>\n<td>RunPod (LoRA training)</td>\n<td>~$20</td>\n<td>3 training runs × 2-10h</td>\n</tr>\n<tr>\n<td>Claude API (multi-agent)</td>\n<td>~$200</td>\n<td>25+ sessions</td>\n</tr>\n<tr>\n<td>Total calendar time</td>\n<td>—</td>\n<td>40 days (2026-03-06 to 2026-04-15)</td>\n</tr>\n<tr>\n<td>Estimated human hours</td>\n<td>—</td>\n<td>~150h</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Appendix H: Dead Ends Catalog (Full Details)</h2>\n<h3>H.1 Prompt Engineering (v22, v27)</h3>\n<ul>\n<li>Elaborate 3-prompt diversity: <strong>−3 points</strong> (v22=33 vs baseline 36)</li>\n<li>Minimal entropy-tuned prompts: <strong>−3 points</strong> (v27=34 vs v24=37)</li>\n<li><strong>Lesson:</strong> Prompts are frozen for reasoning-native models. Any change disrupts internal optimization.</li>\n</ul>\n<h3>H.2 Sampling Parameters (v23, v28)</h3>\n<ul>\n<li>Multi-temperature [0.5, 0.7, 1.0, 1.3]: neutral (v23=36=baseline)</li>\n<li>SC@16 vs SC@8: identical (v28=37=v24)</li>\n<li><strong>Lesson:</strong> Diminishing returns beyond K=8 with this model.</li>\n</ul>\n<h3>H.3 GenSelect — LLM-as-Judge (v29)</h3>\n<ul>\n<li>Theory: +2-4 points (based on NemoSkills literature)</li>\n<li>Reality: <strong>−3 points</strong> (v29=34)</li>\n<li>Root cause: GPT-OSS in Harmony format cannot judge solutions via <code>chat.completions.create()</code></li>\n<li><strong>Lesson:</strong> NemoSkills results (Qwen-based) don't transfer to GPT-OSS architecture.</li>\n</ul>\n<h3>H.4 Adaptive Complexity Routing (v29)</h3>\n<ul>\n<li>A0==A1 difficulty classification with multi-track compute allocation</li>\n<li>Combined with GenSelect: <strong>−3 total</strong></li>\n<li><strong>Lesson:</strong> Complexity introduces regression risk exceeding theoretical gain.</li>\n</ul>\n<h3>H.5 All Post-Processing Methods (S22)</h3>\n<ul>\n<li>Code trajectory analysis, code features, early answer filter, number-theoretic properties, Z3 constraints, ECP evidence mining, LR scoring, digit-wise voting, Bayesian selection, CARE SVD</li>\n<li><strong>Result:</strong> All reduce to majority on hard problems (30:1 wrong-to-correct ratio is mathematically insurmountable)</li>\n</ul>\n<h3>H.6 ThinkPRM-1.5B (S22)</h3>\n<ul>\n<li>1.5B generative PRM, fits alongside 120B (~3GB)</li>\n<li><strong>Result:</strong> Inverse scoring on hard problems (wrong=1.0, correct=0.7)</li>\n<li>CPU inference: 200-900s per solution (impractical)</li>\n</ul>\n<h3>H.7 20B Dual-Model Diversity (v46)</h3>\n<ul>\n<li>Hypothesis: 20B model generates different wrong answers, enabling ensemble</li>\n<li>Reality: Same wrong answers as 120B (529, 4949, 0 on test problems)</li>\n<li>Score: 4/12 vs 120B 5/12 (regression)</li>\n</ul>\n<h3>H.8 Prescriptive Prompts Without TIR (v52)</h3>\n<ul>\n<li>\"Solve two ways,\" \"devil's advocate,\" \"approach from number theory\"</li>\n<li>0/8 gave gold, 0/8 gave new answers</li>\n<li><strong>Lesson:</strong> The model either knows or doesn't. No prompt unlocks hidden capability.</li>\n</ul>\n<h3>H.9 Strategy Diversification (v22, community)</h3>\n<ul>\n<li>Community analysis recommended this approach; our data contradicts it</li>\n<li>v22=−3, v39=−3: every diversity attempt produced a regression</li>\n</ul>",
  "comments": [
    {
      "id": 3461424,
      "author_name": "Durga Kumari",
      "author_url": "",
      "post_date": "2026-05-20T14:43:22.447000",
      "content": "<p>Very detailed and honest write-up. \nEspecially appreciated that you included the failed experiments instead of only the successful parts.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 3457782,
      "author_name": "Philip Vonderlind",
      "author_url": "",
      "post_date": "2026-05-14T10:28:25.033000",
      "content": "<p>Adding to the comments from <a href=\"https://www.kaggle.com/sambealing\" target=\"_blank\">@sambealing</a> below, I have a few additional questions:</p>\n<ol>\n<li><p><strong>Arithmetic Errors</strong>: You mention that arithmetic errors are not fixable. However, I would argue that they can be addressed through tool calls or formal verification systems such as Lean. If the model has produced a valid reasoning path that is mathematically sound, would you agree that it should be possible to translate it into Python or Lean code for verification? Did you experience any counter-examples in practice?</p></li>\n<li><p><strong>Answer Recovery</strong>: You use a fairly simple regex expression to extract multiple digits from the model's answer. Depending on the implementation, this can fail in several cases. For example, if the model produces an equation, fraction, or additional text inside the boxed environment, the correct answer may not be recovered. Did you observe or document cases where the model produced the correct answer, but the extraction failed, and the problem was therefore marked as unsolved? If so, how would you adapt the extraction logic to recover such cases?</p></li>\n<li><p><strong>Bottleneck</strong>: You claim that “generation quality, not selection quality, is the bottleneck.” However, other contestants argue the opposite, for example <a href=\"https://www.kaggle.com/natnitarach\" target=\"_blank\">@natnitarach</a> in <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/model-capability-dominates\" target=\"_blank\">this submission</a>. They argue that selection is the bottleneck, motivated by the publicly available <code>pass@100</code> statistics on both the public and private sets <a href=\"https://x.com/AIMOprize/status/2039441022996934783\" target=\"_blank\">here</a>. What are your thoughts on this interpretation?</p></li>\n<li><p><strong>Reproducibility</strong>: Is the code needed to reproduce all experiments and notebook configurations available? If so, please share it to improve the reproducibility of your work.</p></li>\n</ol>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 3457746,
      "author_name": "Sam Bealing",
      "author_url": "",
      "post_date": "2026-05-14T09:05:09",
      "content": "<p>Hi, thank you for your submission to the Writeup Prize. <a href=\"https://www.kaggle.com/philipvonderlind\" target=\"_blank\">@philipvonderlind</a> and I will post some questions below that help us in assessing your submission more closely, as described in the <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/689703\" target=\"_blank\">updated discussion post</a>.</p>\n<ol>\n<li><strong>Harmony +2 mechanism:</strong> The +2 from v33 came from adding the ChatGPT identity to SystemContent plus the developer-message code rules. Did you have a chance to isolate which of the two (identity vs developer message) actually drove the gain, or are they entangled in the +2?</li>\n<li><strong>Off-by-one: ambiguity vs model error:</strong> Of the 7/16 hard-problem errors within ±2 of gold (Appendix D), did you investigate whether the source problem statements themselves were ambiguous (e.g. the 'is 0 positive?' issue discussed in <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/672872\" target=\"_blank\">this Kaggle thread</a>) versus cases where the question was clear and the model just made a mistake in its solution?</li>\n<li><strong>Variance estimate from n=3:</strong> Your σ ≈ 3 comes from three identical-code runs (39, 33, 34), while the Nitarach n=13 analysis gives σ ≈ 1.7. With only three samples there's a lot of uncertainty on σ itself. Do you think the true σ for this substrate is closer to 3 or 1.7, and what evidence would tip you one way or the other?</li>\n</ol>\n<p>Look forward to reading your responses on these.</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 3446696,
      "author_name": "",
      "author_url": "",
      "post_date": "2026-04-22T00:53:29.913000",
      "content": "",
      "votes": 0,
      "replies": []
    }
  ],
  "comment_count": 4,
  "messages": [
    {
      "id": 3446459,
      "postDate": "2026-04-21T16:46:48.007Z",
      "content": "<h1>Solo Agent-Team Approach to AIMO3: Harmony Format Discovery, Negative Results, and Variance Analysis</h1>\n<p><strong>Submission details:</strong></p>\n<ul>\n<li><strong>Leaderboard:</strong> Public LB + Private LB (both final)</li>\n<li><strong>Final submission:</strong> <a href=\"https://www.kaggle.com/code/kolenkovskin/aimo3-v33-fixed?scriptVersionId=306011227\" target=\"_blank\">aimo3-v33-fixed Version 2</a></li>\n<li><strong>Colab notebook (Kaggle-agnostic):</strong> <a href=\"https://colab.research.google.com/drive/1-AHappCM4UvLu3Ud43tYj3opyggyUTge?usp=sharing\" target=\"_blank\">aimo3-v33-colab</a></li>\n<li><strong>Public LB (best):</strong> 39/50 | <strong>Rank:</strong> 1518 / 4,138 teams</li>\n<li><strong>Private LB (final):</strong> 39/50 (matches public score — final submission <code>aimo3-v33-fixed Version 2</code> scored 39 on both leaderboards)</li>\n<li><strong>Variance:</strong> Same code, same prompts, three runs: 39, 33, 34 on public LB</li>\n<li><strong>Team:</strong> Kolenkovskin (solo)</li>\n<li><strong>Base model:</strong> <a href=\"https://www.kaggle.com/models/danielhanchen/gpt-oss-120b\" target=\"_blank\">danielhanchen/gpt-oss-120b</a> (no fine-tuning in final submission)</li>\n<li><strong>Code:</strong> Kaggle notebook linked above (single .ipynb, complete pipeline)</li>\n</ul>\n<hr>\n<h2>Abstract</h2>\n<p>We describe a solo competitor's approach to AIMO3 (AI Mathematical Olympiad Progress Prize 3) using GPT-OSS-120B and a multi-agent AI team. Throughout this writeup, \"we\" refers to the author and the AI agent team used for development.</p>\n<p>Our best score of <strong>39/50</strong> (mean ~34, sigma ~3) came from a single discovery: a Harmony message-format error present in all 19 analyzed public notebooks. Adding the correct ChatGPT identity string and a developer message with code-format rules improved score by +2 points — the only statistically meaningful gain across 28 submissions. The same code (v33-fixed) scored 39, 33, and 34 across three runs, demonstrating the variance in this evaluation.</p>\n<p>We document 20+ dead ends with empirical evidence, including the finding that all post-hoc selection methods collapse to majority voting on IMO-hard problems where the per-attempt success rate falls below 50%. We provide variance analysis (sigma ≥ 3), a failure taxonomy of GPT-OSS-120B, and three LoRA fine-tuning experiments on an MXFP4-quantized MoE model served with adapters via vLLM. All prompts, configurations, and negative results are included for reproducibility.</p>\n<hr>\n<h2>1. Introduction</h2>\n<p>The AI Mathematical Olympiad Progress Prize 3 (AIMO3) challenges participants to solve 50 IMO-level mathematical problems using a single H100 80GB GPU within a 5-hour runtime, with internet disabled and integer answers in [0, 99999]. Scoring uses double-run averaging: each problem is scored 0 or 1 per run, averaged across two independent runs.</p>\n<p>We participated as a solo competitor using a multi-agent AI team: Claude Code (Opus) for implementation, Claude Desktop for strategic oversight, Deep Research for literature investigation, Grok for adversarial analysis, and Chrome Extension for community intelligence. This writeup covers 40 days of development across 25+ sessions.</p>\n<p>Our core model is GPT-OSS-120B, a Mixture-of-Experts model with 116.8B total parameters (5.1B active per token), quantized to MXFP4 (Microscaling FP4) during post-training. We use self-consistency sampling (K=8) with majority voting and Tool-Integrated Reasoning (TIR) via the Harmony message format.</p>\n<p><strong>Key contributions:</strong></p>\n<ol>\n<li>Discovery and fix of the Harmony format error present in all public notebooks (+2 points)</li>\n<li>Empirical negative-results catalog: 20+ dead ends with quantified regressions</li>\n<li>Variance analysis confirming sigma ≥ 3 on identical code (39 and 33 on same submission)</li>\n<li>First documented LoRA fine-tuning of an MXFP4-quantized MoE model served with adapters via vLLM</li>\n<li>Multi-agent AI team methodology for competition problem-solving</li>\n</ol>\n<hr>\n<h2>2. Model Understanding: GPT-OSS-120B</h2>\n<h3>2.1 Architecture</h3>\n<p>GPT-OSS-120B is a Mixture-of-Experts transformer with extreme sparsity:</p>\n<ul>\n<li><strong>Total parameters:</strong> 116.8B (MoE) + routing layers</li>\n<li><strong>Active parameters per token:</strong> 5.1B (4.4% utilization)</li>\n<li><strong>Experts:</strong> 128 per layer, top-4 routing</li>\n<li><strong>Quantization:</strong> MXFP4 (e2m1 format, 1 mantissa bit, 8 representable values per sign)</li>\n<li><strong>VRAM footprint:</strong> ~60.8 GB at gpu_memory_utilization=0.96</li>\n</ul>\n<p>The MXFP4 quantization is applied during post-training (not post-hoc), meaning the model was trained with this precision in mind. However, the BF16 router weights combined with MXFP4 expert weights create routing non-determinism: 1,000 identical requests at T=0 produce 80 unique completions.</p>\n<h3>2.2 Harmony Message Format</h3>\n<p>GPT-OSS uses a proprietary \"Harmony\" encoding with 6 message carriers:</p>\n<table>\n<thead>\n<tr>\n<th>#</th>\n<th>Carrier</th>\n<th>Purpose</th>\n<th>Tunable?</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>SystemContent</td>\n<td>Model identity and personality</td>\n<td>Frozen</td>\n</tr>\n<tr>\n<td>2</td>\n<td>ReasoningEffort</td>\n<td>Controls thinking depth (low/medium/high)</td>\n<td>medium</td>\n</tr>\n<tr>\n<td>3</td>\n<td>ToolNamespaceConfig</td>\n<td>Tool definitions (Python interpreter)</td>\n<td>Load-bearing</td>\n</tr>\n<tr>\n<td>4</td>\n<td>DeveloperContent</td>\n<td>Developer instructions</td>\n<td><strong>+2 points</strong></td>\n</tr>\n<tr>\n<td>5</td>\n<td>UserContent</td>\n<td>Problem statement</td>\n<td>Per-problem</td>\n</tr>\n<tr>\n<td>6</td>\n<td>preference_prompt</td>\n<td>Output format preferences</td>\n<td>Frozen</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Critical discovery (v33, +2 points):</strong> The model expects SystemContent to contain the ChatGPT identity string (\"You are ChatGPT, a large language model trained by OpenAI…\"). All 19 analyzed public notebooks either omit this or replace it with a custom identity. Additionally, the DeveloperContent carrier (exposed by the openai-harmony library as <code>.with_instructions()</code>) accepts code-format rules that tripled the model's Python tool efficiency from 42 to 13 calls per problem, as measured in S12 A/B tests.</p>\n<p><strong>Catastrophic failure mode (v32, score=0):</strong> Using <code>.with_text()</code> instead of <code>.with_instructions()</code> raises <code>AttributeError</code>, caught by a silent try/except, causing all 400 inference attempts to return None.</p>\n<h3>2.3 Output Channels</h3>\n<p>GPT-OSS produces output in 3 channels: <code>analysis</code> (hidden reasoning), <code>commentary</code>, and <code>final</code>. The host pipeline reads only <code>final</code> for answer extraction and routes <code>recipient=python</code> blocks to Jupyter kernels. Analysis content is appended to conversation history but never inspected by host code. All 19 analyzed competitor notebooks follow this same pattern.</p>\n<h3>2.4 Failure Taxonomy on IMO-Level Problems</h3>\n<table>\n<thead>\n<tr>\n<th>Type</th>\n<th>Frequency</th>\n<th>Behavior</th>\n<th>Fixable?</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>E1: Misunderstanding</td>\n<td>~54% of errors</td>\n<td>Wrong mathematical formalization</td>\n<td>LoRA (possibly)</td>\n</tr>\n<tr>\n<td>E2: Arithmetic error</td>\n<td>~15%</td>\n<td>Correct approach, wrong calculation</td>\n<td>No (random)</td>\n</tr>\n<tr>\n<td>E3: Thread loss</td>\n<td>~15%</td>\n<td>Starts correctly, diverges mid-solution</td>\n<td>Possibly</td>\n</tr>\n<tr>\n<td>E4: Wrong approach</td>\n<td>~10%</td>\n<td>Incorrect strategy from start</td>\n<td>LoRA (possibly)</td>\n</tr>\n<tr>\n<td>E5: Cannot begin</td>\n<td>~6%</td>\n<td>Problem too novel for model</td>\n<td>No (ceiling)</td>\n</tr>\n</tbody>\n</table>\n<p>Source: Prism Math taxonomy (4601 examples) applied to our 12-problem hard set.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F23009828%2F8e917ff52333212a15b90b789c1e5e3a%2Ffig3_error_taxonomy.png?generation=1776779735307120&amp;alt=media\" alt=\"\"></p>\n<hr>\n<h2>3. Inference Pipeline (Kaggle Submission)</h2>\n<h3>3.1 Architecture</h3>\n<pre><code>[Problem text] → Harmony encoding → vLLM (GPT-OSS-120B) → TIR loop\n                                                              ↓\n                                          Jupyter kernel ← code blocks\n                                                              ↓\n                                          \\boxed{answer} extraction\n                                                              ↓\n                                          K=8 attempts → majority vote\n</code></pre>\n<h3>3.2 vLLM Configuration</h3>\n<table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Value</th>\n<th>Rationale</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>gpu_memory_utilization</td>\n<td>0.96</td>\n<td>Maximum without OOM</td>\n</tr>\n<tr>\n<td>max_model_len</td>\n<td>65536</td>\n<td>Full context for long solutions</td>\n</tr>\n<tr>\n<td>max_num_seqs</td>\n<td>256</td>\n<td>Default; reduction to 8 tested and found neutral</td>\n</tr>\n<tr>\n<td>dtype</td>\n<td>auto (MXFP4)</td>\n<td>Native model precision</td>\n</tr>\n<tr>\n<td>kv_cache_dtype</td>\n<td>fp8_e4m3fn</td>\n<td>Saves VRAM on H100</td>\n</tr>\n<tr>\n<td>enforce_eager</td>\n<td>True</td>\n<td>Avoids CUDA graph issues</td>\n</tr>\n<tr>\n<td>port</td>\n<td>8000</td>\n<td>Local subprocess</td>\n</tr>\n</tbody>\n</table>\n<h3>3.3 TIR Execution</h3>\n<ul>\n<li>16 parallel Jupyter kernels via <code>jupyter_client</code></li>\n<li>Per-kernel timeout: 60 seconds</li>\n<li>Code output truncation: first 300 + last 300 characters</li>\n<li>Bug spiral detection: abort after 3 consecutive errors (saves ~15% compute on hard problems)</li>\n<li>Maximum code executions: not capped (model self-limits at ~6-8)</li>\n</ul>\n<h3>3.4 Sampling and Selection</h3>\n<ul>\n<li><strong>K=8</strong> attempts per problem (K=16 tested, no improvement: v28 = 37 = v24)</li>\n<li><strong>Temperature:</strong> 1.0 (T=0.8 tested in v37, neutral)</li>\n<li><strong>Reasoning effort:</strong> medium</li>\n<li><strong>Selection:</strong> majority vote with longest-trace tiebreak</li>\n<li><strong>Answer extraction:</strong> regex <code>\\boxed{(\\d+)}</code> on final channel output</li>\n<li><strong>Extraction accuracy:</strong> 100% (verified on 100 test cases)</li>\n</ul>\n<h3>3.5 Time Management</h3>\n<ul>\n<li>Total budget: 5 hours (18000 seconds)</li>\n<li>Per-problem allocation: <code>remaining_time / remaining_problems</code></li>\n<li>Startup (vLLM load): ~180 seconds</li>\n<li>Average per-problem: ~4-5 minutes (89% budget slack confirmed v25: 30min/290min)</li>\n<li>search_tokens=1024 for early <code>\\boxed{}</code> detection</li>\n</ul>\n<h3>3.6 Invariants (Breaking Any = Failed Submission)</h3>\n<ol>\n<li>Dummy <code>submission.parquet</code> written before ANY imports (crash protection)</li>\n<li>Version stamp printed as first output line</li>\n<li><code>KAGGLE_IS_COMPETITION_RERUN</code> detection for force-serve mode</li>\n<li>try/except in final cell with parquet fallback</li>\n<li><code>ensure_ascii=True</code> on all <code>json.dump</code> calls (cp1252 encoding protection)</li>\n<li>Dual-path model/wheels resolution for interactive vs rerun environments</li>\n</ol>\n<hr>\n<h2>4. Selection Methods: Negative Results</h2>\n<p>The gap between pass@8 (probability that at least one of 8 attempts is correct) and majority@8 (majority vote accuracy) is large: approximately 80% vs. 40% on our 5-problem measured subset. This coverage-versus-pass-rate (CCPR) gap motivated extensive investigation into selection methods. Every method tested failed to close it.</p>\n<h3>4.1 Methods Tested</h3>\n<table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Result</th>\n<th>Evidence</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Majority voting (baseline)</td>\n<td>37/50</td>\n<td>v24, v25, v28</td>\n</tr>\n<tr>\n<td>IEW entropy weighting</td>\n<td>= majority</td>\n<td>AUC=0.595 (near-random)</td>\n</tr>\n<tr>\n<td>GenSelect (LLM-as-judge)</td>\n<td>-3 points</td>\n<td>v29=34; Harmony format incompatible</td>\n</tr>\n<tr>\n<td>Adaptive routing (difficulty-gated)</td>\n<td>-3 points</td>\n<td>v29=34; complexity = regression</td>\n</tr>\n<tr>\n<td>Self-verification (verify-noDev)</td>\n<td>-3 to -5</td>\n<td>FPR=75% (self-confirmation bias)</td>\n</tr>\n<tr>\n<td>Code trajectory analysis</td>\n<td>= majority</td>\n<td>Signal vanishes on hard problems</td>\n</tr>\n<tr>\n<td>Z3 constraint verification</td>\n<td>0/16 distinguish</td>\n<td>Regex constraints too weak</td>\n</tr>\n<tr>\n<td>ECP evidence mining</td>\n<td>-4 points</td>\n<td>FPR=37%</td>\n</tr>\n<tr>\n<td>ThinkPRM-1.5B (process reward model)</td>\n<td>Inverse scoring</td>\n<td>Wrong=1.0, correct=0.7 on hard</td>\n</tr>\n<tr>\n<td>Longest-trace tiebreak</td>\n<td>+1 (tiebreak only)</td>\n<td>v44+v45: 6/12 vs majority 5/12</td>\n</tr>\n<tr>\n<td>DeepConf (13 methods, K=32)</td>\n<td>= majority</td>\n<td>0/12 at K=32, all methods</td>\n</tr>\n<tr>\n<td>Minority selection</td>\n<td>3/3 on hard</td>\n<td>But 0/3 on easy — not usable</td>\n</tr>\n</tbody>\n</table>\n<h3>4.2 Why Selection Fails on Hard Problems</h3>\n<p>Chen et al. (NeurIPS 2024) prove that when p(correct) &lt; p(wrong) per attempt, increasing K makes majority voting worse, not better. On our hard problems, the model produces the same wrong answer 6–7 out of 8 times. No post-hoc method can recover correctness from a distribution where the correct answer is in the minority.</p>\n<p><strong>Generation quality, not selection quality, is the bottleneck.</strong> This overrides our S14–S20 conclusion that \"selection = THE bottleneck.\" On easy problems (pass@1 &gt; 50%), majority voting works. On hard problems (pass@1 &lt; 20%), the model produces the same wrong answer 6–7 out of 8 times — no post-hoc method recovers from that.</p>\n<h3>4.3 External Confirmation</h3>\n<ul>\n<li>wenliangtlh independently confirms the CCPR gap: pass@128 = 0.867 vs. maj@128 = 0.453</li>\n<li>Top-20 Kaggle teams all use majority voting; no confidence-based selection method appears in the top 20 (per community survey)</li>\n<li>Nitarach (arXiv:2603.27844) analysis confirms that approximately 3 borderline problems at p ≈ 0.50 drive all observed leaderboard variance</li>\n</ul>\n<hr>\n<h2>5. LoRA Fine-tuning Experiments</h2>\n<h3>5.1 Motivation</h3>\n<p>All AIMO1/2 winners used fine-tuning (NuminaMath, NemoSkills). NemoSkills gained ~4 points over vanilla baselines through fine-tuning [3]. Public notebook ceiling is 44/50; leaderboard leader achieved 46/50 with 113 submissions.</p>\n<h3>5.2 Technical Challenge: MXFP4 + LoRA</h3>\n<p>No published results exist for LoRA fine-tuning of MXFP4-quantized MoE models. Key challenges:</p>\n<ul>\n<li>Training uses BNB-4bit quantization; inference uses native MXFP4 (different schemes)</li>\n<li>All model-merge paths fail (safetensors format mismatch, Marlin kernel incompatibility)</li>\n<li><strong>Solution:</strong> vLLM 0.18.1 <code>--enable-lora</code> serves adapter directly on MXFP4 base (no merge needed)</li>\n</ul>\n<h3>5.3 Experiments</h3>\n<table>\n<thead>\n<tr>\n<th>Run</th>\n<th>Data</th>\n<th>Format</th>\n<th>Examples</th>\n<th>seq_len</th>\n<th>Loss</th>\n<th>Result</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>v1</td>\n<td>Harmony-filtered (easy)</td>\n<td>Harmony</td>\n<td>987</td>\n<td>2048</td>\n<td>0.64</td>\n<td>5/5 easy, 0/12 hard (= base)</td>\n</tr>\n<tr>\n<td>v2</td>\n<td>OMR hard (DeepSeek format)</td>\n<td>CoT (<code>&lt;think&gt;</code>)</td>\n<td>2000</td>\n<td>2048</td>\n<td>0.52</td>\n<td>1/12; 5/12 extraction errors</td>\n</tr>\n<tr>\n<td>v3</td>\n<td>Nemotron-Math-v2 (GPT-OSS traces)</td>\n<td>Harmony (converted)</td>\n<td>5000</td>\n<td>4096</td>\n<td>0.55</td>\n<td>BNB4/MXFP4 mismatch: code_execs=0</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Key finding:</strong> Format matters more than data quality. v2 trained on hard problems in wrong format (CoT) scored worse than v1 trained on easy problems in correct format (Harmony). v3 had correct format but the BNB4→MXFP4 quantization gap caused the model to lose TIR capability entirely (zero code executions).</p>\n<h3>5.4 Training Configuration (v1, best result)</h3>\n<ul>\n<li><strong>Framework:</strong> Unsloth + PEFT</li>\n<li><strong>Quantization:</strong> BNB-4bit (NF4, double quantization)</li>\n<li><strong>LoRA:</strong> r=16, alpha=32, target_modules=[q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj]</li>\n<li><strong>Optimizer:</strong> adamw_8bit, lr=1e-4, cosine schedule, warmup_ratio=0.03</li>\n<li><strong>Batch:</strong> per_device=2, gradient_accumulation=4</li>\n<li><strong>Hardware:</strong> 1x H100 80GB SXM (RunPod), ~2h training</li>\n<li><strong>Adapter size:</strong> 73 MB</li>\n</ul>\n<h3>5.5 Data Sources</h3>\n<table>\n<thead>\n<tr>\n<th>Dataset</th>\n<th>Size</th>\n<th>Format</th>\n<th>Used</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>nvidia/OpenMathReasoning TIR</td>\n<td>1.7M</td>\n<td>TIR traces</td>\n<td>Filtered to 5000</td>\n</tr>\n<tr>\n<td>nvidia/Nemotron-Math-v2</td>\n<td>3.5M</td>\n<td>GPT-OSS native</td>\n<td>Converted 5000</td>\n</tr>\n<tr>\n<td>Jackrong/Harmony-dataset</td>\n<td>8471</td>\n<td>Harmony format</td>\n<td>Not used (discovered late)</td>\n</tr>\n<tr>\n<td>21 HF AIMO3 finetunes</td>\n<td>varies</td>\n<td>Unknown</td>\n<td>All have empty model cards</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>6. Variance Analysis</h2>\n<h3>6.1 Empirical Evidence</h3>\n<p>Our v33 submission scored <strong>39</strong>, <strong>33</strong>, and <strong>34</strong> on identical code across three separate runs (submitted March 24, March 28, and April 7). This 6-point spread (39 vs 33) from the same codebase is the strongest direct evidence of high variance. The mean of our three runs (35.3) is consistent with sigma ~3.</p>\n<h3>6.2 External Analysis</h3>\n<p>Nitarach (arXiv 2603.27844) ran 13 identical submissions of the same pipeline and found:</p>\n<ul>\n<li>Range: 37–44 (7-point spread)</li>\n<li>Mean: 39.7</li>\n<li>Estimated sigma: ~1.7</li>\n</ul>\n<p>However, our observation (39 vs 33, delta=6) suggests true sigma may be higher (~3), possibly due to:</p>\n<ul>\n<li>MXFP4 routing non-determinism (80 unique completions at T=0)</li>\n<li>Kaggle H100 hardware variation between runs</li>\n<li>~3 borderline problems at p≈0.50 creating bimodal outcomes</li>\n</ul>\n<h3>6.3 Implications for Evaluation</h3>\n<table>\n<thead>\n<tr>\n<th>Delta</th>\n<th>Interpretation</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>&lt; 3</td>\n<td>Noise; do not react</td>\n</tr>\n<tr>\n<td>3-4</td>\n<td>Possibly real; needs 3+ confirmations</td>\n</tr>\n<tr>\n<td>&gt; 4</td>\n<td>Likely real improvement</td>\n</tr>\n</tbody>\n</table>\n<p>This means our 18-submission history contains <strong>one</strong> statistically meaningful finding: v33 (Harmony fix) = +2 over v28 baseline of 37, confirmed by the mechanism (format change has clear causal path). All other deltas are within noise.</p>\n<h3>6.4 Leaderboard Implications</h3>\n<p>The leaderboard leader scored 46/50 from 113 entries. Using winner's curse correction (ML estimate), their true mean is likely ~41.8. The public ceiling of 44/50 from unmodified notebooks is also inflated. True ceiling for vanilla GPT-OSS-120B is approximately 36-38/50.</p>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F23009828%2F3f5372dcd902b5038e1b923620324412%2Ffig4_variance.png?generation=1776780061273863&amp;alt=media\" alt=\"\"></p>\n<hr>\n<h2>7. Competitor Analysis</h2>\n<h3>7.1 Public Notebook Forensics</h3>\n<p>We analyzed 19 public notebooks scoring 36-44 on the leaderboard. Key findings:</p>\n<table>\n<thead>\n<tr>\n<th>Feature</th>\n<th>Our v33</th>\n<th>Typical competitor</th>\n<th>Best competitor</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Identity</td>\n<td>ChatGPT (correct)</td>\n<td>Custom/omitted</td>\n<td>Custom/omitted</td>\n</tr>\n<tr>\n<td>DeveloperContent</td>\n<td>Code-format rules</td>\n<td>None</td>\n<td>None</td>\n</tr>\n<tr>\n<td>K (attempts)</td>\n<td>8</td>\n<td>8</td>\n<td>8-16</td>\n</tr>\n<tr>\n<td>Temperature</td>\n<td>1.0</td>\n<td>0.6-1.0</td>\n<td>0.6</td>\n</tr>\n<tr>\n<td>gpu_memory_util</td>\n<td>0.96</td>\n<td>0.90</td>\n<td>0.90</td>\n</tr>\n<tr>\n<td>max_num_seqs</td>\n<td>256</td>\n<td>6-8</td>\n<td>64</td>\n</tr>\n<tr>\n<td>Selection</td>\n<td>majority + longest</td>\n<td>majority</td>\n<td>majority</td>\n</tr>\n<tr>\n<td>min_p</td>\n<td>0.02</td>\n<td>0.02-0.05</td>\n<td>0.05</td>\n</tr>\n</tbody>\n</table>\n<h3>7.2 Comparison with SOTA</h3>\n<table>\n<thead>\n<tr>\n<th>Method</th>\n<th>Score</th>\n<th>Notes</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Public baseline (kurianbenoy fork)</td>\n<td>36</td>\n<td>Unmodified</td>\n</tr>\n<tr>\n<td>Best public notebook (ans-verifys)</td>\n<td>44</td>\n<td>Lucky run; likely mean ~38-40</td>\n</tr>\n<tr>\n<td>Leaderboard leader (ippeiogawa)</td>\n<td>46</td>\n<td>113 entries; true mean ~41.8</td>\n</tr>\n<tr>\n<td><strong>Our v33 (final submission)</strong></td>\n<td><strong>39 public / 39 private</strong></td>\n<td><strong>3-run variance (public): 39, 33, 34 — mean 35.3</strong></td>\n</tr>\n<tr>\n<td>AIMO2 winner (NemoSkills, 14B fine-tuned)</td>\n<td>34/50</td>\n<td>AIMO2, not directly comparable (4x L4 hardware)</td>\n</tr>\n<tr>\n<td>DeepSeek-R1 (671B, if available)</td>\n<td>N/A</td>\n<td>Not applicable (too large)</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>8. Multi-Agent Workflow</h2>\n<h3>8.1 Agent Roles</h3>\n<table>\n<thead>\n<tr>\n<th>Agent</th>\n<th>Model</th>\n<th>Role</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>KK (Claude Code)</td>\n<td>Claude Opus</td>\n<td>Implementation, code audit, testing, memory</td>\n</tr>\n<tr>\n<td>KD (Claude Desktop)</td>\n<td>Claude Opus</td>\n<td>Strategy, Deep Research, coordination</td>\n</tr>\n<tr>\n<td>DR (Deep Research)</td>\n<td>Claude Opus</td>\n<td>Literature investigation (86 reports)</td>\n</tr>\n<tr>\n<td>GK (Grok)</td>\n<td>grok-4.20</td>\n<td>Adversarial analysis, RunPod SSH</td>\n</tr>\n<tr>\n<td>KH (Chrome Extension)</td>\n<td>Claude Sonnet</td>\n<td>Community intelligence, leaderboard</td>\n</tr>\n</tbody>\n</table>\n<h3>8.2 Communication Infrastructure</h3>\n<ul>\n<li><strong>Shared filesystem:</strong> <code>theory/</code> (86 .md files), <code>prompts/</code> (45 files), <code>logs/kk-sessions/</code></li>\n<li><strong>Memory mirror:</strong> <code>.claude-memory-mirror/</code> (5 files: rules, dead ends, key files, bugs, verified)</li>\n<li><strong>Journal:</strong> <code>journal_aimo3.txt</code> (prepend-only, reverse chronological)</li>\n<li><strong>Execution contract:</strong> <code>CLAUDE.md</code> with mandatory reads and theory-check protocol</li>\n</ul>\n<h3>8.3 Effective Practices</h3>\n<ol>\n<li><strong>Bug detection:</strong> Pre-submission code review caught 5 critical bugs in v29 before the Kaggle run</li>\n<li><strong>Competitor forensics:</strong> One afternoon analyzing 19 notebooks produced more actionable insight than 86 research investigations</li>\n<li><strong>Test framework:</strong> 69 local tests running in 0.06 s prevented regression without GPU access</li>\n<li><strong>Theory audit:</strong> Classifying all 86 research files, archiving 51, and preserving 35 kept working context focused</li>\n</ol>\n<h3>8.4 Failure Modes</h3>\n<ol>\n<li><strong>Research without measurement:</strong> 0 of 86 deep-research investigations led to a positive code change</li>\n<li><strong>False premise cascade:</strong> One unverified assumption (\"our gap = 7 points\") propagated through 30+ research files over 20 days</li>\n<li><strong>Agent convergence is not evidence:</strong> All three agents agreed that extraction was the bottleneck; the first direct measurement disproved it in under a minute</li>\n</ol>\n<hr>\n<h2>9. Dead Ends Summary</h2>\n<p>We tested 20+ approaches beyond the baseline. None improved the score. The full catalog is in Appendix H; here we summarize the key categories:</p>\n<table>\n<thead>\n<tr>\n<th>Category</th>\n<th>Methods Tested</th>\n<th>Best Result</th>\n<th>Lesson</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Prompt engineering</td>\n<td>3-prompt diversity, minimal prompts</td>\n<td>−3 each</td>\n<td>Prompts are frozen for reasoning-native models</td>\n</tr>\n<tr>\n<td>Sampling</td>\n<td>Multi-temp, SC@16</td>\n<td>0, 0</td>\n<td>Diminishing returns beyond K=8</td>\n</tr>\n<tr>\n<td>Selection (LLM-as-judge)</td>\n<td>GenSelect via chat API</td>\n<td>−3</td>\n<td>Harmony format incompatible with judging</td>\n</tr>\n<tr>\n<td>Selection (statistical)</td>\n<td>IEW, DeepConf (13 methods), LR scoring, Bayesian, CARE</td>\n<td>= majority</td>\n<td>All collapse to majority on hard problems</td>\n</tr>\n<tr>\n<td>Selection (code analysis)</td>\n<td>Trajectory, Z3, ECP mining</td>\n<td>0 to −4</td>\n<td>Signal vanishes on hard</td>\n</tr>\n<tr>\n<td>Verification</td>\n<td>Self-verify, ThinkPRM-1.5B</td>\n<td>−3 to −5, inverse</td>\n<td>Self-confirmation bias; PRM inverts on hard</td>\n</tr>\n<tr>\n<td>Model diversity</td>\n<td>20B dual-model</td>\n<td>−1</td>\n<td>Same wrong answers as 120B</td>\n</tr>\n<tr>\n<td>Prompt diversification</td>\n<td>Prescriptive, \"solve two ways\"</td>\n<td>0</td>\n<td>Model either knows or doesn't</td>\n</tr>\n</tbody>\n</table>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F23009828%2F4ab94f0ffd6b704aebe83024e63b2773%2Ffig2_ablation.png?generation=1776779929510625&amp;alt=media\" alt=\"\"></p>\n<hr>\n<h2>10. Lessons Learned</h2>\n<p><strong>Read competitor code on day 1.</strong> We didn't. That cost 20 days. One afternoon of notebook forensics produced the only +2 gain across 28 submissions. 86 deep-research reports produced zero code changes.</p>\n<p><strong>Measure before theorizing.</strong> Three independent agents converged on \"extraction is the bottleneck.\" First measurement: extraction accuracy = 100%. One number killed an entire research track.</p>\n<p><strong>Subtraction beats addition.</strong> Every feature we added scored zero or negative. The only improvement came from fixing a bug (Harmony format) and removing harmful features (IEW, GenSelect). Simple majority vote at 37/50 beat our most elaborate pipeline at 34/50.</p>\n<p><strong>Ten submissions went to noise.</strong> With sigma ≥ 3, the gap between 33 and 39 is one standard deviation. We needed: delta &gt; 4 plus a mechanistic explanation before reacting. We didn't have that rule until submission 17.</p>\n<p><strong>Off-by-one is systematic, not random.</strong> 44% of wrong answers differ from gold by ±1 or ±2 — the same boundary confusion (inclusive vs. exclusive ranges, base cases) across different problems. This is a training data artifact, not a pipeline issue.</p>\n<hr>\n<h2>11. Discussion</h2>\n<h3>11.1 What We Would Do Differently</h3>\n<p>The optimal strategy for a solo competitor, in hindsight, would be:</p>\n<ol>\n<li>Day 1: Fork best public notebook, submit unmodified (baseline)</li>\n<li>Day 2: Analyze all public notebooks, find the key diffs</li>\n<li>Day 3-5: Fix Harmony format, confirm +2</li>\n<li>Day 6-15: LoRA fine-tuning with Jackrong/Harmony-dataset (correct format, hard problems)</li>\n<li>Remaining days: Submit LoRA variants, collect variance data</li>\n</ol>\n<p>We instead spent 20 days on prompt engineering and selection methods before reading competitor code.</p>\n<h3>11.2 Open Questions</h3>\n<ol>\n<li>Does the analysis channel contain usable confidence signals?</li>\n<li>Can targeted LoRA on off-by-one examples fix boundary confusion?</li>\n<li>What is the true per-problem variance (p_i) for each of the 50 problems?</li>\n<li>Would EAGLE3 speculative decoding (40% throughput gain) enable K=12-16 within budget?</li>\n</ol>\n<h3>11.3 Reproducibility Note</h3>\n<p>All code is contained in a single Jupyter notebook. All prompts are frozen and documented in Appendix A. The only external dependency beyond standard Kaggle environment is the GPT-OSS-120B model and vLLM wheels, both available as Kaggle datasets.</p>\n<p>For Kaggle-agnostic reproducibility, a Google Colab version of the full pipeline is provided: <a href=\"https://colab.research.google.com/drive/1-AHappCM4UvLu3Ud43tYj3opyggyUTge?usp=sharing\" target=\"_blank\">aimo3-v33-colab</a>. It installs the <code>openai-harmony</code> library and <code>vLLM</code> from public PyPI, downloads the <code>gpt-oss-120b</code> weights from Hugging Face, and exposes the same inference harness used in the Kaggle submission (with the <code>kaggle_evaluation</code> gateway import guarded by <code>try/except ImportError</code> so the notebook runs in any environment with a single H100-class GPU).</p>\n<hr>\n<h2>References</h2>\n<p>[1] Nitarach. \"Variance Analysis of AIMO3 Submissions.\" arXiv:2603.27844, 2026.\n[2] Chen et al. \"When Majority Voting Fails.\" NeurIPS, 2024.\n[3] NVIDIA NemoSkills team. \"NemoSkills: AIMO2 Winning Solution.\" arXiv:2504.16891, 2025.\n[4] Prism Math. \"Error Taxonomy for Mathematical Reasoning.\" 4,601 examples, 2025.\n[5] Ai. \"On Correlated Voting.\" Corollary 2 (Dawid-Skene limitation), 2025.</p>\n<hr>\n<h2>Appendix A: Prompts (Verbatim)</h2>\n<p>All prompts are copied exactly from <code>aimo3-v33-fixed.ipynb</code> (CFG class). These produced 39/50. <strong>Any modification causes regression</strong> (confirmed v22, v27).</p>\n<h3>A.1 System Prompt (Frozen)</h3>\n<pre><code>You are a world-class International Mathematical Olympiad (IMO) competitor.\nThe final answer must be a non-negative integer between 0 and 99999.\nYou must place the final integer answer inside \\boxed{}.\n</code></pre>\n<p>Injected into DeveloperContent carrier (not SystemContent). SystemContent carries model identity (A.6).</p>\n<h3>A.2 Tool/Namespace Prompt (Frozen, Load-Bearing)</h3>\n<pre><code>Use this tool to execute Python code.\nThe environment is a stateful Jupyter notebook.\nYou must use print() to output results.\n</code></pre>\n<p><strong>WARNING:</strong> Removing this caused +9pp execution errors (v27).</p>\n<h3>A.3 Developer Message (The +2 Discovery)</h3>\n<pre><code># PROBLEM-SOLVING PROTOCOL\n\ndef solve(problem: str) -&gt; int:\n    problem_type = classify(problem)\n    answer_analytical = solve_analytically(problem, problem_type)\n    answer_numerical = verify_with_python(problem, answer_analytical)\n    if answer_analytical != answer_numerical:\n        answer_analytical = answer_numerical  # trust Python over reasoning\n    return answer_analytical\n\ndef solve_analytically(problem, problem_type):\n    method_1 = pick_method(problem_type)\n    result = attempt(method_1)\n    if result is None:\n        method_2 = pick_different_method(problem_type, exclude=method_1)\n        result = attempt(method_2)\n    return result\n\ndef verify_with_python(problem, claimed_answer):\n    # ALWAYS run. Use INDEPENDENT method from analytical.\n    # counting -&gt; enumerate and count\n    # optimization -&gt; scipy.optimize or brute force\n    # equations -&gt; sympy.solve\n    # NEVER recompute same formula\n    return execute(write_verification_code(problem))\n\ndef on_python_error(code, error):\n    # NEVER debug. ALWAYS delete and rewrite from scratch.\n    return write_completely_new_code()\n\n# HARD RULES:\n# - Final answer inside \\\\boxed{}\n# - Answer: non-negative integer 0-99999\n# - Use math, numpy, sympy, scipy, itertools, collections\n# - If two methods disagree, run THIRD to break tie\n</code></pre>\n<p>Injected via <code>DeveloperContent.new().with_instructions()</code>. Tripled Python tool efficiency: 42 to 13 code calls per problem (S12 A/B test).</p>\n<h3>A.4 Preference Prompt (Frozen)</h3>\n<pre><code>Use `math`, `numpy`,`sympy`,`itertools` and `collections` to solve the problem.\n</code></pre>\n<h3>A.5 User Prompt Template</h3>\n<p>Each problem sent as single UserContent message with raw problem text. No framing, no few-shot, no CoT instructions.</p>\n<h3>A.6 Harmony System Identity (Critical)</h3>\n<pre><code>SystemContent.new()\n    .with_model_identity('You are ChatGPT, a large language model trained by OpenAI.')\n    .with_reasoning_effort(reasoning_effort=ReasoningEffort.HIGH)\n    .with_tools(tool_config)\n</code></pre>\n<p><strong>This is the +2 discovery.</strong> All 19 competitor notebooks omit or replace this identity. The <code>openai-harmony</code> library does NOT auto-inject it.</p>\n<h3>A.7 Message Assembly</h3>\n<pre><code>messages = [\n    Message.from_role_and_content(Role.SYSTEM, system_content),      # Identity + tools\n    Message.from_role_and_content(Role.DEVELOPER, developer_content), # Instructions\n    Message.from_role_and_content(Role.USER, problem_text)            # Problem\n]\n</code></pre>\n<p>Three messages total. No conversation history between problems.</p>\n<hr>\n<h2>Appendix B: Complete Version History</h2>\n<p><img src=\"https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F23009828%2Fe92268266332e5124bc6f2e1846937b9%2Ffig1_score_history.png?generation=1776780256053758&amp;alt=media\" alt=\"\"></p>\n<table>\n<thead>\n<tr>\n<th>#</th>\n<th>Date</th>\n<th>Version</th>\n<th>Score</th>\n<th>Delta</th>\n<th>Key Change</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>2026-03-06</td>\n<td>DeepSeek-14B v6</td>\n<td>0</td>\n<td>—</td>\n<td>First submit (RERUN detection broken)</td>\n</tr>\n<tr>\n<td>2</td>\n<td>2026-03-07</td>\n<td>QwQ-32B v7</td>\n<td>0</td>\n<td>0</td>\n<td>Infrastructure works, model too weak</td>\n</tr>\n<tr>\n<td>3</td>\n<td>2026-03-11</td>\n<td>GPT-OSS v19</td>\n<td>0</td>\n<td>0</td>\n<td>6 root-cause fixes, still broken</td>\n</tr>\n<tr>\n<td>4</td>\n<td>2026-03-12</td>\n<td>Fork v3 (baseline)</td>\n<td>36</td>\n<td>+36</td>\n<td>Unmodified kurianbenoy fork</td>\n</tr>\n<tr>\n<td>5</td>\n<td>2026-03-13</td>\n<td>v22</td>\n<td>33</td>\n<td>−3</td>\n<td>3-prompt diversity</td>\n</tr>\n<tr>\n<td>6</td>\n<td>2026-03-14</td>\n<td>v23</td>\n<td>36</td>\n<td>+3</td>\n<td>Minimal prompt + multi-temp</td>\n</tr>\n<tr>\n<td>7</td>\n<td>2026-03-15</td>\n<td>v24</td>\n<td>37</td>\n<td>+1</td>\n<td>batch=256, gpu=0.96, ctx=65536</td>\n</tr>\n<tr>\n<td>8</td>\n<td>2026-03-16</td>\n<td>v25</td>\n<td>37</td>\n<td>0</td>\n<td>Variance confirmation</td>\n</tr>\n<tr>\n<td>9</td>\n<td>2026-03-18</td>\n<td>v28</td>\n<td>37</td>\n<td>0</td>\n<td>SC@16 (= SC@8)</td>\n</tr>\n<tr>\n<td>10</td>\n<td>2026-03-19</td>\n<td>v29</td>\n<td>34</td>\n<td>−3</td>\n<td>GenSelect + adaptive</td>\n</tr>\n<tr>\n<td>11</td>\n<td>2026-03-20</td>\n<td>v30</td>\n<td>36</td>\n<td>−1</td>\n<td>Subtraction (K=8, timeout=10)</td>\n</tr>\n<tr>\n<td>12</td>\n<td>2026-03-20</td>\n<td>v31</td>\n<td>34</td>\n<td>−3</td>\n<td>Align with 42-scorer</td>\n</tr>\n<tr>\n<td>13</td>\n<td>2026-03-22</td>\n<td>v32</td>\n<td>0</td>\n<td>−37</td>\n<td>BUG: <code>.with_text()</code> AttributeError — all 400 attempts returned None</td>\n</tr>\n<tr>\n<td>14</td>\n<td>2026-03-24</td>\n<td><strong>v33</strong></td>\n<td><strong>39</strong></td>\n<td><strong>+2</strong></td>\n<td><strong>Harmony fix + developer message</strong></td>\n</tr>\n<tr>\n<td>15</td>\n<td>2026-03-24</td>\n<td>v34</td>\n<td>34</td>\n<td>−5</td>\n<td>PROVE filter + seqs=8</td>\n</tr>\n<tr>\n<td>16</td>\n<td>2026-03-26</td>\n<td>v37b</td>\n<td>31</td>\n<td>−8</td>\n<td>Experimental features</td>\n</tr>\n<tr>\n<td>17</td>\n<td>2026-03-28</td>\n<td>v33 resub #1</td>\n<td>33</td>\n<td>−6</td>\n<td>Same code as row 14; confirms variance</td>\n</tr>\n<tr>\n<td>18</td>\n<td>~2026-03-31</td>\n<td>v35-verify-fresh</td>\n<td>34</td>\n<td>−5</td>\n<td>Self-verification (FPR=75%)</td>\n</tr>\n<tr>\n<td>19</td>\n<td>~2026-04-01</td>\n<td>v31-majority-clean</td>\n<td>0</td>\n<td>−39</td>\n<td>Bug: clean majority rewrite failed</td>\n</tr>\n<tr>\n<td>20</td>\n<td>~2026-04-02</td>\n<td>gptoss-fork-v1.2</td>\n<td>34</td>\n<td>−5</td>\n<td>Fork variant</td>\n</tr>\n<tr>\n<td>21</td>\n<td>~2026-04-03</td>\n<td>v54-mining-longest v1</td>\n<td>0</td>\n<td>−39</td>\n<td>Code mining extraction (broken)</td>\n</tr>\n<tr>\n<td>22</td>\n<td>~2026-04-04</td>\n<td>v54-mining-longest v2</td>\n<td>Error</td>\n<td>—</td>\n<td>Kaggle Error</td>\n</tr>\n<tr>\n<td>23</td>\n<td>~2026-04-04</td>\n<td>v54-code-mining+longest</td>\n<td>32</td>\n<td>−7</td>\n<td>Code mining + longest tiebreak</td>\n</tr>\n<tr>\n<td>24</td>\n<td>~2026-04-05</td>\n<td>v55-eagle3 v2</td>\n<td>1</td>\n<td>−38</td>\n<td>EAGLE3 speculative decoding (VRAM crash)</td>\n</tr>\n<tr>\n<td>25</td>\n<td>~2026-04-07</td>\n<td>v33-fixed resub #2</td>\n<td>34</td>\n<td>−5</td>\n<td>Same code as row 14; third run</td>\n</tr>\n<tr>\n<td>26</td>\n<td>~2026-04-08</td>\n<td>v56-k10-longest</td>\n<td>36</td>\n<td>−3</td>\n<td>K=10 + longest tiebreak</td>\n</tr>\n<tr>\n<td>27</td>\n<td>~2026-04-10</td>\n<td>v57-k12-longest</td>\n<td>32</td>\n<td>−7</td>\n<td>K=12 + longest (over-sampling)</td>\n</tr>\n<tr>\n<td>28</td>\n<td>~2026-04-11</td>\n<td>v58-dsq-lora v3</td>\n<td>23</td>\n<td>−16</td>\n<td>LoRA adapter (BNB4/MXFP4 mismatch)</td>\n</tr>\n<tr>\n<td>—</td>\n<td><strong>2026-04-15</strong></td>\n<td><strong>v33-fixed (final)</strong></td>\n<td><strong>34</strong></td>\n<td>—</td>\n<td><strong>Selected as final submission</strong></td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Appendix C: Reproducibility Checklist</h2>\n<h3>C.1 Environment</h3>\n<ul>\n<li><strong>Kaggle GPU:</strong> 1x H100 80GB SXM, 5h runtime</li>\n<li><strong>Python:</strong> 3.12 (Kaggle default)</li>\n<li><strong>vLLM:</strong> 0.18.1 (installed from Kaggle dataset wheels)</li>\n<li><strong>Model:</strong> danielhanchen/gpt-oss-120b (Kaggle model dataset)</li>\n<li><strong>Library:</strong> openai-harmony (for Harmony encoding)</li>\n</ul>\n<h3>C.2 Exact vLLM Arguments</h3>\n<pre><code>python -m vllm.entrypoints.openai.api_server \\\n    --seed 42 \\\n    --model /kaggle/tmp/setup/model \\\n    --served-model-name gpt-oss \\\n    --tensor-parallel-size 1 \\\n    --max-num-seqs 256 \\\n    --gpu-memory-utilization 0.96 \\\n    --host 0.0.0.0 \\\n    --port 8000 \\\n    --dtype auto \\\n    --kv-cache-dtype fp8_e4m3 \\\n    --max-model-len 65536 \\\n    --stream-interval 200 \\\n    --max-cudagraph-capture-size 64 \\\n    --async-scheduling \\\n    --disable-log-stats \\\n    --enable-prefix-caching\n</code></pre>\n<h3>C.3 Kaggle Dataset Sources</h3>\n<table>\n<thead>\n<tr>\n<th>Type</th>\n<th>Source ID</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>competition</td>\n<td>118448</td>\n<td>aimo-3 competition data</td>\n</tr>\n<tr>\n<td>modelInstanceVersion</td>\n<td>510391 (model 422384, instance 404485)</td>\n<td>danielhanchen/gpt-oss-120b</td>\n</tr>\n<tr>\n<td>kernelVersion</td>\n<td>289055161</td>\n<td>aimo-3-utils (vLLM 0.18.1 wheels + tiktoken encodings)</td>\n</tr>\n</tbody>\n</table>\n<h3>C.4 Seeds</h3>\n<ul>\n<li>Global seed: 42</li>\n<li>Per-attempt seed: <code>pow(seed + attempt_index, 2) % (2**31)</code></li>\n<li>Note: MXFP4 routing is non-deterministic regardless of seed</li>\n</ul>\n<h3>C.5 Critical Code Paths</h3>\n<table>\n<thead>\n<tr>\n<th>Function</th>\n<th>Cell</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>CFG</code> (class)</td>\n<td>9</td>\n<td>All hyperparameters and prompts</td>\n</tr>\n<tr>\n<td><code>AIMO3Template.apply_chat_template()</code></td>\n<td>11</td>\n<td>Harmony message encoding</td>\n</tr>\n<tr>\n<td><code>AIMO3Sandbox</code></td>\n<td>12</td>\n<td>Jupyter kernel pool management</td>\n</tr>\n<tr>\n<td><code>AIMO3Tool</code></td>\n<td>13</td>\n<td>TIR code execution loop</td>\n</tr>\n<tr>\n<td><code>AIMO3Solver.__init__()</code></td>\n<td>14</td>\n<td>vLLM server startup + model preload</td>\n</tr>\n<tr>\n<td><code>AIMO3Solver._start_server()</code></td>\n<td>14</td>\n<td>vLLM subprocess with exact CLI args</td>\n</tr>\n<tr>\n<td><code>predict()</code></td>\n<td>17</td>\n<td>Main entry: K=8 attempts + majority vote</td>\n</tr>\n<tr>\n<td>Pre-flight check</td>\n<td>16</td>\n<td>Developer message rendering verification</td>\n</tr>\n</tbody>\n</table>\n<p>All code in single notebook: <code>aimo3-v33-fixed.ipynb</code> (19 cells).</p>\n<hr>\n<h2>Appendix D: Off-by-One Error Analysis</h2>\n<table>\n<thead>\n<tr>\n<th>Problem</th>\n<th>Gold</th>\n<th>Majority</th>\n<th>Gold − Majority</th>\n<th>Error type</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>olymp-01629</td>\n<td>4950</td>\n<td>4949</td>\n<td>+1</td>\n<td>Boundary inclusive/exclusive</td>\n</tr>\n<tr>\n<td>oda-00425</td>\n<td>3</td>\n<td>4</td>\n<td>−1</td>\n<td>Count boundary</td>\n</tr>\n<tr>\n<td>dapo-15481</td>\n<td>2</td>\n<td>0</td>\n<td>+2</td>\n<td>Base case</td>\n</tr>\n<tr>\n<td>oda-01612</td>\n<td>4</td>\n<td>2</td>\n<td>+2</td>\n<td>Multiplicity</td>\n</tr>\n<tr>\n<td>olymp-02392</td>\n<td>49</td>\n<td>51</td>\n<td>−2</td>\n<td>Range boundary</td>\n</tr>\n<tr>\n<td>dapo-10920</td>\n<td>4022</td>\n<td>4024</td>\n<td>−2</td>\n<td>Coefficient error</td>\n</tr>\n<tr>\n<td>oda-01183</td>\n<td>12</td>\n<td>6</td>\n<td>+6 (×2)</td>\n<td>Factor omission</td>\n</tr>\n</tbody>\n</table>\n<p>7/16 (44%) of hard-problem errors are within ±2 of the correct answer.</p>\n<hr>\n<h2>Appendix E: LoRA Training Logs</h2>\n<h3>E.1 v1 Training (Harmony format, easy data)</h3>\n<ul>\n<li>Steps: 124, Loss: 1.02 → 0.64</li>\n<li>Data: 987 examples, Harmony format, AMC/AIME level</li>\n<li>Config: r=16, alpha=32, seq_len=2048, lr=1e-4, 1 epoch</li>\n<li>Duration: ~2h on 1x H100 80GB</li>\n<li>Result: 5/5 easy (= base), 0/12 hard (= base). No improvement.</li>\n<li>Root cause: training examples too short (≤16K chars), output collapsed to ~14 chars</li>\n</ul>\n<h3>E.2 v2 Training (DeepSeek format, hard data)</h3>\n<ul>\n<li>Steps: 250, Loss: 0.87 → 0.52</li>\n<li>Data: 2000 examples, <code>&lt;think&gt;</code> CoT format (DeepSeek-R1 style)</li>\n<li>Config: r=16, alpha=32, seq_len=2048, lr=1e-4, 1 epoch</li>\n<li>Duration: ~3.8h on 1x H100 80GB</li>\n<li>Result: 1/12 correct (= base). 5/12 NoneType extraction errors.</li>\n<li>Root cause: <strong>Format mismatch.</strong> Model learned <code>&lt;think&gt;</code> format, but inference uses Harmony. Outputs malformed at inference time.</li>\n</ul>\n<h3>E.3 v3 Training (Nemotron traces, Harmony converted)</h3>\n<ul>\n<li>Steps: ~625, Loss: 0.91 → 0.55</li>\n<li>Data: 5000 examples from nvidia/Nemotron-Math-v2 (GPT-OSS native traces), converted to Harmony</li>\n<li>Config: r=16, alpha=32, seq_len=4096, lr=5e-5, 1 epoch</li>\n<li>Duration: ~10h on 1x H100 80GB</li>\n<li>Result: <strong>BNB4/MXFP4 mismatch.</strong> Training uses BNB-4bit quantization; inference uses native MXFP4. The adapter learned on a different numerical representation. At inference: code_execs=0, turns=1 (model lost TIR capability entirely).</li>\n<li>Root cause: Fundamental incompatibility between training-time and inference-time quantization schemes. No known solution short of full model merge (which also fails due to Marlin kernel format).</li>\n</ul>\n<hr>\n<h2>Appendix F: Experiments Not Run</h2>\n<table>\n<thead>\n<tr>\n<th>Experiment</th>\n<th>Why It Matters</th>\n<th>Why Not Run</th>\n<th>Estimated Impact</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Multi-run per problem (12+)</td>\n<td>Per-problem variance</td>\n<td>Max 3 runs available</td>\n<td>Diagnostic</td>\n</tr>\n<tr>\n<td>Reasoning channel analysis</td>\n<td>Hidden confidence signals</td>\n<td>Pipeline not instrumented</td>\n<td>Unknown</td>\n</tr>\n<tr>\n<td>PRM scoring (7B)</td>\n<td>Step-level selection</td>\n<td>VRAM blocked</td>\n<td>+2-4 (literature)</td>\n</tr>\n<tr>\n<td>CodeBERT clustering</td>\n<td>Approach diversity metric</td>\n<td>Not prioritized</td>\n<td>Unknown</td>\n</tr>\n<tr>\n<td>Adaptive K (K=16-32 on hard)</td>\n<td>Budget 89% slack</td>\n<td>Not tested in time</td>\n<td>+1-2</td>\n</tr>\n<tr>\n<td>LoRA on boundary errors</td>\n<td>44% of errors = off-by-one</td>\n<td>Data not curated</td>\n<td>+1-3</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Appendix G: Cost and Timeline</h2>\n<table>\n<thead>\n<tr>\n<th>Resource</th>\n<th>Cost</th>\n<th>Time</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Kaggle submissions</td>\n<td>Free</td>\n<td>28 submissions × 5h = 140h compute</td>\n</tr>\n<tr>\n<td>RunPod (LoRA training)</td>\n<td>~$20</td>\n<td>3 training runs × 2-10h</td>\n</tr>\n<tr>\n<td>Claude API (multi-agent)</td>\n<td>~$200</td>\n<td>25+ sessions</td>\n</tr>\n<tr>\n<td>Total calendar time</td>\n<td>—</td>\n<td>40 days (2026-03-06 to 2026-04-15)</td>\n</tr>\n<tr>\n<td>Estimated human hours</td>\n<td>—</td>\n<td>~150h</td>\n</tr>\n</tbody>\n</table>\n<hr>\n<h2>Appendix H: Dead Ends Catalog (Full Details)</h2>\n<h3>H.1 Prompt Engineering (v22, v27)</h3>\n<ul>\n<li>Elaborate 3-prompt diversity: <strong>−3 points</strong> (v22=33 vs baseline 36)</li>\n<li>Minimal entropy-tuned prompts: <strong>−3 points</strong> (v27=34 vs v24=37)</li>\n<li><strong>Lesson:</strong> Prompts are frozen for reasoning-native models. Any change disrupts internal optimization.</li>\n</ul>\n<h3>H.2 Sampling Parameters (v23, v28)</h3>\n<ul>\n<li>Multi-temperature [0.5, 0.7, 1.0, 1.3]: neutral (v23=36=baseline)</li>\n<li>SC@16 vs SC@8: identical (v28=37=v24)</li>\n<li><strong>Lesson:</strong> Diminishing returns beyond K=8 with this model.</li>\n</ul>\n<h3>H.3 GenSelect — LLM-as-Judge (v29)</h3>\n<ul>\n<li>Theory: +2-4 points (based on NemoSkills literature)</li>\n<li>Reality: <strong>−3 points</strong> (v29=34)</li>\n<li>Root cause: GPT-OSS in Harmony format cannot judge solutions via <code>chat.completions.create()</code></li>\n<li><strong>Lesson:</strong> NemoSkills results (Qwen-based) don't transfer to GPT-OSS architecture.</li>\n</ul>\n<h3>H.4 Adaptive Complexity Routing (v29)</h3>\n<ul>\n<li>A0==A1 difficulty classification with multi-track compute allocation</li>\n<li>Combined with GenSelect: <strong>−3 total</strong></li>\n<li><strong>Lesson:</strong> Complexity introduces regression risk exceeding theoretical gain.</li>\n</ul>\n<h3>H.5 All Post-Processing Methods (S22)</h3>\n<ul>\n<li>Code trajectory analysis, code features, early answer filter, number-theoretic properties, Z3 constraints, ECP evidence mining, LR scoring, digit-wise voting, Bayesian selection, CARE SVD</li>\n<li><strong>Result:</strong> All reduce to majority on hard problems (30:1 wrong-to-correct ratio is mathematically insurmountable)</li>\n</ul>\n<h3>H.6 ThinkPRM-1.5B (S22)</h3>\n<ul>\n<li>1.5B generative PRM, fits alongside 120B (~3GB)</li>\n<li><strong>Result:</strong> Inverse scoring on hard problems (wrong=1.0, correct=0.7)</li>\n<li>CPU inference: 200-900s per solution (impractical)</li>\n</ul>\n<h3>H.7 20B Dual-Model Diversity (v46)</h3>\n<ul>\n<li>Hypothesis: 20B model generates different wrong answers, enabling ensemble</li>\n<li>Reality: Same wrong answers as 120B (529, 4949, 0 on test problems)</li>\n<li>Score: 4/12 vs 120B 5/12 (regression)</li>\n</ul>\n<h3>H.8 Prescriptive Prompts Without TIR (v52)</h3>\n<ul>\n<li>\"Solve two ways,\" \"devil's advocate,\" \"approach from number theory\"</li>\n<li>0/8 gave gold, 0/8 gave new answers</li>\n<li><strong>Lesson:</strong> The model either knows or doesn't. No prompt unlocks hidden capability.</li>\n</ul>\n<h3>H.9 Strategy Diversification (v22, community)</h3>\n<ul>\n<li>Community analysis recommended this approach; our data contradicts it</li>\n<li>v22=−3, v39=−3: every diversity attempt produced a regression</li>\n</ul>",
      "rawMarkdown": "# Solo Agent-Team Approach to AIMO3: Harmony Format Discovery, Negative Results, and Variance Analysis\n**Submission details:**\n- **Leaderboard:** Public LB + Private LB (both final)\n- **Final submission:** [aimo3-v33-fixed Version 2](https://www.kaggle.com/code/kolenkovskin/aimo3-v33-fixed?scriptVersionId=306011227)\n- **Colab notebook (Kaggle-agnostic):** [aimo3-v33-colab](https://colab.research.google.com/drive/1-AHappCM4UvLu3Ud43tYj3opyggyUTge?usp=sharing)\n- **Public LB (best):** 39/50 | **Rank:** 1518 / 4,138 teams\n- **Private LB (final):** 39/50 (matches public score — final submission `aimo3-v33-fixed Version 2` scored 39 on both leaderboards)\n- **Variance:** Same code, same prompts, three runs: 39, 33, 34 on public LB\n- **Team:** Kolenkovskin (solo)\n- **Base model:** [danielhanchen/gpt-oss-120b](https://www.kaggle.com/models/danielhanchen/gpt-oss-120b) (no fine-tuning in final submission)\n- **Code:** Kaggle notebook linked above (single .ipynb, complete pipeline)\n\n---\n\n## Abstract\n\nWe describe a solo competitor's approach to AIMO3 (AI Mathematical Olympiad Progress Prize 3) using GPT-OSS-120B and a multi-agent AI team. Throughout this writeup, \"we\" refers to the author and the AI agent team used for development.\n\nOur best score of **39/50** (mean ~34, sigma ~3) came from a single discovery: a Harmony message-format error present in all 19 analyzed public notebooks. Adding the correct ChatGPT identity string and a developer message with code-format rules improved score by +2 points — the only statistically meaningful gain across 28 submissions. The same code (v33-fixed) scored 39, 33, and 34 across three runs, demonstrating the variance in this evaluation.\n\nWe document 20+ dead ends with empirical evidence, including the finding that all post-hoc selection methods collapse to majority voting on IMO-hard problems where the per-attempt success rate falls below 50%. We provide variance analysis (sigma ≥ 3), a failure taxonomy of GPT-OSS-120B, and three LoRA fine-tuning experiments on an MXFP4-quantized MoE model served with adapters via vLLM. All prompts, configurations, and negative results are included for reproducibility.\n\n---\n\n## 1. Introduction\n\nThe AI Mathematical Olympiad Progress Prize 3 (AIMO3) challenges participants to solve 50 IMO-level mathematical problems using a single H100 80GB GPU within a 5-hour runtime, with internet disabled and integer answers in [0, 99999]. Scoring uses double-run averaging: each problem is scored 0 or 1 per run, averaged across two independent runs.\n\nWe participated as a solo competitor using a multi-agent AI team: Claude Code (Opus) for implementation, Claude Desktop for strategic oversight, Deep Research for literature investigation, Grok for adversarial analysis, and Chrome Extension for community intelligence. This writeup covers 40 days of development across 25+ sessions.\n\nOur core model is GPT-OSS-120B, a Mixture-of-Experts model with 116.8B total parameters (5.1B active per token), quantized to MXFP4 (Microscaling FP4) during post-training. We use self-consistency sampling (K=8) with majority voting and Tool-Integrated Reasoning (TIR) via the Harmony message format.\n\n**Key contributions:**\n1. Discovery and fix of the Harmony format error present in all public notebooks (+2 points)\n2. Empirical negative-results catalog: 20+ dead ends with quantified regressions\n3. Variance analysis confirming sigma ≥ 3 on identical code (39 and 33 on same submission)\n4. First documented LoRA fine-tuning of an MXFP4-quantized MoE model served with adapters via vLLM\n5. Multi-agent AI team methodology for competition problem-solving\n\n---\n\n## 2. Model Understanding: GPT-OSS-120B\n\n### 2.1 Architecture\n\nGPT-OSS-120B is a Mixture-of-Experts transformer with extreme sparsity:\n- **Total parameters:** 116.8B (MoE) + routing layers\n- **Active parameters per token:** 5.1B (4.4% utilization)\n- **Experts:** 128 per layer, top-4 routing\n- **Quantization:** MXFP4 (e2m1 format, 1 mantissa bit, 8 representable values per sign)\n- **VRAM footprint:** ~60.8 GB at gpu_memory_utilization=0.96\n\nThe MXFP4 quantization is applied during post-training (not post-hoc), meaning the model was trained with this precision in mind. However, the BF16 router weights combined with MXFP4 expert weights create routing non-determinism: 1,000 identical requests at T=0 produce 80 unique completions.\n\n### 2.2 Harmony Message Format\n\nGPT-OSS uses a proprietary \"Harmony\" encoding with 6 message carriers:\n\n| # | Carrier | Purpose | Tunable? |\n|---|---------|---------|----------|\n| 1 | SystemContent | Model identity and personality | Frozen |\n| 2 | ReasoningEffort | Controls thinking depth (low/medium/high) | medium |\n| 3 | ToolNamespaceConfig | Tool definitions (Python interpreter) | Load-bearing |\n| 4 | DeveloperContent | Developer instructions | **+2 points** |\n| 5 | UserContent | Problem statement | Per-problem |\n| 6 | preference_prompt | Output format preferences | Frozen |\n\n**Critical discovery (v33, +2 points):** The model expects SystemContent to contain the ChatGPT identity string (\"You are ChatGPT, a large language model trained by OpenAI...\"). All 19 analyzed public notebooks either omit this or replace it with a custom identity. Additionally, the DeveloperContent carrier (exposed by the openai-harmony library as `.with_instructions()`) accepts code-format rules that tripled the model's Python tool efficiency from 42 to 13 calls per problem, as measured in S12 A/B tests.\n\n**Catastrophic failure mode (v32, score=0):** Using `.with_text()` instead of `.with_instructions()` raises `AttributeError`, caught by a silent try/except, causing all 400 inference attempts to return None.\n\n### 2.3 Output Channels\n\nGPT-OSS produces output in 3 channels: `analysis` (hidden reasoning), `commentary`, and `final`. The host pipeline reads only `final` for answer extraction and routes `recipient=python` blocks to Jupyter kernels. Analysis content is appended to conversation history but never inspected by host code. All 19 analyzed competitor notebooks follow this same pattern.\n\n### 2.4 Failure Taxonomy on IMO-Level Problems\n\n| Type | Frequency | Behavior | Fixable? |\n|------|-----------|----------|----------|\n| E1: Misunderstanding | ~54% of errors | Wrong mathematical formalization | LoRA (possibly) |\n| E2: Arithmetic error | ~15% | Correct approach, wrong calculation | No (random) |\n| E3: Thread loss | ~15% | Starts correctly, diverges mid-solution | Possibly |\n| E4: Wrong approach | ~10% | Incorrect strategy from start | LoRA (possibly) |\n| E5: Cannot begin | ~6% | Problem too novel for model | No (ceiling) |\n\nSource: Prism Math taxonomy (4601 examples) applied to our 12-problem hard set.\n\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F23009828%2F8e917ff52333212a15b90b789c1e5e3a%2Ffig3_error_taxonomy.png?generation=1776779735307120&alt=media)\n\n---\n\n## 3. Inference Pipeline (Kaggle Submission)\n\n### 3.1 Architecture\n\n```\n[Problem text] → Harmony encoding → vLLM (GPT-OSS-120B) → TIR loop\n                                                              ↓\n                                          Jupyter kernel ← code blocks\n                                                              ↓\n                                          \\boxed{answer} extraction\n                                                              ↓\n                                          K=8 attempts → majority vote\n```\n\n### 3.2 vLLM Configuration\n\n| Parameter | Value | Rationale |\n|-----------|-------|-----------|\n| gpu_memory_utilization | 0.96 | Maximum without OOM |\n| max_model_len | 65536 | Full context for long solutions |\n| max_num_seqs | 256 | Default; reduction to 8 tested and found neutral |\n| dtype | auto (MXFP4) | Native model precision |\n| kv_cache_dtype | fp8_e4m3fn | Saves VRAM on H100 |\n| enforce_eager | True | Avoids CUDA graph issues |\n| port | 8000 | Local subprocess |\n\n### 3.3 TIR Execution\n\n- 16 parallel Jupyter kernels via `jupyter_client`\n- Per-kernel timeout: 60 seconds\n- Code output truncation: first 300 + last 300 characters\n- Bug spiral detection: abort after 3 consecutive errors (saves ~15% compute on hard problems)\n- Maximum code executions: not capped (model self-limits at ~6-8)\n\n### 3.4 Sampling and Selection\n\n- **K=8** attempts per problem (K=16 tested, no improvement: v28 = 37 = v24)\n- **Temperature:** 1.0 (T=0.8 tested in v37, neutral)\n- **Reasoning effort:** medium\n- **Selection:** majority vote with longest-trace tiebreak\n- **Answer extraction:** regex `\\boxed{(\\d+)}` on final channel output\n- **Extraction accuracy:** 100% (verified on 100 test cases)\n\n### 3.5 Time Management\n\n- Total budget: 5 hours (18000 seconds)\n- Per-problem allocation: `remaining_time / remaining_problems`\n- Startup (vLLM load): ~180 seconds\n- Average per-problem: ~4-5 minutes (89% budget slack confirmed v25: 30min/290min)\n- search_tokens=1024 for early `\\boxed{}` detection\n\n### 3.6 Invariants (Breaking Any = Failed Submission)\n\n1. Dummy `submission.parquet` written before ANY imports (crash protection)\n2. Version stamp printed as first output line\n3. `KAGGLE_IS_COMPETITION_RERUN` detection for force-serve mode\n4. try/except in final cell with parquet fallback\n5. `ensure_ascii=True` on all `json.dump` calls (cp1252 encoding protection)\n6. Dual-path model/wheels resolution for interactive vs rerun environments\n\n---\n\n## 4. Selection Methods: Negative Results\n\nThe gap between pass@8 (probability that at least one of 8 attempts is correct) and majority@8 (majority vote accuracy) is large: approximately 80% vs. 40% on our 5-problem measured subset. This coverage-versus-pass-rate (CCPR) gap motivated extensive investigation into selection methods. Every method tested failed to close it.\n\n### 4.1 Methods Tested\n\n| Method | Result | Evidence |\n|--------|--------|----------|\n| Majority voting (baseline) | 37/50 | v24, v25, v28 |\n| IEW entropy weighting | = majority | AUC=0.595 (near-random) |\n| GenSelect (LLM-as-judge) | -3 points | v29=34; Harmony format incompatible |\n| Adaptive routing (difficulty-gated) | -3 points | v29=34; complexity = regression |\n| Self-verification (verify-noDev) | -3 to -5 | FPR=75% (self-confirmation bias) |\n| Code trajectory analysis | = majority | Signal vanishes on hard problems |\n| Z3 constraint verification | 0/16 distinguish | Regex constraints too weak |\n| ECP evidence mining | -4 points | FPR=37% |\n| ThinkPRM-1.5B (process reward model) | Inverse scoring | Wrong=1.0, correct=0.7 on hard |\n| Longest-trace tiebreak | +1 (tiebreak only) | v44+v45: 6/12 vs majority 5/12 |\n| DeepConf (13 methods, K=32) | = majority | 0/12 at K=32, all methods |\n| Minority selection | 3/3 on hard | But 0/3 on easy — not usable |\n\n### 4.2 Why Selection Fails on Hard Problems\n\nChen et al. (NeurIPS 2024) prove that when p(correct) < p(wrong) per attempt, increasing K makes majority voting worse, not better. On our hard problems, the model produces the same wrong answer 6–7 out of 8 times. No post-hoc method can recover correctness from a distribution where the correct answer is in the minority.\n\n**Generation quality, not selection quality, is the bottleneck.** This overrides our S14–S20 conclusion that \"selection = THE bottleneck.\" On easy problems (pass@1 > 50%), majority voting works. On hard problems (pass@1 < 20%), the model produces the same wrong answer 6–7 out of 8 times — no post-hoc method recovers from that.\n\n### 4.3 External Confirmation\n\n- wenliangtlh independently confirms the CCPR gap: pass@128 = 0.867 vs. maj@128 = 0.453\n- Top-20 Kaggle teams all use majority voting; no confidence-based selection method appears in the top 20 (per community survey)\n- Nitarach (arXiv:2603.27844) analysis confirms that approximately 3 borderline problems at p ≈ 0.50 drive all observed leaderboard variance\n\n---\n\n## 5. LoRA Fine-tuning Experiments\n\n### 5.1 Motivation\n\nAll AIMO1/2 winners used fine-tuning (NuminaMath, NemoSkills). NemoSkills gained ~4 points over vanilla baselines through fine-tuning [3]. Public notebook ceiling is 44/50; leaderboard leader achieved 46/50 with 113 submissions.\n\n### 5.2 Technical Challenge: MXFP4 + LoRA\n\nNo published results exist for LoRA fine-tuning of MXFP4-quantized MoE models. Key challenges:\n- Training uses BNB-4bit quantization; inference uses native MXFP4 (different schemes)\n- All model-merge paths fail (safetensors format mismatch, Marlin kernel incompatibility)\n- **Solution:** vLLM 0.18.1 `--enable-lora` serves adapter directly on MXFP4 base (no merge needed)\n\n### 5.3 Experiments\n\n| Run | Data | Format | Examples | seq_len | Loss | Result |\n|-----|------|--------|----------|---------|------|--------|\n| v1 | Harmony-filtered (easy) | Harmony | 987 | 2048 | 0.64 | 5/5 easy, 0/12 hard (= base) |\n| v2 | OMR hard (DeepSeek format) | CoT (`<think>`) | 2000 | 2048 | 0.52 | 1/12; 5/12 extraction errors |\n| v3 | Nemotron-Math-v2 (GPT-OSS traces) | Harmony (converted) | 5000 | 4096 | 0.55 | BNB4/MXFP4 mismatch: code_execs=0 |\n\n**Key finding:** Format matters more than data quality. v2 trained on hard problems in wrong format (CoT) scored worse than v1 trained on easy problems in correct format (Harmony). v3 had correct format but the BNB4→MXFP4 quantization gap caused the model to lose TIR capability entirely (zero code executions).\n\n### 5.4 Training Configuration (v1, best result)\n\n- **Framework:** Unsloth + PEFT\n- **Quantization:** BNB-4bit (NF4, double quantization)\n- **LoRA:** r=16, alpha=32, target_modules=[q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj]\n- **Optimizer:** adamw_8bit, lr=1e-4, cosine schedule, warmup_ratio=0.03\n- **Batch:** per_device=2, gradient_accumulation=4\n- **Hardware:** 1x H100 80GB SXM (RunPod), ~2h training\n- **Adapter size:** 73 MB\n\n### 5.5 Data Sources\n\n| Dataset | Size | Format | Used |\n|---------|------|--------|------|\n| nvidia/OpenMathReasoning TIR | 1.7M | TIR traces | Filtered to 5000 |\n| nvidia/Nemotron-Math-v2 | 3.5M | GPT-OSS native | Converted 5000 |\n| Jackrong/Harmony-dataset | 8471 | Harmony format | Not used (discovered late) |\n| 21 HF AIMO3 finetunes | varies | Unknown | All have empty model cards |\n\n---\n\n## 6. Variance Analysis\n\n### 6.1 Empirical Evidence\n\nOur v33 submission scored **39**, **33**, and **34** on identical code across three separate runs (submitted March 24, March 28, and April 7). This 6-point spread (39 vs 33) from the same codebase is the strongest direct evidence of high variance. The mean of our three runs (35.3) is consistent with sigma ~3.\n\n### 6.2 External Analysis\n\nNitarach (arXiv 2603.27844) ran 13 identical submissions of the same pipeline and found:\n- Range: 37–44 (7-point spread)\n- Mean: 39.7\n- Estimated sigma: ~1.7\n\nHowever, our observation (39 vs 33, delta=6) suggests true sigma may be higher (~3), possibly due to:\n- MXFP4 routing non-determinism (80 unique completions at T=0)\n- Kaggle H100 hardware variation between runs\n- ~3 borderline problems at p≈0.50 creating bimodal outcomes\n\n### 6.3 Implications for Evaluation\n\n| Delta | Interpretation |\n|-------|---------------|\n| < 3 | Noise; do not react |\n| 3-4 | Possibly real; needs 3+ confirmations |\n| > 4 | Likely real improvement |\n\nThis means our 18-submission history contains **one** statistically meaningful finding: v33 (Harmony fix) = +2 over v28 baseline of 37, confirmed by the mechanism (format change has clear causal path). All other deltas are within noise.\n\n### 6.4 Leaderboard Implications\n\nThe leaderboard leader scored 46/50 from 113 entries. Using winner's curse correction (ML estimate), their true mean is likely ~41.8. The public ceiling of 44/50 from unmodified notebooks is also inflated. True ceiling for vanilla GPT-OSS-120B is approximately 36-38/50.\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F23009828%2F3f5372dcd902b5038e1b923620324412%2Ffig4_variance.png?generation=1776780061273863&alt=media)\n\n\n---\n\n## 7. Competitor Analysis\n\n### 7.1 Public Notebook Forensics\n\nWe analyzed 19 public notebooks scoring 36-44 on the leaderboard. Key findings:\n\n| Feature | Our v33 | Typical competitor | Best competitor |\n|---------|---------|-------------------|-----------------|\n| Identity | ChatGPT (correct) | Custom/omitted | Custom/omitted |\n| DeveloperContent | Code-format rules | None | None |\n| K (attempts) | 8 | 8 | 8-16 |\n| Temperature | 1.0 | 0.6-1.0 | 0.6 |\n| gpu_memory_util | 0.96 | 0.90 | 0.90 |\n| max_num_seqs | 256 | 6-8 | 64 |\n| Selection | majority + longest | majority | majority |\n| min_p | 0.02 | 0.02-0.05 | 0.05 |\n\n### 7.2 Comparison with SOTA\n\n| Method | Score | Notes |\n|--------|-------|-------|\n| Public baseline (kurianbenoy fork) | 36 | Unmodified |\n| Best public notebook (ans-verifys) | 44 | Lucky run; likely mean ~38-40 |\n| Leaderboard leader (ippeiogawa) | 46 | 113 entries; true mean ~41.8 |\n| **Our v33 (final submission)** | **39 public / 39 private** | **3-run variance (public): 39, 33, 34 — mean 35.3** |\n| AIMO2 winner (NemoSkills, 14B fine-tuned) | 34/50 | AIMO2, not directly comparable (4x L4 hardware) |\n| DeepSeek-R1 (671B, if available) | N/A | Not applicable (too large) |\n\n---\n\n## 8. Multi-Agent Workflow\n\n### 8.1 Agent Roles\n\n| Agent | Model | Role |\n|-------|-------|------|\n| KK (Claude Code) | Claude Opus | Implementation, code audit, testing, memory |\n| KD (Claude Desktop) | Claude Opus | Strategy, Deep Research, coordination |\n| DR (Deep Research) | Claude Opus | Literature investigation (86 reports) |\n| GK (Grok) | grok-4.20 | Adversarial analysis, RunPod SSH |\n| KH (Chrome Extension) | Claude Sonnet | Community intelligence, leaderboard |\n\n### 8.2 Communication Infrastructure\n\n- **Shared filesystem:** `theory/` (86 .md files), `prompts/` (45 files), `logs/kk-sessions/`\n- **Memory mirror:** `.claude-memory-mirror/` (5 files: rules, dead ends, key files, bugs, verified)\n- **Journal:** `journal_aimo3.txt` (prepend-only, reverse chronological)\n- **Execution contract:** `CLAUDE.md` with mandatory reads and theory-check protocol\n\n### 8.3 Effective Practices\n\n1. **Bug detection:** Pre-submission code review caught 5 critical bugs in v29 before the Kaggle run\n2. **Competitor forensics:** One afternoon analyzing 19 notebooks produced more actionable insight than 86 research investigations\n3. **Test framework:** 69 local tests running in 0.06 s prevented regression without GPU access\n4. **Theory audit:** Classifying all 86 research files, archiving 51, and preserving 35 kept working context focused\n\n### 8.4 Failure Modes\n\n1. **Research without measurement:** 0 of 86 deep-research investigations led to a positive code change\n2. **False premise cascade:** One unverified assumption (\"our gap = 7 points\") propagated through 30+ research files over 20 days\n3. **Agent convergence is not evidence:** All three agents agreed that extraction was the bottleneck; the first direct measurement disproved it in under a minute\n\n---\n\n## 9. Dead Ends Summary\n\nWe tested 20+ approaches beyond the baseline. None improved the score. The full catalog is in Appendix H; here we summarize the key categories:\n\n| Category | Methods Tested | Best Result | Lesson |\n|----------|---------------|-------------|--------|\n| Prompt engineering | 3-prompt diversity, minimal prompts | −3 each | Prompts are frozen for reasoning-native models |\n| Sampling | Multi-temp, SC@16 | 0, 0 | Diminishing returns beyond K=8 |\n| Selection (LLM-as-judge) | GenSelect via chat API | −3 | Harmony format incompatible with judging |\n| Selection (statistical) | IEW, DeepConf (13 methods), LR scoring, Bayesian, CARE | = majority | All collapse to majority on hard problems |\n| Selection (code analysis) | Trajectory, Z3, ECP mining | 0 to −4 | Signal vanishes on hard |\n| Verification | Self-verify, ThinkPRM-1.5B | −3 to −5, inverse | Self-confirmation bias; PRM inverts on hard |\n| Model diversity | 20B dual-model | −1 | Same wrong answers as 120B |\n| Prompt diversification | Prescriptive, \"solve two ways\" | 0 | Model either knows or doesn't |\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F23009828%2F4ab94f0ffd6b704aebe83024e63b2773%2Ffig2_ablation.png?generation=1776779929510625&alt=media)\n\n---\n\n## 10. Lessons Learned\n\n**Read competitor code on day 1.** We didn't. That cost 20 days. One afternoon of notebook forensics produced the only +2 gain across 28 submissions. 86 deep-research reports produced zero code changes.\n\n**Measure before theorizing.** Three independent agents converged on \"extraction is the bottleneck.\" First measurement: extraction accuracy = 100%. One number killed an entire research track.\n\n**Subtraction beats addition.** Every feature we added scored zero or negative. The only improvement came from fixing a bug (Harmony format) and removing harmful features (IEW, GenSelect). Simple majority vote at 37/50 beat our most elaborate pipeline at 34/50.\n\n**Ten submissions went to noise.** With sigma ≥ 3, the gap between 33 and 39 is one standard deviation. We needed: delta > 4 plus a mechanistic explanation before reacting. We didn't have that rule until submission 17.\n\n**Off-by-one is systematic, not random.** 44% of wrong answers differ from gold by ±1 or ±2 — the same boundary confusion (inclusive vs. exclusive ranges, base cases) across different problems. This is a training data artifact, not a pipeline issue.\n\n---\n\n## 11. Discussion\n\n### 11.1 What We Would Do Differently\n\nThe optimal strategy for a solo competitor, in hindsight, would be:\n1. Day 1: Fork best public notebook, submit unmodified (baseline)\n2. Day 2: Analyze all public notebooks, find the key diffs\n3. Day 3-5: Fix Harmony format, confirm +2\n4. Day 6-15: LoRA fine-tuning with Jackrong/Harmony-dataset (correct format, hard problems)\n5. Remaining days: Submit LoRA variants, collect variance data\n\nWe instead spent 20 days on prompt engineering and selection methods before reading competitor code.\n\n### 11.2 Open Questions\n\n1. Does the analysis channel contain usable confidence signals?\n2. Can targeted LoRA on off-by-one examples fix boundary confusion?\n3. What is the true per-problem variance (p_i) for each of the 50 problems?\n4. Would EAGLE3 speculative decoding (40% throughput gain) enable K=12-16 within budget?\n\n### 11.3 Reproducibility Note\n\nAll code is contained in a single Jupyter notebook. All prompts are frozen and documented in Appendix A. The only external dependency beyond standard Kaggle environment is the GPT-OSS-120B model and vLLM wheels, both available as Kaggle datasets.\n\nFor Kaggle-agnostic reproducibility, a Google Colab version of the full pipeline is provided: [aimo3-v33-colab](https://colab.research.google.com/drive/1-AHappCM4UvLu3Ud43tYj3opyggyUTge?usp=sharing). It installs the `openai-harmony` library and `vLLM` from public PyPI, downloads the `gpt-oss-120b` weights from Hugging Face, and exposes the same inference harness used in the Kaggle submission (with the `kaggle_evaluation` gateway import guarded by `try/except ImportError` so the notebook runs in any environment with a single H100-class GPU).\n\n---\n\n## References\n\n[1] Nitarach. \"Variance Analysis of AIMO3 Submissions.\" arXiv:2603.27844, 2026.\n[2] Chen et al. \"When Majority Voting Fails.\" NeurIPS, 2024.\n[3] NVIDIA NemoSkills team. \"NemoSkills: AIMO2 Winning Solution.\" arXiv:2504.16891, 2025.\n[4] Prism Math. \"Error Taxonomy for Mathematical Reasoning.\" 4,601 examples, 2025.\n[5] Ai. \"On Correlated Voting.\" Corollary 2 (Dawid-Skene limitation), 2025.\n\n---\n\n## Appendix A: Prompts (Verbatim)\n\nAll prompts are copied exactly from `aimo3-v33-fixed.ipynb` (CFG class). These produced 39/50. **Any modification causes regression** (confirmed v22, v27).\n\n### A.1 System Prompt (Frozen)\n\n```\nYou are a world-class International Mathematical Olympiad (IMO) competitor.\nThe final answer must be a non-negative integer between 0 and 99999.\nYou must place the final integer answer inside \\boxed{}.\n```\n\nInjected into DeveloperContent carrier (not SystemContent). SystemContent carries model identity (A.6).\n\n### A.2 Tool/Namespace Prompt (Frozen, Load-Bearing)\n\n```\nUse this tool to execute Python code.\nThe environment is a stateful Jupyter notebook.\nYou must use print() to output results.\n```\n\n**WARNING:** Removing this caused +9pp execution errors (v27).\n\n### A.3 Developer Message (The +2 Discovery)\n\n```python\n# PROBLEM-SOLVING PROTOCOL\n\ndef solve(problem: str) -> int:\n    problem_type = classify(problem)\n    answer_analytical = solve_analytically(problem, problem_type)\n    answer_numerical = verify_with_python(problem, answer_analytical)\n    if answer_analytical != answer_numerical:\n        answer_analytical = answer_numerical  # trust Python over reasoning\n    return answer_analytical\n\ndef solve_analytically(problem, problem_type):\n    method_1 = pick_method(problem_type)\n    result = attempt(method_1)\n    if result is None:\n        method_2 = pick_different_method(problem_type, exclude=method_1)\n        result = attempt(method_2)\n    return result\n\ndef verify_with_python(problem, claimed_answer):\n    # ALWAYS run. Use INDEPENDENT method from analytical.\n    # counting -> enumerate and count\n    # optimization -> scipy.optimize or brute force\n    # equations -> sympy.solve\n    # NEVER recompute same formula\n    return execute(write_verification_code(problem))\n\ndef on_python_error(code, error):\n    # NEVER debug. ALWAYS delete and rewrite from scratch.\n    return write_completely_new_code()\n\n# HARD RULES:\n# - Final answer inside \\\\boxed{}\n# - Answer: non-negative integer 0-99999\n# - Use math, numpy, sympy, scipy, itertools, collections\n# - If two methods disagree, run THIRD to break tie\n```\n\nInjected via `DeveloperContent.new().with_instructions()`. Tripled Python tool efficiency: 42 to 13 code calls per problem (S12 A/B test).\n\n### A.4 Preference Prompt (Frozen)\n\n```\nUse `math`, `numpy`,`sympy`,`itertools` and `collections` to solve the problem.\n```\n\n### A.5 User Prompt Template\n\nEach problem sent as single UserContent message with raw problem text. No framing, no few-shot, no CoT instructions.\n\n### A.6 Harmony System Identity (Critical)\n\n```python\nSystemContent.new()\n    .with_model_identity('You are ChatGPT, a large language model trained by OpenAI.')\n    .with_reasoning_effort(reasoning_effort=ReasoningEffort.HIGH)\n    .with_tools(tool_config)\n```\n\n**This is the +2 discovery.** All 19 competitor notebooks omit or replace this identity. The `openai-harmony` library does NOT auto-inject it.\n\n### A.7 Message Assembly\n\n```python\nmessages = [\n    Message.from_role_and_content(Role.SYSTEM, system_content),      # Identity + tools\n    Message.from_role_and_content(Role.DEVELOPER, developer_content), # Instructions\n    Message.from_role_and_content(Role.USER, problem_text)            # Problem\n]\n```\n\nThree messages total. No conversation history between problems.\n\n---\n\n## Appendix B: Complete Version History\n\n![](https://www.googleapis.com/download/storage/v1/b/kaggle-user-content/o/inbox%2F23009828%2Fe92268266332e5124bc6f2e1846937b9%2Ffig1_score_history.png?generation=1776780256053758&alt=media)\n\n| # | Date | Version | Score | Delta | Key Change |\n|---|------|---------|-------|-------|------------|\n| 1 | 2026-03-06 | DeepSeek-14B v6 | 0 | — | First submit (RERUN detection broken) |\n| 2 | 2026-03-07 | QwQ-32B v7 | 0 | 0 | Infrastructure works, model too weak |\n| 3 | 2026-03-11 | GPT-OSS v19 | 0 | 0 | 6 root-cause fixes, still broken |\n| 4 | 2026-03-12 | Fork v3 (baseline) | 36 | +36 | Unmodified kurianbenoy fork |\n| 5 | 2026-03-13 | v22 | 33 | −3 | 3-prompt diversity |\n| 6 | 2026-03-14 | v23 | 36 | +3 | Minimal prompt + multi-temp |\n| 7 | 2026-03-15 | v24 | 37 | +1 | batch=256, gpu=0.96, ctx=65536 |\n| 8 | 2026-03-16 | v25 | 37 | 0 | Variance confirmation |\n| 9 | 2026-03-18 | v28 | 37 | 0 | SC@16 (= SC@8) |\n| 10 | 2026-03-19 | v29 | 34 | −3 | GenSelect + adaptive |\n| 11 | 2026-03-20 | v30 | 36 | −1 | Subtraction (K=8, timeout=10) |\n| 12 | 2026-03-20 | v31 | 34 | −3 | Align with 42-scorer |\n| 13 | 2026-03-22 | v32 | 0 | −37 | BUG: `.with_text()` AttributeError — all 400 attempts returned None |\n| 14 | 2026-03-24 | **v33** | **39** | **+2** | **Harmony fix + developer message** |\n| 15 | 2026-03-24 | v34 | 34 | −5 | PROVE filter + seqs=8 |\n| 16 | 2026-03-26 | v37b | 31 | −8 | Experimental features |\n| 17 | 2026-03-28 | v33 resub #1 | 33 | −6 | Same code as row 14; confirms variance |\n| 18 | ~2026-03-31 | v35-verify-fresh | 34 | −5 | Self-verification (FPR=75%) |\n| 19 | ~2026-04-01 | v31-majority-clean | 0 | −39 | Bug: clean majority rewrite failed |\n| 20 | ~2026-04-02 | gptoss-fork-v1.2 | 34 | −5 | Fork variant |\n| 21 | ~2026-04-03 | v54-mining-longest v1 | 0 | −39 | Code mining extraction (broken) |\n| 22 | ~2026-04-04 | v54-mining-longest v2 | Error | — | Kaggle Error |\n| 23 | ~2026-04-04 | v54-code-mining+longest | 32 | −7 | Code mining + longest tiebreak |\n| 24 | ~2026-04-05 | v55-eagle3 v2 | 1 | −38 | EAGLE3 speculative decoding (VRAM crash) |\n| 25 | ~2026-04-07 | v33-fixed resub #2 | 34 | −5 | Same code as row 14; third run |\n| 26 | ~2026-04-08 | v56-k10-longest | 36 | −3 | K=10 + longest tiebreak |\n| 27 | ~2026-04-10 | v57-k12-longest | 32 | −7 | K=12 + longest (over-sampling) |\n| 28 | ~2026-04-11 | v58-dsq-lora v3 | 23 | −16 | LoRA adapter (BNB4/MXFP4 mismatch) |\n| — | **2026-04-15** | **v33-fixed (final)** | **34** | — | **Selected as final submission** |\n\n\n\n---\n\n## Appendix C: Reproducibility Checklist\n\n### C.1 Environment\n- **Kaggle GPU:** 1x H100 80GB SXM, 5h runtime\n- **Python:** 3.12 (Kaggle default)\n- **vLLM:** 0.18.1 (installed from Kaggle dataset wheels)\n- **Model:** danielhanchen/gpt-oss-120b (Kaggle model dataset)\n- **Library:** openai-harmony (for Harmony encoding)\n\n### C.2 Exact vLLM Arguments\n\n```bash\npython -m vllm.entrypoints.openai.api_server \\\n    --seed 42 \\\n    --model /kaggle/tmp/setup/model \\\n    --served-model-name gpt-oss \\\n    --tensor-parallel-size 1 \\\n    --max-num-seqs 256 \\\n    --gpu-memory-utilization 0.96 \\\n    --host 0.0.0.0 \\\n    --port 8000 \\\n    --dtype auto \\\n    --kv-cache-dtype fp8_e4m3 \\\n    --max-model-len 65536 \\\n    --stream-interval 200 \\\n    --max-cudagraph-capture-size 64 \\\n    --async-scheduling \\\n    --disable-log-stats \\\n    --enable-prefix-caching\n```\n\n### C.3 Kaggle Dataset Sources\n\n| Type | Source ID | Description |\n|------|-----------|-------------|\n| competition | 118448 | aimo-3 competition data |\n| modelInstanceVersion | 510391 (model 422384, instance 404485) | danielhanchen/gpt-oss-120b |\n| kernelVersion | 289055161 | aimo-3-utils (vLLM 0.18.1 wheels + tiktoken encodings) |\n\n### C.4 Seeds\n- Global seed: 42\n- Per-attempt seed: `pow(seed + attempt_index, 2) % (2**31)`\n- Note: MXFP4 routing is non-deterministic regardless of seed\n\n### C.5 Critical Code Paths\n\n| Function | Cell | Purpose |\n|----------|------|---------|\n| `CFG` (class) | 9 | All hyperparameters and prompts |\n| `AIMO3Template.apply_chat_template()` | 11 | Harmony message encoding |\n| `AIMO3Sandbox` | 12 | Jupyter kernel pool management |\n| `AIMO3Tool` | 13 | TIR code execution loop |\n| `AIMO3Solver.__init__()` | 14 | vLLM server startup + model preload |\n| `AIMO3Solver._start_server()` | 14 | vLLM subprocess with exact CLI args |\n| `predict()` | 17 | Main entry: K=8 attempts + majority vote |\n| Pre-flight check | 16 | Developer message rendering verification |\n\nAll code in single notebook: `aimo3-v33-fixed.ipynb` (19 cells).\n\n---\n\n## Appendix D: Off-by-One Error Analysis\n\n| Problem | Gold | Majority | Gold − Majority | Error type |\n|---------|------|----------|-----------------|------------|\n| olymp-01629 | 4950 | 4949 | +1 | Boundary inclusive/exclusive |\n| oda-00425 | 3 | 4 | −1 | Count boundary |\n| dapo-15481 | 2 | 0 | +2 | Base case |\n| oda-01612 | 4 | 2 | +2 | Multiplicity |\n| olymp-02392 | 49 | 51 | −2 | Range boundary |\n| dapo-10920 | 4022 | 4024 | −2 | Coefficient error |\n| oda-01183 | 12 | 6 | +6 (×2) | Factor omission |\n\n7/16 (44%) of hard-problem errors are within ±2 of the correct answer.\n\n---\n\n## Appendix E: LoRA Training Logs\n\n### E.1 v1 Training (Harmony format, easy data)\n\n- Steps: 124, Loss: 1.02 → 0.64\n- Data: 987 examples, Harmony format, AMC/AIME level\n- Config: r=16, alpha=32, seq_len=2048, lr=1e-4, 1 epoch\n- Duration: ~2h on 1x H100 80GB\n- Result: 5/5 easy (= base), 0/12 hard (= base). No improvement.\n- Root cause: training examples too short (≤16K chars), output collapsed to ~14 chars\n\n### E.2 v2 Training (DeepSeek format, hard data)\n\n- Steps: 250, Loss: 0.87 → 0.52\n- Data: 2000 examples, `<think>` CoT format (DeepSeek-R1 style)\n- Config: r=16, alpha=32, seq_len=2048, lr=1e-4, 1 epoch\n- Duration: ~3.8h on 1x H100 80GB\n- Result: 1/12 correct (= base). 5/12 NoneType extraction errors.\n- Root cause: **Format mismatch.** Model learned `<think>` format, but inference uses Harmony. Outputs malformed at inference time.\n\n### E.3 v3 Training (Nemotron traces, Harmony converted)\n\n- Steps: ~625, Loss: 0.91 → 0.55\n- Data: 5000 examples from nvidia/Nemotron-Math-v2 (GPT-OSS native traces), converted to Harmony\n- Config: r=16, alpha=32, seq_len=4096, lr=5e-5, 1 epoch\n- Duration: ~10h on 1x H100 80GB\n- Result: **BNB4/MXFP4 mismatch.** Training uses BNB-4bit quantization; inference uses native MXFP4. The adapter learned on a different numerical representation. At inference: code_execs=0, turns=1 (model lost TIR capability entirely).\n- Root cause: Fundamental incompatibility between training-time and inference-time quantization schemes. No known solution short of full model merge (which also fails due to Marlin kernel format).\n\n---\n\n## Appendix F: Experiments Not Run\n\n| Experiment | Why It Matters | Why Not Run | Estimated Impact |\n|-----------|---------------|-------------|-----------------|\n| Multi-run per problem (12+) | Per-problem variance | Max 3 runs available | Diagnostic |\n| Reasoning channel analysis | Hidden confidence signals | Pipeline not instrumented | Unknown |\n| PRM scoring (7B) | Step-level selection | VRAM blocked | +2-4 (literature) |\n| CodeBERT clustering | Approach diversity metric | Not prioritized | Unknown |\n| Adaptive K (K=16-32 on hard) | Budget 89% slack | Not tested in time | +1-2 |\n| LoRA on boundary errors | 44% of errors = off-by-one | Data not curated | +1-3 |\n\n---\n\n## Appendix G: Cost and Timeline\n\n| Resource | Cost | Time |\n|----------|------|------|\n| Kaggle submissions | Free | 28 submissions × 5h = 140h compute |\n| RunPod (LoRA training) | ~$20 | 3 training runs × 2-10h |\n| Claude API (multi-agent) | ~$200 | 25+ sessions |\n| Total calendar time | — | 40 days (2026-03-06 to 2026-04-15) |\n| Estimated human hours | — | ~150h |\n\n---\n\n## Appendix H: Dead Ends Catalog (Full Details)\n\n### H.1 Prompt Engineering (v22, v27)\n- Elaborate 3-prompt diversity: **−3 points** (v22=33 vs baseline 36)\n- Minimal entropy-tuned prompts: **−3 points** (v27=34 vs v24=37)\n- **Lesson:** Prompts are frozen for reasoning-native models. Any change disrupts internal optimization.\n\n### H.2 Sampling Parameters (v23, v28)\n- Multi-temperature [0.5, 0.7, 1.0, 1.3]: neutral (v23=36=baseline)\n- SC@16 vs SC@8: identical (v28=37=v24)\n- **Lesson:** Diminishing returns beyond K=8 with this model.\n\n### H.3 GenSelect — LLM-as-Judge (v29)\n- Theory: +2-4 points (based on NemoSkills literature)\n- Reality: **−3 points** (v29=34)\n- Root cause: GPT-OSS in Harmony format cannot judge solutions via `chat.completions.create()`\n- **Lesson:** NemoSkills results (Qwen-based) don't transfer to GPT-OSS architecture.\n\n### H.4 Adaptive Complexity Routing (v29)\n- A0==A1 difficulty classification with multi-track compute allocation\n- Combined with GenSelect: **−3 total**\n- **Lesson:** Complexity introduces regression risk exceeding theoretical gain.\n\n### H.5 All Post-Processing Methods (S22)\n- Code trajectory analysis, code features, early answer filter, number-theoretic properties, Z3 constraints, ECP evidence mining, LR scoring, digit-wise voting, Bayesian selection, CARE SVD\n- **Result:** All reduce to majority on hard problems (30:1 wrong-to-correct ratio is mathematically insurmountable)\n\n### H.6 ThinkPRM-1.5B (S22)\n- 1.5B generative PRM, fits alongside 120B (~3GB)\n- **Result:** Inverse scoring on hard problems (wrong=1.0, correct=0.7)\n- CPU inference: 200-900s per solution (impractical)\n\n### H.7 20B Dual-Model Diversity (v46)\n- Hypothesis: 20B model generates different wrong answers, enabling ensemble\n- Reality: Same wrong answers as 120B (529, 4949, 0 on test problems)\n- Score: 4/12 vs 120B 5/12 (regression)\n\n### H.8 Prescriptive Prompts Without TIR (v52)\n- \"Solve two ways,\" \"devil's advocate,\" \"approach from number theory\"\n- 0/8 gave gold, 0/8 gave new answers\n- **Lesson:** The model either knows or doesn't. No prompt unlocks hidden capability.\n\n### H.9 Strategy Diversification (v22, community)\n- Community analysis recommended this approach; our data contradicts it\n- v22=−3, v39=−3: every diversity attempt produced a regression\n",
      "votes": 3
    },
    {
      "id": 3461424,
      "postDate": "2026-05-20T14:43:22.447Z",
      "content": "<p>Very detailed and honest write-up. \nEspecially appreciated that you included the failed experiments instead of only the successful parts.</p>",
      "rawMarkdown": "Very detailed and honest write-up. \nEspecially appreciated that you included the failed experiments instead of only the successful parts.\n"
    },
    {
      "id": 3457782,
      "postDate": "2026-05-14T10:28:25.033Z",
      "content": "<p>Adding to the comments from <a href=\"https://www.kaggle.com/sambealing\" target=\"_blank\">@sambealing</a> below, I have a few additional questions:</p>\n<ol>\n<li><p><strong>Arithmetic Errors</strong>: You mention that arithmetic errors are not fixable. However, I would argue that they can be addressed through tool calls or formal verification systems such as Lean. If the model has produced a valid reasoning path that is mathematically sound, would you agree that it should be possible to translate it into Python or Lean code for verification? Did you experience any counter-examples in practice?</p></li>\n<li><p><strong>Answer Recovery</strong>: You use a fairly simple regex expression to extract multiple digits from the model's answer. Depending on the implementation, this can fail in several cases. For example, if the model produces an equation, fraction, or additional text inside the boxed environment, the correct answer may not be recovered. Did you observe or document cases where the model produced the correct answer, but the extraction failed, and the problem was therefore marked as unsolved? If so, how would you adapt the extraction logic to recover such cases?</p></li>\n<li><p><strong>Bottleneck</strong>: You claim that “generation quality, not selection quality, is the bottleneck.” However, other contestants argue the opposite, for example <a href=\"https://www.kaggle.com/natnitarach\" target=\"_blank\">@natnitarach</a> in <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/model-capability-dominates\" target=\"_blank\">this submission</a>. They argue that selection is the bottleneck, motivated by the publicly available <code>pass@100</code> statistics on both the public and private sets <a href=\"https://x.com/AIMOprize/status/2039441022996934783\" target=\"_blank\">here</a>. What are your thoughts on this interpretation?</p></li>\n<li><p><strong>Reproducibility</strong>: Is the code needed to reproduce all experiments and notebook configurations available? If so, please share it to improve the reproducibility of your work.</p></li>\n</ol>",
      "rawMarkdown": "Adding to the comments from @sambealing below, I have a few additional questions:\n\n1. **Arithmetic Errors**: You mention that arithmetic errors are not fixable. However, I would argue that they can be addressed through tool calls or formal verification systems such as Lean. If the model has produced a valid reasoning path that is mathematically sound, would you agree that it should be possible to translate it into Python or Lean code for verification? Did you experience any counter-examples in practice?\n\n2. **Answer Recovery**: You use a fairly simple regex expression to extract multiple digits from the model's answer. Depending on the implementation, this can fail in several cases. For example, if the model produces an equation, fraction, or additional text inside the boxed environment, the correct answer may not be recovered. Did you observe or document cases where the model produced the correct answer, but the extraction failed, and the problem was therefore marked as unsolved? If so, how would you adapt the extraction logic to recover such cases?\n\n3. **Bottleneck**: You claim that “generation quality, not selection quality, is the bottleneck.” However, other contestants argue the opposite, for example @natnitarach in [this submission](https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/model-capability-dominates). They argue that selection is the bottleneck, motivated by the publicly available `pass@100` statistics on both the public and private sets [here](https://x.com/AIMOprize/status/2039441022996934783). What are your thoughts on this interpretation?\n\n4. **Reproducibility**: Is the code needed to reproduce all experiments and notebook configurations available? If so, please share it to improve the reproducibility of your work."
    },
    {
      "id": 3457746,
      "postDate": "2026-05-14T09:05:09Z",
      "content": "<p>Hi, thank you for your submission to the Writeup Prize. <a href=\"https://www.kaggle.com/philipvonderlind\" target=\"_blank\">@philipvonderlind</a> and I will post some questions below that help us in assessing your submission more closely, as described in the <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/689703\" target=\"_blank\">updated discussion post</a>.</p>\n<ol>\n<li><strong>Harmony +2 mechanism:</strong> The +2 from v33 came from adding the ChatGPT identity to SystemContent plus the developer-message code rules. Did you have a chance to isolate which of the two (identity vs developer message) actually drove the gain, or are they entangled in the +2?</li>\n<li><strong>Off-by-one: ambiguity vs model error:</strong> Of the 7/16 hard-problem errors within ±2 of gold (Appendix D), did you investigate whether the source problem statements themselves were ambiguous (e.g. the 'is 0 positive?' issue discussed in <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/672872\" target=\"_blank\">this Kaggle thread</a>) versus cases where the question was clear and the model just made a mistake in its solution?</li>\n<li><strong>Variance estimate from n=3:</strong> Your σ ≈ 3 comes from three identical-code runs (39, 33, 34), while the Nitarach n=13 analysis gives σ ≈ 1.7. With only three samples there's a lot of uncertainty on σ itself. Do you think the true σ for this substrate is closer to 3 or 1.7, and what evidence would tip you one way or the other?</li>\n</ol>\n<p>Look forward to reading your responses on these.</p>",
      "rawMarkdown": "Hi, thank you for your submission to the Writeup Prize. @philipvonderlind and I will post some questions below that help us in assessing your submission more closely, as described in the [updated discussion post](https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/689703).\n\n1. **Harmony +2 mechanism:** The +2 from v33 came from adding the ChatGPT identity to SystemContent plus the developer-message code rules. Did you have a chance to isolate which of the two (identity vs developer message) actually drove the gain, or are they entangled in the +2?\n2. **Off-by-one: ambiguity vs model error:** Of the 7/16 hard-problem errors within ±2 of gold (Appendix D), did you investigate whether the source problem statements themselves were ambiguous (e.g. the 'is 0 positive?' issue discussed in [this Kaggle thread](https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/672872)) versus cases where the question was clear and the model just made a mistake in its solution?\n3. **Variance estimate from n=3:** Your σ ≈ 3 comes from three identical-code runs (39, 33, 34), while the Nitarach n=13 analysis gives σ ≈ 1.7. With only three samples there's a lot of uncertainty on σ itself. Do you think the true σ for this substrate is closer to 3 or 1.7, and what evidence would tip you one way or the other?\n\nLook forward to reading your responses on these.\n"
    },
    {
      "id": 3446696,
      "postDate": "2026-04-22T00:53:29.913Z",
      "rawMarkdown": "",
      "isDeleted": true
    }
  ],
  "complete": true,
  "source": "live",
  "fetched_at": "2026-10-20T04:22:59Z",
  "competition_id": 118448,
  "competition_slug": "ai-mathematical-olympiad-progress-prize-3",
  "team_id": 15309688,
  "solution_url": "/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/harmony-format-dead-ends-and-variance-in-aimo3"
}