{
  "id": 692557,
  "title": "Getting gpt-oss-120b to collaborate",
  "content": "<p>Most notebooks get gpt-oss-120b to work on the problem independently, and implement some voting mechanism to decide which answer to submit.</p>\n<p>My hypothesis is that I can beat the market if I enable multiple instances of gpt-oss-120b to collaborate with each other, by reading the results and findings of other solvers after submitting an answer.</p>\n<p>The interaction is accessible at <a href=\"http://aimo.huikang.dev/runs.html?datetime=2026-02-18-05-21-35&amp;problem=86e8e5&amp;copy=4&amp;solution=0\" target=\"_blank\">aimo.huikang.dev/runs</a>.\nThe visualization was built around Christmas last year. Just before publishing this writeup, I made it much easier to navigate.</p>\n<hr>\n<p>Links</p>\n<ul>\n<li>Comment in submission thread: <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/689703#3446458\" target=\"_blank\">https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/689703#3446458</a></li>\n<li>Writeup: <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/attempts-to-get-gpt-oss-120b-to-collaborate\" target=\"_blank\">https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/attempts-to-get-gpt-oss-120b-to-collaborate</a></li>\n<li>Notebook<ul>\n<li>Kaggle <a href=\"https://www.kaggle.com/code/huikang/streaming-inference-private?scriptVersionId=298346744\" target=\"_blank\">https://www.kaggle.com/code/huikang/streaming-inference-private?scriptVersionId=298346744</a></li>\n<li>Github <a href=\"https://github.com/tonghuikang/aimo3/blob/master/notebook.py\" target=\"_blank\">https://github.com/tonghuikang/aimo3/blob/master/notebook.py</a></li>\n<li>Colab <a href=\"https://colab.research.google.com/drive/1rWFywCyNjDehHiYrsWjzdENA9o4QbpEh\" target=\"_blank\">https://colab.research.google.com/drive/1rWFywCyNjDehHiYrsWjzdENA9o4QbpEh</a> (copy might not run)</li></ul></li>\n<li>Model<ul>\n<li>Kaggle <a href=\"https://www.kaggle.com/models/huikang/gpt-oss-120b-aimo3/Transformers/160a/9\" target=\"_blank\">https://www.kaggle.com/models/huikang/gpt-oss-120b-aimo3/Transformers/160a/9</a> as described in <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/672528\" target=\"_blank\">Corpus Prize Submission</a></li>\n<li>Huggingface: <a href=\"https://huggingface.co/ExampleTestcase/gpt-oss-120b-aimo3\" target=\"_blank\">https://huggingface.co/ExampleTestcase/gpt-oss-120b-aimo3</a></li></ul></li>\n</ul>\n<hr>\n<p>I assume that people are familiar with the popular <a href=\"https://www.kaggle.com/code/nihilisticneuralnet/44-50-let-me-over-cook\" target=\"_blank\">44-score notebook</a>. It has the following features.</p>\n<ul>\n<li>Use of gpt-oss-120b</li>\n<li>vLLM for inference</li>\n<li>The tool calling harness with the Jupyter client</li>\n<li>Early stopping once the majority vote is achieved</li>\n</ul>\n<p>I now explain the additional features of my submission.</p>\n<h3>Solver termination based on KV cache usage</h3>\n<p>When the KV cache is full, vLLM cannot generate any more tokens.\nIt picks one of the in-flight generations, pauses it, and frees up its KV cache. In the naive implementation, completions take turns to wait, and every time one exits the queue, the entire KV cache has to be prefilled with the O(n^2) computation. This becomes inefficient with more tool calls, as the prefix cache is frequently evicted.</p>\n<p>I think it is more likely to get the answer if I have three solvers reaching the 60,000th token compared to eight solvers stuck at the 40,000th token. Therefore, I decided to terminate solvers when a threshold of the KV cache is reached.</p>\n<p>I terminate the least-progressed solver first, with this priority:</p>\n<ul>\n<li>a solver that has not made any proposal yet</li>\n<li>a solver with no answer or proposal</li>\n<li>a solver with no answer</li>\n<li>the solver with the fewest tool calls</li>\n</ul>\n<h3>Adaptive submission logic</h3>\n<p>In the widely-forked 44-score notebook, submission is made once there are 4 solvers agreeing on the answer.</p>\n<p>I think I can implement a logic better than that popular notebook. Given that there are only 8 attempts, if three solvers agree on an answer, it is unlikely that after some time four of the other solvers will agree on a different answer. Therefore, I think we could make a submission as long as 3 solvers agree on the answer.</p>\n<p>However, when I look at the submission logs, I do not think it is true that we can just submit when two solvers agree on the answer.\nIt depends on whether the answer is unanimous. It also depends on how much time we have left.</p>\n<p>My submission entry has this answer-submission logic, where it will submit the answer if</p>\n<ul>\n<li>two solvers have submitted an answer and they agree on the answer</li>\n<li>there are three solvers remaining (due to the solver termination logic) and two solvers agree on the answer</li>\n<li>there are three solvers remaining (due to the solver termination logic) and only one solver has a submission</li>\n</ul>\n<p>In addition, for the last question, I allow the agent to spend all the remaining time on the problem until all solvers submit the same answer.</p>\n<h3>Information sharing between solvers</h3>\n<p>The main bet I am making is that collaboration between solvers will make it more likely to get the correct answer, as they can compare their answers with each other.</p>\n<p>This is an example of a solver being <a href=\"http://localhost:4130/runs.html?datetime=2026-02-18-05-21-35&amp;problem=86e8e5&amp;copy=4&amp;solution=0\" target=\"_blank\">presented</a> with other answers after submitting its own.</p>\n<p>The hope is that the solver will fix its answer based on the information provided by the other solvers.</p>\n<pre><code>assistant\nfinal\n\\boxed{41754}\nuser\nThese are the currently submitted answers:\nSolver 0 (you) is considering 41754\nSolver 2 is submitting 8687\nSolver 3 is submitting 8687\nSolver 5 is submitting 41754\n\nAnother solver has provided this solution:\n\nInsights: f(n)=min LCM(a,b,c) with a+b+c=n ⇒ f(n)/n = min_{d|n, d≥6} r(d), where r(d)=2/3−2/(3d) if d≡1(mod 3), r(d)=2/3−4/(3d) if d≡2(mod 3), r(d)=2/3 for d multiple of 3 (≥9).  \n\nM=3^{2025!} ⇒ M≡1 (mod d) for d∤3.  \n\nFor each c: find smallest divisor ≥6 of N=M+c in each residue class; compute r.  \n\nResults:  \ng(0)=2/3 (d=9); g(4M)=5·2/3=10/3; g(1848374)=16/25 (d=25); g(10162574)=30/47 (d=47); g(265710644)=64/97 (d=97); g(44636594)=110/167 (d=167).  \n\nSum = 125561848/19033825 ⇒ (p+q) mod 99991 = **8687**.  \n\nPitfalls: ignore factor (1+c/M) for c=4M (g(4M)≠2/3) and ensure d≥6, distinct‑divisor condition.\n\nScrutinize your solution, using other solutions as a reference.\nIf you spot any critical mistake in your solution, work towards figuring out the correct answer.\nPrioritize scrutinizing your solution so you can find any mistakes as soon as possible.\n</code></pre>\n<p>The summary from the other solvers is produced by gpt-oss-120b itself in a separate LLM call. When a solver proposes or updates an answer, I take a copy of its conversation tokens, append a prompt asking it to summarize its own current approach in under 250 characters (covering key insights, intermediate results, and pitfalls), and prefix the assistant turn with <code>Insights:</code>.\nThe resulting string is what other solvers see as \"Another solver has provided this solution\". The <code>Insights:</code> and <code>Pitfalls:</code> labels in the example above come from the model following this template.</p>\n<p>If gpt-oss-120b arrived at the correct answer, presenting the summary of the wrong answer almost never causes gpt-oss-120b to adopt the wrong answer. If given 1 hour to arrive at a unanimous answer for Question 10, it seems that I can get 8687 <a href=\"https://www.kaggle.com/code/huikang/streaming-inference-private/output?scriptVersionId=293581258&amp;select=stats.csv\" target=\"_blank\">80% of the time</a>.</p>\n<p>I had previous iterations where the information was injected before the first answer was submitted.\nHowever, this did not increase the probability of arriving at the correct answer in the same time budget.\nI found that interrupting the chain of thought causes gpt-oss-120b to waste tokens. This is because on every interruption, gpt-oss-120b restarts its chain of thought from scratch, rather than continuing from where it left off. This makes it difficult to inject new information in real time. Therefore, I ended up injecting the information only after the first answer is submitted, to ensure that the performance is not worse than a setup with no collaboration.</p>\n<h3>Answer deletion logic</h3>\n<p>I allow solvers to retract their submission if they find their submitted answer is wrong.</p>\n<p>This makes unanimous agreement more likely, and hopefully the unanimously agreed answer is the correct answer.\nIf unanimous agreement is not achieved before time runs out, the retractions remove the wrong answers from participating in the voting process.</p>\n<p>The retraction decision itself is made by gpt-oss-120b in a separate LLM call. I append the solver's conversation tokens with a prompt asking it to reply with either <code>I have confirmed that {answer} is wrong</code> or <code>I have yet to confirm that {answer} is wrong</code>, and string-match the response.</p>\n<p>This prompt-based classifier seems to be unreliable.\nTherefore, for an answer to be deleted, I require two consecutive retraction decisions.\nThe first decision marks the answer as pending retraction in its history. Only a second retraction decision (with no intervening confirmation) actually removes the answer from the voting pool.</p>\n<h3>Backtracking logic</h3>\n<p>After a solver submits an answer, the conversation continues and the solver often re-examines its work in the next iteration.\nThe first time this happens, it is very likely that the solver will spend real effort checking the answer.</p>\n<p>However, if the solver keeps arriving at the same answer, it may simply restate its previous conclusion and stop spending effort on verification.\nThis behavior is undesirable.</p>\n<p>Therefore, I implemented a backtracking logic.\nIf the solver submits the same answer two iterations in a row, I rewind its conversation by popping tokens off the end of its token stream until two assistant turns have been removed — effectively returning it to the state just before the iteration that first produced that answer. Generation then resumes from that earlier point.</p>\n<p>This makes it more likely that the solver will continue to spend effort checking the answer, hopefully figuring out that the answer it has submitted is wrong, and finding the correct answer instead.</p>\n<hr>\n<h3>Results</h3>\n<p>Most of the changes were done by analyzing the errors and making changes to the code to address them.\nI do not have the GPU budget to run ablation tests.</p>\n<p>8 submissions were made for the notebook version.\nThe scores, in chronological order, are 42, 40, 40, 36, 39, 40, 40, and 41.\nThe scores have a mean of 39.75.</p>\n<hr>\n<p>Initially, I did this so that I would have a good chance at the Longest Leader Prize. I did not win the prize. It seems that what was required is a clean implementation of gpt-oss-120b, as seen from the notebooks that first scored between 41 and 44.</p>\n<p>I thought I could achieve a significantly better score than the 44-score notebook, but I could not prove this, even though my changes made the model perform much better on Question 9 and Question 10. I realized that Questions 9 and 10 from the reference problems probably did not represent the problems in the leaderboard. The two questions involve multiple parts, which makes it easy for gpt-oss-120b to be correct in one part but wrong in another. Collaboration is especially useful, as I can allow gpt-oss-120b to compare notes and figure out who is correct. Perhaps most problems in the public leaderboard do not benefit from comparing notes.</p>",
  "comments": [
    {
      "id": 3457793,
      "author_name": "Philip Vonderlind",
      "author_url": "",
      "post_date": "2026-05-14T10:43:05.110000",
      "content": "<p>Adding to the comments by <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>Summary Injection</strong>: As I understand it, your approach generates summaries from completed traces and injects them into other generations that are still running. Did you test replacing this injection mechanism with an LLM-as-a-judge approach, similar to <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/fighting-against-variance-under-time-constraint\" target=\"_blank\">this submission</a>? Would you say there is a benefit to avoiding distinct generation, summarization, and judgment stages?</p></li>\n<li><p><strong>Inference Bottleneck</strong>: You mention waiting for full traces before proceeding with the summarization step. Did you encounter cases where GPU cycles were wasted because one trace took significantly longer to finish than the others, causing the remaining traces or stages to wait?</p></li>\n<li><p><strong>Ablations and Time Management</strong>: Do you have ablations showing that answer retraction and backtracking improve performance on average in a competition-style evaluation? I imagine time budgeting becomes considerably more complex when each problem requires multiple sequential steps, especially given the synchronization issue mentioned above.</p></li>\n</ol>",
      "votes": 1,
      "replies": [
        {
          "id": 3458843,
          "author_name": "Tong Hui Kang",
          "author_url": "",
          "post_date": "2026-05-16T19:03:47.007000",
          "content": "<h3>Summary Injection</h3>\n<p>In some sense, my approach is already something like an LLM-as-a-judge (but a very biased one), the LLM will judge its current answer against the summaries of the other answers.</p>\n<p>Another feature that I have tried is to <a href=\"https://aimo.huikang.dev/runs/2025-12-08-23-35-59/communications/review-116wvp.txt\" target=\"_blank\">get a judge</a> to decide whether a summary is worth injecting <code>Another solver has presented the following finding ... Is this finding genuinely new and useful to you? Answer YES or NO</code>, before I inject the summary. I decided to remove that feature because the performance of solvers running individually is getting higher ceiling scores than mine, and I want to be strictly better than that setup. I no longer need a classifier to decide whether a finding is useful, I will just inject the finding if the boxed answers are different.</p>\n<p>My intention is to avoid distinct generation, summarization, and judgment stages. If I have multiple stages, I need to wait for every trace in each stage to complete or I interrupt, and tokens are wasted.</p>\n<p>A principle of my design here is to keep the main traces uninterrupted, so that I can be more confident that my approach is better than a setup where the solvers solve independently.</p>\n<h3>Inference Bottleneck</h3>\n<p>In my setup, all traces will continue to work until it passes the voting threshold or it times out. Traces will continue to generate even after the boxed answer is submitted, it will be given the status from the other traces and an instruction to check their answer. If a trace repeats the boxed answer multiple times, it will be backtracked to when it first repeated the boxed answer.</p>\n<p>If I assume all traces are doing productive work, I do not think I am wasting any GPU cycles.</p>\n<p>There is still a tradeoff being made though. If I terminate traces that submitted a boxed answer, I leave more memory and compute for other traces. Even so, I think it is faster to get a correct majority vote by fixing an early wrong answer than to be overpowered by other correct answers.</p>\n<h3>Ablations and Time Management</h3>\n<p>I observe that answer retraction actually retract wrong answers, and backtracking prevents the model from repeating the same submitted answer. I did not do ablation beyond these observations.</p>\n<p>On hindsight, I should have done ablations. Probably I should run 50 solve attempts on q9 and compare whether the win rate at least did not worsen, similar to what I did for the corpus prize submission. However, also on hindsight, improvements in q9 does not necessarily generalize to improvements in the leaderboard.</p>\n<p>The time budgeting did not get more complex, the decision to stop depends on the current vote distribution, once the vote passes, all in-flight generation will be stopped.</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 3457735,
      "author_name": "Sam Bealing",
      "author_url": "",
      "post_date": "2026-05-14T08:46:29.193000",
      "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>Run-viewer case studies:</strong> You note you don't have GPU budget for systematic ablations, but the run viewer at aimo.huikang.dev/runs captures detailed traces. From those traces, do you have specific cases where the information-sharing step flipped a solver's answer from wrong to right (or vice versa), and a rough sense of how often that happens?</li>\n<li><strong>Comparison to Blackboard-style sharing:</strong> Your information-sharing summarises a solver's progress via a separate LLM call. <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/aimo3test\" target=\"_blank\">ippeiogawa's Blackboard</a> instead pushes raw tool I/O between solvers. How do you think these two approaches compare and what do you think are the advantages and disadvantages of each?</li>\n</ol>\n<p>Look forward to reading your responses on these.</p>",
      "votes": 1,
      "replies": [
        {
          "id": 3458858,
          "author_name": "Tong Hui Kang",
          "author_url": "",
          "post_date": "2026-05-16T19:29:26.650000",
          "content": "<h3>Run-viewer case studies</h3>\n<p>I only observe <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-08-01-13-08&amp;problem=424e18&amp;solution=2\" target=\"_blank\">one case</a> in q5 where the solver flipped from a correct answer (21818) to a wrong answer (62140).</p>\n<p>Specific cases where the information-sharing step flipped a solver's answer from wrong to right</p>\n<h3>q9 (dd7f5e, GT = 160)</h3>\n<p>learned from correct</p>\n<ul>\n<li>[214 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-04-01-43-44&amp;problem=dd7f5e&amp;solution=1\" target=\"_blank\">160</a>]</li>\n<li>[114 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-07-21-55-41&amp;problem=dd7f5e&amp;solution=2\" target=\"_blank\">160</a>]</li>\n</ul>\n<p>corrected based on difference</p>\n<ul>\n<li>[266 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-04-00-48-09&amp;problem=dd7f5e&amp;solution=2\" target=\"_blank\">160</a>]</li>\n<li>[266 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-04-01-38-17&amp;problem=dd7f5e&amp;solution=2\" target=\"_blank\">160</a>]</li>\n</ul>\n<p>corrected on its own</p>\n<ul>\n<li>[217 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-04-03-01-27&amp;problem=dd7f5e&amp;solution=1\" target=\"_blank\">160</a>]</li>\n<li>[266 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-12-22-20-54&amp;problem=dd7f5e&amp;solution=26\" target=\"_blank\">160</a>]</li>\n</ul>\n<h3>q10 (86e8e5, GT = 8687)</h3>\n<p>learned from correct</p>\n<ul>\n<li>[41754 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-10-01-27-04&amp;problem=86e8e5&amp;solution=3\" target=\"_blank\">8687</a>]</li>\n<li>[96985 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2026-02-18-05-21-35&amp;problem=86e8e5&amp;copy=9&amp;solution=7\" target=\"_blank\">8687</a>]</li>\n</ul>\n<p>corrected based on difference</p>\n<ul>\n<li>[41754 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-17-22-22-40&amp;problem=86e8e5&amp;copy=18&amp;solution=0\" target=\"_blank\">8687</a>]</li>\n<li>[7535 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-17-22-22-40&amp;problem=86e8e5&amp;copy=18&amp;solution=3\" target=\"_blank\">8687</a>]</li>\n</ul>\n<p>corrected on its own</p>\n<ul>\n<li>(none — every q10 rescue had at least some external signal)</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>q9 (160)</th>\n<th>q10 (8687)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>total traces</td>\n<td>1411</td>\n<td>689</td>\n</tr>\n<tr>\n<td>did not box (no \\boxed)</td>\n<td>708 (50.2%)</td>\n<td>420 (61.0%)</td>\n</tr>\n<tr>\n<td>boxed only once — correct</td>\n<td>153 (10.8%)</td>\n<td>15  (2.2%)</td>\n</tr>\n<tr>\n<td>boxed only once — wrong</td>\n<td>76  (5.4%)</td>\n<td>91 (13.2%)</td>\n</tr>\n<tr>\n<td>stayed correct (multi-box, all GT)</td>\n<td>246 (17.4%)</td>\n<td>32  (4.6%)</td>\n</tr>\n<tr>\n<td>wrong → same wrong (one wrong value ≥2×)</td>\n<td>136  (9.6%)</td>\n<td>96 (13.9%)</td>\n</tr>\n<tr>\n<td>wrong → different wrong (≥2 wrong values)</td>\n<td>13  (0.9%)</td>\n<td>22  (3.2%)</td>\n</tr>\n<tr>\n<td>wrong → correct</td>\n<td>79  (5.6%)</td>\n<td>13  (1.9%)</td>\n</tr>\n<tr>\n<td>&nbsp;&nbsp;learned from correct</td>\n<td>58 (73.4% of 79)</td>\n<td>7 (53.8% of 13)</td>\n</tr>\n<tr>\n<td>&nbsp;&nbsp;corrected based on difference</td>\n<td>13 (16.5% of 79)</td>\n<td>6 (46.2% of 13)</td>\n</tr>\n<tr>\n<td>&nbsp;&nbsp;corrected on its own</td>\n<td>8 (10.1% of 79)</td>\n<td>0  (0.0% of 13)</td>\n</tr>\n<tr>\n<td>correct → wrong</td>\n<td>0 (0.0%)</td>\n<td>0 (0.0%)</td>\n</tr>\n</tbody>\n</table>\n<h3>Comparison to Blackboard-style sharing</h3>\n<p>I think sharing code is a great idea, I should have tried that approach when sharing summaries.</p>\n<p>An issue I tried to resolve for my pipeline is that the model is not trying very hard to understand solutions that are different from theirs. I believe if models are provided the code and its output, the models would make a much better effort to understand the differences.</p>\n<p>Sharing code means that you need to ensure that the code works. The code shared needs to be runnable standalone, or otherwise the recipient will waste time debugging the code—and perhaps require a mechanism to test that the code could run on its own. However, even so, for the same tokens and time budget, I think that code is more effective than a pure-text sharing.</p>",
          "votes": 0,
          "replies": []
        }
      ]
    },
    {
      "id": 3443942,
      "author_name": "David Babu",
      "author_url": "",
      "post_date": "2026-04-17T02:13:19.387000",
      "content": "<p>Interesting. I felt there were 2 kinds of hard problems. Ones like the Norwegian problem, which is pass@10/20 problem and another one where model quickly converges to wrong answer. I doubt the unsolvable ones are on the latter category where oss120B overfits on the problem and converges to wrong answer(by searching memory) in under a minute.</p>\n<p>On the point of interrupting the trace, what I found to be working with oss120B was to interrupt/inject with assistant role. User role interruption or non harmony encoding interruptions often broke the COT</p>",
      "votes": 3,
      "replies": []
    },
    {
      "id": 3444907,
      "author_name": "Durga Kumari",
      "author_url": "",
      "post_date": "2026-04-18T17:00:01.610000",
      "content": "<p>Interesting approach, your observation that collaboration mainly helps on multi-part problems is especially insightful</p>",
      "votes": 0,
      "replies": []
    },
    {
      "id": 3444366,
      "author_name": "Simon Frieder",
      "author_url": "",
      "post_date": "2026-04-17T17:56:48.073000",
      "content": "<p>Have you shared this for the writeup prize, or just for the community?</p>\n<p>In the former case, please leave a comment here linking to this writeup here <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/689703\" target=\"_blank\">https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/689703</a></p>",
      "votes": 0,
      "replies": [
        {
          "id": 3444372,
          "author_name": "Tong Hui Kang",
          "author_url": "",
          "post_date": "2026-04-17T18:02:38.160000",
          "content": "<p>Thanks for reaching out!</p>\n<p>On whether I am writing this for the writeup prize, it depends on my final score, before I invest in writing a full write-up that is worth your time to judge.</p>\n<p>For now, I am just happy to share my html file.</p>",
          "votes": 0,
          "replies": [
            {
              "id": 3445890,
              "author_name": "Simon Frieder",
              "author_url": "",
              "post_date": "2026-04-20T16:27:22.800000",
              "content": "<p>Fair enough. But please note that we learned that it will likely be later than the Write-Up Prize deadline that the private LB scores will come in: <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/693267\" target=\"_blank\">https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/693267</a></p>\n<p>So it looks like you may have to make a decision whether you want to go all in or not. In any case, I am sure whatever you come up with will be well worth read. You are a veteran AIMO participant by now :)</p>",
              "votes": 0,
              "replies": []
            }
          ]
        }
      ]
    }
  ],
  "comment_count": 9,
  "messages": [
    {
      "id": 3443903,
      "postDate": "2026-04-17T00:50:28.987Z",
      "content": "<p>Most notebooks get gpt-oss-120b to work on the problem independently, and implement some voting mechanism to decide which answer to submit.</p>\n<p>My hypothesis is that I can beat the market if I enable multiple instances of gpt-oss-120b to collaborate with each other, by reading the results and findings of other solvers after submitting an answer.</p>\n<p>The interaction is accessible at <a href=\"http://aimo.huikang.dev/runs.html?datetime=2026-02-18-05-21-35&amp;problem=86e8e5&amp;copy=4&amp;solution=0\" target=\"_blank\">aimo.huikang.dev/runs</a>.\nThe visualization was built around Christmas last year. Just before publishing this writeup, I made it much easier to navigate.</p>\n<hr>\n<p>Links</p>\n<ul>\n<li>Comment in submission thread: <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/689703#3446458\" target=\"_blank\">https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/689703#3446458</a></li>\n<li>Writeup: <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/attempts-to-get-gpt-oss-120b-to-collaborate\" target=\"_blank\">https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/attempts-to-get-gpt-oss-120b-to-collaborate</a></li>\n<li>Notebook<ul>\n<li>Kaggle <a href=\"https://www.kaggle.com/code/huikang/streaming-inference-private?scriptVersionId=298346744\" target=\"_blank\">https://www.kaggle.com/code/huikang/streaming-inference-private?scriptVersionId=298346744</a></li>\n<li>Github <a href=\"https://github.com/tonghuikang/aimo3/blob/master/notebook.py\" target=\"_blank\">https://github.com/tonghuikang/aimo3/blob/master/notebook.py</a></li>\n<li>Colab <a href=\"https://colab.research.google.com/drive/1rWFywCyNjDehHiYrsWjzdENA9o4QbpEh\" target=\"_blank\">https://colab.research.google.com/drive/1rWFywCyNjDehHiYrsWjzdENA9o4QbpEh</a> (copy might not run)</li></ul></li>\n<li>Model<ul>\n<li>Kaggle <a href=\"https://www.kaggle.com/models/huikang/gpt-oss-120b-aimo3/Transformers/160a/9\" target=\"_blank\">https://www.kaggle.com/models/huikang/gpt-oss-120b-aimo3/Transformers/160a/9</a> as described in <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/672528\" target=\"_blank\">Corpus Prize Submission</a></li>\n<li>Huggingface: <a href=\"https://huggingface.co/ExampleTestcase/gpt-oss-120b-aimo3\" target=\"_blank\">https://huggingface.co/ExampleTestcase/gpt-oss-120b-aimo3</a></li></ul></li>\n</ul>\n<hr>\n<p>I assume that people are familiar with the popular <a href=\"https://www.kaggle.com/code/nihilisticneuralnet/44-50-let-me-over-cook\" target=\"_blank\">44-score notebook</a>. It has the following features.</p>\n<ul>\n<li>Use of gpt-oss-120b</li>\n<li>vLLM for inference</li>\n<li>The tool calling harness with the Jupyter client</li>\n<li>Early stopping once the majority vote is achieved</li>\n</ul>\n<p>I now explain the additional features of my submission.</p>\n<h3>Solver termination based on KV cache usage</h3>\n<p>When the KV cache is full, vLLM cannot generate any more tokens.\nIt picks one of the in-flight generations, pauses it, and frees up its KV cache. In the naive implementation, completions take turns to wait, and every time one exits the queue, the entire KV cache has to be prefilled with the O(n^2) computation. This becomes inefficient with more tool calls, as the prefix cache is frequently evicted.</p>\n<p>I think it is more likely to get the answer if I have three solvers reaching the 60,000th token compared to eight solvers stuck at the 40,000th token. Therefore, I decided to terminate solvers when a threshold of the KV cache is reached.</p>\n<p>I terminate the least-progressed solver first, with this priority:</p>\n<ul>\n<li>a solver that has not made any proposal yet</li>\n<li>a solver with no answer or proposal</li>\n<li>a solver with no answer</li>\n<li>the solver with the fewest tool calls</li>\n</ul>\n<h3>Adaptive submission logic</h3>\n<p>In the widely-forked 44-score notebook, submission is made once there are 4 solvers agreeing on the answer.</p>\n<p>I think I can implement a logic better than that popular notebook. Given that there are only 8 attempts, if three solvers agree on an answer, it is unlikely that after some time four of the other solvers will agree on a different answer. Therefore, I think we could make a submission as long as 3 solvers agree on the answer.</p>\n<p>However, when I look at the submission logs, I do not think it is true that we can just submit when two solvers agree on the answer.\nIt depends on whether the answer is unanimous. It also depends on how much time we have left.</p>\n<p>My submission entry has this answer-submission logic, where it will submit the answer if</p>\n<ul>\n<li>two solvers have submitted an answer and they agree on the answer</li>\n<li>there are three solvers remaining (due to the solver termination logic) and two solvers agree on the answer</li>\n<li>there are three solvers remaining (due to the solver termination logic) and only one solver has a submission</li>\n</ul>\n<p>In addition, for the last question, I allow the agent to spend all the remaining time on the problem until all solvers submit the same answer.</p>\n<h3>Information sharing between solvers</h3>\n<p>The main bet I am making is that collaboration between solvers will make it more likely to get the correct answer, as they can compare their answers with each other.</p>\n<p>This is an example of a solver being <a href=\"http://localhost:4130/runs.html?datetime=2026-02-18-05-21-35&amp;problem=86e8e5&amp;copy=4&amp;solution=0\" target=\"_blank\">presented</a> with other answers after submitting its own.</p>\n<p>The hope is that the solver will fix its answer based on the information provided by the other solvers.</p>\n<pre><code>assistant\nfinal\n\\boxed{41754}\nuser\nThese are the currently submitted answers:\nSolver 0 (you) is considering 41754\nSolver 2 is submitting 8687\nSolver 3 is submitting 8687\nSolver 5 is submitting 41754\n\nAnother solver has provided this solution:\n\nInsights: f(n)=min LCM(a,b,c) with a+b+c=n ⇒ f(n)/n = min_{d|n, d≥6} r(d), where r(d)=2/3−2/(3d) if d≡1(mod 3), r(d)=2/3−4/(3d) if d≡2(mod 3), r(d)=2/3 for d multiple of 3 (≥9).  \n\nM=3^{2025!} ⇒ M≡1 (mod d) for d∤3.  \n\nFor each c: find smallest divisor ≥6 of N=M+c in each residue class; compute r.  \n\nResults:  \ng(0)=2/3 (d=9); g(4M)=5·2/3=10/3; g(1848374)=16/25 (d=25); g(10162574)=30/47 (d=47); g(265710644)=64/97 (d=97); g(44636594)=110/167 (d=167).  \n\nSum = 125561848/19033825 ⇒ (p+q) mod 99991 = **8687**.  \n\nPitfalls: ignore factor (1+c/M) for c=4M (g(4M)≠2/3) and ensure d≥6, distinct‑divisor condition.\n\nScrutinize your solution, using other solutions as a reference.\nIf you spot any critical mistake in your solution, work towards figuring out the correct answer.\nPrioritize scrutinizing your solution so you can find any mistakes as soon as possible.\n</code></pre>\n<p>The summary from the other solvers is produced by gpt-oss-120b itself in a separate LLM call. When a solver proposes or updates an answer, I take a copy of its conversation tokens, append a prompt asking it to summarize its own current approach in under 250 characters (covering key insights, intermediate results, and pitfalls), and prefix the assistant turn with <code>Insights:</code>.\nThe resulting string is what other solvers see as \"Another solver has provided this solution\". The <code>Insights:</code> and <code>Pitfalls:</code> labels in the example above come from the model following this template.</p>\n<p>If gpt-oss-120b arrived at the correct answer, presenting the summary of the wrong answer almost never causes gpt-oss-120b to adopt the wrong answer. If given 1 hour to arrive at a unanimous answer for Question 10, it seems that I can get 8687 <a href=\"https://www.kaggle.com/code/huikang/streaming-inference-private/output?scriptVersionId=293581258&amp;select=stats.csv\" target=\"_blank\">80% of the time</a>.</p>\n<p>I had previous iterations where the information was injected before the first answer was submitted.\nHowever, this did not increase the probability of arriving at the correct answer in the same time budget.\nI found that interrupting the chain of thought causes gpt-oss-120b to waste tokens. This is because on every interruption, gpt-oss-120b restarts its chain of thought from scratch, rather than continuing from where it left off. This makes it difficult to inject new information in real time. Therefore, I ended up injecting the information only after the first answer is submitted, to ensure that the performance is not worse than a setup with no collaboration.</p>\n<h3>Answer deletion logic</h3>\n<p>I allow solvers to retract their submission if they find their submitted answer is wrong.</p>\n<p>This makes unanimous agreement more likely, and hopefully the unanimously agreed answer is the correct answer.\nIf unanimous agreement is not achieved before time runs out, the retractions remove the wrong answers from participating in the voting process.</p>\n<p>The retraction decision itself is made by gpt-oss-120b in a separate LLM call. I append the solver's conversation tokens with a prompt asking it to reply with either <code>I have confirmed that {answer} is wrong</code> or <code>I have yet to confirm that {answer} is wrong</code>, and string-match the response.</p>\n<p>This prompt-based classifier seems to be unreliable.\nTherefore, for an answer to be deleted, I require two consecutive retraction decisions.\nThe first decision marks the answer as pending retraction in its history. Only a second retraction decision (with no intervening confirmation) actually removes the answer from the voting pool.</p>\n<h3>Backtracking logic</h3>\n<p>After a solver submits an answer, the conversation continues and the solver often re-examines its work in the next iteration.\nThe first time this happens, it is very likely that the solver will spend real effort checking the answer.</p>\n<p>However, if the solver keeps arriving at the same answer, it may simply restate its previous conclusion and stop spending effort on verification.\nThis behavior is undesirable.</p>\n<p>Therefore, I implemented a backtracking logic.\nIf the solver submits the same answer two iterations in a row, I rewind its conversation by popping tokens off the end of its token stream until two assistant turns have been removed — effectively returning it to the state just before the iteration that first produced that answer. Generation then resumes from that earlier point.</p>\n<p>This makes it more likely that the solver will continue to spend effort checking the answer, hopefully figuring out that the answer it has submitted is wrong, and finding the correct answer instead.</p>\n<hr>\n<h3>Results</h3>\n<p>Most of the changes were done by analyzing the errors and making changes to the code to address them.\nI do not have the GPU budget to run ablation tests.</p>\n<p>8 submissions were made for the notebook version.\nThe scores, in chronological order, are 42, 40, 40, 36, 39, 40, 40, and 41.\nThe scores have a mean of 39.75.</p>\n<hr>\n<p>Initially, I did this so that I would have a good chance at the Longest Leader Prize. I did not win the prize. It seems that what was required is a clean implementation of gpt-oss-120b, as seen from the notebooks that first scored between 41 and 44.</p>\n<p>I thought I could achieve a significantly better score than the 44-score notebook, but I could not prove this, even though my changes made the model perform much better on Question 9 and Question 10. I realized that Questions 9 and 10 from the reference problems probably did not represent the problems in the leaderboard. The two questions involve multiple parts, which makes it easy for gpt-oss-120b to be correct in one part but wrong in another. Collaboration is especially useful, as I can allow gpt-oss-120b to compare notes and figure out who is correct. Perhaps most problems in the public leaderboard do not benefit from comparing notes.</p>",
      "rawMarkdown": "Most notebooks get gpt-oss-120b to work on the problem independently, and implement some voting mechanism to decide which answer to submit.\n\nMy hypothesis is that I can beat the market if I enable multiple instances of gpt-oss-120b to collaborate with each other, by reading the results and findings of other solvers after submitting an answer.\n\nThe interaction is accessible at [aimo.huikang.dev/runs](http://aimo.huikang.dev/runs.html?datetime=2026-02-18-05-21-35&problem=86e8e5&copy=4&solution=0).\nThe visualization was built around Christmas last year. Just before publishing this writeup, I made it much easier to navigate.\n\n---\n\nLinks\n\n- Comment in submission thread: https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/689703#3446458\n- Writeup: https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/attempts-to-get-gpt-oss-120b-to-collaborate\n- Notebook\n    - Kaggle https://www.kaggle.com/code/huikang/streaming-inference-private?scriptVersionId=298346744\n    - Github https://github.com/tonghuikang/aimo3/blob/master/notebook.py\n    - Colab https://colab.research.google.com/drive/1rWFywCyNjDehHiYrsWjzdENA9o4QbpEh (copy might not run)\n- Model\n    - Kaggle https://www.kaggle.com/models/huikang/gpt-oss-120b-aimo3/Transformers/160a/9 as described in [Corpus Prize Submission](https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/672528)\n    - Huggingface: https://huggingface.co/ExampleTestcase/gpt-oss-120b-aimo3\n\n---\n\nI assume that people are familiar with the popular [44-score notebook](https://www.kaggle.com/code/nihilisticneuralnet/44-50-let-me-over-cook). It has the following features.\n\n- Use of gpt-oss-120b\n- vLLM for inference\n- The tool calling harness with the Jupyter client\n- Early stopping once the majority vote is achieved\n\nI now explain the additional features of my submission.\n\n### Solver termination based on KV cache usage\n\nWhen the KV cache is full, vLLM cannot generate any more tokens.\nIt picks one of the in-flight generations, pauses it, and frees up its KV cache. In the naive implementation, completions take turns to wait, and every time one exits the queue, the entire KV cache has to be prefilled with the O(n^2) computation. This becomes inefficient with more tool calls, as the prefix cache is frequently evicted.\n\nI think it is more likely to get the answer if I have three solvers reaching the 60,000th token compared to eight solvers stuck at the 40,000th token. Therefore, I decided to terminate solvers when a threshold of the KV cache is reached.\n\nI terminate the least-progressed solver first, with this priority:\n- a solver that has not made any proposal yet\n- a solver with no answer or proposal\n- a solver with no answer\n- the solver with the fewest tool calls\n\n\n### Adaptive submission logic\n\nIn the widely-forked 44-score notebook, submission is made once there are 4 solvers agreeing on the answer.\n\nI think I can implement a logic better than that popular notebook. Given that there are only 8 attempts, if three solvers agree on an answer, it is unlikely that after some time four of the other solvers will agree on a different answer. Therefore, I think we could make a submission as long as 3 solvers agree on the answer.\n\nHowever, when I look at the submission logs, I do not think it is true that we can just submit when two solvers agree on the answer.\nIt depends on whether the answer is unanimous. It also depends on how much time we have left.\n\nMy submission entry has this answer-submission logic, where it will submit the answer if\n- two solvers have submitted an answer and they agree on the answer\n- there are three solvers remaining (due to the solver termination logic) and two solvers agree on the answer\n- there are three solvers remaining (due to the solver termination logic) and only one solver has a submission\n\nIn addition, for the last question, I allow the agent to spend all the remaining time on the problem until all solvers submit the same answer.\n\n\n### Information sharing between solvers\n\nThe main bet I am making is that collaboration between solvers will make it more likely to get the correct answer, as they can compare their answers with each other.\n\nThis is an example of a solver being [presented](http://localhost:4130/runs.html?datetime=2026-02-18-05-21-35&problem=86e8e5&copy=4&solution=0) with other answers after submitting its own.\n\nThe hope is that the solver will fix its answer based on the information provided by the other solvers.\n\n```\nassistant\nfinal\n\\boxed{41754}\nuser\nThese are the currently submitted answers:\nSolver 0 (you) is considering 41754\nSolver 2 is submitting 8687\nSolver 3 is submitting 8687\nSolver 5 is submitting 41754\n\nAnother solver has provided this solution:\n\nInsights: f(n)=min LCM(a,b,c) with a+b+c=n ⇒ f(n)/n = min_{d|n, d≥6} r(d), where r(d)=2/3−2/(3d) if d≡1(mod 3), r(d)=2/3−4/(3d) if d≡2(mod 3), r(d)=2/3 for d multiple of 3 (≥9).  \n\nM=3^{2025!} ⇒ M≡1 (mod d) for d∤3.  \n\nFor each c: find smallest divisor ≥6 of N=M+c in each residue class; compute r.  \n\nResults:  \ng(0)=2/3 (d=9); g(4M)=5·2/3=10/3; g(1848374)=16/25 (d=25); g(10162574)=30/47 (d=47); g(265710644)=64/97 (d=97); g(44636594)=110/167 (d=167).  \n\nSum = 125561848/19033825 ⇒ (p+q) mod 99991 = **8687**.  \n\nPitfalls: ignore factor (1+c/M) for c=4M (g(4M)≠2/3) and ensure d≥6, distinct‑divisor condition.\n\nScrutinize your solution, using other solutions as a reference.\nIf you spot any critical mistake in your solution, work towards figuring out the correct answer.\nPrioritize scrutinizing your solution so you can find any mistakes as soon as possible.\n```\n\nThe summary from the other solvers is produced by gpt-oss-120b itself in a separate LLM call. When a solver proposes or updates an answer, I take a copy of its conversation tokens, append a prompt asking it to summarize its own current approach in under 250 characters (covering key insights, intermediate results, and pitfalls), and prefix the assistant turn with `Insights:`.\nThe resulting string is what other solvers see as \"Another solver has provided this solution\". The `Insights:` and `Pitfalls:` labels in the example above come from the model following this template.\n\nIf gpt-oss-120b arrived at the correct answer, presenting the summary of the wrong answer almost never causes gpt-oss-120b to adopt the wrong answer. If given 1 hour to arrive at a unanimous answer for Question 10, it seems that I can get 8687 [80% of the time](https://www.kaggle.com/code/huikang/streaming-inference-private/output?scriptVersionId=293581258&select=stats.csv).\n\nI had previous iterations where the information was injected before the first answer was submitted.\nHowever, this did not increase the probability of arriving at the correct answer in the same time budget.\nI found that interrupting the chain of thought causes gpt-oss-120b to waste tokens. This is because on every interruption, gpt-oss-120b restarts its chain of thought from scratch, rather than continuing from where it left off. This makes it difficult to inject new information in real time. Therefore, I ended up injecting the information only after the first answer is submitted, to ensure that the performance is not worse than a setup with no collaboration.\n\n\n### Answer deletion logic\n\nI allow solvers to retract their submission if they find their submitted answer is wrong.\n\nThis makes unanimous agreement more likely, and hopefully the unanimously agreed answer is the correct answer.\nIf unanimous agreement is not achieved before time runs out, the retractions remove the wrong answers from participating in the voting process.\n\nThe retraction decision itself is made by gpt-oss-120b in a separate LLM call. I append the solver's conversation tokens with a prompt asking it to reply with either `I have confirmed that {answer} is wrong` or `I have yet to confirm that {answer} is wrong`, and string-match the response.\n\nThis prompt-based classifier seems to be unreliable.\nTherefore, for an answer to be deleted, I require two consecutive retraction decisions.\nThe first decision marks the answer as pending retraction in its history. Only a second retraction decision (with no intervening confirmation) actually removes the answer from the voting pool.\n\n\n### Backtracking logic\n\nAfter a solver submits an answer, the conversation continues and the solver often re-examines its work in the next iteration.\nThe first time this happens, it is very likely that the solver will spend real effort checking the answer.\n\nHowever, if the solver keeps arriving at the same answer, it may simply restate its previous conclusion and stop spending effort on verification.\nThis behavior is undesirable.\n\nTherefore, I implemented a backtracking logic.\nIf the solver submits the same answer two iterations in a row, I rewind its conversation by popping tokens off the end of its token stream until two assistant turns have been removed — effectively returning it to the state just before the iteration that first produced that answer. Generation then resumes from that earlier point.\n\nThis makes it more likely that the solver will continue to spend effort checking the answer, hopefully figuring out that the answer it has submitted is wrong, and finding the correct answer instead.\n\n\n---\n\n### Results\n\nMost of the changes were done by analyzing the errors and making changes to the code to address them.\nI do not have the GPU budget to run ablation tests.\n\n8 submissions were made for the notebook version.\nThe scores, in chronological order, are 42, 40, 40, 36, 39, 40, 40, and 41.\nThe scores have a mean of 39.75.\n\n---\n\nInitially, I did this so that I would have a good chance at the Longest Leader Prize. I did not win the prize. It seems that what was required is a clean implementation of gpt-oss-120b, as seen from the notebooks that first scored between 41 and 44.\n\nI thought I could achieve a significantly better score than the 44-score notebook, but I could not prove this, even though my changes made the model perform much better on Question 9 and Question 10. I realized that Questions 9 and 10 from the reference problems probably did not represent the problems in the leaderboard. The two questions involve multiple parts, which makes it easy for gpt-oss-120b to be correct in one part but wrong in another. Collaboration is especially useful, as I can allow gpt-oss-120b to compare notes and figure out who is correct. Perhaps most problems in the public leaderboard do not benefit from comparing notes.\n",
      "votes": 15
    },
    {
      "id": 3457793,
      "postDate": "2026-05-14T10:43:05.110Z",
      "content": "<p>Adding to the comments by <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>Summary Injection</strong>: As I understand it, your approach generates summaries from completed traces and injects them into other generations that are still running. Did you test replacing this injection mechanism with an LLM-as-a-judge approach, similar to <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/fighting-against-variance-under-time-constraint\" target=\"_blank\">this submission</a>? Would you say there is a benefit to avoiding distinct generation, summarization, and judgment stages?</p></li>\n<li><p><strong>Inference Bottleneck</strong>: You mention waiting for full traces before proceeding with the summarization step. Did you encounter cases where GPU cycles were wasted because one trace took significantly longer to finish than the others, causing the remaining traces or stages to wait?</p></li>\n<li><p><strong>Ablations and Time Management</strong>: Do you have ablations showing that answer retraction and backtracking improve performance on average in a competition-style evaluation? I imagine time budgeting becomes considerably more complex when each problem requires multiple sequential steps, especially given the synchronization issue mentioned above.</p></li>\n</ol>",
      "rawMarkdown": "Adding to the comments by @sambealing below, I have a few additional questions:\n\n1. **Summary Injection**: As I understand it, your approach generates summaries from completed traces and injects them into other generations that are still running. Did you test replacing this injection mechanism with an LLM-as-a-judge approach, similar to [this submission](https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/fighting-against-variance-under-time-constraint)? Would you say there is a benefit to avoiding distinct generation, summarization, and judgment stages?\n\n2. **Inference Bottleneck**: You mention waiting for full traces before proceeding with the summarization step. Did you encounter cases where GPU cycles were wasted because one trace took significantly longer to finish than the others, causing the remaining traces or stages to wait?\n\n3. **Ablations and Time Management**: Do you have ablations showing that answer retraction and backtracking improve performance on average in a competition-style evaluation? I imagine time budgeting becomes considerably more complex when each problem requires multiple sequential steps, especially given the synchronization issue mentioned above.",
      "votes": 1,
      "replies": [
        {
          "id": 3458843,
          "postDate": "2026-05-16T19:03:47.007Z",
          "content": "<h3>Summary Injection</h3>\n<p>In some sense, my approach is already something like an LLM-as-a-judge (but a very biased one), the LLM will judge its current answer against the summaries of the other answers.</p>\n<p>Another feature that I have tried is to <a href=\"https://aimo.huikang.dev/runs/2025-12-08-23-35-59/communications/review-116wvp.txt\" target=\"_blank\">get a judge</a> to decide whether a summary is worth injecting <code>Another solver has presented the following finding ... Is this finding genuinely new and useful to you? Answer YES or NO</code>, before I inject the summary. I decided to remove that feature because the performance of solvers running individually is getting higher ceiling scores than mine, and I want to be strictly better than that setup. I no longer need a classifier to decide whether a finding is useful, I will just inject the finding if the boxed answers are different.</p>\n<p>My intention is to avoid distinct generation, summarization, and judgment stages. If I have multiple stages, I need to wait for every trace in each stage to complete or I interrupt, and tokens are wasted.</p>\n<p>A principle of my design here is to keep the main traces uninterrupted, so that I can be more confident that my approach is better than a setup where the solvers solve independently.</p>\n<h3>Inference Bottleneck</h3>\n<p>In my setup, all traces will continue to work until it passes the voting threshold or it times out. Traces will continue to generate even after the boxed answer is submitted, it will be given the status from the other traces and an instruction to check their answer. If a trace repeats the boxed answer multiple times, it will be backtracked to when it first repeated the boxed answer.</p>\n<p>If I assume all traces are doing productive work, I do not think I am wasting any GPU cycles.</p>\n<p>There is still a tradeoff being made though. If I terminate traces that submitted a boxed answer, I leave more memory and compute for other traces. Even so, I think it is faster to get a correct majority vote by fixing an early wrong answer than to be overpowered by other correct answers.</p>\n<h3>Ablations and Time Management</h3>\n<p>I observe that answer retraction actually retract wrong answers, and backtracking prevents the model from repeating the same submitted answer. I did not do ablation beyond these observations.</p>\n<p>On hindsight, I should have done ablations. Probably I should run 50 solve attempts on q9 and compare whether the win rate at least did not worsen, similar to what I did for the corpus prize submission. However, also on hindsight, improvements in q9 does not necessarily generalize to improvements in the leaderboard.</p>\n<p>The time budgeting did not get more complex, the decision to stop depends on the current vote distribution, once the vote passes, all in-flight generation will be stopped.</p>",
          "rawMarkdown": "### Summary Injection\n\nIn some sense, my approach is already something like an LLM-as-a-judge (but a very biased one), the LLM will judge its current answer against the summaries of the other answers.\n\nAnother feature that I have tried is to [get a judge](https://aimo.huikang.dev/runs/2025-12-08-23-35-59/communications/review-116wvp.txt) to decide whether a summary is worth injecting `Another solver has presented the following finding ... Is this finding genuinely new and useful to you? Answer YES or NO`, before I inject the summary. I decided to remove that feature because the performance of solvers running individually is getting higher ceiling scores than mine, and I want to be strictly better than that setup. I no longer need a classifier to decide whether a finding is useful, I will just inject the finding if the boxed answers are different.\n\nMy intention is to avoid distinct generation, summarization, and judgment stages. If I have multiple stages, I need to wait for every trace in each stage to complete or I interrupt, and tokens are wasted.\n\nA principle of my design here is to keep the main traces uninterrupted, so that I can be more confident that my approach is better than a setup where the solvers solve independently.\n\n\n### Inference Bottleneck\n\nIn my setup, all traces will continue to work until it passes the voting threshold or it times out. Traces will continue to generate even after the boxed answer is submitted, it will be given the status from the other traces and an instruction to check their answer. If a trace repeats the boxed answer multiple times, it will be backtracked to when it first repeated the boxed answer.\n\nIf I assume all traces are doing productive work, I do not think I am wasting any GPU cycles.\n\nThere is still a tradeoff being made though. If I terminate traces that submitted a boxed answer, I leave more memory and compute for other traces. Even so, I think it is faster to get a correct majority vote by fixing an early wrong answer than to be overpowered by other correct answers.\n\n\n### Ablations and Time Management\n\nI observe that answer retraction actually retract wrong answers, and backtracking prevents the model from repeating the same submitted answer. I did not do ablation beyond these observations.\n\nOn hindsight, I should have done ablations. Probably I should run 50 solve attempts on q9 and compare whether the win rate at least did not worsen, similar to what I did for the corpus prize submission. However, also on hindsight, improvements in q9 does not necessarily generalize to improvements in the leaderboard.\n\nThe time budgeting did not get more complex, the decision to stop depends on the current vote distribution, once the vote passes, all in-flight generation will be stopped."
        }
      ]
    },
    {
      "id": 3457735,
      "postDate": "2026-05-14T08:46:29.193Z",
      "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>Run-viewer case studies:</strong> You note you don't have GPU budget for systematic ablations, but the run viewer at aimo.huikang.dev/runs captures detailed traces. From those traces, do you have specific cases where the information-sharing step flipped a solver's answer from wrong to right (or vice versa), and a rough sense of how often that happens?</li>\n<li><strong>Comparison to Blackboard-style sharing:</strong> Your information-sharing summarises a solver's progress via a separate LLM call. <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/aimo3test\" target=\"_blank\">ippeiogawa's Blackboard</a> instead pushes raw tool I/O between solvers. How do you think these two approaches compare and what do you think are the advantages and disadvantages of each?</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. **Run-viewer case studies:** You note you don't have GPU budget for systematic ablations, but the run viewer at aimo.huikang.dev/runs captures detailed traces. From those traces, do you have specific cases where the information-sharing step flipped a solver's answer from wrong to right (or vice versa), and a rough sense of how often that happens?\n2. **Comparison to Blackboard-style sharing:** Your information-sharing summarises a solver's progress via a separate LLM call. [ippeiogawa's Blackboard](https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/aimo3test) instead pushes raw tool I/O between solvers. How do you think these two approaches compare and what do you think are the advantages and disadvantages of each?\n\nLook forward to reading your responses on these.\n",
      "votes": 1,
      "replies": [
        {
          "id": 3458858,
          "postDate": "2026-05-16T19:29:26.650Z",
          "content": "<h3>Run-viewer case studies</h3>\n<p>I only observe <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-08-01-13-08&amp;problem=424e18&amp;solution=2\" target=\"_blank\">one case</a> in q5 where the solver flipped from a correct answer (21818) to a wrong answer (62140).</p>\n<p>Specific cases where the information-sharing step flipped a solver's answer from wrong to right</p>\n<h3>q9 (dd7f5e, GT = 160)</h3>\n<p>learned from correct</p>\n<ul>\n<li>[214 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-04-01-43-44&amp;problem=dd7f5e&amp;solution=1\" target=\"_blank\">160</a>]</li>\n<li>[114 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-07-21-55-41&amp;problem=dd7f5e&amp;solution=2\" target=\"_blank\">160</a>]</li>\n</ul>\n<p>corrected based on difference</p>\n<ul>\n<li>[266 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-04-00-48-09&amp;problem=dd7f5e&amp;solution=2\" target=\"_blank\">160</a>]</li>\n<li>[266 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-04-01-38-17&amp;problem=dd7f5e&amp;solution=2\" target=\"_blank\">160</a>]</li>\n</ul>\n<p>corrected on its own</p>\n<ul>\n<li>[217 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-04-03-01-27&amp;problem=dd7f5e&amp;solution=1\" target=\"_blank\">160</a>]</li>\n<li>[266 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-12-22-20-54&amp;problem=dd7f5e&amp;solution=26\" target=\"_blank\">160</a>]</li>\n</ul>\n<h3>q10 (86e8e5, GT = 8687)</h3>\n<p>learned from correct</p>\n<ul>\n<li>[41754 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-10-01-27-04&amp;problem=86e8e5&amp;solution=3\" target=\"_blank\">8687</a>]</li>\n<li>[96985 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2026-02-18-05-21-35&amp;problem=86e8e5&amp;copy=9&amp;solution=7\" target=\"_blank\">8687</a>]</li>\n</ul>\n<p>corrected based on difference</p>\n<ul>\n<li>[41754 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-17-22-22-40&amp;problem=86e8e5&amp;copy=18&amp;solution=0\" target=\"_blank\">8687</a>]</li>\n<li>[7535 -&gt; <a href=\"https://aimo.huikang.dev/runs.html?datetime=2025-12-17-22-22-40&amp;problem=86e8e5&amp;copy=18&amp;solution=3\" target=\"_blank\">8687</a>]</li>\n</ul>\n<p>corrected on its own</p>\n<ul>\n<li>(none — every q10 rescue had at least some external signal)</li>\n</ul>\n<table>\n<thead>\n<tr>\n<th></th>\n<th>q9 (160)</th>\n<th>q10 (8687)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>total traces</td>\n<td>1411</td>\n<td>689</td>\n</tr>\n<tr>\n<td>did not box (no \\boxed)</td>\n<td>708 (50.2%)</td>\n<td>420 (61.0%)</td>\n</tr>\n<tr>\n<td>boxed only once — correct</td>\n<td>153 (10.8%)</td>\n<td>15  (2.2%)</td>\n</tr>\n<tr>\n<td>boxed only once — wrong</td>\n<td>76  (5.4%)</td>\n<td>91 (13.2%)</td>\n</tr>\n<tr>\n<td>stayed correct (multi-box, all GT)</td>\n<td>246 (17.4%)</td>\n<td>32  (4.6%)</td>\n</tr>\n<tr>\n<td>wrong → same wrong (one wrong value ≥2×)</td>\n<td>136  (9.6%)</td>\n<td>96 (13.9%)</td>\n</tr>\n<tr>\n<td>wrong → different wrong (≥2 wrong values)</td>\n<td>13  (0.9%)</td>\n<td>22  (3.2%)</td>\n</tr>\n<tr>\n<td>wrong → correct</td>\n<td>79  (5.6%)</td>\n<td>13  (1.9%)</td>\n</tr>\n<tr>\n<td>&nbsp;&nbsp;learned from correct</td>\n<td>58 (73.4% of 79)</td>\n<td>7 (53.8% of 13)</td>\n</tr>\n<tr>\n<td>&nbsp;&nbsp;corrected based on difference</td>\n<td>13 (16.5% of 79)</td>\n<td>6 (46.2% of 13)</td>\n</tr>\n<tr>\n<td>&nbsp;&nbsp;corrected on its own</td>\n<td>8 (10.1% of 79)</td>\n<td>0  (0.0% of 13)</td>\n</tr>\n<tr>\n<td>correct → wrong</td>\n<td>0 (0.0%)</td>\n<td>0 (0.0%)</td>\n</tr>\n</tbody>\n</table>\n<h3>Comparison to Blackboard-style sharing</h3>\n<p>I think sharing code is a great idea, I should have tried that approach when sharing summaries.</p>\n<p>An issue I tried to resolve for my pipeline is that the model is not trying very hard to understand solutions that are different from theirs. I believe if models are provided the code and its output, the models would make a much better effort to understand the differences.</p>\n<p>Sharing code means that you need to ensure that the code works. The code shared needs to be runnable standalone, or otherwise the recipient will waste time debugging the code—and perhaps require a mechanism to test that the code could run on its own. However, even so, for the same tokens and time budget, I think that code is more effective than a pure-text sharing.</p>",
          "rawMarkdown": "### Run-viewer case studies\n\n\nI only observe [one case](https://aimo.huikang.dev/runs.html?datetime=2025-12-08-01-13-08&problem=424e18&solution=2) in q5 where the solver flipped from a correct answer (21818) to a wrong answer (62140).\n\n\nSpecific cases where the information-sharing step flipped a solver's answer from wrong to right\n\n\n### q9 (dd7f5e, GT = 160)\n\nlearned from correct\n- [214 -> [160](https://aimo.huikang.dev/runs.html?datetime=2025-12-04-01-43-44&problem=dd7f5e&solution=1)]\n- [114 -> [160](https://aimo.huikang.dev/runs.html?datetime=2025-12-07-21-55-41&problem=dd7f5e&solution=2)]\n\ncorrected based on difference\n- [266 -> [160](https://aimo.huikang.dev/runs.html?datetime=2025-12-04-00-48-09&problem=dd7f5e&solution=2)]\n- [266 -> [160](https://aimo.huikang.dev/runs.html?datetime=2025-12-04-01-38-17&problem=dd7f5e&solution=2)]\n\ncorrected on its own\n- [217 -> [160](https://aimo.huikang.dev/runs.html?datetime=2025-12-04-03-01-27&problem=dd7f5e&solution=1)]\n- [266 -> [160](https://aimo.huikang.dev/runs.html?datetime=2025-12-12-22-20-54&problem=dd7f5e&solution=26)]\n\n### q10 (86e8e5, GT = 8687)\n\nlearned from correct\n- [41754 -> [8687](https://aimo.huikang.dev/runs.html?datetime=2025-12-10-01-27-04&problem=86e8e5&solution=3)]\n- [96985 -> [8687](https://aimo.huikang.dev/runs.html?datetime=2026-02-18-05-21-35&problem=86e8e5&copy=9&solution=7)]\n\ncorrected based on difference\n- [41754 -> [8687](https://aimo.huikang.dev/runs.html?datetime=2025-12-17-22-22-40&problem=86e8e5&copy=18&solution=0)]\n- [7535 -> [8687](https://aimo.huikang.dev/runs.html?datetime=2025-12-17-22-22-40&problem=86e8e5&copy=18&solution=3)]\n\ncorrected on its own\n- (none — every q10 rescue had at least some external signal)\n\n\n|                                                |     q9 (160) |  q10 (8687) |\n|------------------------------------------------|-------------:|------------:|\n| total traces                                   |         1411 |         689 |\n| did not box (no \\boxed)                        |  708 (50.2%) | 420 (61.0%) |\n| boxed only once — correct                      |  153 (10.8%) |  15  (2.2%) |\n| boxed only once — wrong                        |   76  (5.4%) |  91 (13.2%) |\n| stayed correct (multi-box, all GT)             |  246 (17.4%) |  32  (4.6%) |\n| wrong → same wrong (one wrong value ≥2×)       |  136  (9.6%) |  96 (13.9%) |\n| wrong → different wrong (≥2 wrong values)      |   13  (0.9%) |  22  (3.2%) |\n| wrong → correct                                |   79  (5.6%) |  13  (1.9%) |\n| &nbsp;&nbsp;learned from correct               | 58 (73.4% of 79) | 7 (53.8% of 13) |\n| &nbsp;&nbsp;corrected based on difference      | 13 (16.5% of 79) | 6 (46.2% of 13) |\n| &nbsp;&nbsp;corrected on its own               |  8 (10.1% of 79) | 0  (0.0% of 13) |\n| correct → wrong                                |     0 (0.0%) |    0 (0.0%) |\n\n\n### Comparison to Blackboard-style sharing\n\nI think sharing code is a great idea, I should have tried that approach when sharing summaries.\n\nAn issue I tried to resolve for my pipeline is that the model is not trying very hard to understand solutions that are different from theirs. I believe if models are provided the code and its output, the models would make a much better effort to understand the differences.\n\nSharing code means that you need to ensure that the code works. The code shared needs to be runnable standalone, or otherwise the recipient will waste time debugging the code—and perhaps require a mechanism to test that the code could run on its own. However, even so, for the same tokens and time budget, I think that code is more effective than a pure-text sharing."
        }
      ]
    },
    {
      "id": 3443942,
      "postDate": "2026-04-17T02:13:19.387Z",
      "content": "<p>Interesting. I felt there were 2 kinds of hard problems. Ones like the Norwegian problem, which is pass@10/20 problem and another one where model quickly converges to wrong answer. I doubt the unsolvable ones are on the latter category where oss120B overfits on the problem and converges to wrong answer(by searching memory) in under a minute.</p>\n<p>On the point of interrupting the trace, what I found to be working with oss120B was to interrupt/inject with assistant role. User role interruption or non harmony encoding interruptions often broke the COT</p>",
      "rawMarkdown": "Interesting. I felt there were 2 kinds of hard problems. Ones like the Norwegian problem, which is pass@10/20 problem and another one where model quickly converges to wrong answer. I doubt the unsolvable ones are on the latter category where oss120B overfits on the problem and converges to wrong answer(by searching memory) in under a minute.\n\n\nOn the point of interrupting the trace, what I found to be working with oss120B was to interrupt/inject with assistant role. User role interruption or non harmony encoding interruptions often broke the COT",
      "votes": 3
    },
    {
      "id": 3444907,
      "postDate": "2026-04-18T17:00:01.610Z",
      "content": "<p>Interesting approach, your observation that collaboration mainly helps on multi-part problems is especially insightful</p>",
      "rawMarkdown": "Interesting approach, your observation that collaboration mainly helps on multi-part problems is especially insightful"
    },
    {
      "id": 3444366,
      "postDate": "2026-04-17T17:56:48.073Z",
      "content": "<p>Have you shared this for the writeup prize, or just for the community?</p>\n<p>In the former case, please leave a comment here linking to this writeup here <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/689703\" target=\"_blank\">https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/689703</a></p>",
      "rawMarkdown": "Have you shared this for the writeup prize, or just for the community?\n\nIn the former case, please leave a comment here linking to this writeup here https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/689703\n",
      "replies": [
        {
          "id": 3444372,
          "postDate": "2026-04-17T18:02:38.160Z",
          "content": "<p>Thanks for reaching out!</p>\n<p>On whether I am writing this for the writeup prize, it depends on my final score, before I invest in writing a full write-up that is worth your time to judge.</p>\n<p>For now, I am just happy to share my html file.</p>",
          "rawMarkdown": "Thanks for reaching out!\n\nOn whether I am writing this for the writeup prize, it depends on my final score, before I invest in writing a full write-up that is worth your time to judge.\n\nFor now, I am just happy to share my html file.",
          "replies": [
            {
              "id": 3445890,
              "postDate": "2026-04-20T16:27:22.800Z",
              "content": "<p>Fair enough. But please note that we learned that it will likely be later than the Write-Up Prize deadline that the private LB scores will come in: <a href=\"https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/693267\" target=\"_blank\">https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/693267</a></p>\n<p>So it looks like you may have to make a decision whether you want to go all in or not. In any case, I am sure whatever you come up with will be well worth read. You are a veteran AIMO participant by now :)</p>",
              "rawMarkdown": "Fair enough. But please note that we learned that it will likely be later than the Write-Up Prize deadline that the private LB scores will come in: https://www.kaggle.com/competitions/ai-mathematical-olympiad-progress-prize-3/discussion/693267\n\nSo it looks like you may have to make a decision whether you want to go all in or not. In any case, I am sure whatever you come up with will be well worth read. You are a veteran AIMO participant by now :)"
            }
          ]
        }
      ]
    }
  ],
  "complete": true,
  "source": "live",
  "fetched_at": "2026-10-20T04:20:14Z",
  "competition_id": 118448,
  "competition_slug": "ai-mathematical-olympiad-progress-prize-3",
  "team_id": 14799743,
  "solution_url": "/competitions/ai-mathematical-olympiad-progress-prize-3/writeups/attempts-to-get-gpt-oss-120b-to-collaborate"
}