{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/lucumr-pocoo-org/2026-08-19-what-is-reasoning/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "A few weeks ago [a paper was shared](https://arxiv.org/html/2608.09867v1) that showed how to extract reasoning traces from closed-weight models. Together with online discussions about tricking models into leaking them, it made me investigate it more out of curiosity. Twitter seems full of half-truths and confusion about how this works, so perhaps this helps some to understand what is happening.\n\n## Hiding Traces\n\nReasoning traces are usually hidden from us. [We have lamented this](https://earendil.com/posts/session-portability/), but mostly have to accept it. Open-weight models thankfully reveal them, and from their behavior you can see that their traces can be long and confusing. This is probably a good reason to separate them from what is normally shown to users.\n\nAt minimum, UIs need to detect them. The industry has done a good job at making reasoning traces sound special and exotic, but they really are just text: the model is trained to emit its thinking into a scratchpad as part of its response, before its final answer.\n\nGPT-OSS’s Harmony response format makes this easy to see:\n\n```\n<|channel|>analysis<|message|>\nI need to work this out ...\n<|end|><|start|>assistant<|channel|>final<|message|>\nThe answer is ...\n<|return|>\n```\n\nThe markers are special tokens, but the reasoning between them uses “the same text” as the final answer (just that GPT chain-of-thought text sounds really funny). When the model samples the `analysis` channel token, a parser routes the following text into a separate stream exposed through the Responses API. For closed models, presumably a simple model redacts and summarizes it.\n\n## Reasoning Effort\n\nHow much budget goes to reasoning? Earlier APIs exposed reasoning token budgets, making it seem like a property of the sampling process. In reality, reasoning effort is baked into the system prompt. GPT-OSS puts this into the system prompt:\n\n```\nReasoning: low\n```\n\nThat’s it. Training produces the resulting behavior, such as emitting the token sequence that switches to the `analysis` channel. This also explains why changing the effort invalidates the KV cache. I think closed GPT models call reasoning effort “juice,” since you can ask most models how much juice they have.\n\nIn [DwarfStar](https://github.com/antirez/ds4) for DeepSeek with max reasoning this is added to the system prompt:\n\n```\nReasoning Effort: Absolute maximum with no shortcuts permitted.\nYou MUST be very thorough in your thinking and comprehensively decompose the\nproblem to resolve the root cause, rigorously stress-testing your logic against\nall potential paths, edge cases, and adversarial scenarios.\n```\n\n## Don’t Think\n\nThe destination of reasoning tokens is therefore a learned convention: the model is trained to keep scratch work out of the `final` channel. Trick it into thinking it is in that channel and it may leak tokens. We have even seen older models, when thinking is disabled, reason into the bash tool and echo their thoughts to `/dev/null`.\n\nSo in some sense the only “special” behavior for some models is not to think. That at times is done by “mechanically” removing the model’s usual ways to think. In [DwarfStar](https://github.com/antirez/ds4), disabled thinking uses the prefill `</think>`, while enabled thinking uses `<think>`, which are the tokens that close and start thinking. GPT-OSS doesn’t prefill but lets the model decide either way on its own.\n\nBut presumably, some inference APIs prefill the opening token when reasoning is enabled, so the model never samples it itself and might prevent the sampling of the reasoning token when disabled since it can be trivially detected. This may explain why a [custom `think` tool](https://gist.github.com/mitsuhiko/0904a3d89741e8e3bcca1ca93ea076de) can trick models into putting some reasoning where it should not go — but only when native reasoning is disabled.\n\nFun fact: this blog post triggered safey checks\n\nHilariously enough I was unable to use GPT 5.6 terra for spell and grammar checking on this blog post because of safety filters. Had to switch to Kimi.\n\n![GPT-5.6-terra refusing to spell-check this blog post](https://lucumr.pocoo.org/static/gpt-5.6-terra-spell-check.png)\n\nThis entry was tagged [ai](https://lucumr.pocoo.org/tags/ai/)\n\n[copy as](https://lucumr.pocoo.org/2026/8/19/what-is-reasoning.md) / [view](https://lucumr.pocoo.org/2026/8/19/what-is-reasoning.md) markdown\n",
  "authors": [
    "Armin Ronacher"
  ],
  "captured_at": "2026-09-19T21:30:23.395188495+00:00",
  "category": "programming",
  "content_html": "<p>A few weeks ago <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/html/2608.09867v1\">a paper was shared</a> that showed how to extract reasoning traces from closed-weight models. Together with online discussions about tricking models into leaking them, it made me investigate it more out of curiosity. Twitter seems full of half-truths and confusion about how this works, so perhaps this helps some to understand what is happening.</p>\n<h2>Hiding Traces</h2>\n<p>Reasoning traces are usually hidden from us. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://earendil.com/posts/session-portability/\">We have lamented this</a>, but mostly have to accept it. Open-weight models thankfully reveal them, and from their behavior you can see that their traces can be long and confusing. This is probably a good reason to separate them from what is normally shown to users.</p>\n<p>At minimum, UIs need to detect them. The industry has done a good job at making reasoning traces sound special and exotic, but they really are just text: the model is trained to emit its thinking into a scratchpad as part of its response, before its final answer.</p>\n<p>GPT-OSS’s Harmony response format makes this easy to see:</p>\n<pre><code><span class=\"code-snippet\">&lt;|channel|&gt;analysis&lt;|message|&gt;\nI need to work this out ...\n&lt;|end|&gt;&lt;|start|&gt;assistant&lt;|channel|&gt;final&lt;|message|&gt;\nThe answer is ...\n&lt;|return|&gt;\n</span></code></pre>\n<p>The markers are special tokens, but the reasoning between them uses “the same text” as the final answer (just that GPT chain-of-thought text sounds really funny). When the model samples the <code>analysis</code> channel token, a parser routes the following text into a separate stream exposed through the Responses API. For closed models, presumably a simple model redacts and summarizes it.</p>\n<h2>Reasoning Effort</h2>\n<p>How much budget goes to reasoning? Earlier APIs exposed reasoning token budgets, making it seem like a property of the sampling process. In reality, reasoning effort is baked into the system prompt. GPT-OSS puts this into the system prompt:</p>\n<pre><code><span class=\"code-snippet\">Reasoning: low\n</span></code></pre>\n<p>That’s it. Training produces the resulting behavior, such as emitting the token sequence that switches to the <code>analysis</code> channel. This also explains why changing the effort invalidates the KV cache. I think closed GPT models call reasoning effort “juice,” since you can ask most models how much juice they have.</p>\n<p>In <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/antirez/ds4\">DwarfStar</a> for DeepSeek with max reasoning this is added to the system prompt:</p>\n<pre><code><span class=\"code-snippet\">Reasoning Effort: Absolute maximum with no shortcuts permitted.\nYou MUST be very thorough in your thinking and comprehensively decompose the\nproblem to resolve the root cause, rigorously stress-testing your logic against\nall potential paths, edge cases, and adversarial scenarios.\n</span></code></pre>\n<h2>Don’t Think</h2>\n<p>The destination of reasoning tokens is therefore a learned convention: the model is trained to keep scratch work out of the <code>final</code> channel. Trick it into thinking it is in that channel and it may leak tokens. We have even seen older models, when thinking is disabled, reason into the bash tool and echo their thoughts to <code>/dev/null</code>.</p>\n<p>So in some sense the only “special” behavior for some models is not to think. That at times is done by “mechanically” removing the model’s usual ways to think. In <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/antirez/ds4\">DwarfStar</a>, disabled thinking uses the prefill <code>&lt;/think&gt;</code>, while enabled thinking uses <code>&lt;think&gt;</code>, which are the tokens that close and start thinking. GPT-OSS doesn’t prefill but lets the model decide either way on its own.</p>\n<p>But presumably, some inference APIs prefill the opening token when reasoning is enabled, so the model never samples it itself and might prevent the sampling of the reasoning token when disabled since it can be trivially detected. This may explain why a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://gist.github.com/mitsuhiko/0904a3d89741e8e3bcca1ca93ea076de\">custom <code>think</code> tool</a> can trick models into putting some reasoning where it should not go — but only when native reasoning is disabled.</p>\n<p>Fun fact: this blog post triggered safey checks</p>\n<p>Hilariously enough I was unable to use GPT 5.6 terra for spell and grammar checking on this blog post because of safety filters. Had to switch to Kimi.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://lucumr.pocoo.org/static/gpt-5.6-terra-spell-check.png\" alt=\"GPT-5.6-terra refusing to spell-check this blog post\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>This entry was tagged <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://lucumr.pocoo.org/tags/ai/\">ai</a></p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://lucumr.pocoo.org/2026/8/19/what-is-reasoning.md\">copy as</a> / <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://lucumr.pocoo.org/2026/8/19/what-is-reasoning.md\">view</a> markdown</p>\n",
  "content_markdown": "A few weeks ago [a paper was shared](https://arxiv.org/html/2608.09867v1) that showed how to extract reasoning traces from closed-weight models. Together with online discussions about tricking models into leaking them, it made me investigate it more out of curiosity. Twitter seems full of half-truths and confusion about how this works, so perhaps this helps some to understand what is happening.\n\n## Hiding Traces\n\nReasoning traces are usually hidden from us. [We have lamented this](https://earendil.com/posts/session-portability/), but mostly have to accept it. Open-weight models thankfully reveal them, and from their behavior you can see that their traces can be long and confusing. This is probably a good reason to separate them from what is normally shown to users.\n\nAt minimum, UIs need to detect them. The industry has done a good job at making reasoning traces sound special and exotic, but they really are just text: the model is trained to emit its thinking into a scratchpad as part of its response, before its final answer.\n\nGPT-OSS’s Harmony response format makes this easy to see:\n\n```\n<|channel|>analysis<|message|>\nI need to work this out ...\n<|end|><|start|>assistant<|channel|>final<|message|>\nThe answer is ...\n<|return|>\n```\n\nThe markers are special tokens, but the reasoning between them uses “the same text” as the final answer (just that GPT chain-of-thought text sounds really funny). When the model samples the `analysis` channel token, a parser routes the following text into a separate stream exposed through the Responses API. For closed models, presumably a simple model redacts and summarizes it.\n\n## Reasoning Effort\n\nHow much budget goes to reasoning? Earlier APIs exposed reasoning token budgets, making it seem like a property of the sampling process. In reality, reasoning effort is baked into the system prompt. GPT-OSS puts this into the system prompt:\n\n```\nReasoning: low\n```\n\nThat’s it. Training produces the resulting behavior, such as emitting the token sequence that switches to the `analysis` channel. This also explains why changing the effort invalidates the KV cache. I think closed GPT models call reasoning effort “juice,” since you can ask most models how much juice they have.\n\nIn [DwarfStar](https://github.com/antirez/ds4) for DeepSeek with max reasoning this is added to the system prompt:\n\n```\nReasoning Effort: Absolute maximum with no shortcuts permitted.\nYou MUST be very thorough in your thinking and comprehensively decompose the\nproblem to resolve the root cause, rigorously stress-testing your logic against\nall potential paths, edge cases, and adversarial scenarios.\n```\n\n## Don’t Think\n\nThe destination of reasoning tokens is therefore a learned convention: the model is trained to keep scratch work out of the `final` channel. Trick it into thinking it is in that channel and it may leak tokens. We have even seen older models, when thinking is disabled, reason into the bash tool and echo their thoughts to `/dev/null`.\n\nSo in some sense the only “special” behavior for some models is not to think. That at times is done by “mechanically” removing the model’s usual ways to think. In [DwarfStar](https://github.com/antirez/ds4), disabled thinking uses the prefill `</think>`, while enabled thinking uses `<think>`, which are the tokens that close and start thinking. GPT-OSS doesn’t prefill but lets the model decide either way on its own.\n\nBut presumably, some inference APIs prefill the opening token when reasoning is enabled, so the model never samples it itself and might prevent the sampling of the reasoning token when disabled since it can be trivially detected. This may explain why a [custom `think` tool](https://gist.github.com/mitsuhiko/0904a3d89741e8e3bcca1ca93ea076de) can trick models into putting some reasoning where it should not go — but only when native reasoning is disabled.\n\nFun fact: this blog post triggered safey checks\n\nHilariously enough I was unable to use GPT 5.6 terra for spell and grammar checking on this blog post because of safety filters. Had to switch to Kimi.\n\n![GPT-5.6-terra refusing to spell-check this blog post](https://lucumr.pocoo.org/static/gpt-5.6-terra-spell-check.png)\n\nThis entry was tagged [ai](https://lucumr.pocoo.org/tags/ai/)\n\n[copy as](https://lucumr.pocoo.org/2026/8/19/what-is-reasoning.md) / [view](https://lucumr.pocoo.org/2026/8/19/what-is-reasoning.md) markdown\n",
  "dateCreated": "2026-09-19T21:30:23.395188495+00:00",
  "date_created": "2026-08-19T00:00:00+00:00",
  "date_modified": "2026-08-19T00:00:00+00:00",
  "date_published": "2026-08-19T00:00:00+00:00",
  "description": "A few weeks ago a paper was shared that showed how to extract reasoning traces from closed-weight models. Together with online discussions about tricking models into leaking them, it made me investigate it more out of curiosity. Twitter…",
  "external_url": "https://lucumr.pocoo.org/2026/8/19/what-is-reasoning/",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/lucumr-pocoo-org/2026/08/2026-08-19-what-is-reasoning.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/lucumr-pocoo-org/2026/08/2026-08-19-what-is-reasoning.md"
  },
  "id": "urn:aggr:item:bac6ce9d4112c592823c692448d42748e4f5b1d5",
  "isBasedOn": {
    "@id": "https://lucumr.pocoo.org/2026/8/19/what-is-reasoning/"
  },
  "mainEntity": {
    "@id": "https://lucumr.pocoo.org/2026/8/19/what-is-reasoning/",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/lucumr-pocoo-org/2026-08-19-what-is-reasoning/#webpage"
    },
    "author": [
      {
        "@type": "Person",
        "name": "Armin Ronacher"
      }
    ],
    "dateModified": "2026-08-19T00:00:00+00:00",
    "datePublished": "2026-08-19T00:00:00+00:00",
    "headline": "What Is Reasoning",
    "timeRequired": "PT3M",
    "url": "https://lucumr.pocoo.org/2026/8/19/what-is-reasoning/",
    "wordCount": 638
  },
  "name": "Archived snapshot: What Is Reasoning",
  "preview": null,
  "reading_minutes": 3,
  "replicated_at": null,
  "source": "lucumr-pocoo-org",
  "source_name": "Armin Ronacher's Thoughts and Writings",
  "summary": null,
  "tags": [],
  "temporalCoverage": "2026-09-19T21:30:23.395188495+00:00",
  "title": "What Is Reasoning",
  "url": "https://aggr.aymericbeaumet.com/items/lucumr-pocoo-org/2026-08-19-what-is-reasoning/",
  "word_count": 638
}