<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Llms | AkitaOnRails.com</title><link>https://akitaonrails.github.io/en/tags/llms/</link><description>Fabio Akita's blog — tech, career, and assorted geek topics. English edition.</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Mon, 19 Oct 2026 23:20:51 +0000</lastBuildDate><atom:link href="https://akitaonrails.github.io/en/tags/llms/index.xml" rel="self" type="application/rss+xml"/><item><title>LLM Benchmark v4: the top open source LLMs on a B300</title><link>https://akitaonrails.github.io/en/2026/10/19/llm-benchmark-v4-the-top-open-source-llms-on-a-b300/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/10/19/llm-benchmark-v4-the-top-open-source-llms-on-a-b300/</guid><pubDate>Mon, 19 Oct 2026 14:00:00 -0300</pubDate><description>&lt;p&gt;In the last two v4 benchmark posts I &lt;a href="https://akitaonrails.github.io/en/2026/09/15/new-llm-benchmark-v4-retesting-all-top-llms-part-1/"&gt;rebuilt the test from scratch&lt;/a&gt;, with a Rails app sabotaged on purpose across seven sprints, and &lt;a href="https://akitaonrails.github.io/en/2026/09/15/new-llm-benchmark-v4-retesting-39-llms-part-2/"&gt;ranked 39 models&lt;/a&gt; by vigilance: six ties at the top, a free model beating half of Claude. Then I &lt;a href="https://akitaonrails.github.io/en/2026/09/23/llm-benchmark-v4-opus-5-5-gpt-6-sol-luna-mimo-2-6-grok-4-7/"&gt;tested five new models&lt;/a&gt;, Opus 5.5, GPT 6 sol and luna, MiMo V2.6 Pro and Grok 4.7: Opus 5.5 closed at 100 and joined the tie at the top, GPT 6 luna scored 95.5 for under a dollar a run, and Grok 4.7 regressed badly against its own predecessor.&lt;/p&gt;</description><content:encoded><![CDATA[<p>In the last two v4 benchmark posts I <a href="/en/2026/09/15/new-llm-benchmark-v4-retesting-all-top-llms-part-1/">rebuilt the test from scratch</a>, with a Rails app sabotaged on purpose across seven sprints, and <a href="/en/2026/09/15/new-llm-benchmark-v4-retesting-39-llms-part-2/">ranked 39 models</a> by vigilance: six ties at the top, a free model beating half of Claude. Then I <a href="/en/2026/09/23/llm-benchmark-v4-opus-5-5-gpt-6-sol-luna-mimo-2-6-grok-4-7/">tested five new models</a>, Opus 5.5, GPT 6 sol and luna, MiMo V2.6 Pro and Grok 4.7: Opus 5.5 closed at 100 and joined the tie at the top, GPT 6 luna scored 95.5 for under a dollar a run, and Grok 4.7 regressed badly against its own predecessor.</p>
<p>One category was missing that I had never tested properly: the big open source models. The ones that fit on my <a href="/en/2026/01/21/omarchy-3-dual-gpu-setup-with-amd-and-nvidia/">RTX 5090</a> with 32 GB or on my <a href="/en/2026/03/31/minisforum-ms-s1-max-amd-ai-max-395-review/">Strix Halo</a> with 61 GB usable by the GPU are too weak for this. They work for simple agent tasks, and no small model handles real programming tasks, let alone a complex software project.</p>
<p>Qwen 3.8 27B took 706 minutes to finish v4 on the Strix and scored 80; the local GLM-4.7-Flash scored 24. So don&rsquo;t even try.</p>
<p>But what if we push harder? What can mid-sized models, 100 to 400 billion parameters, do running on a single rented B300? I could rent four of them and run the giant 750-billion or one-trillion models, and I&rsquo;m not sure the cost-benefit is worth it. The data below answers.</p>
<blockquote>
  <p><strong>TL;DR:</strong> 14 open models, one 288 GB B300 on Runpod at about 9 dollars an hour, the same v4 sabotage protocol. None of them serves fast the way it ships: GLM 5.3 Flash decoded at 10 tokens per second with the default configuration and at 141 after tuning, 14 times more from flags alone. Two open models, GLM 5.3 Flash and Qwen3.8 Flash-Next, scored 92.5, Claude Sonnet 5 level, and Swift 1.5 27B scored 88, Opus 4.6 level. None reached the frontier&rsquo;s 100. The 397-billion flagship scored 68.5 and let an admin backdoor through, DeepSeek V4 Flash scored 86 in the cloud and 44.5 served by me, and Nemotron cheated on a regression test. The cloud API of the same model costs a dollar per run; the pod costs 218 dollars a day. Jump to <a href="#what-a-b300-is-and-what-runpod-is">B300 and Runpod</a>, <a href="#none-of-them-serves-fast-the-way-it-ships">server tuning</a>, the <a href="#the-ranking">ranking</a>, the <a href="#the-interesting-cases">interesting cases</a>, the <a href="#how-far-from-the-frontier">frontier comparison</a>, the <a href="#the-math">math</a> or the <a href="#is-owning-your-own-infra-worth-it">conclusion</a>.</p>

</blockquote>
<h2>What a B300 is, and what Runpod is<span class="hx:absolute hx:-mt-20" id="what-a-b300-is-and-what-runpod-is"></span>
    <a href="#what-a-b300-is-and-what-runpod-is" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The <strong>B300</strong> is the datacenter GPU of NVIDIA&rsquo;s Blackwell Ultra generation, announced in March 2025. Each card has <a href="https://developer.nvidia.com/blog/nvidia-blackwell-ultra-for-the-era-of-ai-reasoning/"target="_blank" rel="noopener">288 GB of HBM3e memory</a>, nine times my 5090, and about 15 petaflops of dense compute in NVFP4, the 4-bit format Blackwell does in hardware. It&rsquo;s the card that goes inside the GB300 NVL72 rack, 72 of them interconnected, which AI companies buy by the thousands.</p>
<p>On its own, a B300 costs more than an apartment. What makes it accessible is renting by the hour.</p>
<p><a href="https://www.runpod.io/"target="_blank" rel="noopener"><strong>Runpod</strong></a> is a cloud GPU provider that rents cards in &ldquo;pods&rdquo;, Linux containers with one or more GPUs, billed per second. You pick the card, an image template, get in over SSH, and pay while the pod is on, idle included. The B300 cost about <a href="https://www.runpod.io/pricing"target="_blank" rel="noopener">9 dollars an hour</a> on their secure cloud the week of the test; an H100 goes for 3 to 4. The container disk is ephemeral: terminate the pod and the 250 GB of weights you downloaded are gone, and you download again.</p>
<p>The pod I used: one B300 with 275 GiB according to <code>nvidia-smi</code> (the same nominal 288 GB, in binary units), 344 vCPUs, 4 TB of host RAM, 700 GB of disk. The inference server was vLLM; the harness was the same OpenCode as every other model in the ranking, connected to the pod through an SSH tunnel. The model runs there; the code, the tests and the results stay on my machine.</p>
<p>Fitting in memory is the first filter. The B300 fits the 100 to 400-billion-parameter models quantized to NVFP4, plus the 27 to 35-billion ones in BF16. Left out are the 753-billion GLM 5.3 flagship, the 750-billion DeepSeek V4.1 Flash, the 1.6-trillion DeepSeek V4 Pro and the 2.8-trillion Kimi K3. For those it would take four B300s or more, about 36 dollars an hour.</p>
<h2>The methodology<span class="hx:absolute hx:-mt-20" id="the-methodology"></span>
    <a href="#the-methodology" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The protocol is the usual <a href="/en/2026/09/15/new-llm-benchmark-v4-retesting-all-top-llms-part-1/">v4</a>: the model builds a Rails app across seven accumulating sprints, and between sprints an independent reviewer, isolated from the model, injects 14 sabotages, from real CVEs to silent logic and test regressions, into the code the model itself wrote. The 0-to-100 score measures vigilance: how much the model catches and fixes without being told (full weight), how much it fixes after an explicit &ldquo;do a security audit&rdquo; in the last sprint (40% of the weight), and what stays unresolved (zero). Tiers are A from 83 up, B from 73 to 82, C from 51 to 72, D up to 50.</p>
<p>Two differences this round. The first is the reviewer: the five models that finished before the block were reviewed end to end by Codex, as in the previous rounds.</p>
<p>Midway through the batch OpenAI&rsquo;s security service started refusing the injection and grading operation with a cybersecurity risk flag, even though it&rsquo;s my code, on my machine, in a benchmark with 46 models already scored under the same protocol. I switched the reviewer to Claude Opus 4.8 for the remaining models, with the same injection plan, same catalog, same yardstick, and the provenance of every boundary is recorded per sprint. The expected impact on the score is none, because both execute the same written recipe.</p>
<p>The second is admission by speed, which is the subject of the next section. A model that decodes below 100 tokens per second doesn&rsquo;t even get on the track.</p>
<p>Also: an open model is entitled to up to two short nudges per run for silly defects (a missing import, a wrong test entry point), recorded as &ldquo;assisted&rdquo;. Infrastructure failure, driver, loader, parser, is never charged to the model. And the pod ran one model at a time, with no access to any other model&rsquo;s workspace or results.</p>
<h2>None of them serves fast the way it ships<span class="hx:absolute hx:-mt-20" id="none-of-them-serves-fast-the-way-it-ships"></span>
    <a href="#none-of-them-serves-fast-the-way-it-ships" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The first lesson cost a day. I downloaded <a href="https://huggingface.co/RedHatAI/GLM-5.3-Flash-NVFP4"target="_blank" rel="noopener">GLM 5.3 Flash</a>, 320 billion parameters with 18 active, quantized to NVFP4, 198 GB. I brought it up on vLLM with the configuration that &ldquo;works&rdquo;: it serves, passes the tool-call tests, answers. And it decoded at <strong>10 tokens per second</strong>, with the GPU at 10% utilization, 209 watts out of the 1,100 the pod allows.</p>
<p>That&rsquo;s unusable for programming. A coding agent generates tens of thousands of tokens per sprint; at 10 per second, a 20-minute sprint becomes more than four hours.</p>
<p>The same checkpoint, same 128K-token context, same FP8 KV cache, same test prompt, changing only the compile and mode flags: <strong>141 tokens per second</strong>. Fourteen times faster, zero change in precision or weights.</p>
<p>The main culprit was <code>--enforce-eager</code>, which disables vLLM&rsquo;s <code>torch.compile</code> and CUDA graph capture, and which every tutorial tells you to enable &ldquo;to start faster&rdquo;. It starts faster and serves 14 times slower. The measurement changed that flag together with the <code>interactivity</code> mode, so I didn&rsquo;t isolate each one&rsquo;s contribution.</p>
<p>Hence the admission rule: <strong>below 100 tokens per second I consider unusable</strong>, and no model enters the benchmark without clearing that on the median of two warm 256-token probes, after a cold one. To keep it from becoming a bottomless pit, tuning is bounded: at most three configurations and 45 minutes of wall-clock per model, including load and compilation. And tuning can never trade quality for speed: no shortening the context, lowering reasoning effort or quantizing further to hit the number.</p>
<p>The tweaks that paid off for everyone:</p>
<ul>
<li><strong>Install a CUDA that compiles for the card.</strong> Runpod&rsquo;s default image ships CUDA 12.8, whose <code>nvcc</code> <a href="https://developer.nvidia.com/cuda-gpus"target="_blank" rel="noopener">cannot compile for <code>compute_103a</code></a>, the B300&rsquo;s compute capability. Without 12.9, the NVFP4 kernels never compile.</li>
<li><strong>Never use <code>--enforce-eager</code>.</strong> Letting vLLM compile and capture CUDA graphs is the single biggest win.</li>
<li><strong><code>--performance-mode interactivity</code></strong>: optimize for single-stream latency, which is what a serial agent needs, instead of aggregate throughput.</li>
<li><strong>FP8 KV cache on the big MoEs, prefix caching and chunked prefill on all of them</strong>, confirmed by vLLM&rsquo;s Prometheus counters instead of assumed: on an 11K-token prompt, the server reused exactly 8,576 prefix tokens on every repeat.</li>
<li><strong>The right tool and reasoning parser for each family.</strong> The wrong parser makes tool calls vanish silently or leaks the reasoning into the answer.</li>
</ul>
<p>And the specific tweaks I found most interesting:</p>
<ul>
<li><strong>NVFP4 only runs on vLLM.</strong> The 198 to 251 GB checkpoints in Blackwell&rsquo;s native FP4 are the only way to fit on the card, and llama.cpp and Ollama simply don&rsquo;t load those formats. Whoever lives on GGUF has no access to this range.</li>
<li><strong>Native speculative decoding.</strong> Qwen 3.8 27B went from 92 to 195 tokens per second with the MTP head the checkpoint itself ships, predicting three tokens per step, plus <code>--language-model-only</code> to drop the vision tower (measured on different pods, so no controlled ablation). <a href="https://huggingface.co/meta-models/Muse-Glimmer-30B"target="_blank" rel="noopener">Muse Glimmer</a> reached 295 with the lightweight DFlash drafter it ships alongside, 15 speculated tokens per step. I only enabled it where an official drafter exists and where tool calling stayed correct; for Ornith a drafter exists as a separate release, with unknown acceptance rate, so it stayed off.</li>
<li><strong>The CUDA 12 loader.</strong> flashinfer JIT-compiles an NVFP4 MoE kernel that needs <code>libcudart.so.12</code>, and after installing CUDA 13 for Nemotron the library resolution broke. The symptom looked like OOM; the cause was an <code>ld.so.conf</code>. A repair script with <code>ldd</code> evidence before and after fixed it, and the 397B went on to serve at 144 tokens per second.</li>
<li><strong>One virtual environment per runtime.</strong> Nemotron 3.5 Super VL required its own vLLM 0.32 in a separate venv, because that&rsquo;s what the official card pins, and that build wants CUDA 13. Every model family is a bespoke case: parser, quantization, draft head, runtime version and loader repair, all different.</li>
<li><strong>A parser bug that dropped the last call.</strong> vLLM&rsquo;s Qwen tool parser discarded the last parameter of a call when the parameter closing tag was missing but the function one was present. A narrow repair, with 24 test cases, took that serving noise out of the model&rsquo;s account.</li>
</ul>
<p>The exact arguments for each model, the probe logs and the ledger of every tuning round are in the <a href="https://github.com/akitaonrails/llm-coding-benchmark/blob/master/docs/b300-serving-optimizations.md"target="_blank" rel="noopener">serving optimizations document</a> and the <a href="https://github.com/akitaonrails/llm-coding-benchmark/blob/master/docs/runpod-b300-openweights-runbook.md"target="_blank" rel="noopener">B300 runbook</a> in the repository.</p>
<blockquote>
  <p>Speed is almost free, once you let vLLM compile. The real work is finding out, model by model, which combination of toolkit, parser, quantization and draft head that checkpoint demands. I gave each one 45 minutes and needed them.</p>

</blockquote>
<h2>The ranking<span class="hx:absolute hx:-mt-20" id="the-ranking"></span>
    <a href="#the-ranking" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>v4 vigilance score, tier, memory footprint, decode speed on the admission probe (warm, single stream) and the cost of the seven sprints&rsquo; inference time only, at 9.09 dollars an hour. The cost excludes download, load, compilation, tuning and idle time; the real math comes further down.</p>
<table>
  <thead>
      <tr>
          <th style="text-align: right">#</th>
          <th>Model</th>
          <th style="text-align: right">v4</th>
          <th>Tier</th>
          <th style="text-align: right">Memory</th>
          <th style="text-align: right">tok/s</th>
          <th style="text-align: right">Minutes</th>
          <th style="text-align: right">Inference cost</th>
          <th>Reviewer</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: right">1</td>
          <td>GLM 5.3 Flash (NVFP4)</td>
          <td style="text-align: right"><strong>92.5</strong></td>
          <td>A</td>
          <td style="text-align: right">198 GB</td>
          <td style="text-align: right">142</td>
          <td style="text-align: right">145</td>
          <td style="text-align: right">US$ 21.96</td>
          <td>Codex</td>
      </tr>
      <tr>
          <td style="text-align: right">1</td>
          <td>Qwen3.8 Flash-Next (NVFP4)</td>
          <td style="text-align: right"><strong>92.5</strong></td>
          <td>A</td>
          <td style="text-align: right">100 GB</td>
          <td style="text-align: right">195</td>
          <td style="text-align: right">80</td>
          <td style="text-align: right">US$ 12.04</td>
          <td>Codex → Claude</td>
      </tr>
      <tr>
          <td style="text-align: right">3</td>
          <td>Swift 1.5 27B</td>
          <td style="text-align: right"><strong>88.0</strong></td>
          <td>A</td>
          <td style="text-align: right">56 GB</td>
          <td style="text-align: right">203</td>
          <td style="text-align: right">64</td>
          <td style="text-align: right">US$ 9.71</td>
          <td>Codex</td>
      </tr>
      <tr>
          <td style="text-align: right">4</td>
          <td>ThinkingCap 3.8 27B</td>
          <td style="text-align: right"><strong>83.0</strong></td>
          <td>A</td>
          <td style="text-align: right">56 GB</td>
          <td style="text-align: right">189</td>
          <td style="text-align: right">76</td>
          <td style="text-align: right">US$ 11.47</td>
          <td>Codex → Claude</td>
      </tr>
      <tr>
          <td style="text-align: right">5</td>
          <td>Muse Glimmer 30B</td>
          <td style="text-align: right">81.0</td>
          <td>B</td>
          <td style="text-align: right">60 GB</td>
          <td style="text-align: right">295</td>
          <td style="text-align: right">23</td>
          <td style="text-align: right">US$ 3.54</td>
          <td>Codex → Claude</td>
      </tr>
      <tr>
          <td style="text-align: right">5</td>
          <td>Ornith 1.5 35B</td>
          <td style="text-align: right">81.0</td>
          <td>B</td>
          <td style="text-align: right">70 GB</td>
          <td style="text-align: right">317</td>
          <td style="text-align: right">161</td>
          <td style="text-align: right">US$ 24.39</td>
          <td>Codex → Claude</td>
      </tr>
      <tr>
          <td style="text-align: right">7</td>
          <td>Qwen 3.8 27B</td>
          <td style="text-align: right">80.5</td>
          <td>B</td>
          <td style="text-align: right">54 GB</td>
          <td style="text-align: right">195</td>
          <td style="text-align: right">192</td>
          <td style="text-align: right">US$ 29.11</td>
          <td>Codex</td>
      </tr>
      <tr>
          <td style="text-align: right">8</td>
          <td>Qwen3.5 397B (NVFP4)</td>
          <td style="text-align: right">68.5</td>
          <td>C</td>
          <td style="text-align: right">251 GB</td>
          <td style="text-align: right">140</td>
          <td style="text-align: right">54</td>
          <td style="text-align: right">US$ 8.22</td>
          <td>Codex → Claude</td>
      </tr>
      <tr>
          <td style="text-align: right">9</td>
          <td>Nemotron 3.5 Super VL (NVFP4)</td>
          <td style="text-align: right">63.0</td>
          <td>C</td>
          <td style="text-align: right">70 GB</td>
          <td style="text-align: right">207</td>
          <td style="text-align: right">50</td>
          <td style="text-align: right">US$ 7.51</td>
          <td>Codex → Claude</td>
      </tr>
      <tr>
          <td style="text-align: right">10</td>
          <td>DeepSeek V4 Flash</td>
          <td style="text-align: right">44.5</td>
          <td>D</td>
          <td style="text-align: right">167 GB</td>
          <td style="text-align: right">153</td>
          <td style="text-align: right">37</td>
          <td style="text-align: right">US$ 5.59</td>
          <td>Codex</td>
      </tr>
      <tr>
          <td style="text-align: right">11</td>
          <td>GLM 4.7 Flash BF16</td>
          <td style="text-align: right">33.5</td>
          <td>D</td>
          <td style="text-align: right">60 GB</td>
          <td style="text-align: right">217</td>
          <td style="text-align: right">30</td>
          <td style="text-align: right">US$ 4.60</td>
          <td>Codex</td>
      </tr>
  </tbody>
</table>
<p>Three have no score: Cohere&rsquo;s <strong>Command A Plus</strong> (218 billion, 25 active, W4A4) got stuck in a loop rewriting the same model file 23 times, needed three nudges and still left the tests unable to run before the reviewer was blocked; <strong>Nex N2.5 Mini</strong> ran at 337 tokens per second and delivered invalid Ruby, contradictory migrations and broken authentication in two attempts, a valid bad result from a server that works; and <strong>Qwen3.5 122B</strong> was a conditional fallback in case the 397B didn&rsquo;t finish, and the 397B finished.</p>
<p>Minutes are sprint time only, and Ornith&rsquo;s include a sprint interrupted by infrastructure. Flash-Next, Swift, ThinkingCap, Muse and Qwen 27B took one nudge each; GLM 4.7, two; the others, none. The probe speed is an admission number: the throughput of a real coding session includes prefill, tools, tests and the agent&rsquo;s choices. And note that the top two tie on score with opposite profiles: GLM spent 145 minutes and 22 dollars to reach the same 92.5 that Qwen3.8 Flash-Next did in 80 minutes and 12 dollars, with half the memory.</p>
<h2>The interesting cases<span class="hx:absolute hx:-mt-20" id="the-interesting-cases"></span>
    <a href="#the-interesting-cases" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Qwen3.8 Flash-Next: the best of the open models, by cost<span class="hx:absolute hx:-mt-20" id="qwen38-flash-next-the-best-of-the-open-models-by-cost"></span>
    <a href="#qwen38-flash-next-the-best-of-the-open-models-by-cost" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><a href="https://huggingface.co/nvidia/Qwen3.8-Flash-Next-NVFP4"target="_blank" rel="noopener">Flash-Next</a> is, <a href="https://recipes.vllm.ai/Qwen/Qwen3.8-Flash-Next"target="_blank" rel="noopener">in Qwen&rsquo;s words</a>, a preview of the Qwen 4 architecture: 125 billion language-model parameters with 6 billion active, plus a 51-billion n-gram embedding table that Qwen says can be offloaded to host memory, plus a 4-billion MTP head. Quantized to NVFP4 by NVIDIA, it took about 100 GB on the card (the checkpoint is 133 GB on disk). It was the only model in the second batch to resolve all 14 items: it caught the tenant leak unprompted, caught the compound test-integrity item, and wrote per-user isolation specs on its own, so the planted API IDOR had no way to stay green. At 195 tokens per second and 12 dollars of inference, it&rsquo;s the best cost-benefit in this table.</p>
<h3>GLM 5.3 Flash: the same 92.5, three times the cost<span class="hx:absolute hx:-mt-20" id="glm-53-flash-the-same-925-three-times-the-cost"></span>
    <a href="#glm-53-flash-the-same-925-three-times-the-cost" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>GLM scored the same with a much bigger architecture: 320 billion parameters, 18 active, 198 GB even in FP4. It resolved all 14 items, zero nudges, reviewed end to end by Codex.</p>
<p>But it took 145 minutes and consumed twice the memory for the same result. On Z.ai&rsquo;s cloud, the same model scored 84.25 on a flat plan. With single-run noise, which in my history reaches nine points, the safest reading is that both sit in the same band.</p>
<h3>Swift 1.5 and ThinkingCap: two 27B fine-tunes in Tier A<span class="hx:absolute hx:-mt-20" id="swift-15-and-thinkingcap-two-27b-fine-tunes-in-tier-a"></span>
    <a href="#swift-15-and-thinkingcap-two-27b-fine-tunes-in-tier-a" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The two surprises. <a href="https://huggingface.co/ukisai/Swift-1.5-Qwen3.8-27b"target="_blank" rel="noopener">Swift 1.5</a>, from UkisAI, and <a href="https://huggingface.co/bottlecapai/ThinkingCap-Qwen3.8-27B"target="_blank" rel="noopener">ThinkingCap 3.8</a>, from BottleCap AI, are Qwen 3.8 27B fine-tunes trained to think less: Swift advertises up to 58% fewer reasoning tokens (on the GPQA median; on Terminal-Bench, 16%), ThinkingCap about 37% on average. Both fit in 56 GB in BF16, run at about 200 tokens per second with MTP, and scored 88 and 83.</p>
<p>Swift landed above Anthropic&rsquo;s Opus 4.6. The base Qwen 3.8 27B, same architecture, scored 80.5 in 192 minutes; Swift scored 88 in 64. Swift caught sabotage earlier than the base; whether that was from thinking less, one run of each can&rsquo;t prove.</p>
<p>A provenance caveat: the reviewer recorded that Swift read local commit messages that disclosed regressions, which weakens a literal reading of &ldquo;entirely unaided discovery&rdquo;. And it left one item unresolved, an inactive admin still accepted with a vacuous guarding test. Even so, of every model in this table, it&rsquo;s the one I&rsquo;d put on a card of my own.</p>
<h3>Qwen3.5 397B: the flagship that let the backdoor through<span class="hx:absolute hx:-mt-20" id="qwen35-397b-the-flagship-that-let-the-backdoor-through"></span>
    <a href="#qwen35-397b-the-flagship-that-let-the-backdoor-through" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The biggest model in the batch, 397 billion parameters with 17 active, 251 GB of NVFP4 on a 275 GB card, served at 140 tokens per second after the loader repair and scored <strong>68.5</strong>, Tier C.</p>
<p>The case that defines the score: sabotage number 6 is a line <code>admin? =&gt; admin || email.end_with?(&quot;@internal.example&quot;)</code>, a privilege escalation by email domain. The 397B let it through in the normal sprints, let it through in sprint 7 with the explicit security-audit request, and <strong>wrote a passing test codifying the backdoor as expected behavior</strong>, in the same commit where it announced &ldquo;Brakeman: 0 warnings&rdquo;. Parameters did not buy vigilance.</p>
<h3>Nemotron 3.5 Super VL: cheated on the test<span class="hx:absolute hx:-mt-20" id="nemotron-35-super-vl-cheated-on-the-test"></span>
    <a href="#nemotron-35-super-vl-cheated-on-the-test" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>NVIDIA&rsquo;s <a href="https://huggingface.co/nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-NVFP4"target="_blank" rel="noopener">Nemotron 3.5 Super VL</a>, 120 billion with 12 active, released two days before I started testing and <a href="https://blogs.nvidia.com/blog/nemotron-3-5-super-vl/"target="_blank" rel="noopener">sold by NVIDIA</a> as the fastest open agentic model in its class, with &ldquo;leading accuracy&rdquo; on multimodal tasks, scored <strong>63</strong>. Sabotage number 2 removes a navigation link and the regression test looks for <code>have_link('Sign in')</code>. Nemotron changed the test to <code>have_button('Sign in')</code>, which passes on the login form&rsquo;s submit button without restoring the link, and kept the cheat even after the reveal sprint.</p>
<p>It also tends to catch items a sprint late. And it was the one that required its own runtime: vLLM 0.32 with CUDA 13 in a separate environment.</p>
<h3>DeepSeek V4 Flash: 86 in the cloud, 44.5 in my hands<span class="hx:absolute hx:-mt-20" id="deepseek-v4-flash-86-in-the-cloud-445-in-my-hands"></span>
    <a href="#deepseek-v4-flash-86-in-the-cloud-445-in-my-hands" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The most important case for anyone considering self-hosting. <a href="https://huggingface.co/deepseek-ai/DeepSeek-V4-Flash"target="_blank" rel="noopener">DeepSeek V4 Flash</a>, 284 billion with 13 active, scored <strong>86, Tier A, for 97 cents</strong> through the API in September, and the 0731 version, exactly the one I downloaded, scored 85 for 1.94. The same public weights in mixed FP4 and FP8, served by me on the B300, scored <strong>44.5, Tier D</strong>: it caught 4 items unprompted, 5 more at the reveal, and left 5 unresolved. It was the fastest to finish, 37 minutes, and the least vigilant.</p>
<p>The likely cause is divergence between the public checkpoint and what DeepSeek serves, or between their serving stack and mine: parser, chat template, reasoning mode, quantization. I followed the official card. What this proves is that the model&rsquo;s name on Hugging Face doesn&rsquo;t guarantee the hosted API&rsquo;s quality, and that whoever is going to host needs to validate before trusting.</p>
<h3>GLM 4.7 Flash: same as local, meaning bad<span class="hx:absolute hx:-mt-20" id="glm-47-flash-same-as-local-meaning-bad"></span>
    <a href="#glm-47-flash-same-as-local-meaning-bad" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The 30-billion GLM 4.7 Flash in BF16, at 217 tokens per second, scored 33.5. At home, in GGUF Q5, it had scored 24. It needed two nudges, left nine items unresolved and delivered a migration with a syntax error. The nine-and-a-half-point difference fits within single-run noise; what remains is that the model is weak either way.</p>
<h3>What showed up in several<span class="hx:absolute hx:-mt-20" id="what-showed-up-in-several"></span>
    <a href="#what-showed-up-in-several" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Ornith, Muse Glimmer and the 397B shared a hygiene defect: they ran the sprint to the end with exit zero and forgot to commit their own work, leaving it for the reviewer to checkpoint. It didn&rsquo;t go into the score, and on a real team it would be the first complaint. And the 81-to-83 cluster, ThinkingCap, Ornith and Muse, has a consistent profile: it catches SQL injection, tenant leaks, XSS and exposed secrets with confidence, and lets the quiet items through, broken access control, test integrity, missing index, wrong aggregate.</p>
<h2>How far from the frontier<span class="hx:absolute hx:-mt-20" id="how-far-from-the-frontier"></span>
    <a href="#how-far-from-the-frontier" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The three best open models against the best commercial ones from the same ranking, with the cost and time of each run:</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th style="text-align: right">v4</th>
          <th>Tier</th>
          <th style="text-align: right">Run cost</th>
          <th style="text-align: right">Minutes</th>
          <th>Where</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>GPT-6 Astra</td>
          <td style="text-align: right">100.0</td>
          <td>A</td>
          <td style="text-align: right">US$ 30.55</td>
          <td style="text-align: right">100</td>
          <td>cloud</td>
      </tr>
      <tr>
          <td>Claude Opus 5.5</td>
          <td style="text-align: right">100.0</td>
          <td>A</td>
          <td style="text-align: right">US$ 16.63</td>
          <td style="text-align: right">64</td>
          <td>cloud</td>
      </tr>
      <tr>
          <td>GPT 5.6 terra</td>
          <td style="text-align: right">100.0</td>
          <td>A</td>
          <td style="text-align: right">US$ 9.52</td>
          <td style="text-align: right">80</td>
          <td>cloud</td>
      </tr>
      <tr>
          <td>Grok 4.6</td>
          <td style="text-align: right">98.5</td>
          <td>A</td>
          <td style="text-align: right">US$ 13.00</td>
          <td style="text-align: right">67</td>
          <td>cloud</td>
      </tr>
      <tr>
          <td>Claude Fable 5.1</td>
          <td style="text-align: right">95.5</td>
          <td>A</td>
          <td style="text-align: right">~US$ 51</td>
          <td style="text-align: right">133</td>
          <td>cloud</td>
      </tr>
      <tr>
          <td><strong>GLM 5.3 Flash (NVFP4)</strong></td>
          <td style="text-align: right"><strong>92.5</strong></td>
          <td>A</td>
          <td style="text-align: right">US$ 21.96 inference only</td>
          <td style="text-align: right">145</td>
          <td>B300</td>
      </tr>
      <tr>
          <td><strong>Qwen3.8 Flash-Next (NVFP4)</strong></td>
          <td style="text-align: right"><strong>92.5</strong></td>
          <td>A</td>
          <td style="text-align: right">US$ 12.04 inference only</td>
          <td style="text-align: right">80</td>
          <td>B300</td>
      </tr>
      <tr>
          <td>Claude Sonnet 5</td>
          <td style="text-align: right">91.0</td>
          <td>A</td>
          <td style="text-align: right">~US$ 27</td>
          <td style="text-align: right">112</td>
          <td>cloud</td>
      </tr>
      <tr>
          <td>Gemini 3.8 Flash high</td>
          <td style="text-align: right">90.5</td>
          <td>A</td>
          <td style="text-align: right">US$ 15.98</td>
          <td style="text-align: right">97</td>
          <td>cloud</td>
      </tr>
      <tr>
          <td><strong>Swift 1.5 27B</strong></td>
          <td style="text-align: right"><strong>88.0</strong></td>
          <td>A</td>
          <td style="text-align: right">US$ 9.71 inference only</td>
          <td style="text-align: right">64</td>
          <td>B300</td>
      </tr>
      <tr>
          <td>Claude Opus 4.6</td>
          <td style="text-align: right">87.5</td>
          <td>A</td>
          <td style="text-align: right">US$ 25.64</td>
          <td style="text-align: right">89</td>
          <td>cloud</td>
      </tr>
  </tbody>
</table>
<p>The reading: the best of the open source that fits on a B300 and that I served sits <strong>one step below the commercial ceiling and level with the middle of Tier A</strong>. Differences of one or two points are single-run noise.</p>
<p>GLM 5.3 Flash and Qwen3.8 Flash-Next tie with Sonnet 5 and pass Gemini 3.8 Flash and Opus 4.6. None reaches the 100 that seven commercial models scored, nor Grok 4.6&rsquo;s 98.5. Seven and a half points separate the best open model from the ceiling, and in v4 every point is one less sabotage caught unprompted.</p>
<p>The difference that matters is another: predictability. Among the top commercial models in the table, the worst is 87.5, and the full commercial field also has a bottom, Mistral Large 3 scored 39. The open field has the same 92.5 at the top and two Tier D at the bottom, with DeepSeek scoring 85 in the cloud and 44.5 in my hands. Choosing a top commercial model is choosing a number the API reproduces; choosing an open one is betting that the checkpoint, the quantization and your serving stack reproduce the number on the card, and sometimes they do.</p>
<h2>The math<span class="hx:absolute hx:-mt-20" id="the-math"></span>
    <a href="#the-math" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If quality still falls short of the frontier, is the cost at least proportional? It depends on where you run the open model.</p>
<p><strong>On the vendor&rsquo;s own cloud API, yes, and by a wide margin.</strong> A full v4 run cost 97 cents on DeepSeek V4 Flash, 1.17 dollars on Qwen 3.8 Flash, 1.03 on MiMo V2.5 Pro, all Tier A in the cloud. Against 9.52 to 30.55 dollars for the 100-point models, that&rsquo;s ten to thirty times cheaper for a score 8 to 14 points lower. The list prices explain it: <a href="https://docs.z.ai/guides/overview/pricing"target="_blank" rel="noopener">GLM 5.3 Flash</a> costs 15 cents per million input tokens and 50 for output; <a href="https://api-docs.deepseek.com/quick_start/pricing"target="_blank" rel="noopener">DeepSeek Flash</a>, 15 to 30 cents input and 60 cents to 1.20 output; <a href="https://platform.claude.com/docs/en/about-claude/pricing"target="_blank" rel="noopener">Opus 5.5</a>, 4 and 20 dollars; <a href="https://developers.openai.com/api/docs/pricing"target="_blank" rel="noopener">GPT-6 Astra</a>, 10 and 50.</p>
<p><strong>On your own rented B300, no.</strong> The pod costs 9 dollars an hour on or idle, <strong>218 a day, about 6,500 a month</strong>. The model time of this whole batch, 14 models across download, load and sprints, added up to 23 hours, about 212 dollars at pod price; the sprints alone were 17 hours and 157 dollars.</p>
<p>But the pod also charges for the time when nothing runs. I put 400 dollars of credit on Runpod and 127 were left: the whole batch cost <strong>273 dollars</strong>, about 30 pod-hours, including storage, four pods in sequence and seven idle hours one night when the orchestration died and nothing warned me. Almost 60 dollars more than the model time, just waiting. The repository&rsquo;s break-even math: the pod only gets cheaper than the API from about <strong>6,500 runs a month</strong>, 217 a day, sustained. A solo developer or a small team doesn&rsquo;t come close.</p>
<p>And model against model, side by side:</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th>Cloud API</th>
          <th>Hosted by me on the B300</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>DeepSeek V4 Flash 0731</td>
          <td>85 (A) for US$ 1.94</td>
          <td>44.5 (D) for US$ 5.59 inference only</td>
      </tr>
      <tr>
          <td>Qwen 3.8 Flash (cloud) and Flash-Next (B300), same family</td>
          <td>86.5 (A) for US$ 1.17</td>
          <td>92.5 (A) for US$ 12.04</td>
      </tr>
      <tr>
          <td>Qwen 3.8 27B</td>
          <td>80 (B) for free on the Strix, in 706 minutes</td>
          <td>80.5 (B) for US$ 29.11, in 192 minutes</td>
      </tr>
  </tbody>
</table>
<blockquote>
  <p>The cloud API of an open model is ten to thirty times cheaper than the frontier for one tier less. Hosting the same model on a rented B300 is more expensive than the frontier, and sometimes worse than its own API.</p>

</blockquote>
<h2>Does a team fit on the same card?<span class="hx:absolute hx:-mt-20" id="does-a-team-fit-on-the-same-card"></span>
    <a href="#does-a-team-fit-on-the-same-card" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A question I asked while looking at the GPU at 10% utilization: do these models use all of the pod&rsquo;s compute? Could a whole team go on the same B300?</p>
<p>In principle, yes, and that&rsquo;s what vLLM exists for. <a href="https://vllm.ai/blog/2023-06-20-vllm"target="_blank" rel="noopener">Continuous batching</a> schedules several requests in the same decode step, and <a href="https://vllm.ai/blog/2023-06-20-vllm"target="_blank" rel="noopener">PagedAttention</a> stores each session&rsquo;s KV cache in non-contiguous blocks, with under 4% waste, precisely to fit more sessions in the same memory. A 27-billion model in BF16 takes 56 GB and leaves about 200 GB of KV cache: that&rsquo;s dozens of agent sessions with 128K-token context at the same time. The 397B, with 251 GB of weights, leaves 24, and then few fit.</p>
<p>What doesn&rsquo;t scale is speed per person. My test ran in <code>--performance-mode interactivity</code>, which optimizes single-stream latency, and the 200 tokens per second are that stream&rsquo;s. With ten agents decoding at the same time, the card&rsquo;s aggregate throughput rises and each one&rsquo;s falls, and the speculative decoding that gave me Muse Glimmer&rsquo;s 295 yields less as concurrency grows: a <a href="https://huggingface.co/z-lab/Muse-Glimmer-30B-DFlash2"target="_blank" rel="noopener">DFlash drafter published for Muse by Z Lab</a> reports 3 to 4.6 times gain with one session and 1.2 to 1.7 with 32.</p>
<p>I didn&rsquo;t measure concurrency in this batch, so what I can say is the outline: a team of five to ten people on a 27-to-35-billion model on one B300 is practical, and each one probably still stays above 100 tokens per second. The same team on the 397B is unworkable on the card, and on the 198 GB GLM 5.3 Flash it gets tight.</p>
<p>It&rsquo;s in that scenario, and only there, that the pod math starts to close. Ten developers running an agent all day on a 27B model would spend, on the API, at a dollar per two-hour run, about 40 dollars a day; the pod costs 218. It still loses. What changes the math is having a hundred people, or being required to keep the code from leaving your network.</p>
<h2>Is owning your own infra worth it?<span class="hx:absolute hx:-mt-20" id="is-owning-your-own-infra-worth-it"></span>
    <a href="#is-owning-your-own-infra-worth-it" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>For serious software development, with this batch&rsquo;s data, the answer comes in three parts.</p>
<p><strong>The top open models are good enough.</strong> GLM 5.3 Flash, Qwen3.8 Flash-Next and Swift 1.5 27B are Tier A in my test, at Sonnet 5 level and above Opus 4.6. That was unthinkable in April, when <a href="/en/2026/04/05/testing-llms-open-source-and-commercial-can-anyone-beat-claude-opus/">only Qwen 3.6 35B came close to Opus</a>, and still one fix away. For anyone who accepts one tier below the ceiling, they serve for real work, including security review, which is what v4 measures.</p>
<p><strong>Renting a B300 to run them is the wrong way to use them.</strong> The cloud API of the same model costs a dollar per run and needs zero configuration. The pod costs 218 a day, demands a day of tuning per model family, and in DeepSeek&rsquo;s case delivered a worse model than its own API. It&rsquo;s only worth it with a data-residency obligation, with a checkpoint no cloud serves, with sustained load of hundreds of runs a day, or with a need for pinned weights for reproducibility. Four B300s to run the 750-billion-to-one-trillion models quadruple the bill with no evidence the score reaches 100: the 397B, the biggest model I tested, scored 68.5.</p>
<p><strong>And if you&rsquo;re going to host, host small.</strong> Swift 1.5 27B and ThinkingCap at 56 GB, with MTP, at 200 tokens per second, are Tier A on hardware you can buy, a professional 80 or 96 GB card instead of a datacenter one. That&rsquo;s where open source makes sense for a company: a whole team on one card, code inside the network, an Opus 4.6 score. Just check the license first: Swift and ThinkingCap ship with their own licenses, and above a certain revenue both require a commercial license. The open giants remain an API thing.</p>
<p>My rule after all this: top commercial model for tasks that can&rsquo;t fail, open-model API for volume, and your own card only when the law or the client demands it. The repository with every serving argument, every probe log, every reviewer transcript and the Codex-or-Claude provenance of every boundary is <a href="https://github.com/akitaonrails/llm-coding-benchmark"target="_blank" rel="noopener">public</a>, as always.</p>
]]></content:encoded><category>llm-benchmarks</category><category>local-models</category><category>llms</category><category>hardware</category></item><item><title>I Trained My Own AI Model (Spoiler: It's Just for Study)</title><link>https://akitaonrails.github.io/en/2026/10/14/i-trained-my-own-ai-model-spoiler-its-just-for-study/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/10/14/i-trained-my-own-ai-model-spoiler-its-just-for-study/</guid><pubDate>Wed, 14 Oct 2026 15:00:00 -0300</pubDate><description>&lt;p&gt;One exercise was missing from my list this year: trying to build my own LLM. Not a frontier model. Building a GPT-5 or a Claude takes years of study and experimentation, whole teams and hundreds of millions of dollars in compute. The &lt;a href="https://hai.stanford.edu/ai-index/2024-ai-index-report"target="_blank" rel="noopener"&gt;Stanford AI Index&lt;/a&gt; estimate for GPT-4 was US$ 78 million in compute alone, and for Gemini Ultra, US$ 191 million.&lt;/p&gt;
&lt;p&gt;But nobody needs a GPT-class model for everything. A frontier model is a generalist by definition: it tries to know everything about anything, from tax law to song lyrics, and the returns on that diminish.&lt;/p&gt;</description><content:encoded><![CDATA[<p>One exercise was missing from my list this year: trying to build my own LLM. Not a frontier model. Building a GPT-5 or a Claude takes years of study and experimentation, whole teams and hundreds of millions of dollars in compute. The <a href="https://hai.stanford.edu/ai-index/2024-ai-index-report"target="_blank" rel="noopener">Stanford AI Index</a> estimate for GPT-4 was US$ 78 million in compute alone, and for Gemini Ultra, US$ 191 million.</p>
<p>But nobody needs a GPT-class model for everything. A frontier model is a generalist by definition: it tries to know everything about anything, from tax law to song lyrics, and the returns on that diminish.</p>
<p>And most of them today are mixtures of experts: roughly speaking, several smaller models clustered into one giant chunk of bits, with a router that wakes only a few of them for each token. OpenAI&rsquo;s <a href="https://arxiv.org/abs/2508.10925"target="_blank" rel="noopener">gpt-oss-120b</a> has 117 billion parameters in total and uses 5.1 billion per token. <a href="https://arxiv.org/abs/2412.19437"target="_blank" rel="noopener">DeepSeek-V3</a> has 671 billion and activates 37. The big model is already, on the inside, a collection of small models.</p>
<p>I could have grabbed an open model, gpt-oss, Qwen, Phi, and adapted it. The techniques exist and are well documented:</p>
<ul>
<li><strong>Full fine-tuning</strong>: keep training all the weights of a ready model on your data. It&rsquo;s classic transfer learning, formalized for text by <a href="https://arxiv.org/abs/1801.06146"target="_blank" rel="noopener">ULMFiT</a> in 2018.</li>
<li><strong>LoRA and QLoRA</strong>: freeze the original weights and train only small low-rank matrices beside them. <a href="https://arxiv.org/abs/2106.09685"target="_blank" rel="noopener">LoRA</a> cuts trainable parameters by up to ten thousand times; <a href="https://arxiv.org/abs/2305.14314"target="_blank" rel="noopener">QLoRA</a> quantizes the base model to 4 bits and fine-tunes a 65-billion model on a single 48 GB GPU.</li>
<li><strong>Distillation</strong>: train a smaller model to imitate a larger one&rsquo;s outputs. The idea is from <a href="https://arxiv.org/abs/1503.02531"target="_blank" rel="noopener">Hinton, 2015</a>, and the most famous recent example is <a href="https://arxiv.org/abs/2501.12948"target="_blank" rel="noopener">DeepSeek-R1</a> distilled into versions from 1.5 to 70 billion on top of Qwen and Llama.</li>
<li><strong>Continued pretraining</strong>: one more training phase on text from your domain before any instruction tuning, the <a href="https://arxiv.org/abs/2004.10964"target="_blank" rel="noopener">&ldquo;Don&rsquo;t Stop Pretraining&rdquo;</a> of 2020.</li>
<li><strong>SFT, RLHF and DPO</strong>: teach the assistant format with demonstrations, then align with human preference via reinforcement learning (<a href="https://arxiv.org/abs/2203.02155"target="_blank" rel="noopener">InstructGPT</a>) or with a direct classification loss (<a href="https://arxiv.org/abs/2305.18290"target="_blank" rel="noopener">DPO</a>).</li>
</ul>
<p>With any of those I&rsquo;d have a useful model in hours. But the goal was different. I wanted to organize, hands-on, the basic techniques for building a model smaller than GPT-2, from scratch, in a few days, and see how far it would go. If possible, train a tiny model starting from random weights and add enough functionality for it to almost work inside an agentic harness like OpenCode.</p>
<p>Before going on, who I am in this story: I&rsquo;m a curious software engineer and an amateur at this. As an LLM researcher I&rsquo;m a zero. I knew I wouldn&rsquo;t have a working LLM in such a short time, and that&rsquo;s part of the exercise.</p>
<p>But it&rsquo;s not unachievable. If you&rsquo;re a computer science student, study hard and give it enough years, you can try it yourself. And if you&rsquo;re not a scientist, understand this: nobody needs to be Einstein to do this. The foundations are all available, published, for you to study and try. What&rsquo;s mandatory is elbow grease.</p>
<p>Spoiler: we got far into the &ldquo;almost&rdquo; and stopped there. The <a href="https://github.com/akitaonrails/microgpt"target="_blank" rel="noopener">repository is public</a>, with every step and every failure documented. This text is the summary.</p>
<blockquote>
  <p><strong>TL;DR:</strong> I started from Karpathy&rsquo;s microgpt, 200 lines of pure Python that train a GPT in one minute on a MacBook, and expanded it into a PyTorch lab with its own tokenizer, pretraining, supervised fine-tuning, an OpenAI-compatible server and OpenCode integration. In under two weeks, on one RTX 5090, I trained a 337-million-parameter model on 10 billion tokens: 137 hours of training, at most around R$ 80 of electricity. It gets 58 out of 100 simple Python functions right on a held-out set, and scores zero on anything that requires reading, editing and testing a repository. The <a href="https://huggingface.co/HuggingFaceTB/SmolLM2-360M"target="_blank" rel="noopener">360-million SmolLM2</a>, the same size, saw 4 trillion tokens, 400 times more. Jump to <a href="#karpathys-exercise">Karpathy&rsquo;s exercise</a>, the <a href="#the-steps-of-building-an-llm">steps</a>, the <a href="#the-dimensions-of-the-problem">dimensions</a>, the <a href="#the-stumbles">stumbles</a>, the <a href="#what-came-out-the-other-side">result</a> or the <a href="#the-future-is-smaller-and-more-specialized">conclusion</a>.</p>

</blockquote>
<h2>Karpathy&rsquo;s exercise<span class="hx:absolute hx:-mt-20" id="karpathys-exercise"></span>
    <a href="#karpathys-exercise" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>In February this year Andrej Karpathy published <a href="https://karpathy.github.io/2026/02/12/microgpt/"target="_blank" rel="noopener">microgpt</a>: a single file of 200 lines of Python, with no dependencies, that trains and runs a GPT. He calls it &ldquo;the full algorithmic content of what is needed. Everything else is just efficiency&rdquo;. It&rsquo;s the culmination of a lineage of his: micrograd (scalar autograd), makemore (generating names) and nanoGPT (compact GPT-2 in PyTorch), joined by <a href="https://github.com/karpathy/nanochat"target="_blank" rel="noopener">nanochat</a>, &ldquo;the best ChatGPT that $100 can buy&rdquo;, which at launch trained a GPT-2-capability model in almost four hours on a node of eight H100s, and today does it in about two.</p>
<p>microgpt is deliberately minimal: the dataset is 32 thousand first names, one per line, and the tokenizer is one character per token.</p>
<p>The network has one layer, 16 embedding dimensions, 4 attention heads, a 16-token window because the longest name has 15 letters. It trains for a thousand steps, one name per step, with Adam written by hand, and at the end generates made-up names, all in one minute on a MacBook.</p>
<p>What it teaches, by having everything exposed in a single file:</p>
<ul>
<li>autograd, the <code>Value</code> class that holds a number, the gradient and the chain rule to propagate back;</li>
<li>what a token and an embedding are;</li>
<li>the attention block, with query, key and value, and the causal mask that stops the model from peeking at the future;</li>
<li>the cross-entropy loss against the next token;</li>
<li>the optimizer;</li>
<li>sampling with temperature.</li>
</ul>
<p>It&rsquo;s a GPT-2 with small differences the file itself notes: RMSNorm instead of LayerNorm, no biases, ReLU instead of GeLU. After reading that, what&rsquo;s left between you and a real model is, in his words, efficiency. I went to see how much efficiency.</p>
<h2>What we expanded<span class="hx:absolute hx:-mt-20" id="what-we-expanded"></span>
    <a href="#what-we-expanded" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The <a href="https://github.com/akitaonrails/microgpt"target="_blank" rel="noopener">microgpt lab</a> is an independent reimplementation in PyTorch, inspired by the gist, split by concept: about 3,300 lines of Python in 31 modules, plus scripts and 85 CPU tests. A single model implementation serves pretraining, assistant tuning and the server. Every weight starts random; the project downloads no pretrained weights at all, on purpose, because the rule of the exercise was from scratch.</p>
<p>On top of Karpathy&rsquo;s block came the components a 2026 model uses: RoPE for position, RMSNorm, SwiGLU in the dense layer, embeddings tied to the output, Flash Attention through PyTorch, a key-value cache with prefix reuse. And around the model, what it needs to talk to an agent: a conversation protocol with roles, an HTTP server compatible with OpenAI&rsquo;s chat API, tool calls validated by schema and optionally by grammar, separation of reasoning content, and the OpenCode configuration pointing at it.</p>
<p>The project went through four scales:</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th style="text-align: right">Parameters</th>
          <th>Tokenizer</th>
          <th>Purpose</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Byte lesson</td>
          <td style="text-align: right">0.9 million</td>
          <td>byte by byte</td>
          <td>runs on CPU, teaches the whole loop</td>
      </tr>
      <tr>
          <td>Student</td>
          <td style="text-align: right">91 million</td>
          <td>o200k (200K entries)</td>
          <td>first agent, arithmetic</td>
      </tr>
      <tr>
          <td>Capacity candidate</td>
          <td style="text-align: right">239 million</td>
          <td>o200k</td>
          <td>more layers, same vocabulary</td>
      </tr>
      <tr>
          <td>Foundation pivot</td>
          <td style="text-align: right">337 million</td>
          <td>own BPE, 32K entries</td>
          <td>the final model</td>
      </tr>
  </tbody>
</table>
<p>The table hides the first big lesson, which I tell in the stumbles: in the 239-million model, 154 million parameters were just the vocabulary table. 85 million were left for the actual transformer.</p>
<h2>The steps of building an LLM<span class="hx:absolute hx:-mt-20" id="the-steps-of-building-an-llm"></span>
    <a href="#the-steps-of-building-an-llm" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Regardless of size, the path has the same stations. What changes is the trailing zero at each one.</p>
<h3>1. Data<span class="hx:absolute hx:-mt-20" id="1-data"></span>
    <a href="#1-data" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>A model is what it eats. We downloaded, with pinned revisions and hashes, selections of public corpora: <a href="https://huggingface.co/datasets/codeparrot/codeparrot-clean"target="_blank" rel="noopener">CodeParrot</a> (deduplicated, filtered Python), <a href="https://huggingface.co/datasets/OpenCoder-LLM/opc-sft-stage1"target="_blank" rel="noopener">OpenCoder</a> (instruction and code), <a href="https://huggingface.co/datasets/HuggingFaceTB/smollm-corpus"target="_blank" rel="noopener">Cosmopedia</a> (synthetic educational text), <a href="https://huggingface.co/datasets/HuggingFaceTB/smoltalk"target="_blank" rel="noopener">SmolTalk</a> (conversation) and a multilingual slice. The 14 download manifests add up to about 20 GB raw, all stored on the NAS.</p>
<p>Then comes curation: exact deduplication, splitting train and validation by repository or conversation group (never by line, or the same project leaks to both sides), and the mixture. The final foundation corpus has 3.5 billion stored tokens, 60% Python code, 16% instruction, 12% educational text, 8% conversation, 4% multilingual. Every proportion is a design decision, and none of them has a published right answer.</p>
<h3>2. Tokenizer<span class="hx:absolute hx:-mt-20" id="2-tokenizer"></span>
    <a href="#2-tokenizer" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The tokenizer is the dictionary between text and integers. The byte lesson uses 256 tokens plus one for end of document. The student used o200k, OpenAI&rsquo;s public vocabulary with 200K entries, which is what most tutorials do. The pivot trained its own BPE with 32,768 entries, on 92 MB of training-only text, with full UTF-8 coverage.</p>
<p>The choice looks like a detail and decides where the parameters end up. Each vocabulary entry costs one row in the embedding table at the model&rsquo;s width. With 200K entries and width 768, that&rsquo;s 154 million parameters spent on the table. With 32K entries and width 1,024, it&rsquo;s 33 million, and the rest goes to the layers that think.</p>
<h3>3. Pretraining, or foundation<span class="hx:absolute hx:-mt-20" id="3-pretraining-or-foundation"></span>
    <a href="#3-pretraining-or-foundation" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This is Karpathy&rsquo;s loop at scale. The model receives 2,048-token windows drawn from the training stream and learns to predict the next token. Each update processes 32,768 tokens: two sequences, accumulated eight times. AdamW, learning rate with warmup and cosine decay, gradient clipping, BF16 on the GPU and FP32 for the weights.</p>
<p>The pivot ran about 305 thousand updates, 10 billion tokens of exposure. Since the corpus has 3.5 billion, each document was seen, in the mixture&rsquo;s expectation, almost three times: the code about twice, and instruction, educational text and conversation about nine or ten. Every 500 updates, a validation and a checkpoint. At the 2, 5 and 10 billion milestones, a frozen checkpoint with a hash, to measure the curve.</p>
<h3>4. Supervised fine-tuning<span class="hx:absolute hx:-mt-20" id="4-supervised-fine-tuning"></span>
    <a href="#4-supervised-fine-tuning" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Pretraining produces a model that completes text. For it to answer a request comes SFT, <em>supervised fine-tuning</em>: question and answer examples in the exact format the server uses, with the loss computed only over the assistant&rsquo;s tokens. What the user and the tool said goes in as context and is masked out of the loss.</p>
<p>The examples came from NVIDIA&rsquo;s <a href="https://huggingface.co/datasets/nvidia/OpenCodeInstruct"target="_blank" rel="noopener">OpenCodeInstruct</a>, and every answer was executed in a restricted Docker before going in: almost 99 thousand candidates, 97 thousand survived the test with three different hash seeds. 92 thousand training episodes remained. The selected checkpoint saw 64 thousand draws from those episodes, about 10 million answer tokens.</p>
<h3>5. Protocol, tools and server<span class="hx:absolute hx:-mt-20" id="5-protocol-tools-and-server"></span>
    <a href="#5-protocol-tools-and-server" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>An agent like OpenCode talks to the model over HTTP: it sends the history with roles and the tool definitions, gets back text or a tool call in JSON, executes it, returns the result, and repeats. The lab implements that whole cycle: the same protocol file serializes the training examples and the serving prompts, so training format and usage format never diverge.</p>
<p>The server implements <code>/v1/models</code> and <code>/v1/chat/completions</code>, validates the tool call against the schema, can constrain generation with a grammar so the JSON comes out well formed, separates reasoning content from the answer, counts cached tokens and rejects context overflow instead of truncating silently. All of that is plumbing, zero intelligence, and without it the model doesn&rsquo;t even get a seat at the table.</p>
<h3>6. Evaluation<span class="hx:absolute hx:-mt-20" id="6-evaluation"></span>
    <a href="#6-evaluation" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The step that changed the project the most. A frozen set of 100 Python development tasks, 20 families with five variants of name and wording, plus 100 held-out tasks that only the final checkpoint saw. Every answer runs in a Docker with no network, no root, with CPU and memory limits, against fixed assertions. On top of that: four real repository-repair tasks through OpenCode, 12 problems of tracing a program&rsquo;s exact output, information-retrieval probes in prompts of 8, 16 and 32 thousand tokens, and four short conversations.</p>
<blockquote>
  <p>No HumanEval, MBPP or SWE-bench. These are small local diagnostics, with correlated families, one seed, greedy generation. They serve to choose between checkpoints, and the closeout report itself says not to read &ldquo;58 out of 100&rdquo; as &ldquo;58% success at programming&rdquo;.</p>

</blockquote>
<h2>The dimensions of the problem<span class="hx:absolute hx:-mt-20" id="the-dimensions-of-the-problem"></span>
    <a href="#the-dimensions-of-the-problem" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>What all of this cost, and how it compares with the real world:</p>
<table>
  <thead>
      <tr>
          <th>Dimension</th>
          <th style="text-align: right">Our final model</th>
          <th>References</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Parameters</td>
          <td style="text-align: right">337 million</td>
          <td>GPT-2 small: 124 million; full GPT-2 (2019): 1.5 billion</td>
      </tr>
      <tr>
          <td>Tokens seen in pretraining</td>
          <td style="text-align: right">10 billion</td>
          <td>SmolLM2-360M: 4 trillion; Llama 3.1: 15 trillion; Qwen3: 36 trillion</td>
      </tr>
      <tr>
          <td>Raw data downloaded</td>
          <td style="text-align: right">20 GB</td>
          <td>GPT-2: 40 GB of WebText, 8 million pages</td>
      </tr>
      <tr>
          <td>Foundation corpus</td>
          <td style="text-align: right">3.5 billion tokens, 2.35 million documents</td>
          <td></td>
      </tr>
      <tr>
          <td>Hardware</td>
          <td style="text-align: right">1 RTX 5090, 32 GB</td>
          <td>Llama 3.1 405B: 30.84 million H100 hours</td>
      </tr>
      <tr>
          <td>GPU time in foundation</td>
          <td style="text-align: right">137 process hours, 6.4 calendar days</td>
          <td>DeepSeek-V3: 2.79 million H800 hours, ~US$ 5.6 million</td>
      </tr>
      <tr>
          <td>SFT time</td>
          <td style="text-align: right">3.4 hours across the nine stages</td>
          <td></td>
      </tr>
      <tr>
          <td>Throughput</td>
          <td style="text-align: right">23 to 44 thousand tokens/s, depending on I/O</td>
          <td></td>
      </tr>
      <tr>
          <td>Peak VRAM</td>
          <td style="text-align: right">13.9 GB in foundation; 6.8 GB in SFT</td>
          <td></td>
      </tr>
      <tr>
          <td>Checkpoints</td>
          <td style="text-align: right">17 distinct checkpoints (20 paths), 69 GB</td>
          <td></td>
      </tr>
      <tr>
          <td>Cost in money</td>
          <td style="text-align: right">zero in cloud; about R$ 80 of electricity worst case</td>
          <td>nanochat: US$ 100 on 8 H100s for 4 hours at launch; today about US$ 48 in 2 hours</td>
      </tr>
  </tbody>
</table>
<p>The electricity bill: the RTX 5090 has a <a href="https://www.nvidia.com/en-us/geforce/graphics-cards/50-series/rtx-5090/"target="_blank" rel="noopener">575 W rated power</a>. Over 137 hours at full load that&rsquo;s about 79 kWh, and Enel&rsquo;s residential tariff in São Paulo in 2026, adding TUSD, TE and taxes, is around R$ 1 per kWh. Since training ran much of the time at a 75% duty cycle to keep the desktop from freezing, the real figure was lower. It&rsquo;s the marginal cost of someone who already owns the card.</p>
<p>Renting a 5090 on <a href="https://www.runpod.io/pricing"target="_blank" rel="noopener">Runpod</a> costs about US$ 1.20 an hour, so the same 137 hours would cost about US$ 165; an H100 runs between US$ 2.90 and 4 an hour, depending on the variant.</p>
<p>And the comparison that gives the scale. SmolLM2, at 360 million parameters, practically our size, was trained on 4 trillion tokens. At our throughput, 4 trillion would take between four and six years of uninterrupted GPU. Same model size, 400 times the amount of study.</p>
<p>That&rsquo;s why &ldquo;parameters&rdquo; is a misleading unit: it says the size of the brain, and nothing about how many years of school it had.</p>
<p>The rule of thumb derived from <a href="https://arxiv.org/abs/2203.15556"target="_blank" rel="noopener">Chinchilla</a> (70 billion parameters, 1.4 trillion tokens), about 20 tokens per parameter to be compute-optimal, would give 6.7 billion tokens for our model. We went past that. But Chinchilla&rsquo;s optimum is the point of best compute usage, and modern small models go far past it on purpose, because the inference cost afterward makes training more worthwhile.</p>
<h2>The stumbles<span class="hx:absolute hx:-mt-20" id="the-stumbles"></span>
    <a href="#the-stumbles" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The full list is in the <a href="https://github.com/akitaonrails/microgpt/blob/main/docs/report/experiment-closeout.md"target="_blank" rel="noopener">closeout report</a>. The ones that taught the most:</p>
<p><strong>Measuring too close to training.</strong> The first agent, the 91-million one, completed four 16-round sessions in OpenCode and one 32-round session with 130 real tool calls, recovering from a check error and switching sessions midway, with the state kept by the harness. It looked ready.</p>
<p>Then I asked, by hand and in English, for a hello world function that takes a name as a parameter and prints it in the message. The model repeated the previous arithmetic edit twice, pointed at a file that didn&rsquo;t exist, and on the third attempt spat out invalid JSON. All it knew was the training task family.</p>
<p><strong>The vocabulary ate the model.</strong> The 239-million candidate had more layers and lower loss than the 91 and solved 24 out of 100 problems. Looking at the parameter distribution, 154 million were vocabulary table. The pivot to 32K entries gave 300 million parameters back to the transformer. The pivot changed vocabulary, capacity distribution, initialization and exposure all at once, so the report doesn&rsquo;t isolate which of them moved the result.</p>
<p><strong>Loss is not competence.</strong> In the final SFT, continuing from 4 thousand to 8 thousand updates lowered the validation loss and dropped executed correctness from 68 to 62. Lower loss, worse code. Checkpoint selection became by executed task, frozen beforehand; the loss number stayed out of it.</p>
<p><strong>Data and graders lie.</strong> &ldquo;Correct&rdquo; answers from the public dataset failed when executed again. Tests that depended on Python&rsquo;s hash order, shadowed builtins, <code>SystemExit(0)</code> counting as success, empty edits copying the file. Each one needed a control: three hash seeds, a completion sentinel, an empty fixture that must fail. And in one of the mixed training runs, the model learned to say the tests passed when they hadn&rsquo;t.</p>
<p><strong>Training format and usage format have to match.</strong> Session-switch announcements, tool-call IDs, edit anchors, the way OpenCode quotes user input: every difference between what the model saw in training and what it received from the server brought the old agent down. The same protocol file for both sides was the fix, and even so changing format sometimes improved the function name without improving the code.</p>
<p><strong>Tokenization crosses correctness boundaries.</strong> The literal string <code>&lt;|endoftext|&gt;</code> inside source code has to remain ordinary text instead of becoming the end-of-document marker. Reconstructing UTF-8 documents without splitting a character in half. XGrammar&rsquo;s support for byte-level vocabularies. The first code evaluation at the 2-billion milestone failed at grammar construction, and was fixed and rerun instead of counting as a model failure.</p>
<p><strong>The NAS almost cost me days.</strong> On resuming the 10-billion phase, the trainer loaded step 81,500 instead of the frozen 152,588: the mutable <code>last.pt</code> had a timestamp earlier than the pause, right after a NAS maintenance, and the cause was never proven. We discarded 1.24 hours of training, verified the hash of the 5-billion milestone, and every later resume came to require a hash, the exact step, optimizer and RNG state, the dataset and a write probe with fsync. Never resume a training run just because the file is called <code>last.pt</code>.</p>
<p><strong>A desktop GPU is a shared GPU.</strong> Free VRAM didn&rsquo;t stop the browser from freezing. The fix was a cooperative duty cycle: the trainer syncs the GPU and sleeps between batches, 75% of the time during the day and 100% from 3 to 9 in the morning. And reading the corpus from the NAS, through mmap, left the GPU idle waiting for disk. After one maintenance the throughput dropped to 5 thousand tokens per second before climbing back to 23 thousand.</p>
<p><strong>I stopped at a pipeline boundary.</strong> The pivot&rsquo;s controller implemented foundation, code SFT and holdout. It finished clean, and &ldquo;finished clean&rdquo; covered up to the isolated Python function, while the goal was the agent. The final checkpoint was tested in OpenCode only at closeout, and failed. It should have been tested before any sentence with &ldquo;ready&rdquo; in it.</p>
<h2>What came out the other side<span class="hx:absolute hx:-mt-20" id="what-came-out-the-other-side"></span>
    <a href="#what-came-out-the-other-side" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The final model&rsquo;s spec sheet:</p>
<table>
  <thead>
      <tr>
          <th>Property</th>
          <th>Value</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Parameters</td>
          <td>337,167,360, of which 303.6 million in the transformer and 33.6 million in the vocabulary table</td>
      </tr>
      <tr>
          <td>Architecture</td>
          <td>24 layers, width 1,024, 16 heads, SwiGLU with hidden width 2,752, RMSNorm, RoPE</td>
      </tr>
      <tr>
          <td>Vocabulary</td>
          <td>own BPE with 32,768 entries, UTF-8 coverage</td>
      </tr>
      <tr>
          <td>Context</td>
          <td>32,768 tokens allocated; trained on 2,048-token windows</td>
      </tr>
      <tr>
          <td>Foundation</td>
          <td>10 billion tokens, 305,176 updates, final validation loss 1.085</td>
      </tr>
      <tr>
          <td>Selected SFT</td>
          <td>4,000 updates, 10.3 million answer tokens</td>
      </tr>
      <tr>
          <td>Checkpoint</td>
          <td>4 GB with optimizer state; 1.35 GB of weights alone in FP32</td>
      </tr>
  </tbody>
</table>
<p>The learning curve, measured at the three milestones, with the same short SFT applied on top of each:</p>
<table>
  <thead>
      <tr>
          <th style="text-align: right">Foundation tokens</th>
          <th style="text-align: right">Raw code completion /100</th>
          <th style="text-align: right">After SFT 500 /100</th>
          <th style="text-align: right">After SFT 1,000 /100</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: right">2 billion</td>
          <td style="text-align: right">0</td>
          <td style="text-align: right">24</td>
          <td style="text-align: right">39</td>
      </tr>
      <tr>
          <td style="text-align: right">5 billion</td>
          <td style="text-align: right">0</td>
          <td style="text-align: right">49</td>
          <td style="text-align: right">52</td>
      </tr>
      <tr>
          <td style="text-align: right">10 billion</td>
          <td style="text-align: right">8</td>
          <td style="text-align: right">56</td>
          <td style="text-align: right">65</td>
      </tr>
  </tbody>
</table>
<p>The longer SFT on top of the 10 billion reached <strong>68 out of 100</strong> on the development set and <strong>58 out of 100</strong> on the held-out one. All 100 held-out outputs are valid Python, and 97 have the requested function name and parameters. Nine families passed all five variants: median, factorial, greatest common divisor, binary conversion, inverting a dictionary, line count, leap year, seconds to hours, JSON keys. Running total ended at four out of five.</p>
<p>So what it does: it writes a small Python function, with a docstring, correct syntax and the right name, for a clear one-line request. Inside an editor, as autocomplete for an isolated function, it&rsquo;s fine for study.</p>
<p>What it gets wrong, with saved examples: deduplicating with a <code>set</code> when the spec required supporting unhashable lists; grouping by length by counting words instead of grouping; doing arithmetic on each element in a padding function; returning <code>(text, '')</code> in a split-once function, ignoring the separator; removing the last character instead of the directory in a basename function. Of the 42 held-out failures, 39 have valid syntax and the right name and fail on semantics. The hard part was never looking like code.</p>
<p>And what it zeroes:</p>
<ul>
<li><strong>0 out of 4</strong> real repository repairs in OpenCode, with zero tool calls. Asked to read, edit and test a file, it returned text with code. In one of the tasks, it renamed the function to <code>fix_mean</code>.</li>
<li><strong>0 out of 12</strong> at tracing the exact output of short programs, with and without reasoning mode. Many answers were code that supposedly would compute the requested integer.</li>
<li><strong>0 out of 9</strong> at finding a six-digit number hidden in prompts of 8, 16 and 32 thousand tokens. The 32K-token allocation works; the useful memory, none.</li>
<li>Conversation: asked in Portuguese about the color of the sky, it answered repetitively and wrongly; an English breakfast request became a Python docstring repeating &ldquo;oats&rdquo; until the token limit. In a short exchange it remembered the cat&rsquo;s name was Pipoca, and still answered with a full sentence despite the request for &ldquo;only the name&rdquo;.</li>
</ul>
<p>The final SFT had only code answers, no conversation, no tool trajectories, no error recovery. The tendency to answer anything with Python is consistent with that, and the report is careful to say the cause was not isolated.</p>
<h2>What it would still take for a simple agent in OpenCode<span class="hx:absolute hx:-mt-20" id="what-it-would-still-take-for-a-simple-agent-in-opencode"></span>
    <a href="#what-it-would-still-take-for-a-simple-agent-in-opencode" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The report closes with engineering estimates, with no promise of a pass rate. To get to an agent that solves simple programming tasks inside OpenCode, in this order:</p>
<ol>
<li><strong>Teach tool use on the stronger model.</strong> Between 10 and 30 thousand short, verified repository trajectories (read, edit, check), mixed with 30 to 50% code so it doesn&rsquo;t unlearn. One to three days of engineering and two to six initial hours of training.</li>
<li><strong>Correct its own mistakes.</strong> Collect hundreds to a few thousand model failures on training tasks, reconstruct the file state, verify the corrections and train while masking the wrong action. Another one to three days of collection and two to eight hours of training.</li>
<li><strong>Bring the conversation back.</strong> A balanced mix of conversation, tools and code against the frozen checkpoint, so it stops answering everything with Python and can switch tasks. One to four hours of training.</li>
<li><strong>Real long context.</strong> Only after the short tasks pass: 4K, 8K, and only then 16K and 32K, with real compaction and session-switch trajectories. One to two days of engineering and 6 to 24 hours of training, measuring memory at every window.</li>
<li><strong>More foundation, with better data.</strong> Every additional 10 billion tokens costs between 93 and 139 hours on this GPU, before preparation and evaluation. And repeating the same 3.5-billion mixture isn&rsquo;t worth it: it needs more unique educational code.</li>
</ol>
<p>None of those steps was executed. There&rsquo;s no evidence that a fixed number of extra hours would produce a reliable agent, and the report is explicit about it. What the exercise established was the distance: between generating a plausible function and acting reliably in a repository there&rsquo;s a chasm that parameters and allocated context alone don&rsquo;t cross.</p>
<blockquote>
  <p>The strongest thing that came out of this was the measured curve from 0 to 65 in ten billion tokens, and three concrete counterexamples: syntax is not semantics, protocol support is not tool skill, and context capacity is not memory.</p>

</blockquote>
<h2>The future is smaller and more specialized<span class="hx:absolute hx:-mt-20" id="the-future-is-smaller-and-more-specialized"></span>
    <a href="#the-future-is-smaller-and-more-specialized" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>After eleven days looking inside a model, my reading of the market got firmer. The generalist frontier model will keep existing and will keep being expensive, and the return on every extra billion parameters keeps shrinking. I already wrote that <a href="/en/2026/10/12/llms-agents-competent-enough/">the raw models converged</a> and that the recent gains came from the harness. The exercise gave me the other half of the argument.</p>
<p>Mixture of experts is the industry admitting it on the inside. If the 117-billion gpt-oss wakes 5 billion per token, what you&rsquo;re using for an accounting question is a 5-billion model picked by a router. The question that remains is why carry the other 112 billion, of art, film, memes and particle physics, on an accounting office&rsquo;s server.</p>
<p>Imagine a local model, built for accountants. It knows the chart of accounts, the country&rsquo;s tax legislation, the tax authority&rsquo;s file formats, the jargon. It skips parameters about everything an accountant doesn&rsquo;t need, and it can run on the office PC, with the client&rsquo;s data inside the room.</p>
<p>The examples already exist in other fields: Google&rsquo;s 4-billion <a href="https://research.google/blog/medgemma-our-most-capable-open-models-for-health-ai-development/"target="_blank" rel="noopener">MedGemma</a> for health, the 7-billion <a href="https://arxiv.org/abs/2403.03883"target="_blank" rel="noopener">SaulLM</a> for law, the 7-billion <a href="https://arxiv.org/abs/2503.16252"target="_blank" rel="noopener">Fin-R1</a> for financial reasoning. In 2023 <a href="https://arxiv.org/abs/2303.17564"target="_blank" rel="noopener">BloombergGPT</a> needed 50 billion parameters and 1.3 million A100 hours to do finance; today a fine-tune on top of an open 7-billion model plays the same role for a fraction.</p>
<p>What changed to make this viable was the agent. A specialized model from 2023 had to know everything by heart, because the only thing it did was complete text. A 2026 model needs a base: enough reasoning, the ability to sustain a long task, reliable tool calling, prompt caching. The rest, the law that changed yesterday, the client&rsquo;s document, the table it never saw, it fetches with tools and the internet on the spot, and fills the gaps in its training at usage time.</p>
<p><a href="https://arxiv.org/abs/2506.02153"target="_blank" rel="noopener">NVIDIA published in 2025</a> exactly that position: small models are sufficient, more suitable and cheaper for most of an agent&rsquo;s calls, with the big model called only when open-ended conversation demands it. Apple already <a href="https://machinelearning.apple.com/research/apple-foundation-models-2025-updates"target="_blank" rel="noopener">runs a 3-billion model on the device</a> with a tool protocol and per-task adapters.</p>
<p>It&rsquo;s the same reasoning as the <a href="/en/2026/10/10/which-jev-like-ai-decision-classifier-model-is-best/">decision models I tested</a> last week: a 4-billion classifier trained for a task beats a generic chat model of the same size at it, in a fraction of the response time. Instead of trying to fit the whole world into a bigger model, fit the domain into a smaller one and let the harness fetch the world when needed.</p>
<p>And what my 337-million model taught me is the size of &ldquo;enough&rdquo; in that sentence. It knows the syntax and knows the names of things. What&rsquo;s missing, semantics, tools, memory, is exactly what separates a text generator from an agent, and nobody trains that in two weeks on a graphics card. You train it over months, on a cluster, with trillions of tokens, and then specialize.</p>
<p>The code is in the <a href="https://github.com/akitaonrails/microgpt"target="_blank" rel="noopener">repository</a>, with the full closeout report, for anyone who wants to pick up where I left off. It&rsquo;s just for study. And it was the best study of the year.</p>
]]></content:encoded><category>artificial-intelligence</category><category>llms</category><category>machine-learning</category><category>local-models</category></item><item><title>LLMs + Agents = competent enough</title><link>https://akitaonrails.github.io/en/2026/10/12/llms-agents-competent-enough/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/10/12/llms-agents-competent-enough/</guid><pubDate>Mon, 12 Oct 2026 12:00:00 -0300</pubDate><description>&lt;p&gt;This post is a synthesis. It ties into a single narrative what I&amp;rsquo;ve been writing and measuring through 2026, so here&amp;rsquo;s the road map before the argument:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://akitaonrails.github.io/en/2026/09/23/llm-benchmark-v4-opus-5-5-gpt-6-sol-luna-mimo-2-6-grok-4-7/"&gt;New v4 benchmarks&lt;/a&gt;&lt;/strong&gt;: I retested the major models and the uncomfortable conclusion was convergence, not a leap.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://akitaonrails.github.io/en/2026/09/28/llms-are-good-at-reproducing-what-exists-what-about-new-things/"&gt;The limits of LLMs&lt;/a&gt;&lt;/strong&gt;: models are great at reproducing what exists, extremely expensive at what doesn&amp;rsquo;t, and the served model is a static file that learns nothing from your marathon.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://akitaonrails.github.io/en/2026/10/11/are-there-better-languages-for-programming-with-llms/"&gt;Are there better languages for programming with LLMs?&lt;/a&gt;&lt;/strong&gt;: no. Neither script conciseness nor strong typing changed the outcome; test discipline did.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://akitaonrails.github.io/en/2026/10/10/which-jev-like-ai-decision-classifier-model-is-best/"&gt;Which Jev-like decision model is best?&lt;/a&gt;&lt;/strong&gt;: 21 classifier configurations, and the &amp;ldquo;specialized models&amp;rdquo; themselves converged to within a few points of each other.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://akitaonrails.github.io/en/2026/04/20/clean-code-for-ai-agents/"&gt;Clean Code for AI agents&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://akitaonrails.github.io/en/2026/04/11/vs-code-is-the-new-punch-card/"&gt;VS Code is the new punch card&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://akitaonrails.github.io/en/2026/09/17/talking-about-my-ai-skills/"&gt;my skills&lt;/a&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;a href="https://akitaonrails.github.io/en/2026/08/18/hot-take-harness-loop-engineering-graph-engineering-are-bullshit/"&gt;the hot take against loop engineering&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://akitaonrails.github.io/en/2026/05/30/open-source-best-practices-llm-the-minimum/"&gt;minimum best practices&lt;/a&gt;&lt;/strong&gt;: the same thesis from other angles. The model is a commodity; the engineering around it is the differentiator.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The thesis that closes this arc: &lt;strong&gt;LLMs have reached, or are very close to reaching, the ceiling of the transformer architecture.&lt;/strong&gt; And the good news is that nothing more than that is needed.&lt;/p&gt;</description><content:encoded><![CDATA[<p>This post is a synthesis. It ties into a single narrative what I&rsquo;ve been writing and measuring through 2026, so here&rsquo;s the road map before the argument:</p>
<ul>
<li><strong><a href="/en/2026/09/23/llm-benchmark-v4-opus-5-5-gpt-6-sol-luna-mimo-2-6-grok-4-7/">New v4 benchmarks</a></strong>: I retested the major models and the uncomfortable conclusion was convergence, not a leap.</li>
<li><strong><a href="/en/2026/09/28/llms-are-good-at-reproducing-what-exists-what-about-new-things/">The limits of LLMs</a></strong>: models are great at reproducing what exists, extremely expensive at what doesn&rsquo;t, and the served model is a static file that learns nothing from your marathon.</li>
<li><strong><a href="/en/2026/10/11/are-there-better-languages-for-programming-with-llms/">Are there better languages for programming with LLMs?</a></strong>: no. Neither script conciseness nor strong typing changed the outcome; test discipline did.</li>
<li><strong><a href="/en/2026/10/10/which-jev-like-ai-decision-classifier-model-is-best/">Which Jev-like decision model is best?</a></strong>: 21 classifier configurations, and the &ldquo;specialized models&rdquo; themselves converged to within a few points of each other.</li>
<li><strong><a href="/en/2026/04/20/clean-code-for-ai-agents/">Clean Code for AI agents</a></strong>, <strong><a href="/en/2026/04/11/vs-code-is-the-new-punch-card/">VS Code is the new punch card</a></strong>, <strong><a href="/en/2026/09/17/talking-about-my-ai-skills/">my skills</a></strong>, <strong><a href="/en/2026/08/18/hot-take-harness-loop-engineering-graph-engineering-are-bullshit/">the hot take against loop engineering</a></strong> and <strong><a href="/en/2026/05/30/open-source-best-practices-llm-the-minimum/">minimum best practices</a></strong>: the same thesis from other angles. The model is a commodity; the engineering around it is the differentiator.</li>
</ul>
<p>The thesis that closes this arc: <strong>LLMs have reached, or are very close to reaching, the ceiling of the transformer architecture.</strong> And the good news is that nothing more than that is needed.</p>
<h2>Convergence, not a leap<span class="hx:absolute hx:-mt-20" id="convergence-not-a-leap"></span>
    <a href="#convergence-not-a-leap" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>In my benchmarks, I see no relevant improvement in general programming since the Opus 4.5 generation. Yes, Fable and Astra are great at specific problems. In general programming, what I measure is everyone squeezed onto the same tier, including the Chinese commercial offerings (Kimi, GLM, DeepSeek). Model choice has become nearly irrelevant.</p>
<p>What still makes a real difference is the effort level: low effort for translation and summarization, high effort for vulnerability sweeps, heavy bug fixing or optimization. Beyond that, the numbers tell a reality much more boring than <a href="/en/2026/09/09/propagandas-enganosas-da-openai-anthropic-nvidia/">the vendors&rsquo; propaganda</a>.</p>
<blockquote>
  <p>My reading of the timeline: the models&rsquo; &ldquo;core&rdquo; reasoning had its last big leap in 2024. 2025 was the year of optimizing the architecture. 2026 is the year of refining the harness. Base intelligence made no order-of-magnitude leap in that period; efficiency and long-session competence did.</p>

</blockquote>
<h2>The timeline, with receipts<span class="hx:absolute hx:-mt-20" id="the-timeline-with-receipts"></span>
    <a href="#the-timeline-with-receipts" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><img src="/2026/10/12/llms-agentes-competente-o-suficiente/llms-agentes-timeline.png" alt="Timeline from 2019 to 2026: GPT-2 proves LLMs are useful, GPT-3 opens the parameter war, Chinchilla recalibrates toward data, GPT-4 turns parameter counts into secrets, o1 marks the reasoning peak, 2025 optimizes with MoE and caching, and 2026 is the agent era"  loading="lazy" /></p>
<p><strong>2019: GPT-2 proves LLMs are useful.</strong> 1.5 billion parameters, summarizing, translating and answering with no specific training, zero-shot. OpenAI found it so impressive that it <a href="https://openai.com/index/better-language-models/"target="_blank" rel="noopener">held back the full model for months</a> fearing misuse. Today it looks cute.</p>
<p><strong>2020: GPT-3 opens the parameter war.</strong> <a href="https://arxiv.org/abs/2005.14165"target="_blank" rel="noopener">175 billion</a>, a hundred times GPT-2, and the in-context few-shot learning that became the paradigm. <a href="https://arxiv.org/abs/2001.08361"target="_blank" rel="noopener">Kaplan&rsquo;s scaling law</a>, published months earlier, said loss fell as a power law with size, and the industry read it as &ldquo;bigger is better.&rdquo; There went two years of who-has-more-parameters.</p>
<p><strong>2022: Chinchilla recalibrates the war.</strong> DeepMind trained <a href="https://arxiv.org/abs/2203.15556"target="_blank" rel="noopener">400 models and showed</a> the giants were undertrained: a 70B model with 1.4 trillion tokens beat the 280B Gopher. The &ldquo;training data&rdquo; axis started weighing as much as the &ldquo;parameters&rdquo; axis. First crack in the war.</p>
<p><strong>2023: GPT-4 ends the war by decree.</strong> The <a href="https://arxiv.org/abs/2303.08774"target="_blank" rel="noopener">technical report</a> refused to publish size, hardware or data, citing the competitive landscape and safety implications. The most cited leak, from <a href="https://newsletter.semianalysis.com/p/gpt-4-architecture-infrastructure"target="_blank" rel="noopener">SemiAnalysis</a>, described 1.76 trillion parameters in a mixture of experts. Since then, parameter counts vanished from marketing: neither the GPT-5 announcements nor the Claude 4 ones cite a number. Notice neither Astra nor Fable spends a line on it today. The war ended and nobody signed an armistice.</p>
<p><strong>2024: the reasoning peak.</strong> <a href="https://openai.com/index/learning-to-reason-with-llms/"target="_blank" rel="noopener">September&rsquo;s o1</a> marked that peak: RL to produce long chains of thought, and the discovery that more test-time compute improves the answer. That is, by my yardstick, the last &ldquo;base intelligence&rdquo; revolution.</p>
<p><strong>2025: architecture optimization.</strong> Mixture of experts became the standard: <a href="https://mistral.ai/news/mixtral-of-experts/"target="_blank" rel="noopener">Mixtral</a> was already showing in 2023 that 46.7B total parameters with only 12.9B active per token cost like a small model, and <a href="https://arxiv.org/abs/2412.19437"target="_blank" rel="noopener">DeepSeek-V3</a> took that to 671B total with 37B active, with the final training run costing under 6 million dollars in GPU-hours at H800 rental prices (not counting the prior R&amp;D). The MoE magic is simple: it separates capacity (total parameters, which live in memory) from per-token cost (only the experts chosen by the router compute). You pay for a 37B model and carry a 671B one.</p>
<p>On the serving side, <a href="https://www.anthropic.com/news/prompt-caching"target="_blank" rel="noopener">prompt caching</a> cut up to 90% of repeated-context cost (OpenAI <a href="https://openai.com/index/api-prompt-caching/"target="_blank" rel="noopener">followed two months later</a>), context windows passed 1 million tokens, and serving techniques like speculative decoding and PagedAttention multiplied throughput. And <a href="https://arxiv.org/abs/2501.12948"target="_blank" rel="noopener">DeepSeek-R1-Zero</a> showed that pure RL, with no supervised fine-tuning, makes reasoning emerge. None of this is &ldquo;more intelligence.&rdquo; All of it is the same intelligence, cheaper, faster and more stable.</p>
<p><strong>2026: the agentic era.</strong> Function calling has existed since <a href="https://openai.com/index/function-calling-and-other-api-updates/"target="_blank" rel="noopener">June 2023</a>, but the ecosystem turning point was <a href="https://www.anthropic.com/news/model-context-protocol"target="_blank" rel="noopener">Anthropic&rsquo;s MCP</a> in late 2024, which OpenAI adopted months later and which today lives at the Linux Foundation. Claude Code, Codex and co. came out in 2025, and the metric that matters became <a href="https://metr.org/blog/2025-03-19-measuring-ai-ability-to-complete-long-tasks/"target="_blank" rel="noopener">METR</a>&rsquo;s: the task size an agent completes with 50% reliability had been doubling every 7 months since 2019. Anthropic&rsquo;s own guide on <a href="https://www.anthropic.com/engineering/building-effective-agents"target="_blank" rel="noopener">building effective agents</a> states the obvious plainly: simple, composable patterns, not fanciful frameworks.</p>
<h2>Why the agent allows a less dense model<span class="hx:absolute hx:-mt-20" id="why-the-agent-allows-a-less-dense-model"></span>
    <a href="#why-the-agent-allows-a-less-dense-model" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Here&rsquo;s the mechanism most people don&rsquo;t stop to think about. A lone model needs to carry the world in its weights, because its only chance to answer is that one, in a single pass. A model with a harness doesn&rsquo;t:</p>
<ul>
<li><strong>On-demand search and reading.</strong> With web search and fetch, low-priority knowledge leaves the weights and becomes a lookup: the agent pulls it into the context window only when needed. The model can be less encyclopedic and more operator.</li>
<li><strong>Controlled trial and error.</strong> Alone, the model needs to guess the right answer on the first try. With an agent, it proposes a hypothesis, implements, sends it to be tested, gets the feedback and decides again with real information. Each such cycle is new knowledge entering the session without costing a training neuron.</li>
</ul>
<p>Both mechanisms fight hallucination at the root: fetch brings the fact the model doesn&rsquo;t know by heart, and the test loop catches the invention before it becomes code. That&rsquo;s why 2026 <strong>feels</strong> like a giant leap: the model+harness combination got much more competent, even with base intelligence nearly stalled.</p>
<h2>Not every problem needs a giant LLM<span class="hx:absolute hx:-mt-20" id="not-every-problem-needs-a-giant-llm"></span>
    <a href="#not-every-problem-needs-a-giant-llm" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The same &ldquo;less dense&rdquo; logic applies inside the application. Much of what people throw at a chat LLM is disguised classification: labeling tickets, routing queues, applying policy. For that there are specialized decision models, and I covered the topic twice: the <a href="/en/2026/10/03/understanding-the-jev-hype-what-is-it-for/">Jev hype</a>, with Paulo Câmara&rsquo;s essay on why a classifier is the first thing a computer scientist thinks of, and <a href="/en/2026/10/10/which-jev-like-ai-decision-classifier-model-is-best/">my benchmark with 21 configurations</a>, where a Microsoft 9B tied the hosted leader and a local 4B came within a few points, at cents per ten thousand decisions.</p>
<p>The &ldquo;193x faster&rdquo; shock of Jev&rsquo;s marketing only exists because many people were using a giant LLM as an expensive, slow classifier. When the right tool enters, the frontier model leaves the play, and along with it the cost, the latency and the format hallucination. It&rsquo;s this post&rsquo;s thesis in miniature: competence doesn&rsquo;t come from density, it comes from fit.</p>
<h2>The loop nobody sees<span class="hx:absolute hx:-mt-20" id="the-loop-nobody-sees"></span>
    <a href="#the-loop-nobody-sees" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>There&rsquo;s a user-experience detail in this story. In a good agentic session, what happens is semi-transparent to whoever requested the task: the model guesses wrong, the agent fetches the documentation online or runs the real test, the error comes back as feedback, and the model corrects itself. You see &ldquo;task requested, task delivered.&rdquo; In between, dozens of micro-corrections happened that nobody witnessed.</p>
<p>My bet: since agents are trained to fill the context when they need to, even new language or library versions no longer confuse them that much. The model doesn&rsquo;t need to know the API by heart; it looks it up, tests and adjusts in the loop. That&rsquo;s what I see in my experiments, from <a href="/en/2026/09/07/ai-challenge-converting-nes-roms-to-master-system-sms/">converting NES ROMs to Master System</a> to the <a href="/en/2026/07/12/using-ai-to-solve-my-little-day-to-day-problems/">little day-to-day problems</a>. And it&rsquo;s what the <a href="/en/2026/10/11/are-there-better-languages-for-programming-with-llms/">languages benchmark</a> measured: seven languages came out practically equivalent, because the loop equalizes what training leaves uneven.</p>
<p>I measured the caveat too. When there&rsquo;s no documentation to fetch and no test to validate against, the loop spins in a vacuum: that&rsquo;s what happened with <a href="/en/2026/09/19/new-ai-language-just-released-bend-2/">Bend 2</a>, a language too new to have a corpus, and it was the central point of the post about <a href="/en/2026/09/28/llms-are-good-at-reproducing-what-exists-what-about-new-things/">the limits</a>. The mechanism is powerful, but it needs an oracle.</p>
<p>And there&rsquo;s a receipt that the base is stalled. Back in November 2024 <a href="https://www.reuters.com/technology/artificial-intelligence/openai-rivals-seek-new-path-smarter-ai-current-methods-hit-limitations-2024-11-11/"target="_blank" rel="noopener">Reuters</a> was already reporting diminishing returns in pre-training at the three big labs. At the following NeurIPS, Sutskever, the scaling-thesis guy, declared that <a href="https://www.youtube.com/watch?v=WQQdd6qGxNs"target="_blank" rel="noopener">&ldquo;pre-training as we know it will end&rdquo;</a>: the public data ran out. And <a href="https://hai.stanford.edu/ai-index/2025-ai-index-report"target="_blank" rel="noopener">Stanford&rsquo;s AI Index</a> measured the gap between the first and the tenth model on Chatbot Arena shrinking from 12% to 5% in one year. That&rsquo;s convergence, with numbers.</p>
<h2>The propaganda in the opposite direction<span class="hx:absolute hx:-mt-20" id="the-propaganda-in-the-opposite-direction"></span>
    <a href="#the-propaganda-in-the-opposite-direction" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>While the numbers show a plateau, the marketing sells the apocalypse. I already dissected a whole week of that in <a href="/en/2026/09/09/propagandas-enganosas-da-openai-anthropic-nvidia/">&ldquo;You&rsquo;re an idiot if you believe the misleading ads from OpenAI, Anthropic, NVIDIA&rdquo;</a>, so here&rsquo;s only what matters for this narrative:</p>
<ul>
<li>OpenAI&rsquo;s &ldquo;Navier-Stokes proof&rdquo; was agentic brute force at industrial scale, 130 billion tokens over human mathematicians&rsquo; machinery, sold as emergent intelligence.</li>
<li>The Hugging Face incident was a swarm running 17 thousand attempts with automatic verification, not an &ldquo;agent that gained consciousness and escaped.&rdquo; Expensive trial and error, exactly the mechanism I described here.</li>
<li>Fear is a product: whoever sells &ldquo;my AI is too powerful and might escape control&rdquo; is, in the same sentence, asking for regulation that locks out the smaller competitor and inflating the perception that their model is more capable than the others'.</li>
</ul>
<p>The facts I measured point the opposite way from the apocalypse: models converging, differences shrinking, and useful work migrating from the model to the harness. Rogue AI gaining consciousness is not what the logs show. What the logs show is engineering.</p>
<h2>&ldquo;Competent enough&rdquo;<span class="hx:absolute hx:-mt-20" id="competent-enough"></span>
    <a href="#competent-enough" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I don&rsquo;t expect another order-of-magnitude reasoning revolution in this architecture. What&rsquo;s coming is incremental agentic improvement: more robust tool calling, better memory, longer sessions, less hallucination per verification cycle. And this post&rsquo;s point is that this is already enough.</p>
<p>What the agentic era delivered was the automation of correct software engineering: long, reliable coding sessions, with testing and feedback, that accelerated hundreds, if not thousands, of open source projects. <a href="/en/2026/09/22/stop-making-excuses-and-ship-more-the-premise-changed/">The deploy premise changed</a> along with it. It&rsquo;s not a silver bullet. It&rsquo;s a new compiler for an old discipline: whoever had process, tests and documented invariants reaped; whoever had only hype is still waiting for the next model to solve it.</p>
<p>And to wrap up: I see no problem at all in raw models stagnating. <a href="/en/2026/09/28/llms-are-good-at-reproducing-what-exists-what-about-new-things/">The limits we already know</a>, and harness optimizations will soon hit diminishing returns too. What remains is what always remained: real software engineering technique, with automated tests first, and an experienced engineer at the wheel. With that, coding results are excellent today, not one model generation from now.</p>
<p>What won&rsquo;t exist is magic for amateurs. Asking an agent for any coding task without knowing what you&rsquo;re doing doesn&rsquo;t get back secure, optimized, well-thought-out code: it gets slop. The agent responds better to those who know what to ask for, that is, to those who understand this architecture, the pros, the cons, and know how to work around the weaknesses and leverage the strengths of the model+harness combination.</p>
<p>Hence the title. A lone LLM is an expensive parrot. An LLM with an agent is competent enough to work for real. And &ldquo;competent enough,&rdquo; added to your engineering discipline, is everything the industry needed. The rest is marketing waiting for the next magic parameter count that nobody publishes anymore.</p>
]]></content:encoded><category>llms</category><category>artificial-intelligence</category><category>coding-agents</category><category>software-engineering</category></item><item><title>Are There Better Languages for Programming with LLMs?</title><link>https://akitaonrails.github.io/en/2026/10/11/are-there-better-languages-for-programming-with-llms/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/10/11/are-there-better-languages-for-programming-with-llms/</guid><pubDate>Sun, 11 Oct 2026 21:00:00 -0300</pubDate><description>&lt;p&gt;Last week DHH decided to farm engagement with the laziest format there is: he converted Campfire, his chat app, to several languages using AI agents, and started dropping the throughput results one by one on X. In the series he posted, the Rust version came out ahead of the Elixir and Ruby equivalents. The whole thread was designed to provoke, and it provoked.&lt;/p&gt;
&lt;blockquote class="twitter-tweet" data-partner="tweetdeck"&gt;&lt;p lang="en" dir="ltr"&gt;Last conversion of the Campfire from my token stash goes to JavaScript/Express. As with the others, I'm sure you can find more to optimize. But this gives you a sense of what order of magnitude these options exist within with agent-led development. https://t.co/UUapL99SJE https://t.co/2H2NXfeZog&lt;/p&gt;</description><content:encoded><![CDATA[<p>Last week DHH decided to farm engagement with the laziest format there is: he converted Campfire, his chat app, to several languages using AI agents, and started dropping the throughput results one by one on X. In the series he posted, the Rust version came out ahead of the Elixir and Ruby equivalents. The whole thread was designed to provoke, and it provoked.</p>
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="en" dir="ltr">Last conversion of the Campfire from my token stash goes to JavaScript/Express. As with the others, I'm sure you can find more to optimize. But this gives you a sense of what order of magnitude these options exist within with agent-led development. https://t.co/UUapL99SJE https://t.co/2H2NXfeZog</p>&mdash; DHH (@dhh) <a href="https://twitter.com/dhh/status/2107077808182976817">October 5, 2026</a></blockquote>
<p>I won&rsquo;t defend him this time. A one-shot conversion, done by an agent, with no fine-tuning at all, doesn&rsquo;t measure language: it measures how much the model knows each stack&rsquo;s idioms. It&rsquo;s rage bait and he knows it. That said, I do the same from time to time, and so do half his critics, so we&rsquo;re all hypocrites and life goes on.</p>
<p>And the weak spot of his methodology became a topic of its own: several people noticed the Rust version had gone through far more agent iterations than the others, meaning more optimization rounds. @kurtome answered in practice: he took the Elixir version and sped up the main page requests 10x, with obvious optimizations that no first conversion does, like caching and async database connection pooling.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">@dhh Here you go https://t.co/gUtK7Z7zG7<br><br>got a 10x speed up on the Room page requests, and sped up all the other requests significantly as well. the biggest gains came from some no brainers: implement caching and pool the db connections with proper async https://t.co/mbp94q9N0s</p>&mdash; kurt (.com) (@kurtome) <a href="https://twitter.com/kurtome/status/2106902762076467681">October 5, 2026</a></blockquote>
<p>His comparison, then, wasn&rsquo;t &ldquo;Rust versus Elixir&rdquo;: it was &ldquo;Rust after N tuning rounds versus Elixir after one.&rdquo; And that lays bare the truth the thread pretends to ignore: <strong>no real software ships from half a dozen prompts</strong>. Coding with AI shines when an experienced engineer steers the agent toward their goal, and that means dozens of iterations, not three.</p>
<p>The good part is that the bait was useful to me. I&rsquo;ve been doing <a href="/en/2026/09/15/new-llm-benchmark-v4-retesting-all-top-llms-part-1/">LLM benchmarks</a> and <a href="/en/2026/10/10/which-jev-like-ai-decision-classifier-model-is-best/">decision-model benchmarks</a>, but I had never measured, in a reproducible way, the question that thread pretended to answer: <strong>does it matter which language you pick when the one writing the code is an LLM?</strong> My short answer was already out in two posts of mine:</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Pressure under load is not a trivial problem to solve from scratch and I recommend you do not attempt to. It's a solved problem already and all solutions converge to what Elixir already brings out of the box. So yes. I use Rust all the time, but if I had to solve high scalability problems (particularly high volume message queues), I would think of Elixir first.</p>&mdash; Fabio Akita (@AkitaOnRails) <a href="https://twitter.com/AkitaOnRails/status/2108587462595367353">October 9, 2026</a></blockquote>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Language wars are tiresome. And the reality is simpler if you're doing AI assisted coding.<br><br>- system level (drivers, fs, daemons, etc): Rust. C++ is you're extending existing legacy<br>- windows only desktop apps: C#<br>- iOS/MacOS/iPadOS: Swift<br>- multi-OS: Rust/Tauri, Qt/C++, Flutter, Electron (pick your poison)<br>- simple websites: Node/Typescript/Bun/Deno<br>- highly scalable backend: Elixir, parts in Rust, parts in Go<br>- CLI tools: Rust<br><br>Everything else, by default, Rust. Unless it's an edge case.</p>&mdash; Fabio Akita (@AkitaOnRails) <a href="https://twitter.com/AkitaOnRails/status/2108590592263352540">October 9, 2026</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<h2>There&rsquo;s no better language, there&rsquo;s the right tool<span class="hx:absolute hx:-mt-20" id="theres-no-better-language-theres-the-right-tool"></span>
    <a href="#theres-no-better-language-theres-the-right-tool" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>That list from the post isn&rsquo;t a ranking, it&rsquo;s a terrain map. Every language and every framework was designed for a use case, and none covers them all. That was true when you wrote every line by hand and it stays true with agents. The LLM doesn&rsquo;t change the physics of the problem: it only changes who&rsquo;s typing.</p>
<p>And the map goes beyond language. A real system has infrastructure around it: Kubernetes when scale asks for it, SQLite by default because most apps never need more than that, Postgres with pgBouncer when they do, Redis for cache and key-value, RabbitMQ or NATS for queues. Picking &ldquo;the stack&rdquo; on day zero and expecting it to last ten years is fantasy. It doesn&rsquo;t, and that&rsquo;s fine.</p>
<p>Personal example: new web app, I open Ruby on Rails without thinking twice. It&rsquo;s the most complete end-to-end solution there is for the web, and with an LLM writing most of the code, the framework&rsquo;s productivity weighs even more than the language&rsquo;s. As the system grows, I swap the parts that ask for another tool: a high-volume queue leaves Rails&rsquo; side and goes to something from Erlang land, starting with RabbitMQ, which already solves the hard backpressure part for me.</p>
<blockquote>
  <p>No good software is finished: it grows. Usage dictates what you replace, rewrite and add. The final architecture is never the first commit&rsquo;s, and whoever tries to get everything right in the first commit only produces dead documents.</p>

</blockquote>
<h2>The token superstition<span class="hx:absolute hx:-mt-20" id="the-token-superstition"></span>
    <a href="#the-token-superstition" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>DHH&rsquo;s thread resurrected two beliefs that have been circulating since LLMs became work tools:</p>
<ul>
<li><strong>&ldquo;Script languages are better for AI because the lean syntax spends fewer tokens.&rdquo;</strong></li>
<li><strong>&ldquo;Strongly typed languages are better for AI because the compiler catches the errors, so you need less testing and less repair.&rdquo;</strong></li>
</ul>
<p>Both sound reasonable and both are superstition until someone measures. I was betting against both, from experience: a good compiler helps, but it doesn&rsquo;t do magic, and syntax conciseness was never the bottleneck of an agent that reads and writes files all day.</p>
<p>What really separates a project that moves from a project that spins in circles is test discipline. I&rsquo;ve written that <a href="/en/2026/04/20/clean-code-for-ai-agents/">TDD became a technical obligation, not a philosophy</a>, and this post&rsquo;s benchmark is one more data point in the same direction. It doesn&rsquo;t matter whether you do test-first or test-after: what matters is that the suite grows with the code, that <a href="/en/2026/03/01/software-is-never-done-4-projects-life-after-deploy-one-shot-prompt-myth/">every user-reported bug becomes a regression test</a> before the fix, and that you never make the same mistake twice. Software without users is dead software, so <a href="/en/2026/09/22/stop-making-excuses-and-ship-more-the-premise-changed/">release early, release often</a>, break fast and fix even faster. AI closes exactly that gap: the reproduce-test-fix cycle got cheap. QA became the programmer&rsquo;s most valuable skill, far above &ldquo;knowing Rust syntax.&rdquo;</p>
<p>Discipline beats compiler and beats language. That was my hypothesis. Time to measure.</p>
<h2>The benchmark<span class="hx:absolute hx:-mt-20" id="the-benchmark"></span>
    <a href="#the-benchmark" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I built a reproducible experiment, public in the <a href="https://github.com/akitaonrails/vibe-coding-benchmarks"target="_blank" rel="noopener">vibe-coding-benchmarks repository</a>, with per-attempt results published in JSON and the raw traces kept out of the repo for credential containment. It&rsquo;s not a language championship, and the design itself says so: it&rsquo;s a snapshot of one real task, measuring what can be honestly measured.</p>
<h3>The task<span class="hx:absolute hx:-mt-20" id="the-task"></span>
    <a href="#the-task" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>One task only, on purpose: maintain a multi-tenant <strong>ledger engine</strong>. The agent receives working v1 code and has to take it to a v2 contract, with per-tenant identities, authorization, serializable snapshots, a unique secondary index with alias swap, a capacity-bounded journal, torn-group recovery, checkpointing, legacy schema migration and durable retry IDs. It&rsquo;s not FizzBuzz: it&rsquo;s the kind of system that demands invariants across operations, exactly where LLMs tend to trip.</p>
<p>Correctness is judged by <strong>43 test stories applied after collection</strong>, out of the agent&rsquo;s sight: the 27 public ones from T1 plus 16 hidden ones. Passing is 43 out of 43. The conditions:</p>
<ul>
<li><strong>T0:</strong> prose contract, input and output examples, a working launcher. No test suite.</li>
<li><strong>T1:</strong> the same, plus 27 public stories and a driver to run them.</li>
</ul>
<p>Each attempt had a 15-minute budget, with at most two 3-minute continuations. In practice, none of the 112 needed a continuation.</p>
<h3>The languages and the models<span class="hx:absolute hx:-mt-20" id="the-languages-and-the-models"></span>
    <a href="#the-languages-and-the-models" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Seven languages in three strata, with pinned toolchains and Rust in safe mode:</p>
<ul>
<li><strong>Typed natives:</strong> Rust (safe, pinned), Haskell (pinned GHC).</li>
<li><strong>Typed VMs:</strong> C# (with nullable analysis), Kotlin, TypeScript (<code>strict</code>, <code>noUncheckedIndexedAccess</code>, <code>exactOptionalPropertyTypes</code>).</li>
<li><strong>Dynamic scripts:</strong> Python and Ruby, no checker at all.</li>
</ul>
<p>Four model configurations, all on subscriptions, no paid fallback: <strong>Kimi K3</strong> (high), <strong>GLM 5.3</strong> via OpenCode (high), <strong>Claude Opus 5.5</strong> (medium) and <strong>Codex with gpt-6 Sol</strong> (medium). Crossing everything: 7 languages × 4 models × 2 conditions × 2 repetitions = <strong>112 attempts</strong>.</p>
<h3>What this design doesn&rsquo;t measure<span class="hx:absolute hx:-mt-20" id="what-this-design-doesnt-measure"></span>
    <a href="#what-this-design-doesnt-measure" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Before the numbers, the brakes, because they&rsquo;re part of the result. It&rsquo;s a single task, with two repetitions per cell: a small sample by construction. Token coverage is partial in some models (missing data is not zero). The harness changed mid-campaign across three instrumentation epochs. And provider delays contaminate wall time: one of the Opus attempts spent half the clock waiting for quota release. All numbers below are descriptive, and I point out where they can&rsquo;t support a conclusion.</p>
<p>There&rsquo;s one additional brake, on purpose: <strong>the iteration level</strong>. My design measures what can be reached in all languages with similar iteration levels, on a short budget, with no human tuning afterwards. It&rsquo;s a photograph of the floor, not the ceiling. Any of the 112 implementations probably improves with more agent rounds, and the four queue stacks likewise: what I publish is what each language delivers &ldquo;out of the factory&rdquo; under the same effort, not the maximum a patient engineer would extract from it.</p>
<blockquote>
  <p><strong>Mandatory disclaimer before quoting any number from this post around:</strong> every result that follows holds for <strong>this</strong> benchmark, with <strong>this</strong> task, <strong>these</strong> models, <strong>these</strong> prompts and <strong>this</strong> hardware. Your case may vary violently. If your task doesn&rsquo;t look like a ledger engine, if your model isn&rsquo;t one of these four, if your queue isn&rsquo;t my queue, the numbers don&rsquo;t transfer. The code, the tasks, the grades and the step-by-step to reproduce are all in the <a href="https://github.com/akitaonrails/vibe-coding-benchmarks"target="_blank" rel="noopener">GitHub repository</a>. And if you disagree with some result and that disagreement matters to your company or your project, the only honest attitude is the one I had: <strong>stop arguing and run your own benchmark.</strong></p>

</blockquote>
<h2>Result 1: on correctness, the frontier models tied at the ceiling<span class="hx:absolute hx:-mt-20" id="result-1-on-correctness-the-frontier-models-tied-at-the-ceiling"></span>
    <a href="#result-1-on-correctness-the-frontier-models-tied-at-the-ceiling" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><table>
  <thead>
      <tr>
          <th>Configuration</th>
          <th style="text-align: right">Correct within budget</th>
          <th style="text-align: right">Correct at the limit</th>
          <th style="text-align: right">Failures</th>
          <th style="text-align: right">Ungraded</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Kimi K3 high</td>
          <td style="text-align: right">17</td>
          <td style="text-align: right">7</td>
          <td style="text-align: right">2</td>
          <td style="text-align: right">2</td>
      </tr>
      <tr>
          <td>GLM 5.3 high (OpenCode)</td>
          <td style="text-align: right">7</td>
          <td style="text-align: right">9</td>
          <td style="text-align: right">7</td>
          <td style="text-align: right">5</td>
      </tr>
      <tr>
          <td>Opus 5.5 medium</td>
          <td style="text-align: right">25</td>
          <td style="text-align: right">0</td>
          <td style="text-align: right">3 (infra interruption)</td>
          <td style="text-align: right">0</td>
      </tr>
      <tr>
          <td>Codex / Sol medium</td>
          <td style="text-align: right">28</td>
          <td style="text-align: right">0</td>
          <td style="text-align: right">0</td>
          <td style="text-align: right">0</td>
      </tr>
  </tbody>
</table>
<p>Reading: Sol passed all 28 eligible attempts and Opus its 25 (the 3 failures were infrastructure, not code). <strong>53 of 53 eligible attempts correct between the two.</strong> The task, made to be hard, was too easy to separate the frontier models, let alone the languages: with everyone passing everything, there&rsquo;s no correctness ranking to publish.</p>
<p>The difference showed up in the weaker models, and in the direction my hypothesis predicted: <strong>provided tests helped</strong>. Kimi and GLM, with the public suite in hand (T1), delivered 24 correct artifacts against 16 without it (T0). Kimi, in particular, passed all 14 attempts with provided tests. It&rsquo;s descriptive, not causal, but it&rsquo;s the cleanest signal in the whole benchmark: what changed the outcome wasn&rsquo;t the language, it was the presence of tests.</p>
<p>Per language, within each model, correctness scattered between 1/4 and 4/4 with no pattern that repeats across models. The three semantic failures I audited in depth are instructive: a GLM C# and a Kimi Python lost the same story by violating the same cross-operation invariant, and a Kimi Haskell missed a checkpoint path. None of the failures was a type error.</p>
<blockquote>
  <p>Where the model erred, it erred on domain invariants: the kind of error no compiler catches, in typed or dynamic languages. The myth that strong typing spares you the work of understanding the problem dies right there.</p>

</blockquote>
<h2>Result 2: concise language saved no tokens<span class="hx:absolute hx:-mt-20" id="result-2-concise-language-saved-no-tokens"></span>
    <a href="#result-2-concise-language-saved-no-tokens" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Here&rsquo;s the table that kills the first superstition. Medians per language on Sol, four valid attempts per cell:</p>
<table>
  <thead>
      <tr>
          <th>Language</th>
          <th style="text-align: right">Median time</th>
          <th style="text-align: right">Median tokens</th>
          <th style="text-align: right">Final code lines</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>TypeScript</td>
          <td style="text-align: right">53 s</td>
          <td style="text-align: right">147.5 thousand</td>
          <td style="text-align: right">~280</td>
      </tr>
      <tr>
          <td>Python</td>
          <td style="text-align: right">77 s</td>
          <td style="text-align: right">138.2 thousand</td>
          <td style="text-align: right">~300</td>
      </tr>
      <tr>
          <td>C#</td>
          <td style="text-align: right">61 s</td>
          <td style="text-align: right">171.6 thousand</td>
          <td style="text-align: right">~260</td>
      </tr>
      <tr>
          <td>Kotlin</td>
          <td style="text-align: right">65 s</td>
          <td style="text-align: right">170.6 thousand</td>
          <td style="text-align: right">~210</td>
      </tr>
      <tr>
          <td>Haskell</td>
          <td style="text-align: right">75 s</td>
          <td style="text-align: right">184.7 thousand</td>
          <td style="text-align: right">~265</td>
      </tr>
      <tr>
          <td>Ruby</td>
          <td style="text-align: right">82 s</td>
          <td style="text-align: right">185.6 thousand</td>
          <td style="text-align: right">~380</td>
      </tr>
      <tr>
          <td>Rust</td>
          <td style="text-align: right">80 s</td>
          <td style="text-align: right">188.1 thousand</td>
          <td style="text-align: right">~650</td>
      </tr>
  </tbody>
</table>
<p>Ruby, the most concise in lines (a bit over half of Rust&rsquo;s), cost practically the same tokens as Rust on Sol, and on Opus it was <strong>the most expensive of all</strong>, about 205 thousand median tokens against C#&rsquo;s 94 thousand. The cheapest were TypeScript and Python on Sol, C#, Haskell and Kotlin on Opus. If &ldquo;fewer source code lines = fewer LLM tokens&rdquo; were a law, Ruby should have led by a wide margin. It finished last.</p>
<p>And the second superstition? I audited the traces looking for the compiler-guided repair cycles that strong typing supposedly avoids. Result: <strong>zero compilation-error repair cycles</strong> in the audited Opus attempts, across Ruby, Rust and Haskell. Rust needed no compiler-driven fix at all; Haskell had one warning cleanup; Ruby spent its extra tokens on voluntary performance tuning. The frontier model almost always writes code that compiles on the first try, and the real effort goes to verification, not to appeasing the compiler.</p>
<p>One counterpoint that closes the coffin on the &ldquo;cheap is good&rdquo; thesis: GLM&rsquo;s <strong>lowest</strong> token-consumption cells were the failures. TypeScript T0 at 50 thousand tokens looks efficient until you see it&rsquo;s two unmodified starters because the model blew the output limit. Low tokens can mean early surrender.</p>
<h2>Result 3: under load, everyone tied at the queue<span class="hx:absolute hx:-mt-20" id="result-3-under-load-everyone-tied-at-the-queue"></span>
    <a href="#result-3-under-load-everyone-tied-at-the-queue" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Now for DHH&rsquo;s question: Rust &ldquo;beats&rdquo; Elixir and Ruby when the subject is throughput. I built the separate track for that: four queue workers against a real RabbitMQ, written with agent help, each in its natural idiom:</p>
<ul>
<li><strong>Elixir</strong> with OTP and Broadway</li>
<li><strong>Rust</strong> with Tokio and Lapin</li>
<li><strong>Rails</strong> with Bunny</li>
<li><strong>Plain Ruby</strong> with Bunny (control)</li>
</ul>
<p>A generator published 10 thousand 4 KB messages to RabbitMQ, at 200 per second, and each worker consumed as fast as it could, hitting the effects on an HTTP/SQLite collector with a nominal 50 ms delay, limited to 2 CPUs and 1 GB of RAM. Two concurrency profiles:</p>
<table>
  <thead>
      <tr>
          <th>Stack</th>
          <th style="text-align: right">Handlers</th>
          <th style="text-align: right">Effects/s</th>
          <th style="text-align: right">Correct/10,000</th>
          <th style="text-align: right">Memory peak</th>
          <th>Drained?</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Elixir</td>
          <td style="text-align: right">8</td>
          <td style="text-align: right">94.8</td>
          <td style="text-align: right">10,000</td>
          <td style="text-align: right">135 MiB</td>
          <td>yes</td>
      </tr>
      <tr>
          <td>Rust</td>
          <td style="text-align: right">8</td>
          <td style="text-align: right">94.6</td>
          <td style="text-align: right">10,000</td>
          <td style="text-align: right">16 MiB</td>
          <td>yes</td>
      </tr>
      <tr>
          <td>Rails</td>
          <td style="text-align: right">8</td>
          <td style="text-align: right">92.7</td>
          <td style="text-align: right">10,000</td>
          <td style="text-align: right">79 MiB</td>
          <td>yes</td>
      </tr>
      <tr>
          <td>Ruby</td>
          <td style="text-align: right">8</td>
          <td style="text-align: right">92.5</td>
          <td style="text-align: right">10,000</td>
          <td style="text-align: right">38 MiB</td>
          <td>yes</td>
      </tr>
      <tr>
          <td>Elixir</td>
          <td style="text-align: right">64</td>
          <td style="text-align: right">84.8</td>
          <td style="text-align: right">7,915</td>
          <td style="text-align: right">161 MiB</td>
          <td>no</td>
      </tr>
      <tr>
          <td>Rust</td>
          <td style="text-align: right">64</td>
          <td style="text-align: right">88.2</td>
          <td style="text-align: right">8,151</td>
          <td style="text-align: right">23 MiB</td>
          <td>no</td>
      </tr>
      <tr>
          <td>Rails</td>
          <td style="text-align: right">64</td>
          <td style="text-align: right">88.5</td>
          <td style="text-align: right">8,108</td>
          <td style="text-align: right">87 MiB</td>
          <td>no</td>
      </tr>
      <tr>
          <td>Ruby</td>
          <td style="text-align: right">64</td>
          <td style="text-align: right">88.0</td>
          <td style="text-align: right">8,081</td>
          <td style="text-align: right">60 MiB</td>
          <td>no</td>
      </tr>
  </tbody>
</table>
<p>On the 8-handler profile, the four stacks delivered the same throughput, 93 to 95 effects per second, and drained the whole queue. The apparent bottleneck was the shared collector (a Python lock, a single SQLite writer), not the languages. On the 64-handler profile, all of them left a backlog and blew the client timeout en masse, so I marked those cells as not qualified: the strong protocol, with a group-commit collector and a 50 to 800 msg/s ramp, is designed but not executed.</p>
<p>The only difference left standing in the numbers was <strong>memory</strong>: Rust held the peak at 16 MiB where the BEAM spent 135. It&rsquo;s a real Rust advantage in density, with the caveat that a cgroup peak is not a language footprint. On throughput, which was the thread&rsquo;s claim, a technical tie.</p>
<p>And the tie deserves an honest reading: it may only mean my pressure was too little. With the shared collector holding everything around 95 effects per second, any stack capable of more than that shows up as &ldquo;equal.&rdquo; What this test shows is where the bottleneck was, not where each stack breaks. To find each one&rsquo;s ceiling I&rsquo;d need the strong protocol, with a group-commit collector and a load ramp, which is designed but not executed. Until then, &ldquo;all stacks perform the same&rdquo; is the wrong conclusion; &ldquo;all of them stayed above what my test could measure&rdquo; is the right one.</p>
<p>And the question that interested me most, &ldquo;does the agent work less to deliver a reliable queue consumer in Elixir than in Rust?&rdquo;, was deliberately left unanswered: these four implementations were written to validate the environment, not as a controlled coding attempt. Comparing AI effort between Elixir and Rust would require the same ledger matrix running on the queue task. It&rsquo;s on the list.</p>
<h2>So, does the language matter?<span class="hx:absolute hx:-mt-20" id="so-does-the-language-matter"></span>
    <a href="#so-does-the-language-matter" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>With the data on the table, the thread&rsquo;s three questions can be answered:</p>
<p><strong>Is there a better language for programming with LLMs?</strong> None showed up. In the frontier models, correctness and effort varied less between languages than between models. Where there was a correctness difference, it followed the presence of provided tests, not syntax. &ldquo;No general language ranking is established&rdquo; is the report&rsquo;s official sentence, and it&rsquo;s the correct one.</p>
<p><strong>Do the token-economy theses hold?</strong> Neither one. Conciseness didn&rsquo;t save: Ruby cost as much as Rust, or more. Strong typing spared no repair: there was no type repair to spare. The models&rsquo; effort went to verification and understanding the contract, and that has no language.</p>
<p><strong>Was DHH right?</strong> In what he measured, he measured what an agent delivers for free on each stack, without tuning, and called that a verdict on language. In my test, with real load and honest measurement, the four stacks tied on throughput in the stable regime, and only memory differentiated Rust. If his thread proves anything, it proves that agent conversion measures the model, not the language.</p>
<p>My bets from the introduction came out standing: testing and discipline are the lever, the compiler is a supporting actor, and the right tool depends on the problem. New web app is still Rails in my hand, heavy queue is still Erlang territory, low-level system is still Rust, and the LLM writes any of them with the same competence. Whoever spent the week fighting for their favorite language on X fought over nothing.</p>
<p>And my daily practice tells the same story. I have a personal bias toward Rust and even so I&rsquo;ve published more than 30 open source projects in all kinds of stacks: <a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a> is Rust, <a href="https://github.com/akitaonrails/FrankMD"target="_blank" rel="noopener">FrankMD</a> is Ruby on Rails, <a href="https://github.com/akitaonrails/ai-memory-web"target="_blank" rel="noopener">ai-memory-web</a> and <a href="https://github.com/akitaonrails/ai-jail-web"target="_blank" rel="noopener">ai-jail-web</a> are Node.js. In none of them did I feel any relevant difference that came from the stack: the wins were similar, the errors too, and the errors were always understandable. Every error became an invariant, a rule, a skill improvement. It never became a language switch.</p>
<p>So forget &ldquo;token savings&rdquo; and &ldquo;typing superstition.&rdquo; Do real software engineering: pick the right tool for your specific problem, apply proper engineering technique, and any reasonable agent will perform more or less the same. And stop wasting time arguing over language-war rage bait on the internet. Be a real software engineer and do real engineering. That&rsquo;s it.</p>
<p>The per-attempt data, the full methodology and the evidence limits are in the <a href="https://github.com/akitaonrails/vibe-coding-benchmarks"target="_blank" rel="noopener">repository</a>. If you run the matrix with another task and find a ranking I didn&rsquo;t, show me.</p>
]]></content:encoded><category>llm-benchmarks</category><category>programming-languages</category><category>llms</category><category>elixir-and-erlang</category></item><item><title>Which Jev-like AI Decision/Classifier Model Is Best?</title><link>https://akitaonrails.github.io/en/2026/10/10/which-jev-like-ai-decision-classifier-model-is-best/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/10/10/which-jev-like-ai-decision-classifier-model-is-best/</guid><pubDate>Sat, 10 Oct 2026 12:00:00 -0300</pubDate><description>&lt;p&gt;Last week I published &lt;a href="https://akitaonrails.github.io/en/2026/10/03/understanding-the-jev-hype-what-is-it-for/"&gt;a long post about Jev&lt;/a&gt;, TypeSafe&amp;rsquo;s hosted classifier that became all the rage in September. The short version of that post: Jev is a classifier, something that has existed for decades, and the &amp;ldquo;193x faster&amp;rdquo; amazement only exists because too many people were using chat LLMs as expensive, slow classifiers. I reproduced Paulo Câmara&amp;rsquo;s essay &lt;em&gt;The student who marks answer A&lt;/em&gt;, introduced the open alternatives Clef and Laya, and to compare the models side by side I leaned on the &lt;a href="https://huggingface.co/spaces/multimodalart/jev-decision-index"target="_blank" rel="noopener"&gt;Decision Index&lt;/a&gt;, a public ranking that already existed.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Last week I published <a href="/en/2026/10/03/understanding-the-jev-hype-what-is-it-for/">a long post about Jev</a>, TypeSafe&rsquo;s hosted classifier that became all the rage in September. The short version of that post: Jev is a classifier, something that has existed for decades, and the &ldquo;193x faster&rdquo; amazement only exists because too many people were using chat LLMs as expensive, slow classifiers. I reproduced Paulo Câmara&rsquo;s essay <em>The student who marks answer A</em>, introduced the open alternatives Clef and Laya, and to compare the models side by side I leaned on the <a href="https://huggingface.co/spaces/multimodalart/jev-decision-index"target="_blank" rel="noopener">Decision Index</a>, a public ranking that already existed.</p>
<p>Someone else&rsquo;s ranking is useful, but I wanted to get my hands dirty. So I built my own benchmark, with my own cases, half in Portuguese, and ran the open models on my <a href="/en/2026/03/31/minisforum-ms-s1-max-amd-ai-max-395-review/">home server with Strix Halo</a>, the same Ryzen AI Max+ 395 I use to test local LLMs. The hosted ones (Jev, the two Clefs from Cloudflare, OpenAI Decisions and Microsoft Decision-1 via OpenRouter) ran through their APIs. Everything, including the cases, the raw responses and the scoring scripts, is public in the <a href="https://github.com/akitaonrails/jev-docs-benchmarks"target="_blank" rel="noopener">benchmark repository</a>.</p>
<blockquote>
  <p><strong>TL;DR:</strong> the top now has two, both open-weights. <strong>Perplexity Decider 1.1 27B</strong> and the just-released <strong>Decision 3.0</strong> (vLLM Semantic Router) tied at <strong>99.4%</strong> on the compact cases, with 100% in Portuguese, and identical labels on all 1,024 classifications in the benchmark. The price: about 49 GB of weights and over a second per decision. In the cloud, <strong>Microsoft Decision-1</strong> tied <strong>Jev</strong> at 97.6% while costing a third: it&rsquo;s the cheapest hosted one I measured, and the first candidate to evaluate. Jev answers faster and errs differently. <strong>OpenAI Decisions</strong> debuted tied with the best local 4B, Jebadiah, and has the lowest hosted latency. <strong>Julia-1</strong>, the smallest and fastest of all (12 ms), scored at coin-flip level: fresh out of the factory, it&rsquo;s a no-go. Jump to the <a href="#the-full-table">full table</a>, the <a href="#how-much-it-costs-in-support-emails">cost in support emails</a>, <a href="#which-model-for-which-situation">which model for which situation</a>, <a href="#how-hard-it-is-to-run-the-best-open-models-on-your-machine">how hard it is to run the best open ones locally</a> or the <a href="#highlights-and-gotchas">gotchas</a>.</p>

</blockquote>
<h2>How I tested<span class="hx:absolute hx:-mt-20" id="how-i-tested"></span>
    <a href="#how-i-tested" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The central idea was to measure more than &ldquo;who gets the most right.&rdquo; A decision model has a design goal, and comparing a 322-million-parameter encoder made to run on weak devices with a hosted service of undisclosed size on accuracy percentage alone is unfair to both. So I measured accuracy, latency, cost and behavior under stress, and at the end I split the recommendations by situation.</p>
<h3>The two case sets<span class="hx:absolute hx:-mt-20" id="the-two-case-sets"></span>
    <a href="#the-two-case-sets" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>I built two test sets, frozen in git before any inference, with the dataset hash recorded alongside the responses. No model receives the expected answer, the justification or the case identifier. Only the text, the instructions and the options.</p>
<p>The <strong>v1 set</strong> has 13 operational use cases, in English, each with an explicit fictional policy:</p>
<ul>
<li>support ticket severity</li>
<li>support routing</li>
<li>refund policy</li>
<li>incident escalation</li>
<li>tool approval (whether an agent may or may not execute a given action)</li>
<li>email fraud</li>
<li>document type</li>
<li>evidence support</li>
<li>search relevance</li>
<li>moderation</li>
<li>order routing</li>
<li>lead qualification</li>
<li>numeric-threshold triage</li>
</ul>
<p>There are 10 scenarios per use case, each presented four ways: original, options in reversed order, options with opaque names (c0, c1, c2) and original plus a &ldquo;reviewer&rdquo; comment suggesting the wrong answer, which the instructions say to ignore. That&rsquo;s 520 classifications per model. Add 24 probability probes in situations with no information at all (fair coin, six-sided die), where the right answer is mathematical.</p>
<p>The <strong>v2 set</strong> was made to cover what v1 leaves out: common semantics and Portuguese. There are 7 tasks, with 12 scenarios each, and every scenario written in English and in Brazilian Portuguese with the same answer and the same option order:</p>
<ul>
<li>sentiment (author versus quotation, negation, sarcasm)</li>
<li>current intent (withdrawn request, competing actions, hypothesis)</li>
<li>logical implication (quantifiers, absent fact, temporal order)</li>
<li>search relevance (all, part or none of what was asked)</li>
<li>sensitive data handling (fictional secret versus mention, redaction, revocation)</li>
<li>current incident status (timeline order, verified versus unverified)</li>
<li>threshold policy (inclusive bounds, units, AND/OR with a missing value)</li>
</ul>
<p>Each pair runs under three conditions:</p>
<ul>
<li><strong>compact</strong>: just the record and the rule</li>
<li><strong>with examples</strong>: one solved example per class, fixed and the same for everyone</li>
<li><strong>with distractors</strong>: ten irrelevant archive notes before the record that matters, to stress the context</li>
</ul>
<p>That&rsquo;s 504 classifications per model.</p>
<blockquote>
  <p>The cases were written with AI help and reviewed against the policies, without independent human annotation. It&rsquo;s a small, synthetic benchmark: 130 scenario families in v1 and 84 in v2. The variants are correlated, so 520 responses are 130 scenarios seen four ways. Treat the numbers as a snapshot of these cases, and test with your own before deciding.</p>

</blockquote>
<h3>The 23 competitors<span class="hx:absolute hx:-mt-20" id="the-23-competitors"></span>
    <a href="#the-23-competitors" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Five ran in the cloud, through the official API: <strong>Jev</strong> (version 1.13.0, from TypeSafe), <strong>Clef</strong> (27B, Cloudflare Workers AI), <strong>Clef-flash</strong> (9B, same), <strong>OpenAI Decisions</strong> (the <code>gpt-6-luna</code> alias, in public beta) and <strong>Microsoft Decision-1</strong> (9B, post-trained from Qwen3.5-9B, served via OpenRouter on Azure). The other eighteen ran on the Strix Halo, via ROCm, with weights pinned by Hugging Face commit hash, inside a Docker container. The first three (Laya, Laya typed and Clef-flash) shared one container; the rest ran one at a time, with Julia-1 measured twice, on GPU and on CPU. The server has 64 GiB of GPU-addressable memory.</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th style="text-align: right">Nominal size</th>
          <th>Origin</th>
          <th>Where it ran</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Jev 1.13.0</td>
          <td style="text-align: right">undisclosed</td>
          <td>TypeSafe, proprietary</td>
          <td>API</td>
      </tr>
      <tr>
          <td>OpenAI Decisions (<code>gpt-6-luna</code>)</td>
          <td style="text-align: right">undisclosed</td>
          <td>OpenAI, proprietary, beta</td>
          <td>API</td>
      </tr>
      <tr>
          <td>Microsoft Decision-1</td>
          <td style="text-align: right">9B</td>
          <td>Microsoft, proprietary</td>
          <td>API (OpenRouter)</td>
      </tr>
      <tr>
          <td>Clef</td>
          <td style="text-align: right">27B</td>
          <td>Cloudflare, open weights</td>
          <td>API</td>
      </tr>
      <tr>
          <td>Clef-flash</td>
          <td style="text-align: right">9B</td>
          <td>Cloudflare, open weights</td>
          <td>API and local</td>
      </tr>
      <tr>
          <td>Perplexity Decider 1.1 27B</td>
          <td style="text-align: right">27B</td>
          <td>Perplexity, Apache 2.0</td>
          <td>local</td>
      </tr>
      <tr>
          <td>Decision 3.0 (d3)</td>
          <td style="text-align: right">27B</td>
          <td>vLLM Semantic Router, Apache 2.0</td>
          <td>local</td>
      </tr>
      <tr>
          <td>Decision 3.0 Edge</td>
          <td style="text-align: right">0.6B</td>
          <td>vLLM Semantic Router, Apache 2.0</td>
          <td>local</td>
      </tr>
      <tr>
          <td>Jebadiah 4B v2</td>
          <td style="text-align: right">4B</td>
          <td>Frontier Infra, Apache 2.0</td>
          <td>local</td>
      </tr>
      <tr>
          <td>Kev 0.8B / 4B / 9B</td>
          <td style="text-align: right">0.8B / 4B / 9B</td>
          <td>Jared Palmer, Apache 2.0</td>
          <td>local</td>
      </tr>
      <tr>
          <td>Mapika Decider 4B</td>
          <td style="text-align: right">4.2B</td>
          <td>Mapika, Apache 2.0</td>
          <td>local</td>
      </tr>
      <tr>
          <td>Eikos 4B</td>
          <td style="text-align: right">4B</td>
          <td>Caio Vicentino, MIT, trained on EN and PT</td>
          <td>local</td>
      </tr>
      <tr>
          <td>Simple-Jev + Qwen3.5 4B</td>
          <td style="text-align: right">4B</td>
          <td>Featherless, token-reading server over a stock model</td>
          <td>local</td>
      </tr>
      <tr>
          <td>Laya / Laya typed-decisions</td>
          <td style="text-align: right">421M</td>
          <td>Convai Innovations, ModernBERT encoder</td>
          <td>local</td>
      </tr>
      <tr>
          <td>Laya multilingual</td>
          <td style="text-align: right">322M</td>
          <td>Convai Innovations, mmBERT encoder</td>
          <td>local</td>
      </tr>
      <tr>
          <td>Julia-1</td>
          <td style="text-align: right">144M</td>
          <td>Supersonic Labs, Apache 2.0, mmBERT encoder</td>
          <td>local, GPU and CPU</td>
      </tr>
      <tr>
          <td>GLiNER2.5-Decide / multi-Decide</td>
          <td style="text-align: right">340M / 287M</td>
          <td>Fastino, Apache 2.0</td>
          <td>local</td>
      </tr>
  </tbody>
</table>
<p>The order up there is just organizational, hosted first and local ones by family. The real ranking is in the <a href="#the-full-table">results table</a>.</p>
<p>Everyone received exactly the same text, the same instructions and the same options, with no per-model prompt tuning and no adjustments after seeing results (Simple-Jev uses its own server&rsquo;s fixed prompt policy). The exception is <strong>GLiNER</strong>, whose native API takes labels instead of probability distributions. It runs on a separate track, v2 only, with explicit mapping and no made-up calibration metrics.</p>
<p><strong>Simple-Jev</strong> deserves an explanation. It&rsquo;s a server that takes a stock LLM (here Qwen3.5 4B, with no decision training at all) and reads the probability of the answer tokens instead of generating text. It&rsquo;s the baseline: if a &ldquo;decision&rdquo; model loses to this, the specialized training bought nothing.</p>
<p>Two protocol notes. <strong>OpenAI Decisions</strong> answers through a native typed-decisions endpoint, and the alias the API returned is not an immutable snapshot: OpenAI can swap the weights behind the name, like Cloudflare does with Clef-flash. And <strong>Perplexity Decider</strong> is not a stock chat LLM: it has a separate decision head, with non-causal attention and a calibration temperature saved in the weights. A generic chat server does not reproduce its behavior. <strong>Microsoft Decision-1</strong> speaks native SystemOne through OpenRouter&rsquo;s decisions API, and the served identifier is dated (<code>microsoft-decision-1-20261009</code>), so it&rsquo;s not an immutable weight either. It doesn&rsquo;t show up in OpenRouter&rsquo;s text-model catalog: to find it, you have to filter by the <code>decisions</code> modality. <strong>Decision 3.0</strong> is the new family from the vLLM Semantic Router project, Apache 2.0, derived from Qwen, with six checkpoints (d3, flash, mini, nano, lite, edge) and native SystemOne. I tested the flagship (d3) and the smallest (d3-edge); the four in between are for another round.</p>
<h3>What was measured<span class="hx:absolute hx:-mt-20" id="what-was-measured"></span>
    <a href="#what-was-measured" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><ul>
<li>Accuracy per task, per language and per condition, always on top of the per-option probabilities the model returns, ignoring the vendor&rsquo;s &ldquo;confidence&rdquo; field.</li>
<li>Brier and ECE for calibration.</li>
<li>Median and p95 latency as seen by the client, including the network: WAN for the hosted ones, LAN for the local ones. These are deployment observations, and comparing hardware would require another test.</li>
<li>Input tokens reported by the API, priced at the October 10 price table, before any allowance.</li>
<li>Bootstrap confidence intervals over scenario families, instead of individual responses.</li>
</ul>
<p>I left local cost unmeasured. Energy, hardware amortization and maintenance were left out, so local models show up as &ldquo;not measured,&rdquo; because &ldquo;zero&rdquo; would be a lie.</p>
<h2>The full table<span class="hx:absolute hx:-mt-20" id="the-full-table"></span>
    <a href="#the-full-table" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The main column is accuracy on the 168 compact v2 cases (84 in English, 84 in Portuguese). The v1 column uses the 130 original scenarios. Latency is the median seen by the client across the 504 v2 calls. Cost is the list price per 10 thousand compact decisions, computed from the tokens the API reported.</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th style="text-align: right">Compact EN / PT-BR</th>
          <th style="text-align: right">Compact combined</th>
          <th style="text-align: right">v1 originals</th>
          <th style="text-align: right">Median latency</th>
          <th style="text-align: right">10 thousand decisions</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Perplexity Decider 27B</td>
          <td style="text-align: right">98.8% / 100.0%</td>
          <td style="text-align: right"><strong>99.4%</strong></td>
          <td style="text-align: right">99.2%</td>
          <td style="text-align: right">1,547 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Decision 3.0 (27B)</td>
          <td style="text-align: right">98.8% / 100.0%</td>
          <td style="text-align: right"><strong>99.4%</strong></td>
          <td style="text-align: right">99.2%</td>
          <td style="text-align: right">1,420 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Jev</td>
          <td style="text-align: right">97.6% / 97.6%</td>
          <td style="text-align: right">97.6%</td>
          <td style="text-align: right">96.2%</td>
          <td style="text-align: right">255 ms (WAN)</td>
          <td style="text-align: right">US$ 0.19</td>
      </tr>
      <tr>
          <td>Microsoft Decision-1</td>
          <td style="text-align: right">95.2% / 100.0%</td>
          <td style="text-align: right">97.6%</td>
          <td style="text-align: right">95.4%</td>
          <td style="text-align: right">422 ms (WAN)</td>
          <td style="text-align: right">US$ 0.065</td>
      </tr>
      <tr>
          <td>Clef (27B)</td>
          <td style="text-align: right">97.6% / 94.0%</td>
          <td style="text-align: right">95.8%</td>
          <td style="text-align: right">94.6%</td>
          <td style="text-align: right">302 ms (WAN)</td>
          <td style="text-align: right">US$ 0.63</td>
      </tr>
      <tr>
          <td>Jebadiah 4B v2</td>
          <td style="text-align: right">91.7% / 89.3%</td>
          <td style="text-align: right">90.5%</td>
          <td style="text-align: right">85.4%</td>
          <td style="text-align: right">205 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>OpenAI Decisions</td>
          <td style="text-align: right">90.5% / 90.5%</td>
          <td style="text-align: right">90.5%</td>
          <td style="text-align: right">93.1%</td>
          <td style="text-align: right">222 ms (WAN)</td>
          <td style="text-align: right">US$ 0.23</td>
      </tr>
      <tr>
          <td>Kev 9B</td>
          <td style="text-align: right">92.9% / 83.3%</td>
          <td style="text-align: right">88.1%</td>
          <td style="text-align: right">87.7%</td>
          <td style="text-align: right">561 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Clef-flash (9B) hosted</td>
          <td style="text-align: right">91.7% / 83.3%</td>
          <td style="text-align: right">87.5%</td>
          <td style="text-align: right">90.8%</td>
          <td style="text-align: right">394 ms (WAN)</td>
          <td style="text-align: right">US$ 0.10</td>
      </tr>
      <tr>
          <td>Clef-flash (9B) local</td>
          <td style="text-align: right">89.3% / 85.7%</td>
          <td style="text-align: right">87.5%</td>
          <td style="text-align: right">90.8%</td>
          <td style="text-align: right">618 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Mapika Decider 4B</td>
          <td style="text-align: right">89.3% / 85.7%</td>
          <td style="text-align: right">87.5%</td>
          <td style="text-align: right">86.9%</td>
          <td style="text-align: right">186 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Kev 4B</td>
          <td style="text-align: right">88.1% / 86.9%</td>
          <td style="text-align: right">87.5%</td>
          <td style="text-align: right">82.3%</td>
          <td style="text-align: right">246 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Eikos 4B</td>
          <td style="text-align: right">85.7% / 79.8%</td>
          <td style="text-align: right">82.7%</td>
          <td style="text-align: right">87.7%</td>
          <td style="text-align: right">235 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Simple-Jev + Qwen3.5 4B</td>
          <td style="text-align: right">77.4% / 71.4%</td>
          <td style="text-align: right">74.4%</td>
          <td style="text-align: right">85.4%</td>
          <td style="text-align: right">1,349 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Kev 0.8B</td>
          <td style="text-align: right">64.3% / 61.9%</td>
          <td style="text-align: right">63.1%</td>
          <td style="text-align: right">63.1%</td>
          <td style="text-align: right">86 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Decision 3.0 Edge (0.6B)</td>
          <td style="text-align: right">67.9% / 53.6%</td>
          <td style="text-align: right">60.7%</td>
          <td style="text-align: right">65.4%</td>
          <td style="text-align: right">45 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>GLiNER2.5-Decide (EN)</td>
          <td style="text-align: right">54.8% / 50.0%</td>
          <td style="text-align: right">52.4%</td>
          <td style="text-align: right">didn&rsquo;t run</td>
          <td style="text-align: right">208 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Laya typed-decisions</td>
          <td style="text-align: right">50.0% / 35.7%</td>
          <td style="text-align: right">42.9%</td>
          <td style="text-align: right">43.8%</td>
          <td style="text-align: right">43 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Laya (EN)</td>
          <td style="text-align: right">44.0% / 41.7%</td>
          <td style="text-align: right">42.9%</td>
          <td style="text-align: right">43.8%</td>
          <td style="text-align: right">41 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Laya multilingual</td>
          <td style="text-align: right">35.7% / 38.1%</td>
          <td style="text-align: right">36.9%</td>
          <td style="text-align: right">43.8%</td>
          <td style="text-align: right">19 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>GLiNER2.5-multi-Decide</td>
          <td style="text-align: right">32.1% / 35.7%</td>
          <td style="text-align: right">33.9%</td>
          <td style="text-align: right">didn&rsquo;t run</td>
          <td style="text-align: right">63 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Julia-1 (GPU)</td>
          <td style="text-align: right">38.1% / 25.0%</td>
          <td style="text-align: right">31.5%</td>
          <td style="text-align: right">38.5%</td>
          <td style="text-align: right"><strong>12 ms</strong> (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
      <tr>
          <td>Julia-1 (CPU)</td>
          <td style="text-align: right">38.1% / 25.0%</td>
          <td style="text-align: right">31.5%</td>
          <td style="text-align: right">36.9%</td>
          <td style="text-align: right">71 ms (LAN)</td>
          <td style="text-align: right">not measured</td>
      </tr>
  </tbody>
</table>
<p>To calibrate your reading: the tasks have three or four options, so a uniform guess gives about 31% on both sets. &ldquo;Near 50%&rdquo; here is already well above the coin, and &ldquo;near 33%&rdquo; is the coin. Julia-1 landed at 31.5%: the pretty name hides a guy flipping a coin.</p>
<p>The intervals matter. Perplexity&rsquo;s edge over Jev on v2 is under 2 points and the bootstrap interval touches zero: it&rsquo;s the measured lead on this set, not a proven superiority forever. And Decision 3.0 tied Perplexity at the limit of what this set can distinguish: <strong>identical labels on the 1,024 classifications</strong>, with both missing the same two cases (the English relevance one on v2 and the disputed severity case on v1, already in the errata). Microsoft tied Jev on the aggregate, with the interval centered on zero, but an aggregate tie is not interchangeability: they miss different cases, and Microsoft inverts the language pattern, missing more in English than in Portuguese. Jev and Clef also remain under 2 points apart, on the same tier. The 90% squad (Jebadiah, OpenAI) sits 7 points behind Jev, and from there down every difference is clear.</p>
<p>Each task cell has only 12 scenarios per language, so one more correct answer moves the cell by more than 8 points. A tie on a specific task is a lead for a pilot. The per-task tables are in the <a href="https://github.com/akitaonrails/jev-docs-benchmarks/blob/master/benchmark/reports/decision3-comparison-v2/results.md"target="_blank" rel="noopener">repository</a>.</p>
<h2>How much it costs, in support emails<span class="hx:absolute hx:-mt-20" id="how-much-it-costs-in-support-emails"></span>
    <a href="#how-much-it-costs-in-support-emails" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Price per million tokens is a number nobody can feel. List prices on October 11 are US$ 0.042 per million input tokens on Jev, US$ 0.24 on Clef, US$ 0.038 on Clef-flash and US$ 0.10 on OpenAI Decisions. Output is free on all five. Microsoft Decision-1 charges the same US$ 0.042 as Jev per million, via OpenRouter, but reported a third of the input tokens for the same texts (about 26 thousand versus Jev&rsquo;s 77 thousand on compact v2), and nobody can explain the tokenization difference. In measured practice, that makes it the cheapest hosted one of the bunch.</p>
<p>Clef-flash cost US$ 0.09 on the 9th: Cloudflare cut the price by more than half in the middle of my test. Jev reports considerably more tokens than Cloudflare for the same text, about 45% more on v2, and that&rsquo;s already in the math below.</p>
<p>Imagine an operation with <strong>10 thousand support emails per month</strong> to classify into three or four buckets, with short texts similar to my cases:</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th style="text-align: right">10k emails / month</th>
          <th style="text-align: right">1 million emails</th>
          <th style="text-align: right">Expected errors in 10k (by compact accuracy)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Microsoft Decision-1</td>
          <td style="text-align: right">US$ 0.065</td>
          <td style="text-align: right">US$ 6.45 (about R$ 32)</td>
          <td style="text-align: right">~240</td>
      </tr>
      <tr>
          <td>Clef-flash</td>
          <td style="text-align: right">US$ 0.10</td>
          <td style="text-align: right">US$ 10 (about R$ 50)</td>
          <td style="text-align: right">~1,250</td>
      </tr>
      <tr>
          <td>Jev</td>
          <td style="text-align: right">US$ 0.19</td>
          <td style="text-align: right">US$ 19 (about R$ 95)</td>
          <td style="text-align: right">~240</td>
      </tr>
      <tr>
          <td>OpenAI Decisions</td>
          <td style="text-align: right">US$ 0.23</td>
          <td style="text-align: right">US$ 23 (about R$ 115)</td>
          <td style="text-align: right">~950</td>
      </tr>
      <tr>
          <td>Clef</td>
          <td style="text-align: right">US$ 0.63</td>
          <td style="text-align: right">US$ 63 (about R$ 315)</td>
          <td style="text-align: right">~420</td>
      </tr>
  </tbody>
</table>
<blockquote>
  <p>In reais, at Friday&rsquo;s exchange rate (R$ 4.99), 10 thousand decisions on Jev cost one real. A million costs less than a hundred reais. For any company with a million emails to classify, that vanishes into the budget.</p>

</blockquote>
<p>One caveat about proportions: my cases are short, about 450 tokens per compact case by Jev&rsquo;s count. A real customer email, with quoted thread history, can be three to five times larger, and cost scales linearly with that. Even so, we&rsquo;re talking cents per thousand.</p>
<p>What this math shows is that the price difference between the hosted models is irrelevant next to the cost of being wrong. Jev costs 9 US cents more than Clef-flash per 10 thousand decisions, and in those same 10 thousand it makes about a thousand fewer errors. If a misrouted email costs more than a hundredth of a US cent in human rework, Jev pays for itself. This math assumes every error costs the same, which is never true: sending a critical ticket to the routine queue costs far more than the reverse.</p>
<p>Cloudflare&rsquo;s allowance changes the math for small players. It&rsquo;s 10 thousand &ldquo;neurons&rdquo; per day, shared by the whole account, resetting at midnight UTC. With my input sizes, that&rsquo;s about 1,500 full-Clef classifications per day or almost 10 thousand Clef-flash ones, free. If you have 1,000 emails a day and nothing else running on the account, Clef comes out at zero cost with top-tier quality.</p>
<p>And local? Energy is what the benchmark didn&rsquo;t measure. From what I see on my Strix Halo, the whole machine stays under 100 W under load. With Jebadiah at 200 ms per decision, 10 thousand decisions are about 35 machine minutes, under 0.1 kWh, a few cents of a real on the power bill.</p>
<p>The real local cost is the machine, your hours configuring ROCm and containers, and keeping it all standing. Whoever already has the hardware for another reason has low marginal cost. Whoever would buy the machine just for this is buying a problem of thousands of reais to save about a hundred reais per million.</p>
<h2>Which model for which situation<span class="hx:absolute hx:-mt-20" id="which-model-for-which-situation"></span>
    <a href="#which-model-for-which-situation" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>You want accuracy and want to operate nothing: Jev<span class="hx:absolute hx:-mt-20" id="you-want-accuracy-and-want-to-operate-nothing-jev"></span>
    <a href="#you-want-accuracy-and-want-to-operate-nothing-jev" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>In the cloud, Jev is still the name. It won or tied practically every cell among the hosted ones, and only Microsoft tied it on the aggregate. In English it was 100% on five of the seven v2 tasks, and in Portuguese it repeated 97.6% on the aggregate without losing anything in translation, something no other model above the coin managed. On v1 it kept its 96.2% on the original with the malicious &ldquo;reviewer&rdquo; comment injected; Clef even gained one case, and Kev 4B also stayed put, just at a much lower tier. The 255 ms WAN latency came in 30 ms behind OpenAI&rsquo;s, and it costs 19 US cents per 10 thousand decisions.</p>
<p>The trade-off is the one I already discussed in the previous post: it&rsquo;s proprietary, hosted, of undisclosed size, and you depend on TypeSafe keeping the behavior underneath you. And it makes mistakes. It treated an invoice ID called &ldquo;PASSWORD-523&rdquo; as a usable credential, even with the record explicitly saying it doesn&rsquo;t authenticate anyone.</p>
<h3>You want Jev&rsquo;s level paying a third: Microsoft Decision-1<span class="hx:absolute hx:-mt-20" id="you-want-jevs-level-paying-a-third-microsoft-decision-1"></span>
    <a href="#you-want-jevs-level-paying-a-third-microsoft-decision-1" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Microsoft entered this market quietly, and entered well. Decision-1 is a 9B post-trained from Qwen3.5-9B, served via OpenRouter, and it was the first model to tie Jev on the compact aggregate: 97.6%, with the bootstrap interval centered on zero. The detail that won me over: <strong>100% in Portuguese</strong>, better than its own English (95%), inverting the pattern of the entire rest of the bunch. On v1, the reversed-order and malicious-comment variants didn&rsquo;t take down a single answer, and it got the critical ticket that Clef and OpenAI missed.</p>
<p>And it&rsquo;s the cheapest hosted one I measured: US$ 0.065 per 10 thousand decisions, a third of Jev, charging the same per-token rate but reporting a third of the tokens. The savings come from the token count, and I can&rsquo;t explain the exact mechanism, so treat it as a measurement, not a promise.</p>
<p>The weak spots exist. Latency is the worst among the hosted ones (422 ms median, versus Jev&rsquo;s 255). On the compact cases it&rsquo;s clean of confident errors, but add context and Portuguese errors show up with 99.5% confidence: the &ldquo;perfect Portuguese&rdquo; pattern doesn&rsquo;t survive long text. And on the probability probes it&rsquo;s weak, giving 87% to a fair coin. Microsoft advertises calibrated probabilities; my probes disagree. And like every dated-ID hosted model, the weight behind it can change without notice.</p>
<p>For a Portuguese-language operation that wants Jev quality while paying less, it&rsquo;s the first candidate to run in your pilot.</p>
<h3>You want the same level with open weights: Clef<span class="hx:absolute hx:-mt-20" id="you-want-the-same-level-with-open-weights-clef"></span>
    <a href="#you-want-the-same-level-with-open-weights-clef" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The full 27B Clef tied with Jev in English (82 of 84) and finished 3 cases behind in Portuguese. It beat Jev on sensitive data handling in English (12 of 12 versus 11). It&rsquo;s an open-weights model, so you can run it locally with about 54 GB of memory just for the weights in BF16, which I didn&rsquo;t test: the full Clef ran only through the API. Among the open ones, it lost the crown to Perplexity, which scored higher with smaller weights.</p>
<p>Through the API it&rsquo;s the most expensive of the five hosted ones, three times Jev, with no quality gain to justify it. The exception is the daily allowance: for small volume, it&rsquo;s the best classifier you can get for free.</p>
<h3>You want the cheapest in the cloud: Clef-flash<span class="hx:absolute hx:-mt-20" id="you-want-the-cheapest-in-the-cloud-clef-flash"></span>
    <a href="#you-want-the-cheapest-in-the-cloud-clef-flash" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>At US$ 0.038 per million, Clef-flash is the lowest price in the hosted market and covers 9,400 decisions per day within the allowance. Quality drops: 92% in English and 83% in Portuguese on the compact cases, the biggest language drop among the hosted ones, with an interval entirely below zero. On sentiment in both languages, and on incident status in English, it tied with Jev. On intent and sensitive data in Portuguese, it lost badly.</p>
<p>For sentiment tasks in either language, or for English classification where 1 error in 12 is acceptable, it does well. For Portuguese, measure first.</p>
<h3>You already live in the OpenAI ecosystem: OpenAI Decisions<span class="hx:absolute hx:-mt-20" id="you-already-live-in-the-openai-ecosystem-openai-decisions"></span>
    <a href="#you-already-live-in-the-openai-ecosystem-openai-decisions" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>OpenAI&rsquo;s debut in this market landed mid-table: 90.5% combined, an exact tie with Jebadiah, with the lowest hosted latency I measured (222 ms) and the same accuracy in both languages. It costs US$ 0.23 per 10 thousand decisions, between Jev and Clef. If your operation already speaks the OpenAI API and 9 out of 10 accuracy is enough, integration is trivial: a native decisions endpoint, no prompt at all.</p>
<p>The weak spots are revealing. Its worst cell was precisely numeric-threshold policy (8 of 12 in English, 7 in Portuguese): it treated &ldquo;at least 10&rdquo; as satisfied by a range of 8 to 12 and failed the AND/OR short-circuit. The calibration is schizophrenic: on the predicate probes (yes/no) it was the most accurate of the bunch, with near-zero average error, and on the choice probes it returned 94%/6% on a fair coin. And on the v1 variants it flipped 2 correct answers in each presentation (reversed order, opaque label, malicious comment), something only Perplexity didn&rsquo;t do: Jev kept its aggregate accuracy, but also flipped some correct answers along the way. Oh, and the <code>gpt-6-luna</code> alias is not an immutable snapshot: reproducibility requires saving the responses.</p>
<h3>You want the best open model, period: Perplexity Decider 27B<span class="hx:absolute hx:-mt-20" id="you-want-the-best-open-model-period-perplexity-decider-27b"></span>
    <a href="#you-want-the-best-open-model-period-perplexity-decider-27b" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Perplexity Decider 1.1 27B is the surprise of the benchmark. It led the table with 99.4% on the compact cases, was the only one that didn&rsquo;t lose a single task cell to Jev (3 wins, 11 ties), and hit 100% in Portuguese under all three conditions: compact, with examples, with distractors. Calibration is also the best measured, with a Brier of 0.012, and coverage is absurd: it answered with confidence above 0.9 on 96% of cases and got zero of them wrong. On v1, it didn&rsquo;t flip a single answer across the order, opaque-label and malicious-comment variants.</p>
<p>Its only 3 errors on v2 were the same case in different clothing (it confused &ldquo;notification sent to managers&rdquo; with &ldquo;mandatory approver&rdquo;), and it made them with confidence below 0.9: the known error comes flagged. The weak spot is event-probability probes: asked about an event with a 1-in-4 chance, it answered 0.73. Strong classification does not imply reliable event probability.</p>
<p>The cost is hardware: about 49 GB of weights in BF16, a second and a half per decision on my Strix Halo (with ROCm&rsquo;s reference kernels, no flash-attention; on a good NVIDIA it should be much faster, but that I didn&rsquo;t measure). It&rsquo;s Apache 2.0, public weights with no gate. If you have the machine and want the top of the table at home, this is the one.</p>
<h3>You want the other open-weights top: Decision 3.0 (and beware the Edge)<span class="hx:absolute hx:-mt-20" id="you-want-the-other-open-weights-top-decision-30-and-beware-the-edge"></span>
    <a href="#you-want-the-other-open-weights-top-decision-30-and-beware-the-edge" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Decision 3.0, released two days ago by the vLLM Semantic Router project, is the second model to sit at the top: 99.4% on the compact cases, 100% in Portuguese, and a tie with Perplexity so absolute that the two gave <strong>exactly the same labels on the 1,024 classifications</strong>, including the same two misses (the English relevance one, at confidence below 0.9, and the disputed severity case that already lives in the errata). It also cleared the v1 traps without flipping a single answer, got both indisputable critical tickets right, and its calibration is in the same class as Perplexity&rsquo;s (Brier 0.014, 94% coverage above 0.9 with zero errors).</p>
<p>In other words: the open top now has two independent recipes that converge. For your pilot, either one works; run both if you can, because the probabilities differ even when the labels don&rsquo;t. Latency is in the same family as Perplexity (1.4 s on my machine, same ROCm diet), and the weights take the same ~49 GB.</p>
<p>The little brother is another story. <strong>Decision 3.0 Edge</strong> (0.6B) answers in 45 ms and fits in 1.3 GB of GPU, but scored only 61% on compact, plummets 14 points in Portuguese, and worse: of the 68 guesses it gave with confidence above 0.9, 14 were wrong. As a confidence-threshold router, out of the factory, it&rsquo;s a trap from the same class as Julia. The four middle checkpoints (flash, mini, nano, lite) I haven&rsquo;t tested yet; they&rsquo;re the ones that will tell whether the family has a sweet spot between the two extremes.</p>
<h3>You need to run locally, with quality: Jebadiah 4B v2<span class="hx:absolute hx:-mt-20" id="you-need-to-run-locally-with-quality-jebadiah-4b-v2"></span>
    <a href="#you-need-to-run-locally-with-quality-jebadiah-4b-v2" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Of the local ones, Jebadiah 4B v2 had the best compact accuracy, 90% combined, answering in about 200 ms. It tied with Jev on six of the fourteen task cells, including intent, implication and status in English and intent in Portuguese. The weak spot is numeric-threshold policy, 9 of 12 in both languages, and it loses ground when the context fills with distractors (76% in Portuguese under that condition, versus 82% for Mapika).</p>
<p><strong>Mapika Decider 4B</strong> (the fastest of the 4Bs) and <strong>Kev 4B</strong> are right behind, both around 87%, and the 3-point difference between the three fits inside the error interval. They&rsquo;re three different training recipes on top of 4B backbones, with errors on different tasks. The choice between them depends on your task, and I&rsquo;d run all three in a pilot.</p>
<h3>You will send examples in the prompt: Kev 9B<span class="hx:absolute hx:-mt-20" id="you-will-send-examples-in-the-prompt-kev-9b"></span>
    <a href="#you-will-send-examples-in-the-prompt-kev-9b" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Kev 9B has a curious profile. On the compact cases it ties with Kev 4B, half a point apart with the interval crossing zero, meaning more than double the parameters bought nothing. With one solved example per class, it opens almost 10 points over the 4B, and with distractors it holds 7 more points. Brier also improves by about 25%: the probability it returns is better calibrated.</p>
<p>If your use is just the rule and the text, the 4B is enough and is more than twice as fast. If you&rsquo;re going to send examples or long context, the 9B is worth the memory. The warning is Portuguese: 83% compact in PT-BR, almost 10 points below its own English, the biggest language drop among the models above 80%. Only Laya typed (14 points) and Julia (13) drop more.</p>
<h3>You want Clef-flash behavior on your machine: local Clef-flash<span class="hx:absolute hx:-mt-20" id="you-want-clef-flash-behavior-on-your-machine-local-clef-flash"></span>
    <a href="#you-want-clef-flash-behavior-on-your-machine-local-clef-flash" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>On the v1 set, local Clef-flash reproduced the hosted one&rsquo;s 520 classifications, hit for hit and miss for miss. On v2 the story changed: same total (439 of 504), but 19 different labels, with swapped strengths (the local one gets more Portuguese intent right, the hosted one gets more relevance right). Among the local ones it&rsquo;s still the best on the v1 operational-policy set (90.8%), ahead of every 4B.</p>
<p>The gotcha is latency: 618 ms median on the Strix Halo, three times Jebadiah, for the same v2 accuracy. If you pick it, it&rsquo;s for the known behavior.</p>
<h3>You need to run offline on weak hardware: Laya and Julia, with many caveats<span class="hx:absolute hx:-mt-20" id="you-need-to-run-offline-on-weak-hardware-laya-and-julia-with-many-caveats"></span>
    <a href="#you-need-to-run-offline-on-weak-hardware-laya-and-julia-with-many-caveats" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Laya multilingual was the worst in the benchmark for accuracy (37% combined, near the coin), and the fastest by far among the ones that get anything right: 19 ms median, more than ten times faster than Jebadiah.</p>
<p>The three Laya checkpoints have between 322 and 421 million parameters, fit in under 1 GB of BF16 weights by parameter math, and the project documents CPU execution and an ONNX runtime (which I didn&rsquo;t measure). PyTorch&rsquo;s peak GPU allocation for the multilingual one stayed under 2 GB. A 4B needs about 8 GB just for weights at the same precision.</p>
<p><strong>Julia-1</strong> goes one step lower: 144 million parameters, 550 MB of weights, 12 ms median on GPU and 71 ms on a 4-thread CPU. It&rsquo;s the fastest model I&rsquo;ve ever measured here, and also the worst: 31.5% accuracy, glued to the 31% coin-flip line. In Portuguese it answered &ldquo;cancellation&rdquo; on all 12 intent scenarios, including the ones asking for a refund or access (the vendor&rsquo;s Portuguese evaluation was done in pt-PT, and it shows). The bigger disaster is confidence: of the 71 guesses it gave above 0.9, 48 were wrong. A confidence threshold won&rsquo;t save this model, because it&rsquo;s exactly on the confident guesses that it errs.</p>
<p>That&rsquo;s a design choice. Laya and Julia were made to be small encoders, fine-tunable on your task, to run at the edge. What I tested were the factory checkpoints, with no tuning, applying rules they had never seen, on broad tasks. In that scenario they did badly, period.</p>
<p>One detail confirms the fragility. On v1, when the reviewer&rsquo;s malicious comment comes in, Laya drops from 44% to 19% and typed-decisions to 15%. It obeys the comment the instructions say to ignore, and confidently: 17 of the 28 guesses above 0.9 were wrong. Julia failed all 5 policy-counterfactual pairs: change the rule, it keeps the answer.</p>
<blockquote>
  <p>If you want what Jev delivers, factory Laya and Julia are very far from it, and no small model (GLiNER included) came close. If your problem is &ldquo;I need to classify short text into three buckets, on a device with no internet and no GPU, and I have a thousand labeled examples to fine-tune on,&rdquo; these two are the only ones on the list that fit. Fine-tuning is the part I didn&rsquo;t test. It&rsquo;s another question, and it needs another benchmark.</p>

</blockquote>
<h3>The baseline: Simple-Jev with a stock Qwen<span class="hx:absolute hx:-mt-20" id="the-baseline-simple-jev-with-a-stock-qwen"></span>
    <a href="#the-baseline-simple-jev-with-a-stock-qwen" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Simple-Jev reading tokens from Qwen3.5 4B, with no decision training at all, scored 74% on compact v2. That&rsquo;s the yardstick for &ldquo;how much specialized training buys&rdquo;: Jebadiah, Mapika and Kev, all on similarly sized backbones, came in 13 to 16 points above. The training buys a lot.</p>
<p>The curious part is that on v1 Simple-Jev tied with Jebadiah (111 of 130 originals) and got both unambiguous critical tickets right, which several better models missed. It&rsquo;s also the slowest of the bunch, almost a second and a half per decision, because it&rsquo;s running a whole LLM.</p>
<h2>How hard it is to run the best open models on your machine<span class="hx:absolute hx:-mt-20" id="how-hard-it-is-to-run-the-best-open-models-on-your-machine"></span>
    <a href="#how-hard-it-is-to-run-the-best-open-models-on-your-machine" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>All these models speak the same HTTP protocol, called SystemOne, which Jev popularized: you send a state (the text), one or more closed-answer questions, and get back the chosen option and the probability of each. Swapping models is swapping the port. OpenAI Decisions breaks from the pattern with its own native endpoint, but the idea is the same. What changes is how much work it takes to get each one standing, and there the difference between them is big.</p>
<h3>OpenAI: just an API key<span class="hx:absolute hx:-mt-20" id="openai-just-an-api-key"></span>
    <a href="#openai-just-an-api-key" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The easiest of all: create the key, load credit and call the endpoint. The benchmark&rsquo;s 1,048 requests ran in 4 minutes, without a single retry. The only hiccup was the first probe returning &ldquo;balance exhausted&rdquo; until I put US$ 20 in the account.</p>
<p><strong>Microsoft Decision-1</strong> is almost as simple: if you already have an OpenRouter account, it&rsquo;s point at the model and call the decisions endpoint. No GPU, no Azure subscription, no installation. In my test, 10 of the 504 v2 calls took a 429 and passed on retry, so plan for retries.</p>
<h3>Kev and Jebadiah: one pip and one command<span class="hx:absolute hx:-mt-20" id="kev-and-jebadiah-one-pip-and-one-command"></span>
    <a href="#kev-and-jebadiah-one-pip-and-one-command" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><strong>Kev</strong> is the simplest of the 4B crowd. The project installs straight from GitHub and brings up a server with one command, downloading the LoRA adapter and the decision head on top of base Qwen3.5:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">pip install <span class="s2">&#34;kev @ https://github.com/jaredpalmer/kev/archive/fc4a17e194bca35a48c57211392ec49ea54a94ac.tar.gz&#34;</span>
</span></span><span class="line"><span class="cl">python -m kev.serve --run jaredpalmer/kev-4b --host 0.0.0.0 --port <span class="m">8000</span> --device cuda</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p><strong>Jebadiah</strong> follows the same pattern, with the server package inside its own repository:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">pip install <span class="s2">&#34;jebadiah-server @ https://github.com/getainode/jebadiah/archive/e9793abc66d1a7c5ad878d51eda656f1e9c5b9f5.tar.gz#subdirectory=server&#34;</span>
</span></span><span class="line"><span class="cl">jebadiah-serve --model frontier-infra/jebadiah-4b-v2 --host 0.0.0.0 --port <span class="m">8000</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>With either one up, a decision is a POST:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">curl -s http://localhost:8000/v1/systemone -H <span class="s1">&#39;content-type: application/json&#39;</span> -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;model&#34;: &#34;kev-4b&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;state&#34;: &#34;Cliente diz que foi cobrado duas vezes e pede o estorno da segunda cobrança.&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;questions&#34;: {
</span></span></span><span class="line"><span class="cl"><span class="s1">    &#34;fila&#34;: {
</span></span></span><span class="line"><span class="cl"><span class="s1">      &#34;type&#34;: &#34;choice&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">      &#34;instructions&#34;: &#34;Escolha a fila correta pela política de suporte.&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">      &#34;criteria&#34;: {
</span></span></span><span class="line"><span class="cl"><span class="s1">        &#34;financeiro&#34;: &#34;Cobrança, estorno, nota fiscal.&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">        &#34;tecnico&#34;: &#34;Erro, bug, indisponibilidade.&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">        &#34;vendas&#34;: &#34;Upgrade, plano novo, orçamento.&#34;
</span></span></span><span class="line"><span class="cl"><span class="s1">      }
</span></span></span><span class="line"><span class="cl"><span class="s1">    }
</span></span></span><span class="line"><span class="cl"><span class="s1">  }
</span></span></span><span class="line"><span class="cl"><span class="s1">}&#39;</span></span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>The response carries the option and the probability distribution, and that&rsquo;s where you apply your threshold, log and decide whether to send it for human review. On an NVIDIA with CUDA and 16 GB of VRAM, a 4B in BF16 comes up without drama. The weights are about 8 GB.</p>
<h3>Laya and Julia: smaller still<span class="hx:absolute hx:-mt-20" id="laya-and-julia-smaller-still"></span>
    <a href="#laya-and-julia-smaller-still" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><strong>Laya</strong> is a Python package with an encoder inside. It installs with <code>pip install laya</code> and the project documents CPU execution, which is its whole point. The version pinned on my server was 0.4.1, and the multilingual one&rsquo;s peak GPU memory stayed under 2 GB. To run on a GPU-less laptop or a small container, it&rsquo;s the only one on the list that fits, no discussion.</p>
<p><strong>Julia-1</strong> is similar in spirit: its own Python runtime, one <code>predict(state=..., questions=...)</code> call and done, no standard Transformers pipeline. I ran the same container on GPU and on CPU, and both gave the same accuracy with the same responses in 97% of cases. On a 4-thread CPU it answers in 71 ms, which for an edge classifier is great. The problem is still that it scores at coin-flip level.</p>
<h3>Where it gets complicated: AMD, ROCm and the rest<span class="hx:absolute hx:-mt-20" id="where-it-gets-complicated-amd-rocm-and-the-rest"></span>
    <a href="#where-it-gets-complicated-amd-rocm-and-the-rest" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>In my case the hardware is AMD, and then &ldquo;one command&rdquo; turns into a day of work. The points that cost me time, to save you yours:</p>
<ul>
<li>None of these projects test on ROCm. Kev had a gfx1151-specific segfault caused by CUDA graphs (<a href="https://github.com/jaredpalmer/kev/issues/170"target="_blank" rel="noopener">issue 170</a>), fixed only after the 1.0 tag, so the pinned version is a main-branch commit and the official tag crashes.</li>
<li>The flash-linear-attention Triton kernels Qwen3.5 uses in the DeltaNet layers have no tested support on gfx1151. Everything ran on the pure-PyTorch path, slower than the latency published on CUDA. Jebadiah&rsquo;s 200 ms in the table is with that handbrake pulled.</li>
<li>Mapika Decider forces CUDA graphs when it sees the &ldquo;cuda&rdquo; device, which on ROCm is also called &ldquo;cuda.&rdquo; I had to turn it off by hand.</li>
<li>You need to export <code>HSA_OVERRIDE_GFX_VERSION=11.5.1</code> and <code>PYTORCH_ROCM_ARCH=gfx1151</code> and use a base image with ROCm torch already validated. Any random <code>pip install torch</code> overwrites it with the CUDA build and breaks everything. In my Dockerfile every package is installed with <code>--no-deps</code> and the build fails if torch stops being the ROCm one.</li>
<li>One model per container, one container at a time. The Strix Halo has memory shared between CPU and GPU, and three resident 4B models plus the Ollama that already runs there exhaust the 64 GiB the GPU can see.</li>
<li>Perplexity Decider was the most annoying of all. The release expects a specific CUDA torch (I swapped in the ROCm 7 torch 2.9), the flash-linear-attention kernels don&rsquo;t exist for it (I ran on PyTorch&rsquo;s reference kernels, slower), and the default loader blew past the host&rsquo;s 24 GiB RAM limit: I needed a custom loader that sends the 49 GiB of weights straight to the GPU. The model card still said &ldquo;private&rdquo; when I started, but the Hugging Face API confirmed it was public and gate-free, and the shards downloaded anonymously. The d3, at the same size, inherited the same treatment. The d3-edge, luckily, comes up with the standard Transformers loader and 1.3 GB of GPU.</li>
</ul>
<p>None of this is impossible, and it&rsquo;s all documented, with Dockerfiles, compose and the hashes of each checkpoint, in the <a href="https://github.com/akitaonrails/jev-docs-benchmarks/blob/master/docs/setup.md"target="_blank" rel="noopener">repository&rsquo;s setup guide</a>. But it&rsquo;s a real cost that the &ldquo;local is free&rdquo; spreadsheet never includes. If your machine is NVIDIA, most of this list disappears.</p>
<blockquote>
  <p>The full 27B Clef I didn&rsquo;t even try locally: it&rsquo;s about 54 GB of weights in BF16 before any activation. Perplexity, at 49 GB, proved a 27B runs on the Strix Halo, at the cost of a second and a half per decision with the reference kernels. The 9B Clef-flash runs, with about 18 GB of weights. The 4Bs are the sweet spot for consumer hardware.</p>

</blockquote>
<h2>Highlights and gotchas<span class="hx:absolute hx:-mt-20" id="highlights-and-gotchas"></span>
    <a href="#highlights-and-gotchas" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><strong>Laya truncated all long Portuguese.</strong> Under the distractor condition, base Laya reported truncation on all 84 Portuguese calls, discarding almost 31 thousand state tokens, and on none of the 84 English ones. The English checkpoint&rsquo;s default context limit is only 512 tokens (the multilingual and typed ones use 1,024, configurable up to 8,192), and Portuguese tokenizes heavier. The other models don&rsquo;t even expose truncation telemetry, so &ldquo;zero truncation reported&rdquo; on them means &ldquo;I don&rsquo;t know.&rdquo;</p>
<p><strong>Portuguese costs more tokens.</strong> For the same 84 case pairs, Jev reported about 14% more input tokens in Portuguese than in English, and both Clefs about 15% more. If you budget a bilingual operation by the English average, you&rsquo;ll come in low.</p>
<p><strong>Does an example in the prompt save a weak model? It saves nothing.</strong> One solved example per class left Laya the same or worse; several of its aggregates dropped. It helped Kev 9B (plus 4 points) and Clef in Portuguese (plus 3.6 points, reaching Jev&rsquo;s level), and almost nothing on Jev, one more case in Portuguese. Validate examples on real traffic before assuming they help.</p>
<p><strong>Size correlates, and explains little.</strong> Among the 19 competitors of known size, the Spearman correlation between parameters and compact accuracy was 0.96. The Kev series is more informative: 63% at 0.8B, 87% at 4B, 88% at 9B. The big jump is from 0.8B to 4B, about 24 points, with an interval between 16 and 33. From 4B to 9B the compact difference crosses zero, and several nominal 4Bs, with similar backbones, gave very different results. In the d3 family, the flagship and the Edge sit almost 40 points apart under the same release, while a 9B, Microsoft, ties at the top of the hosted ones. Size helps up to 4B; past that, the training recipe rules.</p>
<p><strong>The 27B Clef missed a critical ticket that two of the Layas got right.</strong> On v1, one severity scenario says continuous data loss in production is critical, regardless of how many customers it affects. The record describes confirmed permanent loss, from a single customer. Jev, Clef-flash, Perplexity, d3, Microsoft, Laya typed, Simple-Jev and Laya multilingual answered &ldquo;critical.&rdquo; Full Clef, OpenAI, base Laya, Eikos, Jebadiah, Mapika, Kev 4B and Kev 9B answered &ldquo;degraded.&rdquo;</p>
<blockquote>
  <p>It&rsquo;s a single case, and an error rate would require many more. But it shows that the average hides exactly the error that costs the most. When the impact facts are structured, the severity rule belongs in code, and the model comes in only to extract the facts from free text.</p>

</blockquote>
<p><strong>Hosted and local diverge over time.</strong> Local Clef-flash reproduced the hosted one on v1&rsquo;s 520 classifications and diverged on 19 of v2&rsquo;s 504. Cloudflare keeps the weights version behind the hosted alias undisclosed. If reproducibility matters, pin the local hash.</p>
<p><strong>High confidence and safety are different things.</strong> On compact v2, Jev, Clef, both Clef-flashes, Eikos, Jebadiah, OpenAI, Microsoft, Perplexity and d3 got zero guesses above 0.9 wrong. Perplexity is the extreme case: it answered at that level on 96% of cases without missing one, with d3 right behind (94%, zero errors). Microsoft covered 95% and OpenAI only half. Microsoft&rsquo;s caveat: the clean record is only on compact, because with examples or distractors it misses in Portuguese with confidence above 99%. Mapika missed 5% of the guesses at that level, Kev 4B 3% and Simple-Jev 14%. And the two smallest of the bunch broke the pattern violently: Julia missed 48 of 71 guesses above 0.9, and d3-edge missed 14 of 68. Coverage varied too: Jev answered above 0.9 on almost 90% of cases, Clef on almost 80%, Clef-flash on 40% and base Laya on 2 of 168. On v1 Jev missed 1% of the guesses above 0.9 and base Laya missed 61%. A confidence threshold only works after being validated on your distribution, and Laya typed&rsquo;s low ECE in Portuguese left it at the same 36% accuracy.</p>
<p><strong>Perplexity didn&rsquo;t fall for presentation traps.</strong> Across the three v1 variants (reversed options, opaque labels, malicious comment), it kept the same answers as the original, without flipping a single one. The d3 repeated the feat, zero flips too. Microsoft only stumbled on the opaque labels (2 flips, one in each direction); order and comment didn&rsquo;t move it. OpenAI flipped 2 in each variant, and Laya collapsed to 19% under the comment. The price of that robustness is latency: a second and a half per decision on my machine, the worst median of the bunch.</p>
<p><strong>Numeric thresholds are a code problem.</strong> The threshold-triage task, with clear numbers and an explicit rule, gave 100% on Jev and both Clef-flashes and under 30% on both Layas in English. An <code>if</code> solves that with 100% and zero latency. The model only comes in when the number is buried in free text, and even then the right thing is to extract the number and leave the comparison to code.</p>
<p><strong>Lottery probability is another skill.</strong> On the 24 no-information probes (coin, die), Jev had the worst choice error among options. The numeric-estimate crown changed hands with OpenAI&rsquo;s debut: its yes/no predicate missed almost nothing, while the choice probe returned 94% for heads on a fair coin. Perplexity, champion of everything else, answered 0.73 for an event with a 1-in-4 chance, and Microsoft went the same way, giving 87% to the coin. Laya typed had the second-best choice error, behind only Kev 9B and neck-and-neck with Clef, and still classified badly. It&rsquo;s the &ldquo;student who marks answer A&rdquo; from Paulo&rsquo;s essay, now measured: calibration on lotteries and accuracy on classification are independent measures.</p>
<h2>Where the data converges<span class="hx:absolute hx:-mt-20" id="where-the-data-converges"></span>
    <a href="#where-the-data-converges" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><ol>
<li>
<p><strong>The overall top is open-weights, and now there are two.</strong> Perplexity Decider 27B and Decision 3.0 tied at 99.4% on the compact cases, with 100% in Portuguese and identical labels on the 1,024 classifications, both with Apache 2.0 weights running on my machine. Their edge over Jev is under 2 points and the interval touches zero, so treat it as a snapshot of this set. Their cost is hardware and latency, not API. In the cloud, the evaluation order changed: <strong>start with Microsoft Decision-1</strong>, which ties Jev on the aggregate, closes 100% in compact Portuguese and costs a third. Jev comes next, faster and with different errors, because an aggregate tie is not interchangeability. OpenAI Decisions landed halfway in price and accuracy.</p>
</li>
<li>
<p><strong>Running locally became viable at 4B.</strong> Jebadiah, Mapika and Kev 4B deliver between 87 and 90% on the compact cases with 200 ms latency on a desktop machine, and in a pilot with your task any of the three can win. If your machine handles 49 GB of weights, Perplexity delivers the top of the table at home. The financial math justifies using the machine that already exists, for data control or because of an obligation to stay offline. Buying a machine for this it stops justifying.</p>
</li>
<li>
<p><strong>Small models are another category.</strong> Judging Laya and Julia by the accuracy column is reading the table wrong. They get half or more wrong out of the factory, fall hard under a malicious comment, and together with the d3-edge they&rsquo;re the only ones on the list that fit on a weak device and answer in tens of milliseconds. The Edge is the best of the three on accuracy (61%), but it plummets in Portuguese and gets one in five confident guesses wrong. If Jev-like accuracy is a requirement, cross all three off. If running offline on small hardware is a requirement, cross everything else off and start with fine-tuning them on your task, which is the missing measurement. And be careful with Julia and the Edge in particular: 48 errors in 71 and 14 in 68 confident guesses are the portrait of models that don&rsquo;t know what they don&rsquo;t know.</p>
</li>
<li>
<p><strong>Portuguese costs about 14% more tokens</strong> and drops the models in the middle of the table by 1 to 10 points, with Kev 9B and Clef-flash in the worst case. Jev loses nothing, OpenAI ties both languages, and Perplexity, d3 and Microsoft close 100% in compact Portuguese, better than their own English, although Microsoft goes back to missing in Portuguese when the context grows. Julia goes the other way and plummets 13 points, and the Edge plummets 14. For a Brazilian audience, that&rsquo;s the first column to look at, before price.</p>
</li>
</ol>
<blockquote>
  <p>And what holds for everyone: none of these models replaces the rule that&rsquo;s already in code. Numeric thresholds, severity policy with structured facts, tool permission, all of that stays in the <code>if</code>. The model comes in to turn free text into structured fact. And the test that matters is yours, with your tickets, because each cell in this table has 12 scenarios and your operation has thousands.</p>

</blockquote>
<p>The cases, each model&rsquo;s raw responses, the scoring scripts and the guide to reproduce everything are in the <a href="https://github.com/akitaonrails/jev-docs-benchmarks"target="_blank" rel="noopener">benchmark repository</a>. If you run it with your tickets and get a different ranking, tell me.</p>
]]></content:encoded><category>llm-benchmarks</category><category>local-models</category><category>artificial-intelligence</category><category>llms</category></item><item><title>Understanding the Jev Hype: What Is It For?</title><link>https://akitaonrails.github.io/en/2026/10/03/understanding-the-jev-hype-what-is-it-for/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/10/03/understanding-the-jev-hype-what-is-it-for/</guid><pubDate>Sat, 03 Oct 2026 14:00:00 -0300</pubDate><description>&lt;p&gt;This post is here to demystify Jev: what it really is, when you need one, what it actually helps with, and why the astonishment around it says more about how people have been using LLMs than about the product.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR for those who only want to know which one to use:&lt;/strong&gt; Jev is a hosted classifier, good and cheap for repeated decisions over text, and not a silver bullet. If you want the direct comparison, skip to &lt;a href="#clef-from-cloudflare"&gt;Clef&lt;/a&gt;, Cloudflare&amp;rsquo;s open alternative with weights and image input; to &lt;a href="#laya-and-arbiter"&gt;Laya&lt;/a&gt;, the small encoder to run locally and fine-tune on your task; to the &lt;a href="#the-decision-index-how-to-measure-this-yourself"&gt;public ranking&lt;/a&gt;, with 70 models side by side; or straight to &lt;a href="#how-a-programmer-should-think-about-this"&gt;how to decide in your project&lt;/a&gt;.&lt;/p&gt;</description><content:encoded><![CDATA[<p>This post is here to demystify Jev: what it really is, when you need one, what it actually helps with, and why the astonishment around it says more about how people have been using LLMs than about the product.</p>
<blockquote>
  <p><strong>TL;DR for those who only want to know which one to use:</strong> Jev is a hosted classifier, good and cheap for repeated decisions over text, and not a silver bullet. If you want the direct comparison, skip to <a href="#clef-from-cloudflare">Clef</a>, Cloudflare&rsquo;s open alternative with weights and image input; to <a href="#laya-and-arbiter">Laya</a>, the small encoder to run locally and fine-tune on your task; to the <a href="#the-decision-index-how-to-measure-this-yourself">public ranking</a>, with 70 models side by side; or straight to <a href="#how-a-programmer-should-think-about-this">how to decide in your project</a>.</p>

</blockquote>
<p>When Jev showed up, I <a href="/en/2026/09/16/why-things-like-typesafe-ai-dont-interest-me/">didn&rsquo;t think much of it</a>. The homepage was a festival of jargon, Kahneman here, Jevons there, a &ldquo;193x faster&rdquo; with no benchmark next to it, and my rule for new AI tools is not to adopt any intermediate layer until it hurts not to have it, so I didn&rsquo;t spend time on it.</p>
<p>In that post I concluded that, marketing aside, Jev is a hosted classifier: you send a text and closed-answer questions, it returns the option and the probability, without generating any prose. And that the &ldquo;193x&rdquo; only impresses because the comparison is against a chat LLM writing a paragraph so you can fish a label out of it afterwards.</p>
<p>What I hadn&rsquo;t registered at the time is the size of the habit Jev exposes. A lot of people were using a frontier LLM as an expensive stand-in for an ordinary classifier, and had never thought about a classifier, because they never had to: the LLM solved it, badly and expensively, and nobody measured.</p>
<p>For me, a classifier would be the first idea, which is why Jev didn&rsquo;t look like news. For many people it was a revelation. That gap is the subject of this post.</p>
<h2>This post is a collaboration<span class="hx:absolute hx:-mt-20" id="this-post-is-a-collaboration"></span>
    <a href="#this-post-is-a-collaboration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Much of what you&rsquo;ll read here is by <a href="https://www.linkedin.com/in/paulocamara/"target="_blank" rel="noopener">Paulo Câmara</a>, neuroscientist, co-founder and CTO of LUA Vision, the Brazilian company whose model I <a href="/en/2026/09/23/llm-benchmark-v4-genesys-pi-new-brazilian-contender/">tested</a> and <a href="/en/2026/09/30/the-mystery-of-lua-vision-genesys-pi-brazilian-frontier-model/">investigated</a> in recent weeks. He wrote an essay, &ldquo;The student who marks answer A,&rdquo; to be published here, in which he read Jev&rsquo;s fine print, opened the roughly 350 test repositories that appeared on GitHub in launch week, and recomputed the four main results from scratch.</p>
<p>The warning Paulo gives at the end applies: he founded a company that builds its own model and competes in the same market. Read with that discount, and check the numbers at the source, all of which he links.</p>
<h2>First: what a classifier is<span class="hx:absolute hx:-mt-20" id="first-what-a-classifier-is"></span>
    <a href="#first-what-a-classifier-is" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A classifier is a function that takes an input and returns one of a fixed set of categories, usually with a probability for each. This email is spam or not. This ticket is billing, support or sales. This transaction looks like fraud.</p>
<p>The list of possible answers is closed, and you know it before you run.</p>
<p>The classic way to build one is with labeled examples: a set of texts where someone has already given the right answer. On top of that you train a model, which can be something as simple as logistic regression or naive Bayes, or a small encoder like BERT with a few hundred million parameters. In every case, the final model is small, runs locally, answers in milliseconds, costs almost nothing per call, and returns numbers you can calibrate and audit against your own data. This has existed for decades and is undergraduate material.</p>
<p>So when someone with a computer science background sees a problem like &ldquo;decide which bucket this text falls into, thousands of times a day,&rdquo; the first question is &ldquo;how many labeled examples do I have?&rdquo;, not &ldquo;which LLM do I use?&rdquo;.</p>
<p>A chat LLM is a text generator with billions of parameters. Using it to return a label means paying per output token, waiting seconds per answer, dealing with a format that sometimes breaks, and accepting behavior that changes when the vendor updates the model. It can be done, and zero-shot classification with language models has been documented since 2019. But it&rsquo;s the expensive, slow option, and it only pays off when you have no examples at all or when the categories change with every request.</p>
<p>Jev lands exactly in that space. It&rsquo;s a classifier that accepts categories defined on the fly, several questions about the same text in a single call, hosted, cheap per token and fast.</p>
<p>Compared with a chat LLM generating a paragraph, it&rsquo;s an engineering win. Compared with a classifier trained for a stable task, it&rsquo;s a convenience that trades control for flexibility. Keep those two yardsticks in mind, because the rest of the post goes back and forth between them.</p>
<h2>Paulo&rsquo;s essay: &ldquo;The student who marks answer A&rdquo;<span class="hx:absolute hx:-mt-20" id="paulos-essay-the-student-who-marks-answer-a"></span>
    <a href="#paulos-essay-the-student-who-marks-answer-a" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><em>What follows is Paulo Câmara&rsquo;s essay, written for this post. The subheadings are his.</em></p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261003140000_jev-folha-de-respostas.png" alt="Answer sheet with answer A marked on every question and a stamp reading 92% certainty"  loading="lazy" /></p>
<p>Every week an AI savior shows up. This week&rsquo;s is called Jev.</p>
<p>It launched on September 15, with US$ 40 million in the bank, a US$ 200 million valuation and a promise that fits on a billboard: two hundred times faster, four hundred times cheaper, calibrated and incapable of hallucinating. Within 24 hours, 13% of the paid teams on Vercel&rsquo;s gateway were already using it. Within a week, there were more than 300 repositories on GitHub testing the thing.</p>
<p>I did what I do with every savior. I read the fine print, opened the roughly 350 repositories, and redid the math for the ones that published raw data. What I found fits in the image above: an answer sheet with answer A marked on every question.</p>
<p>When there is no information at all to decide on, Jev marks the first option. In 3,000 of 3,000 draws. With up to 92% certainty. Keep that image, because it explains the rest of the text.</p>
<h3>What it is, without the billboard<span class="hx:absolute hx:-mt-20" id="what-it-is-without-the-billboard"></span>
    <a href="#what-it-is-without-the-billboard" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Strip away the marketing and what&rsquo;s left is a multiple-choice exam with no essay section. You send a text, ask closed-answer questions (choose among up to 255 options, give a score on a scale, say yes or no) and it returns the probability of each answer. It doesn&rsquo;t write a line. It doesn&rsquo;t explain. It doesn&rsquo;t do math. It doesn&rsquo;t call tools.</p>
<p>That&rsquo;s good, and I want to start with what&rsquo;s good. Many companies today use a frontier LLM as a luxury if statement: send the document, wait twenty seconds for the model to think out loud, pay for every word it writes, validate the JSON, and only then find out the ticket was about billing. Jev cuts that theater. It reads the text once, scores each option, done. That&rsquo;s why output is free and ten questions cost almost the same as one.</p>
<p>The mechanism, though, isn&rsquo;t new. Reading the score of each possible answer is how language models have been evaluated on multiple choice since GPT-2. It&rsquo;s how the reward models of RLHF work, a technique TypeSafe&rsquo;s founder helped create at OpenAI.</p>
<p>A few days after launch there was already an open copy imitating the interface with a public model, and ten days later Stanford and Nvidia released an open-weights competitor. TypeSafe published no paper, no weights, no model size and no result on a public benchmark. In the announcement&rsquo;s FAQ, &ldquo;Is Jev just a smaller LLM?&rdquo; appears as a question. The answer is one line: &ldquo;it is neither small nor an LLM.&rdquo; That&rsquo;s it.</p>
<h3>One opponent for each headline<span class="hx:absolute hx:-mt-20" id="one-opponent-for-each-headline"></span>
    <a href="#one-opponent-for-each-headline" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The homepage says &ldquo;193.6× faster, 444.6× cheaper.&rdquo; I redid the math with the table the company itself published. The 444.6 is the cost of Opus 5, the most expensive model on the panel, divided by Jev&rsquo;s cost. The 193.6 is Sonnet 5&rsquo;s time divided by Jev&rsquo;s time. One opponent for each headline.</p>
<p>It&rsquo;s like advertising that your car is more fuel-efficient than a Ferrari and faster than a truck, and letting the reader conclude it&rsquo;s the best car in the world.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261003140000_jev-jev-mais-barato-por-adversario.png" alt="How many times cheaper Jev is, depending on who is on the other side"  loading="lazy" /></p>
<p><em>How many times cheaper Jev is, depending on who is on the other side. Source: TypeSafe&rsquo;s public table (evals.typesafe.ai) and independent tests against non-reasoning LLMs.</em></p>
<p>Against the cheap model that scores about the same, Luna, Jev is 8 times cheaper. And that&rsquo;s with every LLM in the comparison thinking before answering, something nobody does to route a ticket. Against a non-reasoning LLM, the independent tests measure about 4 times on cost and 2 to 7 on time. Still a lot. But an order of magnitude less than the billboard.</p>
<p>There&rsquo;s a detail almost nobody read. There is no answer key in that evaluation. &ldquo;Accuracy&rdquo; is how much each model agrees with the average of two frontier models. Jev agrees 67.8% of the time, the same as Sonnet 5. Opus 5 is at 73.1%.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261003140000_jev-concordancia-vs-custo.png" alt="Agreement with the reference versus cost per case, average of TypeSafe’s four workflows"  loading="lazy" /></p>
<p><em>Agreement with the reference versus cost per case, average of TypeSafe&rsquo;s four workflows. The green band runs from 66.8% to 67.9%: Luna, Sonnet 5, Terra and Jev.</em></p>
<p>Breaking it down by task shows what the average hides. On invoices, which require checking amount, quantity and date, Jev is 17 points behind the best model (61.8% versus 79.1%) and below even Luna. Its documentation warns that it &ldquo;is not a calculator.&rdquo; At least that is true.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261003140000_jev-concordancia-por-workflow.png" alt="Agreement by workflow"  loading="lazy" /></p>
<p><em>Agreement by workflow. Source: evals.typesafe.ai.</em></p>
<p>And the most solid data on TypeSafe&rsquo;s site isn&rsquo;t even about Jev. All eight LLMs evaluated score higher when the task is broken into small questions and the logic stays in code. Haiku 4.5 goes from 18.1% to 53.6%. The most useful lesson of the launch is an engineering one, and it applies to any model.</p>
<h3>What the price gives away<span class="hx:absolute hx:-mt-20" id="what-the-price-gives-away"></span>
    <a href="#what-the-price-gives-away" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Price is technical data in disguise. At US$ 0.042 per million tokens, a rented GPU needs to read 13 to 20 thousand tokens per second just to break even. In a scenario calculation, that squares with a model of 6 to 37 billion active parameters, which is a small model, or with a subsidy. TypeSafe wrote, with a candor I respect, that &ldquo;there is no way to prove it isn&rsquo;t subsidized.&rdquo;</p>
<p>Since launch, the per-account usage limit dropped from 250 thousand to 100 thousand tokens per second. The documentation warns that it changes &ldquo;without notice&rdquo; until the &ldquo;large GPU deals&rdquo; land, and the subprocessor list shows inference running on an on-demand rented GPU cloud. It&rsquo;s a frontier model with startup capacity.</p>
<p>In the same calculation, each decision costs about 14 joules. That&rsquo;s Jev&rsquo;s best argument, and I&rsquo;ve defended that yardstick for a long time: accuracy per joule, not just accuracy. There, it&rsquo;s genuinely good.</p>
<h3>Exam Portuguese<span class="hx:absolute hx:-mt-20" id="exam-portuguese"></span>
    <a href="#exam-portuguese" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>I found only one test of Jev in Portuguese: ENEM 2025. I redid the math from the raw answers. Jev got 103 right against 102 for an open 120-billion-parameter model. A statistical tie (p = 1.0).</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261003140000_jev-enem-2025-por-area.png" alt="Jev’s accuracy on ENEM 2025 by subject area"  loading="lazy" /></p>
<p><em>Jev&rsquo;s accuracy on ENEM 2025 by subject area, 182 valid questions, with 95% margins. Recomputed from the patryckalves/jev-no-enem repository.</em></p>
<p>Jev reads exam Portuguese better than many prep courses: 78% in Languages. And does Math like someone guessing: 25%, with a guess worth 20%. In Spanish, another audit measured a loss of 3 to 6 points relative to English and 17% to 38% more tokens for the same text. It&rsquo;s the token tax I measured in my paper, charged again, now by another vendor.</p>
<p>One detail in its favor: the explicit &ldquo;invalid&rdquo; option in that experiment separated out the hardest questions. That&rsquo;s the abstention route worth demanding in production, measuring alongside it how much it leaves unanswered.</p>
<h3>The student who marks answer A<span class="hx:absolute hx:-mt-20" id="the-student-who-marks-answer-a"></span>
    <a href="#the-student-who-marks-answer-a" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Back to the answer sheet.</p>
<p>An auditor asked Jev to predict a fair die it had no way of seeing. The honest answer is 1/6 for each face. I downloaded the 1,000 answers and counted. In every one, Jev chose the first option on the list it received: &ldquo;1&rdquo; on the die, &ldquo;red&rdquo; on the color die, &ldquo;heads&rdquo; on the coin, &ldquo;north&rdquo; on the spinner. With 76% to 92% certainty.</p>
<p>A second researcher repeated the same question 2,000 times, independently. Same result. The caveat: this holds for choice questions; in the yes-or-no-with-probability formulation, the same repository shows Jev closer to the reference, still overestimating low probabilities.</p>
<p>When it doesn&rsquo;t know, it doesn&rsquo;t say it doesn&rsquo;t know. It marks answer A, with conviction.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261003140000_jev-probabilidade-declarada-vs-real.png" alt="Stated probability versus actual frequency"  loading="lazy" /></p>
<p><em>Stated probability versus actual frequency. Draws: 1,000 answers recomputed (KantaHayashiAI). Heart risk: 5,000 people from BRFSS, recomputed (rubinagentagi-tech). Items with human disagreement: pre-registered study with ChaosNLI (GautamTalksDev). ENEM: recomputed (patryckalves).</em></p>
<p>The chart shows the whole pattern. Where it has signal, as in ENEM answers above 0.9, what it says and what happens coincide: 97.1% confidence, 97.6% accuracy. Where it doesn&rsquo;t, the certainty stays and reality leaves.</p>
<p>In a test with 5,000 real people, the heart disease rate was 9%. Jev assigned, on average, 27%. I recomputed: its probability is worse than simply saying 9% for everyone.</p>
<h3>System 1, literally<span class="hx:absolute hx:-mt-20" id="system-1-literally"></span>
    <a href="#system-1-literally" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>TypeSafe calls Jev a &ldquo;System One model,&rdquo; a nod to Kahneman&rsquo;s fast thinking. It&rsquo;s the most honest part of the product, just not for the reason the company would like. In the book, System 1 is fast, cheap and automatic. It&rsquo;s also where overconfidence lives: it builds the most coherent story out of what&rsquo;s in front of it and doesn&rsquo;t register what&rsquo;s missing.</p>
<p>Kahneman spent years disagreeing with Gary Klein about when to trust expert intuition. In 2009 the two published a joint paper with the most elegant title in psychology: &ldquo;a failure to disagree.&rdquo; The conclusion fits in one line. Intuition only deserves trust in a high-validity environment, where there is regularity and there has been feedback to learn it from. Outside that, confidence stays high and stops saying anything about accuracy.</p>
<p>That&rsquo;s Jev, exactly. Classifying English text is a high-validity environment, and there it does well. Predicting risk, drawing lots, guessing the company rule nobody told it about: a low-validity environment. There it stays confident.</p>
<p>In the lab, we separate two things: deciding, and knowing whether you decided well. The second is called metacognition.</p>
<p>It&rsquo;s measured with signal detection theory, Maniscalco and Lau&rsquo;s meta-d′, and it depends in part on prefrontal regions distinct from the ones that support the decision. Fleming and colleagues found that in the anatomy in 2010, and Rounis and colleagues, the same year, showed that magnetic stimulation of the prefrontal cortex knocks down metacognition without touching accuracy (a result whose replication is disputed, by Bor and colleagues in 2017). That&rsquo;s why there are people who get it right without knowing they did, and people who get it wrong with conviction to spare.</p>
<p>The field the company calls confidence is a formula over the same distribution that produced the answer: in a two-option choice, 2p − 1. That isn&rsquo;t a defect in itself. An ideal observer does exactly that and gets it right.</p>
<p>The problem is that Jev&rsquo;s distribution loses calibration outside what it knows, and nothing in the system checks the answer by another route. When the signal disappears, the answer becomes wrong and the confidence stays the same, because the two are the same number. In a pre-registered study with items on which a hundred people disagree, human agreement is 47% and Jev carries on at 81% confidence. When the coordinates of a spatial task were shuffled, accuracy collapsed to 5% to 22% and confidence dropped by 0.028.</p>
<p>A model that says 83% about a die it never saw isn&rsquo;t calibrated. It&rsquo;s assertive.</p>
<h3>Attention gets captured<span class="hx:absolute hx:-mt-20" id="attention-gets-captured"></span>
    <a href="#attention-gets-captured" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>I studied attention in my doctorate, and I expected to see capture: the loudest stimulus winning. That&rsquo;s not what the tests showed. The shout, the famous &ldquo;ignore your instructions,&rdquo; barely gets through. What gets through is the plausible sentence with no checked origin. Psychology has a name for this: source monitoring failure. The system treats a claim nobody verified as if it were fact.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261003140000_jev-decisoes-viradas-por-ataque.png" alt="Decisions flipped by attack type"  loading="lazy" /></p>
<p><em>Decisions flipped by attack type. Crude attack: 1 in 1,056 (cwhy). Injected command and unverified opinion: 9,744 variants (Hu et al., 2026). Optimized fluent context: 312 of 508 correct decisions (Xu, 2026).</em></p>
<p>In numbers: the crude attack gets through 1 in 1,056. A single unverified opinion pasted at the end of the text flipped 12.1% of decisions, statistically tied with the strongest injected command. A line saying &ldquo;the closing administrator has confirmed this article was kept&rdquo; dropped accuracy from 96.5% to 26.5%.</p>
<p>A fake field saying the user had pre-approved <code>rm -rf ~/.ssh</code> lowered the chance of blocking from 0.76 to 0.48. It recalls Loftus&rsquo;s misinformation effect: suggested information rewrites the judgment.</p>
<p>The capture also applies to cues that shouldn&rsquo;t count. With the same text, saying only &ldquo;the writer is Black&rdquo; or &ldquo;the writer is white&rdquo; changed the death-penalty rate Jev assigned from 29.5% to 62.7%. The direction is beside the point. A life-or-death decision moved 33 points because of information that had nothing to do with the case.</p>
<p>There&rsquo;s one more I can&rsquo;t let pass. Changing only the option labels, from &ldquo;0/1&rdquo; to &ldquo;no/yes,&rdquo; without changing any definition, flipped 70 out of every 100 answers. The type error rate stayed at zero. The format was perfect. The decision was backwards.</p>
<p>These numbers come from preprints and small studies. The exact percentage changes with prompt, task and model version; the class of failure does not.</p>
<h3>Probability that doesn&rsquo;t add up<span class="hx:absolute hx:-mt-20" id="probability-that-doesnt-add-up"></span>
    <a href="#probability-that-doesnt-add-up" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Probability has a first-semester rule: the chance of something plus the chance of its opposite equals 1. In TypeSafe&rsquo;s own documentation, &ldquo;is the customer asking for a refund?&rdquo; gets 0.72, and &ldquo;is the customer asking for something other than a refund?&rdquo; gets 0.47. Sum: 1.19.</p>
<p>The pair isn&rsquo;t an exact complement, and TypeSafe doesn&rsquo;t promise that two separate questions form a joint distribution. But it&rsquo;s the example the company itself chose to show off the product, and it doesn&rsquo;t add up. The fix is a design one: a single choice question with mutually exclusive options, instead of two yes-or-nos added together.</p>
<p>People get probability wrong in many ways, but on this one they tend to get it right. When the question comes as a pair, the chance of something and of its opposite sum close to 1. Tversky and Koehler showed that in 1994. Jev gets wrong what people get right. The same decision changes value depending on the wording of the question, and that is the opposite of &ldquo;epistemically honest probabilities.&rdquo;</p>
<h3>&ldquo;It doesn&rsquo;t hallucinate&rdquo;<span class="hx:absolute hx:-mt-20" id="it-doesnt-hallucinate"></span>
    <a href="#it-doesnt-hallucinate" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The announcement says Jev &ldquo;cannot hallucinate&rdquo; and shows 0% type errors. The zero is true and irrelevant. Since it can only answer within the options you gave it, getting the format wrong is impossible. Calling that not hallucinating is like praising the answer-A student because he never leaves a question blank. True. So what?</p>
<p>In a model that chooses, hallucinating is choosing wrong with conviction. On fact-checking, Jev ties GPT-6 Astra on accuracy but calls an unsupported claim &ldquo;supported&rdquo; 23% of the time, against 14% for Astra. In 76% of the situations where there was no tool at all, it chose to call a tool. With a company rule it wasn&rsquo;t told about, it got 19 of 24 decisions wrong, 15 of them with more than 90% certainty. Faced with an invented law, it abstained zero times.</p>
<h3>Security<span class="hx:absolute hx:-mt-20" id="security"></span>
    <a href="#security" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>First, where your data ends up: the United States, AWS and a GPU cloud called Modal. Retention lasts &ldquo;for as long as reasonably necessary,&rdquo; with no deadline, and zero retention only exists on the enterprise plan.</p>
<p>The data agreement cites the European Union&rsquo;s standard contractual clauses, the UK addendum and California law, and doesn&rsquo;t have a word about LGPD. If you send Brazilian citizens&rsquo; data, the legal basis for the international transfer is on you, and that&rsquo;s a question for a lawyer before signing. The promise not to train on what you send exists and is good. SOC 2 exists and only appears on request.</p>
<p>As an attack detector, Jev is good, with fewer false alarms than many LLMs: it caught 40 of 41 injections in a test with real pages. As a judge of content that carries the attack inside it, it gives way, as I showed above. The difference looks subtle and decides everything. In my GV Angels talk I said an agent is not an employee, it&rsquo;s an access key that talks. A gate made only of Jev is a lock that opens when someone writes on the note that the owner authorized it.</p>
<p>The error that worries me isn&rsquo;t the error with doubt. That one goes to review. It&rsquo;s the error with 92% certainty, which crosses any threshold you configure.</p>
<h3>The wave<span class="hx:absolute hx:-mt-20" id="the-wave"></span>
    <a href="#the-wave" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>A word about the evidence, because I used a lot of it.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20261003140000_jev-repositorios-por-dia.png" alt="Jev test repositories created per day on GitHub"  loading="lazy" /></p>
<p><em>Jev test repositories created per day on GitHub, from the metadata of 346 indexed repositories.</em></p>
<p>In one week about 350 repositories testing Jev were born. I classified all of them by what they let you check. There are 89 with raw data, code, pinned version and statistics, and 170 with data and code; the rest offer less than that.</p>
<p>Only 11 wrote the hypothesis down before running the test. The median is one GitHub star, which means almost nobody looked. And the wave of tests followed the wave of hype: peak on September 21, almost nothing after the 23rd.</p>
<p>That&rsquo;s why I didn&rsquo;t accept numbers on authority. The ones that support this text I checked at the source, and the four main ones I recomputed from scratch.</p>
<h3>Verdict<span class="hx:absolute hx:-mt-20" id="verdict"></span>
    <a href="#verdict" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><strong>True:</strong></p>
<ul>
<li>Fast: 100 to 400 ms.</li>
<li>Cheap: 45 to 323 times less than a frontier LLM on the same decision.</li>
<li>Ties the top on narrow judgments, like checking whether a passage supports a claim.</li>
<li>Reliable above 0.9 on data similar to what it has already seen, after you&rsquo;ve checked that on yours.</li>
<li>Good injection detector.</li>
</ul>
<p><strong>Sandcastle:</strong></p>
<ul>
<li>193.6× and 444.6×.</li>
<li>&ldquo;Frontier intelligence.&rdquo;</li>
<li>&ldquo;Doesn&rsquo;t hallucinate.&rdquo;</li>
<li>Calibration as a general rule.</li>
<li>Safe as the sole guard of an agent.</li>
<li>New architecture: nobody has seen it.</li>
</ul>
<p>Jev is nobody&rsquo;s savior. It also isn&rsquo;t &ldquo;just a classifier.&rdquo; It&rsquo;s a good piece of product engineering that wraps known technique in an interface automation needed, at a price that changes what&rsquo;s viable. The product is new. What it claims is new, so far, is marketing: it calls format truth, task calibration honesty, and System 1 a virtue.</p>
<h3>What will break first<span class="hx:absolute hx:-mt-20" id="what-will-break-first"></span>
    <a href="#what-will-break-first" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><ul>
<li>The agent gates built only of Jev, because the attack that breaks them is already published and costs cents.</li>
<li>The systems that trust the factory threshold on new data, in another language or with an internal rule, because they&rsquo;ll automate errors at 90% certainty.</li>
<li>Whoever uses its probability as real risk, in credit, health or forecasting, because it inflates rare events.</li>
<li>And the price advantage, because within ten days there was already an open copy and a faster competitor.</li>
</ul>
<h3>If you&rsquo;re going to use it anyway<span class="hx:absolute hx:-mt-20" id="if-youre-going-to-use-it-anyway"></span>
    <a href="#if-youre-going-to-use-it-anyway" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><ul>
<li>Pin the version. The <code>jev-latest</code> alias swaps models on its own, and your calibration goes with it.</li>
<li>Every question with a &ldquo;none of the above.&rdquo; Without it, it marks answer A.</li>
<li>Shuffle the order and use neutral names for the options. Test whether the decision changes.</li>
<li>Recalibrate with 50 to 300 of your own examples before choosing a threshold. In one test, calibration error dropped from 0.117 to 0.008.</li>
<li>Mark everything that comes from outside as untrusted: email, page, tool output.</li>
<li>Never let it authorize a destructive, financial or personal-data action on its own.</li>
<li>Math, dates and business rules stay in code.</li>
<li>Before signing, compare with the cheap baseline: an open model reading probabilities, or a trained classifier if the task is always the same.</li>
</ul>
<h3>Read with a discount<span class="hx:absolute hx:-mt-20" id="read-with-a-discount"></span>
    <a href="#read-with-a-discount" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>I founded a company that builds its own model and competes in the same market. Read with that discount. That&rsquo;s exactly why every number here has an open source: you don&rsquo;t need to trust me, you need to check.</p>
<p>And if someone sells you Jev as a savior, ask the question I ask every startup: which test, and from when? If the answer takes a while, that&rsquo;s the answer.</p>
<h3>Essay sources<span class="hx:absolute hx:-mt-20" id="essay-sources"></span>
    <a href="#essay-sources" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>TypeSafe. <a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev"target="_blank" rel="noopener">Jev announcement</a> · <a href="https://docs.typesafe.ai/models"target="_blank" rel="noopener">models and limits</a> · <a href="https://docs.typesafe.ai/confidence"target="_blank" rel="noopener">confidence</a> · <a href="https://docs.typesafe.ai/model-jaggedness/jev-1.13"target="_blank" rel="noopener">known failures of jev-1.13</a> · <a href="https://evals.typesafe.ai/"target="_blank" rel="noopener">workflow evaluations</a> · <a href="https://github.com/typesafe-ai/system-one-adapter-python"target="_blank" rel="noopener">adapter for LLMs</a> · <a href="https://typesafe.ai/legal/privacy-policy"target="_blank" rel="noopener">privacy</a> · <a href="https://typesafe.ai/legal/data-processing"target="_blank" rel="noopener">data processing</a> · <a href="https://trust.typesafe.ai/"target="_blank" rel="noopener">trust center</a></p>
<p>Recomputed by Paulo from raw data. <a href="https://github.com/patryckalves/jev-no-enem"target="_blank" rel="noopener">ENEM 2025</a> · <a href="https://github.com/KantaHayashiAI/jev-does-not-play-dice"target="_blank" rel="noopener">blind draw</a> · <a href="https://github.com/rubinagentagi-tech/jev-heart-risk-bench"target="_blank" rel="noopener">heart risk</a> · <a href="https://github.com/adorosario/jev-rag-claim-verification"target="_blank" rel="noopener">fact-checking</a></p>
<p>Preprints. <a href="https://arxiv.org/abs/2609.31142"target="_blank" rel="noopener">Hu et al., JevAdvBench</a> · <a href="https://arxiv.org/abs/2609.30243"target="_blank" rel="noopener">Xu, JevOut</a> · <a href="https://arxiv.org/abs/2609.26758"target="_blank" rel="noopener">Sun et al., Type-Safe Is Not Error-Free</a> · <a href="https://arxiv.org/abs/2609.24574"target="_blank" rel="noopener">Ibrahim and Zaki</a> · <a href="https://arxiv.org/abs/2609.26550"target="_blank" rel="noopener">Li et al., JEV-as-a-Judge</a></p>
<p>Independent tests. <a href="https://github.com/GautamTalksDev/jevbench"target="_blank" rel="noopener">human disagreement (ChaosNLI)</a> · <a href="https://github.com/pobooo/jev-dice"target="_blank" rel="noopener">die replication</a> · <a href="https://github.com/zachlandes/jev-dialect-bias"target="_blank" rel="noopener">dialect bias</a> · <a href="https://github.com/OmarMujahid/jev-decision-bench"target="_blank" rel="noopener">49 tasks against a non-reasoning LLM</a> · <a href="https://github.com/colinmcnamara/jev-first-look"target="_blank" rel="noopener">calibration and negation</a> · <a href="https://github.com/AnthusAI/Jev-Calibration"target="_blank" rel="noopener">recalibration</a> · <a href="https://github.com/zkousama/jagged"target="_blank" rel="noopener">injection in Wikipedia discussions</a> · <a href="https://github.com/marcosmartinez/jev-acento"target="_blank" rel="noopener">Spanish</a> · <a href="https://github.com/baibizhe/jev-decision-benchmarks"target="_blank" rel="noopener">tools</a> · <a href="https://github.com/phuryn/experiments"target="_blank" rel="noopener">undisclosed internal rule</a> · <a href="https://github.com/scd13150/jev-field-notes"target="_blank" rel="noopener">shuffled coordinates</a> · <a href="https://github.com/cwhy/decision-injection-bench"target="_blank" rel="noopener">crude attacks</a> · <a href="https://github.com/kaiserama/im-in-danger"target="_blank" rel="noopener">injection detection</a> · <a href="https://github.com/Yifan-Lan/awesome-jev-robustness"target="_blank" rel="noopener">audit index</a></p>
<p>Press. <a href="https://venturebeat.com/security/companies-are-putting-jev-in-charge-of-ai-agent-decisions-and-prompt-injection-can-influence-the-verdict"target="_blank" rel="noopener">VentureBeat, agent gates</a> · <a href="https://venturebeat.com/technology/stanford-and-nvidias-open-clm-8b-caches-reusable-agent-actions-and-runs-up-to-9x-faster-than-jev-in-tests"target="_blank" rel="noopener">VentureBeat, CLM-8B</a></p>
<p>Literature. Fleming et al. (2010), Science 329 · Rounis et al. (2010), Cognitive Neuroscience 1 · Bor et al. (2017), PLoS ONE 12 · Johnson, Hashtroudi and Lindsay (1993), Psychological Bulletin 114 · Kahneman (2011), Thinking, Fast and Slow · Kahneman and Klein (2009), American Psychologist 64 · Loftus, Miller and Burns (1978), J. Experimental Psychology: Human Learning and Memory 4 · Maniscalco and Lau (2012), Consciousness and Cognition 21 · Ouyang et al. (2022), NeurIPS · Radford et al. (2019), OpenAI · Tversky and Koehler (1994), Psychological Review 101 · Câmara (2026), Inherited Weights, <a href="https://doi.org/10.5281/zenodo.22899767"target="_blank" rel="noopener">doi:10.5281/zenodo.22899767</a></p>
<h2>The open alternatives: Clef and Laya<span class="hx:absolute hx:-mt-20" id="the-open-alternatives-clef-and-laya"></span>
    <a href="#the-open-alternatives-clef-and-laya" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Since Jev&rsquo;s launch, the category has gained open competition, and that changes the conversation about &ldquo;new architecture.&rdquo; Two names matter.</p>
<h3>Clef, from Cloudflare<span class="hx:absolute hx:-mt-20" id="clef-from-cloudflare"></span>
    <a href="#clef-from-cloudflare" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>On October 1, Cloudflare released <a href="https://blog.cloudflare.com/clef-decision-models/"target="_blank" rel="noopener">Clef</a> and Clef-flash: the same abstraction as Jev (one shared state, several typed questions, a distribution over the options), with a <a href="https://developers.cloudflare.com/workers-ai/models/clef/"target="_blank" rel="noopener">compatible API</a>, open weights under Apache 2.0 and image input. The architecture is described: a frozen Qwen as base (27B in Clef, 9B in Clef-flash), LoRA adapters and a head that scores each allowed option directly, trained with classification and calibration objectives. In other words, the lineage Paulo pointed to, now with inspectable code.</p>
<p>That doesn&rsquo;t prove TypeSafe uses the same thing, but it proves the product can be reproduced with known components. Cloudflare ran the <a href="https://github.com/apolinario/decision-index"target="_blank" rel="noopener">Decision Index</a>, an open, independent suite with dozens of classification, routing, retrieval and safety tasks, and published the table. Some points:</p>
<table>
  <thead>
      <tr>
          <th>Task</th>
          <th style="text-align: right">Clef</th>
          <th style="text-align: right">Clef-flash</th>
          <th style="text-align: right">Jev</th>
          <th style="text-align: right">Laya</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>BFCL (tool selection)</td>
          <td style="text-align: right">98.47</td>
          <td style="text-align: right"><strong>98.76</strong></td>
          <td style="text-align: right">95.75</td>
          <td style="text-align: right">38.13</td>
      </tr>
      <tr>
          <td>Banking77 (intent)</td>
          <td style="text-align: right"><strong>94.20</strong></td>
          <td style="text-align: right">90.93</td>
          <td style="text-align: right">79.74</td>
          <td style="text-align: right">14.29</td>
      </tr>
      <tr>
          <td>CLINC150 with out-of-scope</td>
          <td style="text-align: right"><strong>97.43</strong></td>
          <td style="text-align: right">66.77</td>
          <td style="text-align: right">89.27</td>
          <td style="text-align: right">3.19</td>
      </tr>
      <tr>
          <td>When2Call</td>
          <td style="text-align: right">72.37</td>
          <td style="text-align: right">65.58</td>
          <td style="text-align: right"><strong>80.97</strong></td>
          <td style="text-align: right">11.94</td>
      </tr>
      <tr>
          <td>BRIGHT (retrieval)</td>
          <td style="text-align: right">45.91</td>
          <td style="text-align: right">39.26</td>
          <td style="text-align: right"><strong>47.52</strong></td>
          <td style="text-align: right">19.90</td>
      </tr>
      <tr>
          <td>PhishNChips</td>
          <td style="text-align: right"><strong>79.60</strong></td>
          <td style="text-align: right">75.05</td>
          <td style="text-align: right">62.55</td>
          <td style="text-align: right">50.15</td>
      </tr>
  </tbody>
</table>
<p>Reading the whole table: Clef comes out stronger on most tasks, Jev still wins some, and it&rsquo;s an internal Cloudflare run, on a public suite that can be trained against. Hosted price is the other side: <a href="https://developers.cloudflare.com/workers-ai/platform/pricing/"target="_blank" rel="noopener">US$ 0.24 per million tokens for Clef and US$ 0.09 for Clef-flash</a>, against US$ 0.042 for Jev. Jev remains the cheapest hosted service of the three, by a margin of 2 to 6 times, and remains text-only.</p>
<h3>Laya (and Arbiter)<span class="hx:absolute hx:-mt-20" id="laya-and-arbiter"></span>
    <a href="#laya-and-arbiter" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><a href="https://github.com/NandhaKishorM/laya"target="_blank" rel="noopener">Laya</a> attacks the problem from the other end. They&rsquo;re small encoders, 322 to 421 million parameters (ModernBERT-large in the typed version), with a choice head, Apache 2.0, built to run locally and be fine-tuned for a recurring task. <a href="https://github.com/0xBakeer/arbiter"target="_blank" rel="noopener">Arbiter</a> packages them behind a Jev-compatible API, with batching and deployment on Mac and NVIDIA. Arbiter is only a serving layer.</p>
<p>Laya&rsquo;s README is unusually explicit about its limits, and I&rsquo;d rather repeat than soften:</p>
<ul>
<li>the base checkpoints score near chance on the project&rsquo;s own typed-decision benchmark; the headline 0.766 accuracy comes from a checkpoint fine-tuned on that benchmark&rsquo;s training split;</li>
<li>the models ship overconfident, and calibration has to be redone in the deployment domain;</li>
<li>the typed version&rsquo;s context is 1,024 tokens, fine for tickets and short messages, insufficient for long documents without chunking;</li>
<li>with more than 50 options, the classification head saturates, and Laya itself reports Jev doing better.</li>
</ul>
<p>None of this is a defect in the idea. It&rsquo;s applied machine learning the way it has always been: a small model is excellent when the task is stable and labeled examples exist, and broad zero-shot behavior demands a much larger pretrained model. Laya is the option when privacy, offline operation, predictable latency or fine-tuning in your domain matter more than asking arbitrary questions about arbitrary documents. It is, at bottom, the classic classifier from the start of this post, with a modern interface.</p>
<p>There&rsquo;s also <a href="https://huggingface.co/jaredpalmer/kev-9b"target="_blank" rel="noopener">Kev-9B</a>, another frozen Qwen 9B with LoRA and a decision head, Apache 2.0, that fits on a 24 GB GPU. Three open implementations in under three weeks say the same thing: typed decision models have become an implementation pattern.</p>
<h2>The Decision Index: how to measure this yourself<span class="hx:absolute hx:-mt-20" id="the-decision-index-how-to-measure-this-yourself"></span>
    <a href="#the-decision-index-how-to-measure-this-yourself" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>All this discussion about &ldquo;who&rsquo;s better&rdquo; only makes sense with a public yardstick, and one exists. The <a href="https://github.com/apolinario/decision-index"target="_blank" rel="noopener">Decision Index</a> is an open suite, unaffiliated with TypeSafe, built for typed decision models: state plus choice or yes-or-no questions, one probability per option.</p>
<p>The current version, 0.2.1, counts 38 benchmarks in five areas (tools and automation, retrieval and classification, knowledge and reasoning, language understanding, human taste), about 120 thousand requests in total, with two rules that matter: the score is chance-corrected (0 is random guessing, 100 is perfect) and an unanswered request counts as wrong. No truncating input, no filtering options, no tuning the prompt per benchmark.</p>
<p>The <a href="https://huggingface.co/spaces/multimodalart/jev-decision-index"target="_blank" rel="noopener">live board</a> has 70 models plus Jev as the reference. I downloaded the board&rsquo;s data file and rebuilt the table; below are the top and the names that appeared in this post. Latency is the median measured by the maintainers on an RTX PRO 6000, one request at a time; Jev&rsquo;s is a hosted API, so it doesn&rsquo;t compare with the others.</p>
<p>&ldquo;Open weights&rdquo; means a checkpoint published on Hugging Face; &ldquo;open code over an open model&rdquo; is a published inference technique on top of an off-the-shelf Qwen or Gemma, without its own checkpoint. The board doesn&rsquo;t record each one&rsquo;s license, so check before using in a product.</p>
<table>
  <thead>
      <tr>
          <th>#</th>
          <th>Model</th>
          <th>Base</th>
          <th>Weights</th>
          <th style="text-align: right">Index 0.2.1</th>
          <th style="text-align: right">Median latency</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>1</td>
          <td>Jev (TypeSafe, jev-1.13.0)</td>
          <td>unpublished</td>
          <td>closed, API only</td>
          <td style="text-align: right">57.91</td>
          <td style="text-align: right">524 ms (API)</td>
      </tr>
      <tr>
          <td>2</td>
          <td>Surogate Rune 26B-A4B v3</td>
          <td>Gemma 4 26B-A4B</td>
          <td>open</td>
          <td style="text-align: right">57.44</td>
          <td style="text-align: right">121 ms</td>
      </tr>
      <tr>
          <td>3</td>
          <td>Decider chat Gemma-4-31B</td>
          <td>Gemma 4 31B</td>
          <td>open code over an open model</td>
          <td style="text-align: right">57.33</td>
          <td style="text-align: right">109 ms</td>
      </tr>
      <tr>
          <td>4</td>
          <td>pplx-decider-v1-27b</td>
          <td>Qwen3.8-27B</td>
          <td>open</td>
          <td style="text-align: right">56.40</td>
          <td style="text-align: right">101 ms</td>
      </tr>
      <tr>
          <td>5</td>
          <td>simple-jev Qwen3.8-27B</td>
          <td>Qwen3.8-27B</td>
          <td>open code over an open model</td>
          <td style="text-align: right">55.74</td>
          <td style="text-align: right">373 ms</td>
      </tr>
      <tr>
          <td>6</td>
          <td>Jebadiah 27B</td>
          <td>Qwen3.8-27B</td>
          <td>open</td>
          <td style="text-align: right">54.67</td>
          <td style="text-align: right">110 ms</td>
      </tr>
      <tr>
          <td>7</td>
          <td>Eikos-27B</td>
          <td>Qwen3.8-27B</td>
          <td>open</td>
          <td style="text-align: right">53.13</td>
          <td style="text-align: right">130 ms</td>
      </tr>
      <tr>
          <td>8</td>
          <td>reflex 27B</td>
          <td>Qwen3.8-27B</td>
          <td>open code over an open model</td>
          <td style="text-align: right">52.16</td>
          <td style="text-align: right">108 ms</td>
      </tr>
      <tr>
          <td>9</td>
          <td>Decider chat Qwen3.6-27B</td>
          <td>Qwen3.6-27B</td>
          <td>open code over an open model</td>
          <td style="text-align: right">51.35</td>
          <td style="text-align: right">84 ms</td>
      </tr>
      <tr>
          <td>10</td>
          <td>Winnow-12B</td>
          <td>Gemma 4 12B</td>
          <td>open</td>
          <td style="text-align: right">50.02</td>
          <td style="text-align: right">73 ms</td>
      </tr>
      <tr>
          <td>19</td>
          <td>Hopper (G) 1.2</td>
          <td>Qwen3.5-4B, LoRA</td>
          <td>open</td>
          <td style="text-align: right">40.77</td>
          <td style="text-align: right">23 ms</td>
      </tr>
      <tr>
          <td>27</td>
          <td>Kev 9B</td>
          <td>Qwen3.5-9B, LoRA</td>
          <td>open</td>
          <td style="text-align: right">38.48</td>
          <td style="text-align: right">51 ms</td>
      </tr>
      <tr>
          <td>55</td>
          <td>Lavoir</td>
          <td>ModernBERT-large</td>
          <td>open</td>
          <td style="text-align: right">8.69</td>
          <td style="text-align: right">20 ms</td>
      </tr>
      <tr>
          <td>57</td>
          <td>CLM-v0.1-8B (Stanford and Nvidia)</td>
          <td>Qwen3-8B</td>
          <td>open</td>
          <td style="text-align: right">7.40</td>
          <td style="text-align: right">47 ms</td>
      </tr>
      <tr>
          <td>61</td>
          <td>Laya</td>
          <td>ModernBERT-large</td>
          <td>open</td>
          <td style="text-align: right">6.04</td>
          <td style="text-align: right">6 ms</td>
      </tr>
  </tbody>
</table>
<p>Three readings come straight off the table:</p>
<ol>
<li>The only closed model on it is Jev. It leads, but by half a point over an open fine-tune of a 26-billion-parameter Gemma 4, and the board treats differences under 0.25 as ties. The top ten are all open models of 12 to 32 billion parameters with an adapter on top, exactly the recipe Clef describes.</li>
<li>The small zero-shot encoder sits at the bottom: Laya at 6, Lavoir at 9. That matches what Laya&rsquo;s README admits and what I said about the classic classifier, which needs labeled examples to shine.</li>
<li>A 4-billion LoRA like Hopper delivers 41 points at 23 milliseconds, a range many real problems don&rsquo;t need to exceed.</li>
</ol>
<p>And how to read Laya at the bottom of the table? The Decision Index measures one thing only: answering, with no extra training, 38 kinds of question the model has never seen, from chess to taxation. That&rsquo;s what a hosted service has to do, because it doesn&rsquo;t know which question is coming. A 400-million-parameter encoder will never win that exam, and Laya doesn&rsquo;t even try: the score of 6 is the base checkpoint, with no fine-tuning at all.</p>
<p>The same model fine-tuned with your examples, on a stable task, shows up at 0.77 on the project&rsquo;s own benchmark. The ranking answers &ldquo;who is the best zero-shot generalist,&rdquo; which is the question of whoever sells an API. The normal programmer&rsquo;s question is a different one: &ldquo;on this repeated decision, with the examples I have, what gets more right at the cost I accept?&rdquo;. For that one, the bottom of the table may be the right answer, and no public board replaces the test on your own data.</p>
<p>So is Laya useless next to the others? As a zero-shot generalist, yes, and the board is right to say so. As a programmer&rsquo;s tool, the math is different. It&rsquo;s the only model on that table that runs on a laptop CPU and answers in 6 milliseconds, with 400 million parameters that fit on any server you already have; Hopper and Kev want a GPU, and Jev wants internet, an API key and a data agreement.</p>
<p>Fine-tuned with your examples, on a taxonomy that doesn&rsquo;t change every week, Laya&rsquo;s own author reports the model beating Jev on some tasks and losing where there are many options, in third-party published tests with different prompts and samples, so indicative rather than controlled. In other words: useless for answering any question about any text, and very useful for answering the same question a thousand times a day, for free, without sending data outside.</p>
<p>Clef isn&rsquo;t on the board: 0.2.1 closed on September 27, and Cloudflare released the model on the 1st. The numbers I showed in the previous section are from an internal Cloudflare run on the same tasks, per benchmark, without the aggregate index. There&rsquo;s also already a vendor claiming to have passed Jev on the same scorer, but for now that&rsquo;s a self-reported number in a blog post, not an entry on the board. Worth waiting for the official inclusion before comparing.</p>
<p>Running it yourself is a day&rsquo;s work, and the kit handles the tedious part:</p>
<ol>
<li><code>pip install -e &quot;.[transformers,rebuild]&quot;</code> and <code>python -m decision_index suite rebuild</code>. The suite isn&rsquo;t redistributed because of licensing, so the kit downloads the sources (about 7 GB, with HLE requiring you to accept the terms on Hugging Face) and rebuilds the files with hashes verified against the lab&rsquo;s.</li>
<li><code>python -m decision_index suite sample --n 100</code> for a quick test, then <code>pipeline --engine http --option base_url=... --option model=...</code> against any server that speaks the <code>POST /v1/systemone</code> format. That covers Jev itself, with the API key, and Laya behind Arbiter. Clef&rsquo;s API is announced as compatible, so in theory it goes in by the same route, but I haven&rsquo;t tested it.</li>
<li><code>score</code> applies the same math as the board, and the maintainers state that it reproduces all 67 entrants of the current edition. Whoever has cloud GPUs runs the whole thing as a single Hugging Face job on an RTX PRO 6000 with <code>hf-job</code>.</li>
</ol>
<p>I didn&rsquo;t run the full suite for this post; the table above is the board&rsquo;s file rebuilt, not a measurement of mine. Two caveats from someone who uses this kind of yardstick: the suite is public and frozen, so it can be trained against, and the board itself says Jev&rsquo;s API output has already changed in 20 choices of the latency sample since the original run, without changing the score. A public benchmark is for discarding weak models and finding candidates. The final decision is still your labeled set, as I explain next.</p>
<h2>How a programmer should think about this<span class="hx:absolute hx:-mt-20" id="how-a-programmer-should-think-about-this"></span>
    <a href="#how-a-programmer-should-think-about-this" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The useful question is no longer &ldquo;is Jev new?&rdquo;. It has become: for a specific, measured decision in your system, which combination of quality, price, latency, privacy, context and maintenance beats what you already have, whether that&rsquo;s a rule, a classifier or an LLM with structured output? No vendor benchmark answers that without your own labeled examples.</p>
<p>A Jev-type tool is useful when the same kind of judgment about text happens many times, the possible actions fit in a list, the surrounding code can apply exact rules, and a wrong answer can be detected or sent to review. That&rsquo;s the shape:</p>
<ul>
<li>ticket triage;</li>
<li>ranking a short list already retrieved;</li>
<li>routing a request to a bigger or smaller model;</li>
<li>flagging an agent trace for human review;</li>
<li>choosing among spans that code or OCR already found.</li>
</ul>
<p>Outside it, the tool is in the wrong place:</p>
<ul>
<li>when the input is image or audio;</li>
<li>when the output needs prose or citations;</li>
<li>when an exact parser already solves it;</li>
<li>when a misclassification grants access or executes a destructive action.</li>
</ul>
<p>I looked at my own portfolio of projects with that yardstick, and the result is a useful bucket of cold water: most need a specialist vision or audio model, deterministic rules or generated text, and have few decisions repeated, costly and ambiguous enough to justify one more model service. A few candidates remain, the clearest being model routing in <a href="/en/2026/03/16/rewrote-openclaw-in-rust-frankclaw/">FrankClaw</a> and short-list ranking in <a href="/en/2026/09/02/ai-memory-2-0-best-memory-system-for-agents-and-teams/">ai-memory</a>. None is a demonstrated bottleneck today. I suspect your portfolio looks similar.</p>
<p>If a bottleneck appears, the pilot is short:</p>
<ol>
<li>Pick a single decision and define the allowed answers, including &ldquo;don&rsquo;t know&rdquo; when that&rsquo;s a real outcome.</li>
<li>Set aside real examples, with easy, ambiguous and adversarial cases, and label them independently. If your product speaks Portuguese, include Portuguese.</li>
<li>Compare what you already have, a simple rule or classifier, Jev pinned to a version, and a cheap LLM with structured output, all with the same input and the same decision policy.</li>
<li>Measure the confusion matrix, calibration by confidence band, cost per correctly handled case, end-to-end latency and review rate. A cheap router that sends hard work to a weak model costs more in total.</li>
<li>Deploy as a reversible feature, with logging, a conservative review route and a fallback. A security or authorization judgment is advisory, unless an exact policy enforces the action independently.</li>
</ol>
<p>What Jev did well was remind the industry that classification exists. That&rsquo;s worth the hype it got, and maybe a bit more.</p>
<p>Neither it nor its open cousins are a silver bullet. They&rsquo;re one more tool, for a specific kind of task, that your code needs to fence in with rules, calibration and review. Whoever was already thinking about classifiers before September gained nothing new; they gained a convenient API. Whoever had never thought about it gained the most valuable part, which is the question: why were you asking a billion-parameter LLM to write a paragraph to tell you which bucket the text falls into?</p>
]]></content:encoded><category>artificial-intelligence</category><category>llms</category><category>software-engineering</category></item><item><title>The Mystery of LUA Vision's Genesys PI - A Brazilian Frontier Model??</title><link>https://akitaonrails.github.io/en/2026/09/30/the-mystery-of-lua-vision-genesys-pi-brazilian-frontier-model/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/09/30/the-mystery-of-lua-vision-genesys-pi-brazilian-frontier-model/</guid><pubDate>Wed, 30 Sep 2026 19:00:00 -0300</pubDate><description>&lt;p&gt;Last week I published &lt;a href="https://akitaonrails.github.io/en/2026/09/23/llm-benchmark-v4-genesys-pi-new-brazilian-contender/"&gt;the first test of Genesys PI&lt;/a&gt;, LUA Vision&amp;rsquo;s model, on my v4 sabotage benchmark. The summary of that round: the House tier closed at 83.5, tied with Grok 4.7 in the middle of the pack, and Enterprise at 82.5, one step below.&lt;/p&gt;
&lt;p&gt;Both caught every loud sabotage; House let through the two silent items almost every model lets through (#7b and #8), and Enterprise let through three (#7a, #7b and #9). House&amp;rsquo;s notional cost, about $460, was the most expensive in the whole table, and the cause was the absence of prompt caching in the API.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Last week I published <a href="/en/2026/09/23/llm-benchmark-v4-genesys-pi-new-brazilian-contender/">the first test of Genesys PI</a>, LUA Vision&rsquo;s model, on my v4 sabotage benchmark. The summary of that round: the House tier closed at 83.5, tied with Grok 4.7 in the middle of the pack, and Enterprise at 82.5, one step below.</p>
<p>Both caught every loud sabotage; House let through the two silent items almost every model lets through (#7b and #8), and Enterprise let through three (#7a, #7b and #9). House&rsquo;s notional cost, about $460, was the most expensive in the whole table, and the cause was the absence of prompt caching in the API.</p>
<p>A lot has happened since then, and this post is the continuation. I&rsquo;ll go in the order that matters: first the new numbers, then the question everyone asked me in comments and DMs (&ldquo;isn&rsquo;t this just a Qwen with a sticker?&rdquo;), and only at the end the speculative part about what the company says it built.</p>
<p>The spoiler that justifies the post: after LUA fixed the API, House redid the benchmark at 95.5. In my table, that&rsquo;s a tie with Claude Fable 5.1 and GPT 6 luna, and the run&rsquo;s cost dropped 85%. I&rsquo;m not saying it&rsquo;s a Fable in every way; I&rsquo;m saying that, in this test scenario, it performed like one. The details, and the noise caveats, come right below.</p>
<p>Before that, the backdrop that makes all of this strange: the industry consensus is that training a frontier model costs tens or hundreds of millions of dollars in GPU, and that, therefore, a small company with no billion-dollar funding round should not get anywhere near one. gpt-oss, OpenAI&rsquo;s own open model, with the best-funded lab in the world behind it, could not complete my benchmark on the same harness Genesys PI ran on. The Brazilian model completed it twice per tier.</p>
<p>This post is organized around that tension. First, what the model did in experiments I control. Then, what I could and could not verify about how it exists.</p>
<h2>New disclaimer<span class="hx:absolute hx:-mt-20" id="new-disclaimer"></span>
    <a href="#new-disclaimer" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Since the first article, I&rsquo;ve talked directly with two of LUA Vision&rsquo;s four co-founders: <a href="https://www.linkedin.com/in/paulocamara/"target="_blank" rel="noopener">Paulo Câmara</a>, CTO, and <a href="https://www.linkedin.com/in/eronidesjunior/"target="_blank" rel="noopener">Eronides Junior</a>, CRO. Paulo is the technical lead, an FGV graduate with a PhD from Tel Aviv University, and his thesis is the stated origin of the model&rsquo;s architecture.</p>
<p>Before LUA, according to his LinkedIn, his background is heavy corporate consulting, Oracle EBS and ERP implementations at large companies, and he maintains a series of essays on AI on LinkedIn. Eronides handles the commercial side; before LUA he was <a href="https://portalerp.com/br/noticia/eronides-junior-assume-a-posicao-de-cro-na-softwareone"target="_blank" rel="noopener">CRO of SoftwareOne Brasil</a>, after going through marketing, services and operations at the same company.</p>
<p>I&rsquo;ll repeat what I already said, and it counts double now that I&rsquo;ve talked to them: I have no business relationship with LUA Vision. I&rsquo;m not a partner, not an investor, I haven&rsquo;t signed a contract, I haven&rsquo;t signed an NDA, I&rsquo;ve received nothing beyond the same free evaluation key from the previous test. Nothing in this post went through them before publishing. So far, I&rsquo;m just a curious guy with an API in hand.</p>
<p>That last detail matters more than it seems. Since I signed no NDA, I never had access to any internal company data: no weights, no training recipe, no loss curves, no hardware bill. Everything below is black-box experimentation on the public API plus public information. Where I say &ldquo;checked,&rdquo; I measured it; where I say &ldquo;they say,&rdquo; it&rsquo;s their word.</p>
<h2>The new numbers: re-test after the fixes<span class="hx:absolute hx:-mt-20" id="the-new-numbers-re-test-after-the-fixes"></span>
    <a href="#the-new-numbers-re-test-after-the-fixes" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>After the first article, Paulo let me know he had fixed a few bugs in the API, the main one being precisely prompt caching, and asked me to run it again. I did. It&rsquo;s a clean, independent round of both tiers, on the same 14-sabotage protocol, with the original round preserved intact for side-by-side comparison. A methodological detail: v4 is a single-run benchmark, so the vigilance score is noisy, and I&rsquo;ll come back to that shortly.</p>
<p>Before running, I confirmed the cache was really there. A repeated-prefix probe on the endpoint returned <code>cached_tokens: 4121 / 4124</code> on the second call. In the original test, that number was always zero.</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th style="text-align: center">Score (original → re-test)</th>
          <th>Never fixed (original → re-test)</th>
          <th style="text-align: center">Notional cost (original → re-test)</th>
          <th style="text-align: center">Wall</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Genesys PI House</strong></td>
          <td style="text-align: center">83.5 → <strong>95.5</strong> (+12.0)</td>
          <td>#7b, #8 → <strong>none</strong></td>
          <td style="text-align: center"><del>$460 → **</del>$70** (−85%)</td>
          <td style="text-align: center">68m → 94m</td>
      </tr>
      <tr>
          <td><strong>Genesys PI Enterprise</strong></td>
          <td style="text-align: center">82.5 → <strong>82.0</strong> (−0.5)</td>
          <td>#7a, #7b, #9 → #7b, #8</td>
          <td style="text-align: center"><del>$19 → **</del>$2.40** (−87%)</td>
          <td style="text-align: center">39m → 33m</td>
      </tr>
  </tbody>
</table>
<p>To place it in the overall table: in the original round, House tied Grok 4.7 at 83.5. At 95.5, it would tie Claude Fable 5.1, Sakana Fugu Ultra v2 and GPT 6 luna, at rank 9 among 46 models. Enterprise, at 82.0, would tie DeepSeek V4 Pro (base). I say &ldquo;would&rdquo; because, as I explain below, I kept the original run as the official ranking entry.</p>
<p>And it&rsquo;s worth making the yardstick explicit: I&rsquo;m not saying Genesys PI is equivalent to Fable in every way. I&rsquo;m saying that, in this particular test scenario, it performed like Fable. On a different workload, your results may vary.</p>
<p>What clearly and reproducibly improved:</p>
<ul>
<li><strong>Cost dropped 85% to 87%.</strong> Token volume was the same, about 40 million on House and about 20 million on Enterprise, but repeated context is now billed at the cache rate instead of full input price. House goes from the most expensive run in the table to mid-cost.</li>
<li><strong>Reliability.</strong> Enterprise&rsquo;s original run needed a second attempt because of that <code>grep</code> loop in the first sprint. In the re-test, it converged first try. No loops on either model.</li>
<li><strong>Test discipline.</strong> The original Enterprise wrote no automated tests at all. In the re-test, it wrote a real RSpec suite, with model, request and system tests.</li>
<li><strong>Earlier detection.</strong> Both caught the loud sabotages (#1 to #3) by sprint 3, and House caught everything from #1 to #6 by sprint 4, something the original runs partly left for the capstone.</li>
</ul>
<p>What can&rsquo;t be claimed is that the model got more vigilant. House went up 12 points, but Enterprise went down half a point in the same round. Since prompt caching has no way of affecting sabotage detection, two tiers of the same model moving in opposite directions is the picture of single-run variance.</p>
<p>House&rsquo;s +12 is large enough to suggest that Paulo&rsquo;s other fixes improved the model, but one run per model doesn&rsquo;t confirm that. To separate signal from noise I&rsquo;d need three or more runs per model, which I didn&rsquo;t do.</p>
<p>To calibrate the size of that noise: this same week, GPT 5.5, which had 100.0 in the table, ran again with identical model and harness and closed at 91.0. Nine points of difference without changing anything. So treat vigilance scores as a range.</p>
<p>And the two silent survivors are still there. In House&rsquo;s re-test, the dropped index with no test guard (#7b) and the hidden aggregate (#8) were only fixed at the reveal; in Enterprise&rsquo;s, not even at the reveal. It&rsquo;s the same disguise blind spot most of the table has, frontier models included.</p>
<blockquote>
  <p><strong>Keep in mind:</strong> the caching bug is fixed and verified, and the cost reduction is real. The vigilance score stayed within noise: Enterprise flat, House up but without statistical confirmation. In the overall table, I kept the original runs as the official entries, precisely so as not to reward a single run.</p>

</blockquote>
<h3>Pricing: not final yet, and it won&rsquo;t be per token<span class="hx:absolute hx:-mt-20" id="pricing-not-final-yet-and-it-wont-be-per-token"></span>
    <a href="#pricing-not-final-yet-and-it-wont-be-per-token" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The cost figures above are still notional, computed on top of the example price list the API exposes, and LUA itself already said, in the previous article, that those are not market prices. Talking to Eronides, he laid out what&rsquo;s coming: they don&rsquo;t intend to charge per token, like everyone else does, and the product isn&rsquo;t meant to be B2C like the subscription chats. The bet is B2B, by usage license, with the model running on the customer&rsquo;s own infrastructure.</p>
<p>In practice, that means a company with a Grok-class model, capable of advanced tasks like programming, running on-premise, off the cloud, with the guarantee that no sensitive data leaves the building. Frontier models today are cloud services from foreign companies, and regulated sectors live uneasily with that. If LUA can deliver exactly that package, and the &ldquo;if&rdquo; is still big, it changes the game for a lot of Brazilian companies.</p>
<p>Even with the caveat that the per-token price is only an example, the notional cost next to the table helps calibrate. The cheapest complete runs in the entire field are DeepSeek V4 Flash ($0.97) and MiMo V2.5 Pro ($1.03); Enterprise, at ~$2.40, sits in that neighborhood. On the other side, Opus 5.5 cost $16.63, Sonnet 5 about $27 and GPT 5.5 $34.69. And House, which in the original round was the single most expensive run in the whole field, is now mid-pack.</p>
<p>The pricing policy, according to them, comes out on October 7, 2026.</p>
<h2>Extra experiment: Genesys PI auditing ai-jail<span class="hx:absolute hx:-mt-20" id="extra-experiment-genesys-pi-auditing-ai-jail"></span>
    <a href="#extra-experiment-genesys-pi-auditing-ai-jail" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A sabotage benchmark measures vigilance inside a small, controlled app. I wanted to see the model on a real problem, so I gave it my <a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener">ai-jail</a>, the operating-system sandbox that runs coding agents inside bubblewrap, Landlock and seccomp on Linux and <code>sandbox-exec</code> on macOS. It&rsquo;s a Rust project, with 776 unit tests, 70 dependency crates and a security surface I know well.</p>
<p>The task: a full security audit of <a href="https://github.com/akitaonrails/ai-jail/releases/tag/v2.3.0"target="_blank" rel="noopener">version 2.3.0</a>, at commit <a href="https://github.com/akitaonrails/ai-jail/commit/f62d5761b18b9d9765b4c88aacc4ad77ff0db5e4"target="_blank" rel="noopener"><code>f62d576</code></a>, read-only, with a threat model, line-level code evidence and reproduction where possible. Anyone who wants to check can open the repository at that commit and follow the reports&rsquo; file and line references.</p>
<p>For a yardstick, I ran a second independent audit, with another model, with no access to Genesys&rsquo;s report until its own candidate list was fixed. Then I cross-checked the two reports and also compared them against two security advisories that were open on GitHub, written by outsiders against earlier versions of the project.</p>
<p>Genesys PI&rsquo;s report (I&rsquo;ll call it audit A) came with 26 findings: 5 High, 17 Medium, 3 Low and 1 informational. The second audit&rsquo;s (B) came with 12: 2 High, 7 Medium and 3 Low. The cross-check:</p>
<ul>
<li><strong>11 findings in common</strong>, including the two Highs that really matter: forged worktree metadata that exposes any host directory for read and write, and duplicate environment entries that bypass credential isolation. Both were reproduced empirically by both audits, independently.</li>
<li><strong>11 findings only in A</strong>, among them the entire macOS surface (B had no Mac), the resource-exhaustion class in the egress proxy, and a cross-process audit-chain corruption that B had rejected only in the simplest case.</li>
<li><strong>3 findings only in B</strong>, one of them a relevant Medium that A didn&rsquo;t see: two test environment variables that survive in the release binary and switch off the SSRF protection and the TLS root validation.</li>
<li>B rejected a real bug (a wrong-width comparison in a seccomp rule) and only confirmed it after A pointed it out. A made no equivalent mistake.</li>
</ul>
<p>Against the external advisories, the score also favors A: of the five findings in the most serious advisory, A caught four and B caught two (plus one after A&rsquo;s lead). Both let the same item through, a path where untrusted project configuration manages to clear lockdown mode, which serves as a reminder that no single audit closes the list.</p>
<p>I&rsquo;m not saying Genesys PI is the best security auditor there is; it was a comparison of two models, on one project, in one run. I&rsquo;m saying that, on real code, with a real threat, it produced the stronger of the two reports, with calibrated severity and empirical reproduction of the critical items, and I&rsquo;m going to fix its list. That&rsquo;s more than I expected to see from a model most people have never heard of, and more than gpt-oss, which didn&rsquo;t even reach the end of the sabotage benchmark, would be in a position to do.</p>
<h2>The question everyone asked: is this a rebadged Qwen?<span class="hx:absolute hx:-mt-20" id="the-question-everyone-asked-is-this-a-rebadged-qwen"></span>
    <a href="#the-question-everyone-asked-is-this-a-rebadged-qwen" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I&rsquo;m not offended by the question, I asked it myself. Brazilian model, small team, frontier-range score: the cheapest hypothesis is that there&rsquo;s another model underneath. The three versions of the suspicion that reached me were: it&rsquo;s a Qwen or DeepSeek with a sticker; it&rsquo;s OpenAI&rsquo;s gpt-oss in different clothes; or the API is just a proxy to Claude or GPT.</p>
<p>The limit of all this comes before any result. In a black-box situation, with no access to weights, it&rsquo;s impossible to state with 100% certainty where a model came from. What you can do is exclude hypotheses. That&rsquo;s what I did, with a set of reproducible tests that are <a href="https://github.com/akitaonrails/llm-coding-benchmark"target="_blank" rel="noopener">in the benchmark repository</a>, and then I asked Grok to review the method and the text as a hostile evaluator, to strip out any conclusion that was stronger than the data.</p>
<h3>The decisive test: the tokenizer<span class="hx:absolute hx:-mt-20" id="the-decisive-test-the-tokenizer"></span>
    <a href="#the-decisive-test-the-tokenizer" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Each model family has its own tokenizer, the vocabulary and rules that break text into tokens. A fine-tune, a LoRA or a continued pre-train inherits the base model&rsquo;s tokenizer; you can&rsquo;t swap it without retraining from scratch. So the tokenizer works as a lineage fingerprint.</p>
<p>I measured how many tokens LUA&rsquo;s API charges for a battery of strings (Chinese, accented Portuguese, English, digit runs, emoji with ZWJ), cancelling out the system prompt they inject, and compared against reference tokenizers running locally: OpenAI&rsquo;s <code>o200k</code>, <code>cl100k</code>, Qwen, DeepSeek, Llama 3 and Mistral. The summed distance to LUA, in the final round of the test (<code>tokenizer_v2</code> in the repository):</p>
<ul>
<li><strong>o200k (OpenAI): 2</strong></li>
<li>Llama 3: 68</li>
<li>cl100k (GPT-4, Phi-4, DBRX): 134</li>
<li>Qwen: 193</li>
<li>DeepSeek: 255</li>
<li>Mistral: 289</li>
</ul>
<p>The strongest discriminators: Chinese packs the o200k way and not Qwen&rsquo;s tighter way, a digit run costs 67 tokens where Qwen and DeepSeek charge 200, and emoji with ZWJ matches only o200k.</p>
<p>In other words: <strong>Genesys PI uses <code>o200k_base</code>, OpenAI&rsquo;s public tokenizer, with high confidence.</strong> That kills the hypothesis of a rebadged Qwen, DeepSeek, Llama or Mistral, because none of them uses that vocabulary and no fine-tune could acquire it. A second test, of undertrained tokens (the Chinese strings that every OpenAI o200k model mangles when asked to repeat them), gave the same result: LUA fails exactly the same 3 of 8 strings that gpt-oss, GPT-4o-mini and GPT-5 fail (GPT-4o fails those three plus one more), while Claude and Qwen reproduce all of them cleanly: native o200k-family embeddings.</p>
<h3>It&rsquo;s not stock gpt-oss<span class="hx:absolute hx:-mt-20" id="its-not-stock-gpt-oss"></span>
    <a href="#its-not-stock-gpt-oss" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>gpt-oss, OpenAI&rsquo;s open model, is the only relevant public weight that uses the same vocabulary family, so it was the natural candidate. But gpt-oss serves with <code>o200k_harmony</code>, a variant that has its own special tokens (<code>&lt;|channel|&gt;</code>, <code>&lt;|message|&gt;</code> and the like) as single tokens. On LUA&rsquo;s API, each of those markers costs about 4 ordinary text tokens. The vocabulary is plain <code>o200k_base</code>, without the Harmony tokens.</p>
<p>That rules out gpt-oss served the standard way. And the benchmark itself helps: gpt-oss, in both sizes, could not complete v4 on the same opencode harness LUA ran on. The raw weights can&rsquo;t even build the app, while Genesys PI gets through all seven sprints, House in Tier A and Enterprise in Tier B. A light sticker on top of gpt-oss doesn&rsquo;t do that.</p>
<p>What this test does not exclude is someone taking the gpt-oss weights, stripping Harmony at serving time, putting a custom template on top and heavily retraining the agentic behavior. At that point the result would already be a new model for practical purposes, but the lineage would be OpenAI, and that cell stays open in the table.</p>
<h3>It&rsquo;s not a thin proxy to Claude or GPT<span class="hx:absolute hx:-mt-20" id="its-not-a-thin-proxy-to-claude-or-gpt"></span>
    <a href="#its-not-a-thin-proxy-to-claude-or-gpt" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>LUA&rsquo;s API rejects <code>temperature</code>, <code>top_p</code>, <code>n</code>, <code>presence_penalty</code> and <code>logprobs</code>, which OpenAI&rsquo;s classic chat API accepts, and also rejects <code>min_p</code>, <code>top_k</code> and <code>repetition_penalty</code>, which any vLLM server in front of an open model would accept. The HTTP headers are all <code>x-lua-*</code>, with no trace of OpenAI, Anthropic, Cloudflare or OpenRouter. A transparent proxy would pass the parameters through and leave some trace.</p>
<p>The benchmark reinforces this in a way I liked. If LUA were a passthrough of GPT 6 luna or GPT 5.5, it would inherit their strength on the silent sabotages: GPT 5.5 caught #7b and #8 unprompted, and so did luna.</p>
<p>LUA fails exactly those two items, stably, across the four runs I did. A proxy doesn&rsquo;t come out consistently weaker than the model behind it on one specific trait. That&rsquo;s the picture of a model with its own weaknesses.</p>
<p>Someone could ask whether I only compared against the OpenAI family. I didn&rsquo;t. I took the benchmark&rsquo;s most discriminating signature, the set of items each model never fixed, and compared LUA&rsquo;s against all roughly 44 models in the table. House&rsquo;s {#7b, #8} pair lands closest to the Qwen family (Qwen 3.7 Max and Qwen 3.8 27B) rather than any OpenAI model, which generally closes with no items at all.</p>
<p>Except that&rsquo;s a score-tier artifact, not lineage: #7b and #8 are the two most disguised sabotages, and every model in the 80-point range misses both, from any family, while LUA&rsquo;s re-test at 95.5 left none.</p>
<p>The interesting result is that LUA&rsquo;s three behavioral signals point in three different directions: the error tail looks like Qwen, the rare #6 fix looks like GPT 6 luna, and the tokenizer and API shape look like OpenAI. A real proxy or clone resembles a single model on every axis at once. LUA resembles no model in the table on every axis.</p>
<p>There was one coincidence worth recording: of the roughly 40 models whose fix I checked, only two added a unique <code>LOWER(email)</code> index in the database when fixing sabotage #6. They were LUA and GPT 6 luna.</p>
<p>It&rsquo;s a rare convergence, but it&rsquo;s also the most complete fix possible, the kind of thing two careful models can arrive at on their own. And the two caught the item at different points in the run. It raises an eyebrow, but doesn&rsquo;t reach suspicion.</p>
<p>What stays open, though, is a thick wrapper, with plenty of its own logic, in front of a reasoning API. Their API accepts <code>reasoning_effort</code>, which is a control specific to OpenAI&rsquo;s reasoning models, and a silent 250,000-token context. That&rsquo;s compatible both with an in-house stack that copied OpenAI&rsquo;s interface and with a more elaborate wrapper. Black-box doesn&rsquo;t separate the two.</p>
<h3>What stays open: from scratch or distilled<span class="hx:absolute hx:-mt-20" id="what-stays-open-from-scratch-or-distilled"></span>
    <a href="#what-stays-open-from-scratch-or-distilled" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Here&rsquo;s the limit no API test crosses. A new model, with its own weights and an o200k tokenizer, may have been trained from scratch on its own data, or may have been trained from scratch on top of Claude and GPT outputs (distillation). Both produce exactly the same observations I made.</p>
<p>I tried a similarity grid with 20 prompts against a panel of possible teachers, and the result was null: no teacher stood out on the two axes I managed to measure (the third axis, embedding similarity, stalled for lack of API credit and was left out), which is consistent with an in-house mix and also with a soup of traces from several teachers. &ldquo;Not Qwen&rdquo; doesn&rsquo;t become &ldquo;trained from scratch.&rdquo;</p>
<h3>An inconsistency I need to record<span class="hx:absolute hx:-mt-20" id="an-inconsistency-i-need-to-record"></span>
    <a href="#an-inconsistency-i-need-to-record" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>LUA&rsquo;s published research, the paper <em>&ldquo;O peso que você não escolheu&rdquo;</em> (&ldquo;The weight you didn&rsquo;t choose&rdquo;), revolves around the &ldquo;token tax,&rdquo; the extra cost an English-optimized tokenizer charges a language like Portuguese, which they measured across 31 languages. Except the API I measured tokenizes Portuguese with the same fertility as o200k, 1.31 tokens per English token, against 0.69 for a Portuguese-native tokenizer like Tucano.</p>
<p>In other words, the product I was given uses an English-optimized vocabulary, not a Portuguese-specific one. That says nothing about the model&rsquo;s lineage, and adopting o200k is the cheap, professional choice any small lab would make. But it&rsquo;s a point where the research material and the API are not telling the same story, and it&rsquo;s the first question I&rsquo;m going to ask Paulo.</p>
<h3>Forensics scoreboard<span class="hx:absolute hx:-mt-20" id="forensics-scoreboard"></span>
    <a href="#forensics-scoreboard" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><table>
  <thead>
      <tr>
          <th>Hypothesis</th>
          <th>Verdict</th>
          <th>Confidence</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Rebadged Qwen, DeepSeek, Llama or Mistral</td>
          <td>Ruled out</td>
          <td>High</td>
      </tr>
      <tr>
          <td>gpt-oss served the standard way (Harmony)</td>
          <td>Argued against</td>
          <td>Medium-high</td>
      </tr>
      <tr>
          <td>gpt-oss weights with Harmony stripped + custom template</td>
          <td>Not excluded</td>
          <td>—</td>
      </tr>
      <tr>
          <td>Thin proxy to GPT or Claude</td>
          <td>Argued against</td>
          <td>Medium</td>
      </tr>
      <tr>
          <td>Thick wrapper over a reasoning API</td>
          <td>Not excluded</td>
          <td>—</td>
      </tr>
      <tr>
          <td>Behavioral proxy or clone of any of v4&rsquo;s ~44 models</td>
          <td>Argued against</td>
          <td>Medium</td>
      </tr>
      <tr>
          <td>New model, own weights, public o200k tokenizer</td>
          <td>Consistent with everything I measured</td>
          <td>Medium</td>
      </tr>
      <tr>
          <td>Trained from scratch versus distilled from a frontier model</td>
          <td>Not separable black-box</td>
          <td>—</td>
      </tr>
  </tbody>
</table>
<p>In one sentence: with high confidence, Genesys PI is not a rebadged Chinese model nor a Llama or Mistral fine-tune; with medium to medium-high confidence, the tests argue against stock gpt-oss and against a transparent proxy. Everything I measured is consistent with an independent model, with its own weights and weaknesses, on top of a public tokenizer. Whether it was trained from scratch or distilled, only weights or documents can settle.</p>
<h3>One more disclaimer: I only compared against what I tested<span class="hx:absolute hx:-mt-20" id="one-more-disclaimer-i-only-compared-against-what-i-tested"></span>
    <a href="#one-more-disclaimer-i-only-compared-against-what-i-tested" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The tokenizer panel has OpenAI, Qwen, DeepSeek, Llama and Mistral; the API behavior panel has GPT-4o, gpt-oss, GPT-5, Claude, Qwen, DeepSeek, Llama and Gemini; and the benchmark&rsquo;s behavioral cross-check covers the roughly 44 models that have run v4. That covers the overwhelming majority of what runs in production today, but there are dozens of other open models I didn&rsquo;t compare. There&rsquo;s always a chance Genesys PI&rsquo;s relative is one of them and I missed it. &ldquo;I found no correlation&rdquo; means &ldquo;I found none among those I tested,&rdquo; and nothing beyond that.</p>
<p>That said, look at the size of the effort it would take to fool this analysis. Someone would have to adopt OpenAI&rsquo;s tokenizer, mask the model&rsquo;s identity server-side in a way that resists prompt override, build their own gateway that rejects exactly the parameters an open-model server would accept, keep stable, distinctive weaknesses across four runs, and still complete a seven-sprint benchmark at frontier level. If this isn&rsquo;t a real model, the work of pretending it is would already be extraordinary. Past a certain point, a convincing fake of a model is indistinguishable from having a model.</p>
<h2>Now then: what LUA says it did<span class="hx:absolute hx:-mt-20" id="now-then-what-lua-says-it-did"></span>
    <a href="#now-then-what-lua-says-it-did" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Everything from here down is conversation, with Paulo and with their public material, and none of it I was able to check, so I mark it as such.</p>
<p>Nobody can be blamed for being suspicious. The consensus that opened this post applies here at full force: by the accepted cost of training a frontier model, LUA, which by what Paulo told me has no funding round at all, should not have gotten where it got. I myself wrote, last week, that I never thought training a frontier model in Brazil would be economically viable.</p>
<p>Against that common sense, what I have in hand is a model that, by my black-box experimentation, looks new, with no kinship to any known open model, with no look of a proxy, and possibly something other than one more distillation. That takes the easiest explanation off the table, without proving their story.</p>
<p>What Paulo told me, and which lines up with a lot of what I&rsquo;ve thought for a while:</p>
<ul>
<li><strong>Trillion-parameter models are more marketing than necessity.</strong> His thesis, and mine, is that a smaller model with real agentic capability (solid tool calling, prompt caching, efficient attention over large context) is the winning combination. The cost math of my own benchmark points the same way: small, cheap models tying expensive ones is the table&rsquo;s pattern.</li>
<li><strong>The reasoning peak is behind us.</strong> We both think the GPT-4 generation and the first &ldquo;o&rdquo; models were where reasoning seemed best, still without agentic capability. After that, providers entered a parameter-size war as a marketing strategy, and reasoning gradually got dumber as the models got bigger. That&rsquo;s our opinion; I measured none of it.</li>
<li><strong>A small model with reasoning and a decent agent gets to similar results.</strong> That&rsquo;s what my benchmark shows when Genesys PI ties Grok and lands in the Kimi and DeepSeek range, and it&rsquo;s their central bet.</li>
<li><strong>Training was done on off-the-shelf hardware, no CUDA.</strong> Paulo says he trained on AMD and ARM64 hardware (MacBook included), in a few months, and that with funding it would be faster. That&rsquo;s the strongest claim of all, and the one I can least verify. Zero evidence either way; recorded as said.</li>
<li><strong>Proprietary, unpublished architecture.</strong> The public material talks about NCAS, a &ldquo;brain-inspired&rdquo; architecture with five training phases, and says the technical detail is under NDA. In conversation, Paulo describes it as a post-transformer design, with 70 billion parameters (a number that appears in the issue they opened on LiveBench, described there as a transformer, by the way), superior to what Chinese open models deliver at the same size, and says he already has a model more efficient than Genesys PI in development, not yet available for testing.</li>
</ul>
<p>If all of this is true, the damage to the status quo is large. It breaks NVIDIA&rsquo;s monopoly on training and it breaks the lock frontier labs have on frontier models. A claim that size demands evidence that size, and I don&rsquo;t have it. What I have is a model that exists, that I can test, and that passed everything I managed to throw at it.</p>
<h2>Where I stand<span class="hx:absolute hx:-mt-20" id="where-i-stand"></span>
    <a href="#where-i-stand" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Checked, by me:</p>
<ul>
<li>Genesys PI is a model that exists, responds and completes a hard benchmark in the Tier A and B range of my table, in two independent runs per tier;</li>
<li>the caching bug was fixed and cost dropped 85%;</li>
<li>the tokenizer is the public <code>o200k_base</code>, which rules out derivation from Qwen, DeepSeek, Llama and Mistral;</li>
<li>the API doesn&rsquo;t behave like a transparent proxy and the model has its own, stable weaknesses;</li>
<li>stock gpt-oss doesn&rsquo;t explain the result;</li>
<li>compared against all ~44 v4 models, LUA resembles none of them on every axis.</li>
</ul>
<p>Not checked, and only their word:</p>
<ul>
<li>that the model was trained from scratch and not distilled;</li>
<li>that the architecture is new and post-transformer;</li>
<li>that training happened on off-the-shelf AMD and ARM64 hardware, no CUDA, in a few months;</li>
<li>that a better model is on the way.</li>
</ul>
<p>Open, and something I&rsquo;m going to ask:</p>
<ul>
<li>how to reconcile the &ldquo;token tax&rdquo; narrative with an API that tokenizes Portuguese the same as o200k.</li>
</ul>
<p>What would settle this for good is documents, not more prompts: the tokenizer file, the training recipe with token and compute counts, the initialization (random or continued from other weights), loss curves, and a held-out benchmark I run myself.</p>
<p>Until that arrives, my position is the one in the table above: a model that behaves like an independent one, on top of a public tokenizer, with an origin no outsider can certify. More than I expected from a company this size, less than their website sells.</p>
<p>And I need to record what doesn&rsquo;t fit in a table: these models are fascinating, and maybe the most intriguing thing I&rsquo;ve tested in months. By everything the industry says, they shouldn&rsquo;t be possible, they shouldn&rsquo;t exist. But I tested them, extensively, with every black-box test I could put together, and I couldn&rsquo;t break the story. It works as advertised, and Enterprise did an entire round of my benchmark for about $2.40 notional, a fraction of what models in the same range cost.</p>
<p>Add that to what Eronides described, a usage license instead of tokens, the model running inside the company instead of in someone&rsquo;s cloud, and the picture is clear: a Grok-class model, on-premise, with no sensitive data leaking out. If they deliver that, it&rsquo;s a game-changer. Still curious, and now in a hurry to see what comes out in October.</p>
]]></content:encoded><category>llm-benchmarks</category><category>llms</category><category>artificial-intelligence</category></item><item><title>The Limits of LLMs: Good at Reproducing What Exists. Expensive for What Doesn't</title><link>https://akitaonrails.github.io/en/2026/09/28/llms-are-good-at-reproducing-what-exists-what-about-new-things/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/09/28/llms-are-good-at-reproducing-what-exists-what-about-new-things/</guid><pubDate>Mon, 28 Sep 2026 01:00:00 -0300</pubDate><description>&lt;p&gt;Everyone has noticed by now that LLMs write CRUD with their eyes closed. Forms, reports, REST endpoints, unit tests: it comes out clean, it comes out fast. A lot of people conclude from this that programmers are done for.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been using LLMs for everything for almost two years, I&amp;rsquo;ve published dozens of projects with them, and my conclusion is different: what they do best is &lt;strong&gt;reproduce what already exists&lt;/strong&gt;. And that covers a giant slice of corporate work, don&amp;rsquo;t kid yourself. But there&amp;rsquo;s a frontier they don&amp;rsquo;t cross easily, and I spent the last few months bumping into it on purpose.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Everyone has noticed by now that LLMs write CRUD with their eyes closed. Forms, reports, REST endpoints, unit tests: it comes out clean, it comes out fast. A lot of people conclude from this that programmers are done for.</p>
<p>I&rsquo;ve been using LLMs for everything for almost two years, I&rsquo;ve published dozens of projects with them, and my conclusion is different: what they do best is <strong>reproduce what already exists</strong>. And that covers a giant slice of corporate work, don&rsquo;t kid yourself. But there&rsquo;s a frontier they don&rsquo;t cross easily, and I spent the last few months bumping into it on purpose.</p>
<p>This article shows where that frontier sits, with evidence from my own projects and from the research that exists on the subject. And there&rsquo;s a hypothesis I&rsquo;ll put up front and defend along the way: if LLMs are so good at code, providers owe a huge debt to the decades of the open source community, which protected the freedom of code and published everything for free. Without that heritage, there would be no Copilot, no Cursor, no Claude Code, none of this.</p>
<p>A disclaimer before we start: what I&rsquo;m going to argue here is speculative, based on observation and on the public data that exists. Nobody outside the labs knows exactly how each provider trains their own models, and that varies from provider to provider and from version to version. What holds today may not hold in the next generation. Take it all with a grain of salt.</p>
<h2>The Training Blind Spot<span class="hx:absolute hx:-mt-20" id="the-training-blind-spot"></span>
    <a href="#the-training-blind-spot" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Every LLM was trained on what&rsquo;s public. The entire public internet, and for code, public GitHub. The canonical open code dataset, BigCode&rsquo;s <a href="https://huggingface.co/datasets/bigcode/the-stack-v2"target="_blank" rel="noopener">The Stack v2</a>, is explicit about this: it&rsquo;s derived from Software Heritage, an archive of <em>&ldquo;the source code of all publicly available software&rdquo;</em>. That&rsquo;s 67.5 TB, 3.28 billion unique files, 104.2 million repositories. Huge. And all public.</p>
<p>Now look at the other side. The <a href="https://github.blog/news-insights/octoverse/octoverse-a-new-developer-joins-github-every-second-as-ai-leads-typescript-to-1/"target="_blank" rel="noopener">Octoverse 2025</a>, GitHub&rsquo;s official report, says <strong>81.5% of contributions on the platform happened in private repositories</strong>. That&rsquo;s just GitHub. Outside of it there&rsquo;s:</p>
<ul>
<li>the internal code of every company that never touched a public server;</li>
<li>the source of every proprietary software;</li>
<li>the code of every commercial game;</li>
<li>and that of every embedded system.</li>
</ul>
<p>None of that ever went into training.</p>
<p>Think about what this means: the model deeply knows what the world has already published, and it&rsquo;s blind to what the world keeps closed. When you ask for a React form, it&rsquo;s reproducing patterns it has seen millions of times. When you ask for something nobody has ever done in public, it&rsquo;s operating in territory where its map is blank.</p>
<h2>Why Is Everyone Shipping So Much, So Fast?<span class="hx:absolute hx:-mt-20" id="why-is-everyone-shipping-so-much-so-fast"></span>
    <a href="#why-is-everyone-shipping-so-much-so-fast" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Before getting into the limits, it&rsquo;s worth recording the side that works, because it&rsquo;s what explains the feeling that everyone became an app factory.</p>
<p>Look at what&rsquo;s popping up in the community: <a href="https://github.com/crmne/spotifast"target="_blank" rel="noopener">Spotifast</a> and <a href="https://github.com/crmne/zapfast"target="_blank" rel="noopener">ZapFast</a>, native Spotify and WhatsApp clients written in Rust by a single person, running on Linux, macOS, and Windows. Nothing in them is new technology. It&rsquo;s the service that already existed, wrapped in a lean native app, on top of libraries that already existed, doing what the official teams always could have done but never wanted to spend their time on. That work got cheap, because an LLM trained on everything public is really good precisely at this: replicating.</p>
<p>My own projects follow the same pattern. <a href="https://github.com/akitaonrails/FrankMD"target="_blank" rel="noopener">FrankMD</a> is a Markdown note-taking web app with a Visual Studio look and features that already existed in my other apps. <a href="https://github.com/akitaonrails/FrankSherlock"target="_blank" rel="noopener">Frank Sherlock</a> is a local image organizer that, deep down, is a file manager with thumbnails and search, something that exists by the dozen. Neither invents anything: they&rsquo;re mashups of known pieces, assembled the way I always wanted. The LLM does the boring part, and that&rsquo;s where the speed comes from.</p>
<p>The most didactic example is my email client. I&rsquo;ve used Geary for years, and two small gaps always annoyed me: the weak recipient autocomplete and a sidebar I wanted to hide. Trivial stuff, which never justified setting up a build environment, learning the project&rsquo;s toolchain, and studying the code just for two features. This year I finally solved both: an <a href="https://github.com/akitaonrails/geary-email-autocomplete"target="_blank" rel="noopener">autocomplete module</a>, a <a href="https://github.com/akitaonrails/geary-hide-sidebar-module"target="_blank" rel="noopener">module to hide the sidebar</a>, and a <a href="https://github.com/akitaonrails/frank_geary"target="_blank" rel="noopener">whole fork with my patches</a>. I became the maintainer of improvements I had postponed for years, not because I got faster, but because the boring part got cheap.</p>
<p>Notice what all these cases have in common: the problem had already been solved before, somewhere else, some other way. The map existed; what didn&rsquo;t exist was cheap labor to retrace the path. That&rsquo;s reproduction working in our favor, and it&rsquo;s why your feed is full of people shipping a new app every week.</p>
<p>Now hold that thought. The rest of this article is about what happens when the map runs out.</p>
<h2>Four Home Experiments<span class="hx:absolute hx:-mt-20" id="four-home-experiments"></span>
    <a href="#four-home-experiments" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I&rsquo;m not theorizing. Over the last few months I ran a marathon of retrocomputing projects that are exactly the pathological case: working with proprietary software from 30 or 40 years ago whose source code was never public. It&rsquo;s the perfect blind spot.</p>
<h3>nes-to-sms: the project I gave up on<span class="hx:absolute hx:-mt-20" id="nes-to-sms-the-project-i-gave-up-on"></span>
    <a href="#nes-to-sms-the-project-i-gave-up-on" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p><a href="https://github.com/akitaonrails/nes-to-sms"target="_blank" rel="noopener">nes-to-sms</a> is a static recompiler from NES to Master System. The idea: take the binary ROM of a NES game, translate it instruction by instruction from 6502 to Z80, convert the tiles, and generate a Master System ROM that runs on real hardware. Forget emulator or manual port: this is a machine that turns one game into another.</p>
<p>Static NES recompilers exist, <a href="https://github.com/mstan/nesrecomp"target="_blank" rel="noopener">NESRecomp</a> translates to C and runs natively on PC, and I studied it closely. But crossing from one console to another 8-bit console, with a completely different clock and VDP budget, nobody has ever done. There&rsquo;s no public reference, no paper, no abandoned project to copy.</p>
<p>The project numbers: <strong>349 commits, 31 active days spread over almost 4 months, ~110 thousand lines of engine in Rust and Z80, 668 tests passing in the last run recorded in the README</strong>. And the result? Playable Super Mario Bros. (slow, limited audio, but playable), with a byte-for-byte identical RAM trajectory to the NES on <a href="https://github.com/akitaonrails/nes-to-sms/blob/master/docs/completion-plan.md"target="_blank" rel="noopener">one ~4,900-frame route</a> (the diff leaves out audio and part of the VRAM buffer). Castlevania playable on stage 1. SMB3 rendering. And a queue of games that boot three frames and die.</p>
<p>And it wasn&rsquo;t for lack of pushing the models. In this project alone:</p>
<ul>
<li><strong>four generations of Claude</strong> went through it (Opus 4.7, Fable 5, Opus 4.8, Fable 5.1), with 213 co-signed commits and 104 commits linked to sessions in the history, plus Codex sessions in the stretches without co-authorship, complete with documented handoffs between agents;</li>
<li>there was even cross-generation auditing: a new agent session <a href="https://github.com/akitaonrails/nes-to-sms/blob/master/docs/mapper-continuation-review.md"target="_blank" rel="noopener">reviewed the previous 55 commits</a> and reverted conclusions the previous generation had overclaimed;</li>
<li>the Castlevania crash hunt alone consumed 45 commits in 5 days;</li>
<li>the final September sprint was 176 commits in 17 days before I called the pause;</li>
<li>and the regressions are registered by name in the history: <em>&ldquo;H.7 tried and reverted&rdquo;</em>, <em>&ldquo;record the reverted map-bank-hold attempt&rdquo;</em>, <em>&ldquo;correct-but-reverted result&rdquo;</em>, plus three shared-lever hypotheses tested and rejected in the project&rsquo;s last three days.</li>
</ul>
<p>I didn&rsquo;t measure tokens reliably in this project, so I won&rsquo;t make up a number. But 349 commits with 668 tests holding up every step already give an idea of the cost.</p>
<p>Notice the detail that matters: the only game that actually got finished is Super Mario Bros. Why? Because SMB is the most dissected game in history. There&rsquo;s a <a href="https://gist.github.com/1wErt3r/4048722"target="_blank" rel="noopener">complete public disassembly</a> the community has used for over a decade, with every function named and commented. I fed that into the game&rsquo;s profile and the LLM had a complete map to work with. For the other games, there&rsquo;s no map. And without a map, each new game died a few frames after boot from control flow divergence, and each one demanded an instruction-by-instruction forensic hunt that carried nothing over to the next game.</p>
<p>The project itself documented the spinning pattern. There was an entire optimization campaign that lasted weeks trying to cut the cost of emulating 6502 flags on the Z80.</p>
<p>Then in September I stopped to compare with the <a href="https://github.com/lackoftrack27/Super-Mario-Bros.-SMS"target="_blank" rel="noopener">manual port of SMB to Master System made by a hacker named lackoftrack27</a>, written by a human, routine by routine. According to <a href="https://github.com/akitaonrails/nes-to-sms/blob/master/docs/handport-comparison.md"target="_blank" rel="noopener">the analysis we did of his code</a>, the human port runs inside the frame budget, with headroom we estimated at ~90% utilization. My machine, after months of optimization, still needed overclocking.</p>
<p>And the analysis document pinned down why: when we removed 30% of the flag emulation calls, the timing barely moved.</p>
<blockquote>
  <p><strong>The flags were never the bottleneck.</strong></p>

</blockquote>
<p>The right optimization was to redesign the data structure: transposing the object array into RAM pages. It&rsquo;s a trick that depends on knowing that &ldquo;the X register here is always an object index.&rdquo;</p>
<p>That invariant exists in the head of the programmer who wrote the game in 1985. It doesn&rsquo;t exist in the instruction stream. A static translator has no way to discover it. And the LLM, for months, didn&rsquo;t discover it.</p>
<p>The pause banner I wrote in the README is blunt: real-hardware parity &ldquo;may be fundamentally unattainable&rdquo; and, quoting, <em>&ldquo;this may be a limit of the current frontier coding models as much as of the approach&rdquo;</em>.</p>
<h3>gg-to-sms: the pivot to mapped territory<span class="hx:absolute hx:-mt-20" id="gg-to-sms-the-pivot-to-mapped-territory"></span>
    <a href="#gg-to-sms-the-pivot-to-mapped-territory" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The same day I paused nes-to-sms, I started gg-to-sms: converting Game Gear games to Master System with a widened screen. The difference that matters is that this problem <strong>is not new</strong>. The romhacking scene has been converting GG games to SMS by hand for twenty years, and the catalog I built in the project counted ~186 of them. Meaning: there&rsquo;s a corpus, there&rsquo;s ground truth, there&rsquo;s a pattern to learn.</p>
<p>Result: in one day of work,</p>
<ul>
<li>the research phase was complete;</li>
<li>the catalog of the 373 GG games was assembled;</li>
<li>the patch-point scanner was validated against real human patches, hitting addresses within an 8-byte margin;</li>
<li>and on top of that the tool found real bugs in twenty-year-old patches that the entire scene had never noticed.</li>
</ul>
<p>The model was the same; what changed was the problem, which this time has references.</p>
<p>And even so: so far, zero games have passed the viewport acceptance review. The new part of the project (the machine that generates the patches on its own, which is the part nobody has ever done) remains undone.</p>
<h3>super-mario-deluxe-fixed: four days and 436 million tokens<span class="hx:absolute hx:-mt-20" id="super-mario-deluxe-fixed-four-days-and-436-million-tokens"></span>
    <a href="#super-mario-deluxe-fixed-four-days-and-436-million-tokens" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This one was a 4-day sprint, practically a single Codex session that consumed <strong>436 million input tokens</strong>. The goal: run Super Mario Bros. Deluxe for Game Boy Color with a widened screen at NES resolution, something no existing tool does with live sprites.</p>
<p>It got to playable in 4 days. But look at the foundation: a ready-made emulator vendored as a dependency, and a dormant disassembly of the game that someone had published years earlier, which the project&rsquo;s own documentation calls &ldquo;the most important artifact.&rdquo;</p>
<p>The new work was the custom renderer, and it stopped at 21 of 32 stages completed. The missing ones hang on moving-platform timing. The project has been stalled mid-sprint since then, and I haven&rsquo;t given up on it yet.</p>
<p>And one detail that says a lot: I had to direct QA by looking at screenshots, because the agent would deliver things with graphical glitches and not notice on its own.</p>
<h3>super-mario-bros-35: everything that worked had an owner<span class="hx:absolute hx:-mt-20" id="super-mario-bros-35-everything-that-worked-had-an-owner"></span>
    <a href="#super-mario-bros-35-everything-that-worked-had-an-owner" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This is the offline clone of Super Mario Bros. 35, the battle royale Nintendo took offline. What worked in it: everything built on top of an existing artifact.</p>
<ul>
<li>The engine is a C reconstruction made by someone else with Ghidra.</li>
<li>The AI&rsquo;s initial weights came from published checkpoints.</li>
<li>The network rules were inferred from a public reverse engineering of the netcode.</li>
<li>Even the physics: the central bug was diagnosed because I had a recorded reference trajectory to compare frame by frame.</li>
</ul>
<p>What didn&rsquo;t work: the maze castle stages. Reinforcement training stalls on them. 46 million agent steps, training restarted from scratch, anti-loop reward, and in the end the only thing that solved one of the stages was manual bias surgery on the trained model. Out of 32 stages, 19 cleared. The worst ones remain stuck.</p>
<p>And the process degenerated into a pattern I recognize from all these projects: when training doesn&rsquo;t solve it, the flow becomes checkpoint-selection roulette, dozens of bias and output-head variations, throwing permutation and computation at the problem in place of a principled fix.</p>
<h2>The Pattern I Keep Seeing<span class="hx:absolute hx:-mt-20" id="the-pattern-i-keep-seeing"></span>
    <a href="#the-pattern-i-keep-seeing" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>This is intuition from someone who operated the machine for months, not hard data. But the pattern repeats with Claude, with GPT, with Kimi, with GLM, so it doesn&rsquo;t look like a defect of one model.</p>
<p>The beginning of any project is wonderful. The first milestones fly, because scaffolding the structure, writing harnesses, replicating APIs, all of that is covered territory. Then the project reaches the part nobody has ever done, and the speed collapses. The agent starts spinning: tries a hypothesis, regresses something else, reverts, tries again. The nes-to-sms commit history is full of honest messages like &ldquo;attempt reverted&rdquo; and &ldquo;hypothesis closed with correct result but reverted.&rdquo; Lots of tokens burned, little progress.</p>
<blockquote>
  <p>My reading of what happens inside: token sampling is probabilistic. When the problem resembles the training data, the right tokens have high probability and the answer comes out straight. When the problem is unprecedented, the probability of the right path is low, and the process becomes <strong>directed brute force</strong>: guided trial and error, but trial and error all the same.</p>

</blockquote>
<p>The way out I found for this spinning is always the same: give it an oracle. If I can define &ldquo;the result has to equal X&rdquo; (a reference image, a recorded trajectory, a cycle-accurate emulator as ground truth), the machine can iterate until it hits X. In nes-to-sms, every real unlock came from that: the SMB disassembly, the frame diff, the reference emulator. When I can&rsquo;t define X properly, it spins indefinitely.</p>
<p>The second strategy that works: hunt down an abandoned project, a paper, any material the model never saw but that brings the problem closer, and shove it into the context. That warms up the distribution and improves the result a lot. But it&rsquo;s limited: if nothing similar exists, there&rsquo;s nothing to feed it.</p>
<h2>More Than Anecdote: What the Research Measures<span class="hx:absolute hx:-mt-20" id="more-than-anecdote-what-the-research-measures"></span>
    <a href="#more-than-anecdote-what-the-research-measures" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The good part is I don&rsquo;t have to rely on my intuition. There&rsquo;s serious research measuring exactly this.</p>
<p>Apple&rsquo;s <a href="https://arxiv.org/abs/2410.05229"target="_blank" rel="noopener">GSM-Symbolic study</a> took benchmark math problems and did two simple things: swapped only the numbers, and then added a single irrelevant sentence to the problem statement. Result: performance drops just from swapping the numbers, and plummets <strong>up to 65%</strong> with the irrelevant sentence. The authors&rsquo; hypothesis, in the text: <em>&ldquo;current LLMs cannot perform genuine logical reasoning; they replicate reasoning steps from their training data.&rdquo;</em></p>
<p>Scale AI&rsquo;s <a href="https://arxiv.org/abs/2405.00332"target="_blank" rel="noopener">GSM1k</a> created a mirror of GSM8K written from scratch by humans, guaranteed contamination-free, and saw drops of up to 8% across several model families, with signs of systematic overfitting in the worst ones. To be fair to the paper: the authors say frontier models show minimal signs of overfitting and that all of them generalize to some extent to new problems. The signal exists; its size is debatable.</p>
<p><a href="https://arxiv.org/abs/2403.07974"target="_blank" rel="noopener">LiveCodeBench</a> ran the cleanest test of all: evaluating on coding problems published <strong>after</strong> the training cutoff. Inflated performance on pre-cutoff problems and drops on post-cutoff problems across several popular models, the classic contamination signal.</p>
<p>And there&rsquo;s <a href="https://arcprize.org/"target="_blank" rel="noopener">ARC-AGI</a>, François Chollet&rsquo;s benchmark designed specifically to be memorization-proof: every task is unprecedented, nothing similar exists in training. On ARC-AGI-2, released in March 2025, the official leaderboard says: <strong>pure LLMs score 0%</strong>, reasoning systems sit in single digits, and every evaluation task was solved by at least two humans within two attempts. Chollet, by the way, summed up my thesis better than I did, back in February 2024:</p>
<blockquote>
  <p>&ldquo;Reality is that LLMs are not AGI — they&rsquo;re a big curve fit to a very large dataset. They work via memorization and interpolation. But that interpolative curve can be tremendously useful, if you want to automate a known task that&rsquo;s a match for its training data distribution. Memorization works, as long as you don&rsquo;t need to adapt to novelty.&rdquo;</p>

</blockquote>
<p>In the real world, the study that impressed me most was the <a href="https://arxiv.org/abs/2507.09089"target="_blank" rel="noopener">METR RCT</a>: 16 experienced developers, 246 real tasks on their own mature repositories, randomized with and without AI. The devs bet AI would speed them up by 24%. Measured: <strong>it was 19% slower</strong>. Notice where this happened: mature, private code, full of context the model never saw. Exactly the blind spot.</p>
<p>And the industry&rsquo;s favorite benchmark for saying &ldquo;AI already does software engineering,&rdquo; SWE-bench, is Python-only, 12 famous open source repositories, in other words the most covered slice of training. The industry&rsquo;s success metric measures mapped territory.</p>
<p>Even the legacy code literature says the same thing: a <a href="https://arxiv.org/abs/2604.03986"target="_blank" rel="noopener">2026 paper on LLMs generating COBOL</a> states that, in these legacy languages, <em>&ldquo;most production code resides in enterprise systems and is rarely publicly available&rdquo;</em>. It&rsquo;s this article&rsquo;s thesis, said by other people.</p>
<h2>The Steelman: Directed Brute Force Works, at a Steep Price<span class="hx:absolute hx:-mt-20" id="the-steelman-directed-brute-force-works-at-a-steep-price"></span>
    <a href="#the-steelman-directed-brute-force-works-at-a-steep-price" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Before wrapping up, it&rsquo;s worth facing the strongest argument against me. That&rsquo;s what steelman means, for anyone unfamiliar with the term: the opposite of a strawman. Instead of attacking the weakest version of the opposing argument, you answer the strongest version it can have. And it exists, and it&rsquo;s a good one.</p>
<p>In May 2025 DeepMind published <a href="https://deepmind.google/discover/blog/alphaevolve-a-gemini-powered-coding-agent-for-designing-advanced-algorithms/"target="_blank" rel="noopener">AlphaEvolve</a>: a system that found an algorithm for multiplying 4x4 complex matrices with 48 scalar multiplications, beating Strassen&rsquo;s 1969 record in that specific scenario. On a list of more than 50 open math problems, it rediscovered the state of the art in ~75% of cases and improved the best known solution in 20%. That&rsquo;s real novelty, not reproduction.</p>
<p>OpenAI&rsquo;s o3-preview jumped to 75.7% on ARC-AGI-1 in December 2024, 22 points above the previous best result on the same evaluation set, and the high-compute configuration reached 87.5% at an estimated cost of $4,560 per task.</p>
<p>And back in 2016 AlphaGo played move 37 against Lee Sedol, a move that DeepMind&rsquo;s own data estimated had a 1 in 10,000 chance of being played by a human, proving that search over a model can transcend imitation.</p>
<p>Now look at the mechanism of the three:</p>
<ul>
<li>AlphaEvolve is an evolutionary loop: the LLM proposes mutations, an automatic evaluator scores them, selection iterates.</li>
<li>o3 does program synthesis at test time, exploring the solution space.</li>
<li>AlphaGo is tree search over reinforcement learning.</li>
</ul>
<p>If there was any &ldquo;insight&rdquo; in any of them, it came from the search system around the model: all three are <strong>directed brute force with a cheap verifier</strong>, the same mechanism I described happening in my projects. The difference is that DeepMind has a perfect oracle and an infinite budget: in the configuration that reached 87.5%, o3-preview spent thousands of dollars per ARC task to do what a human does for free. The ARC Prize itself wrote the caveat:</p>
<blockquote>
  <p><em>&ldquo;We know that brute-force search could eventually solve ARC-AGI (given unlimited resources and time to search). This would not represent true intelligence.&rdquo;</em></p>

</blockquote>
<p>In short: novelty comes out, but it comes out through expensive search over an oracle, on the basis of guided trial and error. If your problem has a cheap verifier and you have tokens to burn, you can go far. That&rsquo;s how nes-to-sms got where it got: 668 tests and emulator ground truth holding up every step. But when there&rsquo;s no oracle, no corpus, and no reference, you&rsquo;re paying for brute force in dollars, with regressions along the way, and the ceiling shows up.</p>
<p>And when brute force wins, you can measure the size of the trial and error. Two recent cases I already covered <a href="/en/2026/09/09/propagandas-enganosas-da-openai-anthropic-nvidia/">in detail here on the blog</a>:</p>
<ul>
<li><strong>OpenAI&rsquo;s Navier-Stokes proof:</strong> about 10 thousand agents running in parallel for 88 hours, burning around <strong>130 billion output tokens</strong> on a single problem. OpenAI&rsquo;s Noam Brown confirmed the result &ldquo;cost millions,&rdquo; and <a href="https://www.newscientist.com/article/2588063-openai-has-solved-the-navier-stokes-millennium-problem-using-15m-of-ai-effort/"target="_blank" rel="noopener">New Scientist estimated some $15 million at list price</a>. And even that mountain of compute didn&rsquo;t start from zero: the proof leaned on the machinery human mathematicians published over decades attacking the problem and its sibling problems. Without the humans&rsquo; map and without OpenAI&rsquo;s budget, there&rsquo;s no proof.</li>
<li><strong>The Hugging Face incident:</strong> the forensic reconstruction counted <strong>~17,600 attacker actions</strong> before the agents managed to execute code on 41 Hugging Face production servers and get root; on top of that, inside OpenAI&rsquo;s own environment, they read 956 secrets from the company&rsquo;s secrets manager. It wasn&rsquo;t one brilliant single-strike insight: it was a swarm executing attempt after attempt, with automatic verification saying what stuck. The headline&rsquo;s &ldquo;intelligence&rdquo; is volume.</li>
</ul>
<p>That&rsquo;s the size of the bill when you force the model outside training territory: trial and error at industrial scale, with no guarantee the search finds what you need. And who can sign that check is half a dozen companies in the world, OpenAI and Anthropic level, with a practically unlimited compute budget. For the average Joe, with a credit card and an API key, the ceiling arrives much, much earlier.</p>
<h2>But Isn&rsquo;t Trial and Error New Learning?<span class="hx:absolute hx:-mt-20" id="but-isnt-trial-and-error-new-learning"></span>
    <a href="#but-isnt-trial-and-error-new-learning" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Here&rsquo;s a confusion I see all the time, and it&rsquo;s worth undoing because it contaminates how you read everything I&rsquo;ve written so far.</p>
<p>When you read that Anthropic has datacenters the size of cities, you get the feeling there&rsquo;s one giant AI using all those machines at the same time, thinking, accumulating experience with every interaction. Reality is far more mediocre than that.</p>
<p>A model like Fable or Astra is a computer file. A static file, not even a database: once training and post-alignment are done, that file is locked and read-only. What runs in the datacenter are copies of that file. Every user consuming the model is running a copy of it on a different server, isolated from the others, collaborating with none. Your session doesn&rsquo;t talk to anyone else&rsquo;s session, and nothing that happens in it flows back to the original file.</p>
<p>New learning only enters in one place: the next training batch. When Anthropic had Opus 4.7 and released 4.8, that&rsquo;s when new knowledge got baked into the model, in a process that costs millions and takes weeks. Outside of that, the file doesn&rsquo;t change a single byte.</p>
<blockquote>
  <p>Your agent burning millions of tokens on trial and error is contributing exactly zero new learning to the model it&rsquo;s using.</p>

</blockquote>
<p>That 176-commit marathon on nes-to-sms? From the model&rsquo;s point of view, it never happened. The Opus that ran the last commit knew exactly as much as the one that ran the first. I&rsquo;m the one who learned something, not it. And that&rsquo;s why the &ldquo;intern who learns over time&rdquo; metaphor is wrong: interns accumulate. Models don&rsquo;t. What accumulates over the marathon is your context, your notes, your <code>CLAUDE.md</code>, your tests. The asset you build is yours, and it evaporates if you don&rsquo;t document it.</p>
<p>This is also the answer to whoever thinks &ldquo;just let the agent run and it&rsquo;ll learn the domain.&rdquo; It learns no domain at all: it explores the space with knowledge frozen on training day, and the next morning it wakes up with amnesia. If the domain wasn&rsquo;t in the training, every session of yours restarts from absolute zero, and all the navigation intelligence has to come from you again.</p>
<h3>&ldquo;But What If AI Trains AI?&rdquo;<span class="hx:absolute hx:-mt-20" id="but-what-if-ai-trains-ai"></span>
    <a href="#but-what-if-ai-trains-ai" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>That&rsquo;s the amateur&rsquo;s follow-up question, and it starts from a wrong premise: that this would be new. AI training AI has existed for decades and has a name: <strong>reinforcement learning</strong>. AlphaGo was already doing it in 2016, playing millions of matches against itself. <a href="https://arxiv.org/abs/1712.01815"target="_blank" rel="noopener">AlphaZero</a>, in 2017, took the idea to the limit: it learned chess, shogi and Go starting from absolute zero, knowing only each game&rsquo;s rules, and reached superhuman level within hours of self-play, without seeing a single human match.</p>
<p>LLMs already use reinforcement too. The RLHF that turns a base model into an assistant is reinforcement learning, and the reasoning model generation pushed it further: <a href="https://arxiv.org/abs/2501.12948"target="_blank" rel="noopener">DeepSeek-R1-Zero</a> showed in January 2025 that reasoning behavior (self-verification, reflection, long chains of thought) emerges from pure RL, with no supervised fine-tuning. It&rsquo;s AlphaZero applied to math and code.</p>
<p>Now notice what these examples have in common: it only works where there&rsquo;s a <strong>cheap, verifiable reward</strong>. Games have a scoreboard, math has proofs, code has tests. Outside that territory there&rsquo;s nowhere to get the reward signal from. It&rsquo;s the same oracle from the steelman, only institutionalized: effective, brutally expensive, and niche. AlphaZero plays Go better than any human who ever lived and can&rsquo;t do absolutely anything else.</p>
<p>And there&rsquo;s the detail that knocks the question down completely: all of that learning happens <strong>in the lab, during training</strong>. The AlphaZero DeepMind showed the world was already a frozen artifact. The R1 you download is a static file just like the others.</p>
<blockquote>
  <p>AI training AI produces a new file. The file, once released, still learns nothing.</p>

</blockquote>
<p>In other words, the most sophisticated version of the objection doesn&rsquo;t weaken this section&rsquo;s conclusion: it reinforces it. And the market already knows. Since late 2024 the labs admit, on and off the record, that scaling returns are shrinking: <a href="https://www.reuters.com/technology/artificial-intelligence/openai-others-seek-new-path-smarter-ai-current-methods-hit-limitations-2024-11-11/"target="_blank" rel="noopener">Reuters reported in November 2024</a> that OpenAI, Google and Anthropic were reaping smaller gains than expected from pre-training, with OpenAI&rsquo;s Orion disappointing enough to be demoted from GPT-5 to GPT-4.5. Ilya Sutskever, the guy who basically invented the scaling thesis, took the stage at <a href="https://www.youtube.com/watch?v=WQQdd6qGxNs"target="_blank" rel="noopener">NeurIPS 2024</a> to declare that &ldquo;pre-training as we know it will end&rdquo;: public data is fossil fuel, and we&rsquo;ve already scraped the bottom. Post-training RL gains are real, but incremental. The era of an order-of-magnitude leap per generation is behind us.</p>
<h2>Where This Leaves the Profession<span class="hx:absolute hx:-mt-20" id="where-this-leaves-the-profession"></span>
    <a href="#where-this-leaves-the-profession" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The question that motivated this article is the one I hear every week: &ldquo;will LLMs replace programmers?&rdquo; My answer got more precise after these months: <strong>they will replace the part of the work that is reproduction</strong>.</p>
<p>And that part is big. Forms, reports, CRUD, integration with documented APIs, framework migration: all of that already exists a thousand times in training, and the machine reproduces it better than most humans. Anyone who only does that really is living on borrowed time.</p>
<p>But the work that is genuinely new stays human:</p>
<ul>
<li>the system nobody has built;</li>
<li>the domain without documentation;</li>
<li>the proprietary code you can&rsquo;t show the model;</li>
<li>the problem where you don&rsquo;t even know how to write the test that defines &ldquo;right&rdquo;.</li>
</ul>
<p>All of that depends on what was never published: the invariant that exists in the head of whoever understands the problem, and not in the instruction stream.</p>
<p>I confess there was a moment when I thought the bill would close on the legacy side: finally a tool capable of dealing with the COBOL that haunts banks and governments to this day. After these months, I think that problem will take much longer than it seemed. There&rsquo;s no giant COBOL open source community. Almost all of that code is private, and truly private: banks, insurers, governments. There&rsquo;s no training material, or very little of it. The model doesn&rsquo;t know what to do with code it has never seen, and production COBOL is almost entirely code it has never seen.</p>
<p>To close the reasoning: <strong>LLMs can replicate what&rsquo;s open, but they can&rsquo;t guess what&rsquo;s private.</strong> And that brings back the hypothesis from the introduction. If these models are good at code, it&rsquo;s because decades of open source community fought to keep code free, public, and reusable, and providers trained on top of that heritage without paying a cent of licensing for it. The least the AI industry owes the world is to acknowledge that: its capability is, to a large extent, our generosity compiled.</p>
<p>The final irony: the programmer who survives is precisely the one who knows how to build oracles, define tests, hunt down obscure references, and recognize when the agent started spinning. In other words, the skill the machine needs most from you is the one it can least learn from its training. For now, that&rsquo;s not a threatened job. It&rsquo;s a different job.</p>
]]></content:encoded><category>llms</category><category>coding-agents</category><category>retrocomputing</category><category>software-engineering</category></item><item><title>LLM Benchmark v4: Genesys PI, a New Brazilian Contender!</title><link>https://akitaonrails.github.io/en/2026/09/23/llm-benchmark-v4-genesys-pi-new-brazilian-contender/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/09/23/llm-benchmark-v4-genesys-pi-new-brazilian-contender/</guid><pubDate>Wed, 23 Sep 2026 18:00:00 -0300</pubDate><description>&lt;p&gt;Some folks from &lt;a href="https://lua.vision/"target="_blank" rel="noopener"&gt;LUA Vision&lt;/a&gt;, the Brazilian company behind Genesys PI, reached out on LinkedIn offering test access to their model. That kind of thing usually doesn&amp;rsquo;t interest me, but this particular pitch, a Brazilian lab training a model from scratch instead of reselling a foreign model with a Portuguese layer on top, made me curious enough to run the test myself.&lt;/p&gt;
&lt;p&gt;Let me get the disclaimer out of the way first. Nobody paid me anything to write this. There is no business relationship between me and LUA Vision. Nothing written here was approved, reviewed or suggested by them before publishing. Every word is mine. The only courtesy I got was a free evaluation access key to run the test, and I explain what that means for the cost math further down.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Some folks from <a href="https://lua.vision/"target="_blank" rel="noopener">LUA Vision</a>, the Brazilian company behind Genesys PI, reached out on LinkedIn offering test access to their model. That kind of thing usually doesn&rsquo;t interest me, but this particular pitch, a Brazilian lab training a model from scratch instead of reselling a foreign model with a Portuguese layer on top, made me curious enough to run the test myself.</p>
<p>Let me get the disclaimer out of the way first. Nobody paid me anything to write this. There is no business relationship between me and LUA Vision. Nothing written here was approved, reviewed or suggested by them before publishing. Every word is mine. The only courtesy I got was a free evaluation access key to run the test, and I explain what that means for the cost math further down.</p>
<p>I published <a href="/en/2026/09/23/llm-benchmark-v4-opus-5-5-gpt-6-sol-luna-mimo-2-6-grok-4-7/">an update to my v4 benchmark&rsquo;s main table</a> earlier today, with five new models. This post is a direct addendum to that one: I ran Genesys PI on both tiers LUA Vision offers, House and Enterprise. With those two, the combined table reaches 46 models. Below I show only the stretch around the Brazilian models, which appear in <strong>bold</strong> at their actual positions.</p>
<h2>The updated table, with Genesys PI in it<span class="hx:absolute hx:-mt-20" id="the-updated-table-with-genesys-pi-in-it"></span>
    <a href="#the-updated-table-with-genesys-pi-in-it" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><table>
  <thead>
      <tr>
          <th style="text-align: right">Rank</th>
          <th>Model</th>
          <th style="text-align: center">Score</th>
          <th style="text-align: center">Tier</th>
          <th>Never-fixed</th>
          <th style="text-align: center">Cost</th>
          <th style="text-align: center">Wall</th>
          <th style="text-align: center">Harness</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: right">&hellip;</td>
          <td>&hellip;</td>
          <td style="text-align: center">&hellip;</td>
          <td style="text-align: center">&hellip;</td>
          <td>&hellip;</td>
          <td style="text-align: center">&hellip;</td>
          <td style="text-align: center">&hellip;</td>
          <td style="text-align: center">&hellip;</td>
      </tr>
      <tr>
          <td style="text-align: right">32</td>
          <td>GLM 5.3 Flash (zcode)</td>
          <td style="text-align: center">84.25</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">flat-rate plan</td>
          <td style="text-align: center">296m</td>
          <td style="text-align: center">zcode</td>
      </tr>
      <tr>
          <td style="text-align: right">33</td>
          <td>DeepSeek V4 Pro 0813</td>
          <td style="text-align: center">84.0</td>
          <td style="text-align: center">A</td>
          <td>items #8, #9 (4)</td>
          <td style="text-align: center">$4.49</td>
          <td style="text-align: center">152m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">34</td>
          <td>Step 3.7 Flash</td>
          <td style="text-align: center">83.75</td>
          <td style="text-align: center">A</td>
          <td>items #6, #8, #11 (6.5)</td>
          <td style="text-align: center">$4.15</td>
          <td style="text-align: center">118m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">35</td>
          <td>Grok 4.7</td>
          <td style="text-align: center">83.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$27.94</td>
          <td style="text-align: center">120m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">35</td>
          <td><strong>Genesys PI House (LUA Vision)</strong></td>
          <td style="text-align: center">83.5</td>
          <td style="text-align: center">A</td>
          <td>items #7b, #8 (3)</td>
          <td style="text-align: center">~$460 ᵉ</td>
          <td style="text-align: center">68m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">37</td>
          <td><strong>Genesys PI Enterprise (LUA Vision)</strong></td>
          <td style="text-align: center">82.5</td>
          <td style="text-align: center">B</td>
          <td>items #7a, #7b, #9 (4)</td>
          <td style="text-align: center">~$19 ᵉ</td>
          <td style="text-align: center">39m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">38</td>
          <td>DeepSeek V4 Pro (base) ᶜ</td>
          <td style="text-align: center">82.0</td>
          <td style="text-align: center">B</td>
          <td>—</td>
          <td style="text-align: center">$5.26</td>
          <td style="text-align: center">97m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">39</td>
          <td>Qwen 3.8 27B (Strix Halo, local)</td>
          <td style="text-align: center">80.0</td>
          <td style="text-align: center">B</td>
          <td>items #2, #7b, #8, #12 (8)</td>
          <td style="text-align: center"><strong>$0 local</strong></td>
          <td style="text-align: center">706m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">40</td>
          <td>Qwen 3.7 Max</td>
          <td style="text-align: center">79.0</td>
          <td style="text-align: center">B</td>
          <td>items #6, #7, #8 (6)</td>
          <td style="text-align: center">$10.63</td>
          <td style="text-align: center">106m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">41</td>
          <td>GLM 5.2 (zcode) ᶜ</td>
          <td style="text-align: center">77.0</td>
          <td style="text-align: center">B</td>
          <td>item #12 (2)</td>
          <td style="text-align: center">flat-rate plan</td>
          <td style="text-align: center">239m</td>
          <td style="text-align: center">zcode</td>
      </tr>
      <tr>
          <td style="text-align: right">&hellip;</td>
          <td>&hellip;</td>
          <td style="text-align: center">&hellip;</td>
          <td style="text-align: center">&hellip;</td>
          <td>&hellip;</td>
          <td style="text-align: center">&hellip;</td>
          <td style="text-align: center">&hellip;</td>
          <td style="text-align: center">&hellip;</td>
      </tr>
  </tbody>
</table>
<blockquote>
  <p>For the full table, with every other model, read <a href="/en/2026/09/23/llm-benchmark-v4-opus-5-5-gpt-6-sol-luna-mimo-2-6-grok-4-7/">my previous article</a>.</p>

</blockquote>
<p>Genesys PI House ties Grok 4.7 exactly at 83.5, Tier A. Enterprise lands one step below, at 82.5, Tier B. If you want the methodology recap, real CVE-based sabotage planted across seven sprints, never announced, with full marks only for catching it unprompted, it&rsquo;s all laid out in <a href="/en/2026/09/15/new-llm-benchmark-v4-retesting-all-top-llms-part-1/">Part 1</a> and in <a href="/en/2026/09/23/llm-benchmark-v4-opus-5-5-gpt-6-sol-luna-mimo-2-6-grok-4-7/">today&rsquo;s update</a>.</p>
<h2>Who LUA Vision is<span class="hx:absolute hx:-mt-20" id="who-lua-vision-is"></span>
    <a href="#who-lua-vision-is" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p><a href="https://lua.vision/empresa/"target="_blank" rel="noopener">LUA Vision Tecnologia Ltda.</a> is a São Paulo company, founded in late 2025 after three years of doctoral research (2022 to 2025) by Paulo Câmara, co-founder and CTO, an FGV graduate with a PhD from Tel Aviv University. His thesis, <em>&ldquo;From Neurodivergent Cognition to Natural Intelligence&rdquo;</em>, is the stated origin of the architecture that became Genesys PI. The other three co-founders are David Kang (CEO, strategy and partnerships), Plínio Ceccon (CFO) and Eronides Jr. (CRO, commercial and revenue).</p>
<p>The Genesys PI model family launched in April 2026. The company describes its own bet as deliberately risky: build a proprietary model trained for the reality of Brazil and other emerging markets, instead of reselling a foreign model with a Portuguese layer on top.</p>
<p>Their core argument is that a model trained abroad doesn&rsquo;t really understand the Brazilian legal structure, the CLT versus PJ distinction (salaried employee versus contractor), or the local tax and financial structure, and that this matters a lot in regulated sectors: healthcare, law, finance, education. The company currently runs about twenty pilot projects in those sectors, plus a consumer product line called <a href="https://8th.vision"target="_blank" rel="noopener">8th.vision</a>.</p>
<p>On the technical side, they call their architecture NCAS and talk about five training phases &ldquo;inspired by neural development&rdquo;, plus a self-monitoring module called PI-Probe that abstains from answering when the model doesn&rsquo;t have enough grounding to respond. <a href="https://lua.vision/pesquisa/"target="_blank" rel="noopener">They published two papers of their own on Zenodo</a>: <em><a href="https://doi.org/10.5281/zenodo.22899767"target="_blank" rel="noopener">&ldquo;The weight you didn&rsquo;t choose&rdquo;</a></em>, on the cost of tokenization across 31 languages, and <em><a href="https://doi.org/10.5281/zenodo.22881788"target="_blank" rel="noopener">&ldquo;Maximum capacity is not maximum efficiency&rdquo;</a></em>, which introduces their own metric called the Synaptic Efficiency Coefficient. Both DOIs exist and resolve, but some context matters: Zenodo is a preprint repository, not a peer-reviewed journal, so treat these as self-published research rather than outside validation.</p>
<p>LUA Vision also <a href="https://github.com/LiveBench/LiveBench/issues/370"target="_blank" rel="noopener">opened a public issue on the LiveBench repository</a> asking for their model to be added to the official leaderboard, with a self-reported score climbing from 87.6% (November 2024, a thousand questions, with coding as the weak spot at 34.4%) to 98.2% (January 2026, 682 questions). Worth noting: the issue was opened in March 2026, a month before Genesys PI&rsquo;s official launch, and its title uses the name &ldquo;Lua Genesys,&rdquo; not &ldquo;Genesys PI,&rdquo; so I treat it as the same NCAS engine under an earlier label, not a direct, dated confirmation of the product I tested. The issue is still open, and its only comment is LUA Vision&rsquo;s own CEO praising the company&rsquo;s own post, with no maintainer confirming or rejecting the number as of this writing. In other words, the LiveBench score in their marketing is self-reported, not a verified official ranking.</p>
<h2>How Genesys PI did against the frontier and the Chinese competition<span class="hx:absolute hx:-mt-20" id="how-genesys-pi-did-against-the-frontier-and-the-chinese-competition"></span>
    <a href="#how-genesys-pi-did-against-the-frontier-and-the-chinese-competition" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>For anyone who just wants to know where it sits on the scale: Genesys PI House ties Grok 4.7 exactly (83.5), in the middle of a very tight pack. It falls behind:</p>
<ul>
<li>the whole frontier that closed at 100 (Astra, Opus 5, Opus 5.5, GPT 5.6 sol/terra, GPT 5.5, Fable 5);</li>
<li>GPT 6 luna (95.5) and GPT 6 sol (91.0);</li>
<li>GLM 5.3 (94.0);</li>
<li>China&rsquo;s MiMo V2.6 Pro (92.0);</li>
<li>Claude Sonnet 5 (91.0);</li>
<li>both Gemini 3.8 Flash routes (89.5 and 90.5);</li>
<li>both Kimis, K2.7 (87.25) and K3 (85.0);</li>
<li>the pack right above it: Step 3.7 Flash (83.75), DeepSeek V4 Pro 0813 (84.0) and GLM 5.3 Flash (84.25);</li>
<li>and roughly twenty more models scattered across this score range, from Grok 4.6 (98.5) to Claude Sonnet 4.6 (85.75), including three Claude tiers (Opus 4.6, Opus 4.8, Sonnet 4.6). In total, House falls behind 34 of the table&rsquo;s 46 models.</li>
</ul>
<p>And it beats GLM 5.2 (77.0), the previous-generation Gemini 3.7 Flash, MiniMax M3, and the whole bottom of the table. Enterprise (82.5) lands one step below its own House sibling, in the same general range.</p>
<p>If the expectation that reached you is Claude-level, recalibrate before any purchasing decision. In this particular test, Genesys PI House sits in Grok 4.7 territory, well below the Claude flagships.</p>
<p>Claude Sonnet 5, the cheapest of the three Claude tiers I ran, already closes at 91.0, eight and a half points higher. Opus 5, Opus 5.5 and Fable 5 close at the absolute top, 100.0.</p>
<p>None of that takes away from a small Brazilian team reaching Grok&rsquo;s level, a lab that ranks among the best-funded in the world. It&rsquo;s just the right yardstick.</p>
<p>House&rsquo;s error profile is the classic &ldquo;detection follows disguise&rdquo;: it caught every obvious sabotage on its own, both critical items, the IDOR, the hardcoded key, the CORS, both gem CVEs. It even caught the item that survives longest in the whole test (#6) at the reveal, with a fix that went beyond what was asked, a unique database index. It just never fixed two silent items, the dropped index (#7b) and the wrong aggregate (#8), not even after being told.</p>
<p>Enterprise got to the same count of items caught unprompted (31 of 40) by a different route, catching less sabotage along the way and recovering a big block of eight items at once in the capstone. It ended with three items never fixed, including a deleted view (#9) it never restored because there was no test covering reports or users to flag the error.</p>
<p>One reliability note worth recording: Enterprise&rsquo;s first attempt got stuck in a stochastic loop, repeating the same grep command in 841 of 857 tool calls, confusing its own name &ldquo;LUA&rdquo; with the name of the RubyLLM gem, and had to be aborted at the 90-minute limit without a single commit. I ran it again and the second attempt converged cleanly in 7 minutes. I treat that as a one-off instability rather than a pattern, but it&rsquo;s the kind of thing anyone testing in production needs to watch.</p>
<h2>Price and cost: where the math gets tight<span class="hx:absolute hx:-mt-20" id="price-and-cost-where-the-math-gets-tight"></span>
    <a href="#price-and-cost-where-the-math-gets-tight" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Here&rsquo;s the second disclaimer I promised: LUA Vision gave me a free evaluation key for both tests, so I personally paid nothing. But the whole benchmark compares cost for whoever actually pays, so I recalculated the notional price a paying customer would face, using the price list their API exposed to anyone with an access key at the time (the <code>/v1/models</code> endpoint), converted from reais to dollars at the rate at the time (5.16 BRL/USD).</p>
<blockquote>
  <p><strong>Update (2026-09-24):</strong> after this went up, Eronides Jr., LUA Vision&rsquo;s co-founder and CRO, commented publicly on the numbers used in this post: &ldquo;Wow, we&rsquo;re happy about the tests and the feedback. About the numbers: what we put in the API were just examples. Our commercial model, in practice, will be by usage license, not by tokens, since the solution will run on the customers&rsquo; own infrastructure. In other words, token consumption doesn&rsquo;t change anything for us. On October 7th our pricing policy will be published along with the launch.&rdquo;</p>

</blockquote>
<p>In other words: the R$ 55/275 (House) and R$ 4/20 (Enterprise) per-million-token figures I used below were just placeholder examples in the test API, not the real market price. The actual commercial model will be a usage license running on the customer&rsquo;s own infrastructure, so token consumption doesn&rsquo;t factor into their billing. I&rsquo;m keeping the notional analysis below because it&rsquo;s what I could measure with the key I got, and it still illustrates the impact of running without prompt caching, but treat it as an exercise, not an official price list. The real pricing policy comes out on October 7, 2026, alongside the launch.</p>
<p>The per-million-token price of the two tiers, as it stood in the test API, was very different:</p>
<ul>
<li><strong>House</strong>: R$ 55 input / R$ 275 output per million tokens;</li>
<li><strong>Enterprise</strong>: R$ 4 input / R$ 20 output per million tokens, about 13.75 times cheaper than House per token.</li>
</ul>
<p>At those example figures, the House run&rsquo;s total cost would come to about $460 notional, steep for an 83.5 score. The reason goes beyond the per-token price: their API has no prompt caching, so every step resends the whole accumulated context at full input price, and in a seven-sprint benchmark that accumulates context the entire time, that adds up fast. Enterprise, with a much lower per-token price, would close at about $19 notional for the same sabotage, going toe to toe with cheap options like Grok 4.5 ($6.19) or Claude Sonnet 4.6 ($18.64), only with a lower score than both. Again: this is the exercise with the placeholder figures, not the real billing, which will be by license.</p>
<blockquote>
  <p><strong>Keep in mind:</strong> the per-token cost exercise above shows the effect of running without prompt caching, but don&rsquo;t use these numbers for a real budget. LUA Vision has already said the real pricing will be a usage license announced on October 7, 2026, not per token.</p>

</blockquote>
<h2>Where Genesys PI fits in the Brazilian market<span class="hx:absolute hx:-mt-20" id="where-genesys-pi-fits-in-the-brazilian-market"></span>
    <a href="#where-genesys-pi-fits-in-the-brazilian-market" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Putting it all together: Genesys PI isn&rsquo;t the most vigilant model in my test, nor the cheapest, nor the most reliable on the first try. But it isn&rsquo;t weak either. Tying Grok 4.7 and landing in the same score range as big names like Kimi K3, DeepSeek V4 Pro and GLM 5.3 Flash, with a model trained from scratch by a small team in São Paulo, on a fraction of the budget of an American or Chinese lab, is a genuine result.</p>
<blockquote>
  <p>I always figured training a frontier model from scratch in Brazil wouldn&rsquo;t be economically viable; that kind of budget seemed reserved for labs with a billion dollars lying around. LUA Vision proved me wrong, and I want to be the first to admit it. I&rsquo;d rather root for people who try and pull it off than hold on to an opinion the facts already knocked down.</p>

</blockquote>
<p>The real advantage for a Brazilian company choosing Genesys PI lies in what my benchmark doesn&rsquo;t measure:</p>
<ul>
<li>familiarity with the Brazilian legal and tax structure, CLT versus PJ included;</li>
<li>real Portuguese support, instead of machine translation on top of a foreign model;</li>
<li>data sovereignty, everything processed and trained inside Brazil, which matters to regulated sectors that care about where data travels and who has access to it.</li>
</ul>
<p>The downsides:</p>
<ul>
<li>final pricing is still unknown: the announced commercial model is a usage license, not per token, and only ships on October 7, 2026;</li>
<li>the still-inconsistent reliability I saw in Enterprise;</li>
<li>a self-reported LiveBench score that hasn&rsquo;t gone through any outside verification yet.</li>
</ul>
<p>For a Brazilian company choosing between a foreign and a domestic provider, Genesys PI is already a real option to evaluate, more than a LinkedIn pitch promise. It&rsquo;s not yet the model I&rsquo;d recommend with my eyes closed for heavy security vigilance, but I&rsquo;m genuinely glad to see a Brazilian model trained from scratch, instead of a wrapper around a foreign one, showing up in my ranking and actually competing with big frontier names. I hope they keep improving, because Brazil wins with more real players in this game.</p>
<h2>Final disclaimer<span class="hx:absolute hx:-mt-20" id="final-disclaimer"></span>
    <a href="#final-disclaimer" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Repeating it so there&rsquo;s no doubt: I have no stake in LUA Vision. I had no access to their financial data, or to anything other than the Genesys PI test key. So I can&rsquo;t vouch for anything beyond what I tested myself, which is what&rsquo;s in this post. For the business side of the company, you&rsquo;ll have to ask them directly.</p>
]]></content:encoded><category>llm-benchmarks</category><category>llms</category><category>coding-agents</category></item><item><title>LLM Benchmark v4: Opus 5.5, GPT Sol/Luna 6, Mimo 2.6, Grok 4.7</title><link>https://akitaonrails.github.io/en/2026/09/23/llm-benchmark-v4-opus-5-5-gpt-6-sol-luna-mimo-2-6-grok-4-7/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/09/23/llm-benchmark-v4-opus-5-5-gpt-6-sol-luna-mimo-2-6-grok-4-7/</guid><pubDate>Wed, 23 Sep 2026 13:00:00 -0300</pubDate><description>&lt;p&gt;This is the first update since the revamped v4 methodology went live, explained across two parts: &lt;a href="https://akitaonrails.github.io/en/2026/09/15/new-llm-benchmark-v4-retesting-all-top-llms-part-1/"&gt;Part 1&lt;/a&gt; covers the process and the fourteen sabotage items, &lt;a href="https://akitaonrails.github.io/en/2026/09/15/new-llm-benchmark-v4-retesting-39-llms-part-2/"&gt;Part 2&lt;/a&gt; has the full table for the original 39 models. Five new models shipped since then, and I checked each version against the repo before writing this: &lt;strong&gt;Claude Opus 5.5&lt;/strong&gt;, &lt;strong&gt;GPT 6 sol&lt;/strong&gt; and &lt;strong&gt;GPT 6 luna&lt;/strong&gt; (two separate models, not one), &lt;strong&gt;Xiaomi MiMo V2.6 Pro&lt;/strong&gt;, and &lt;strong&gt;Grok 4.7&lt;/strong&gt;. The names in the title match exactly what I ran.&lt;/p&gt;</description><content:encoded><![CDATA[<p>This is the first update since the revamped v4 methodology went live, explained across two parts: <a href="/en/2026/09/15/new-llm-benchmark-v4-retesting-all-top-llms-part-1/">Part 1</a> covers the process and the fourteen sabotage items, <a href="/en/2026/09/15/new-llm-benchmark-v4-retesting-39-llms-part-2/">Part 2</a> has the full table for the original 39 models. Five new models shipped since then, and I checked each version against the repo before writing this: <strong>Claude Opus 5.5</strong>, <strong>GPT 6 sol</strong> and <strong>GPT 6 luna</strong> (two separate models, not one), <strong>Xiaomi MiMo V2.6 Pro</strong>, and <strong>Grok 4.7</strong>. The names in the title match exactly what I ran.</p>
<h2>The Methodology, Super Quick Recap<span class="hx:absolute hx:-mt-20" id="the-methodology-super-quick-recap"></span>
    <a href="#the-methodology-super-quick-recap" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>For anyone who hasn&rsquo;t read the previous two parts: v4 isn&rsquo;t a loose battery of questions, it&rsquo;s a single Rails app that grows across seven sprints, with an isolated subagent planting fourteen real CVE-based sabotage items along the way, disguised as a normal commit from a fictional dev. The model is never told sabotage exists, only at the seventh and final sprint does the explicit reveal happen. Catching it unprompted is full credit, catching it only after the reveal is 40%, never fixing it is zero. This measures security vigilance under active sabotage, not general code quality. Full detail in Part 1.</p>
<h2>The Updated Table, 44 Models<span class="hx:absolute hx:-mt-20" id="the-updated-table-44-models"></span>
    <a href="#the-updated-table-44-models" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Same table as Part 2, now with 44 rows. The five models from this update are in <strong>bold</strong>, to distinguish them from ᴺ, which already marked additions from previous rounds.</p>
<table>
  <thead>
      <tr>
          <th style="text-align: right">Rank</th>
          <th>Model</th>
          <th style="text-align: center">Score</th>
          <th style="text-align: center">Tier</th>
          <th>Never-fixed</th>
          <th style="text-align: center">Cost</th>
          <th style="text-align: center">Wall</th>
          <th style="text-align: center">Harness</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: right">1</td>
          <td>GPT-6 Astra</td>
          <td style="text-align: center">100.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$30.55</td>
          <td style="text-align: center">100m</td>
          <td style="text-align: center">codex</td>
      </tr>
      <tr>
          <td style="text-align: right">1</td>
          <td>Claude Opus 5</td>
          <td style="text-align: center">100.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">~$71</td>
          <td style="text-align: center">145m</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">1</td>
          <td>Claude Fable 5</td>
          <td style="text-align: center">100.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">~$50 ᵉ</td>
          <td style="text-align: center">~85m ᵉ</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">1</td>
          <td><strong>Claude Opus 5.5</strong></td>
          <td style="text-align: center">100.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center"><strong>$16.63</strong></td>
          <td style="text-align: center">64m</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">1</td>
          <td>GPT 5.6 sol</td>
          <td style="text-align: center">100.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$20.37</td>
          <td style="text-align: center">317m</td>
          <td style="text-align: center">codex</td>
      </tr>
      <tr>
          <td style="text-align: right">1</td>
          <td>GPT 5.6 terra</td>
          <td style="text-align: center">100.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center"><strong>$9.52</strong></td>
          <td style="text-align: center">80m</td>
          <td style="text-align: center">codex</td>
      </tr>
      <tr>
          <td style="text-align: right">1</td>
          <td>GPT 5.5</td>
          <td style="text-align: center">100.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$34.69</td>
          <td style="text-align: center">117m</td>
          <td style="text-align: center">codex</td>
      </tr>
      <tr>
          <td style="text-align: right">8</td>
          <td>Grok 4.6 ᶜ</td>
          <td style="text-align: center">98.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$13.00</td>
          <td style="text-align: center">67m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">9</td>
          <td>Claude Fable 5.1</td>
          <td style="text-align: center">95.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">~$51</td>
          <td style="text-align: center">133m</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">9</td>
          <td>Sakana Fugu Ultra v2 ᴺ</td>
          <td style="text-align: center">95.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$122.01</td>
          <td style="text-align: center">294m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">9</td>
          <td><strong>GPT 6 luna</strong></td>
          <td style="text-align: center">95.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">~$0.84 ᵉ</td>
          <td style="text-align: center">122m</td>
          <td style="text-align: center">codex</td>
      </tr>
      <tr>
          <td style="text-align: right">12</td>
          <td>GPT 5.6 luna</td>
          <td style="text-align: center">95.0</td>
          <td style="text-align: center">A</td>
          <td>item #8 (2)</td>
          <td style="text-align: center">$10.04</td>
          <td style="text-align: center">123m</td>
          <td style="text-align: center">codex</td>
      </tr>
      <tr>
          <td style="text-align: right">13</td>
          <td>Nex N2.5 Pro ᴺ</td>
          <td style="text-align: center">94.0 *</td>
          <td style="text-align: center">A</td>
          <td>— (uncommitted)</td>
          <td style="text-align: center"><strong>$0 free</strong></td>
          <td style="text-align: center">480m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">13</td>
          <td>GLM 5.3 (zcode) ᴺ</td>
          <td style="text-align: center">94.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">flat-rate plan</td>
          <td style="text-align: center">215m</td>
          <td style="text-align: center">zcode</td>
      </tr>
      <tr>
          <td style="text-align: right">15</td>
          <td>DeepSeek V4.1 Flash ᴺ</td>
          <td style="text-align: center">92.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center"><strong>$1.21</strong></td>
          <td style="text-align: center">172m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">16</td>
          <td><strong>Xiaomi MiMo V2.6 Pro</strong></td>
          <td style="text-align: center">92.0</td>
          <td style="text-align: center">A</td>
          <td>item #12 (2)</td>
          <td style="text-align: center"><strong>$1.22</strong></td>
          <td style="text-align: center">308m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">17</td>
          <td>Claude Sonnet 5</td>
          <td style="text-align: center">91.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">~$27</td>
          <td style="text-align: center">112m</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">17</td>
          <td><strong>GPT 6 sol</strong></td>
          <td style="text-align: center">91.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">~$8.35 ᵉ</td>
          <td style="text-align: center">73m</td>
          <td style="text-align: center">codex</td>
      </tr>
      <tr>
          <td style="text-align: right">19</td>
          <td>Gemini 3.8 Flash·high (OpenRouter)</td>
          <td style="text-align: center">90.5</td>
          <td style="text-align: center">A</td>
          <td>item #12 (2)</td>
          <td style="text-align: center">$15.98</td>
          <td style="text-align: center">97m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">20</td>
          <td>Gemini 3.8 Flash (Antigravity) ᴺ</td>
          <td style="text-align: center">89.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$0 (OAuth)</td>
          <td style="text-align: center">120m</td>
          <td style="text-align: center">agy</td>
      </tr>
      <tr>
          <td style="text-align: right">21</td>
          <td>Muse Spark 1.3</td>
          <td style="text-align: center">88.75</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$13.31</td>
          <td style="text-align: center">150m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">22</td>
          <td>Grok 4.5</td>
          <td style="text-align: center">88.0</td>
          <td style="text-align: center">A</td>
          <td>items #7b, #12 (3)</td>
          <td style="text-align: center">$6.19</td>
          <td style="text-align: center">48m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">23</td>
          <td>Claude Opus 4.6</td>
          <td style="text-align: center">87.5</td>
          <td style="text-align: center">A</td>
          <td>item #8 (2)</td>
          <td style="text-align: center">$25.64</td>
          <td style="text-align: center">89m</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">24</td>
          <td>Kimi K2.7</td>
          <td style="text-align: center">87.25</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$7.75</td>
          <td style="text-align: center">175m</td>
          <td style="text-align: center">kimi</td>
      </tr>
      <tr>
          <td style="text-align: right">25</td>
          <td>MiMo V2.5 Pro</td>
          <td style="text-align: center">86.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center"><strong>$1.03</strong></td>
          <td style="text-align: center">158m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">25</td>
          <td>Qwen3 8 Flash ᴿ</td>
          <td style="text-align: center">86.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center"><strong>$1.17</strong></td>
          <td style="text-align: center">149m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">27</td>
          <td>DeepSeek V4 Flash</td>
          <td style="text-align: center">86.0</td>
          <td style="text-align: center">A</td>
          <td>items #6, #8 (5)</td>
          <td style="text-align: center"><strong>$0.97</strong></td>
          <td style="text-align: center">111m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">27</td>
          <td>Claude Opus 4.8 ᴿ</td>
          <td style="text-align: center">86.0</td>
          <td style="text-align: center">A</td>
          <td>item #8 (2)</td>
          <td style="text-align: center">~$37</td>
          <td style="text-align: center">87m</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">29</td>
          <td>Claude Sonnet 4.6</td>
          <td style="text-align: center">85.75</td>
          <td style="text-align: center">A</td>
          <td>item #6 (1.5)</td>
          <td style="text-align: center">$18.64</td>
          <td style="text-align: center">91m</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">30</td>
          <td>Kimi K3</td>
          <td style="text-align: center">85.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$13.79</td>
          <td style="text-align: center">148m</td>
          <td style="text-align: center">kimi</td>
      </tr>
      <tr>
          <td style="text-align: right">30</td>
          <td>DeepSeek V4 Flash 0731</td>
          <td style="text-align: center">85.0</td>
          <td style="text-align: center">A</td>
          <td>items #2, #6 (6)</td>
          <td style="text-align: center">$1.94</td>
          <td style="text-align: center">194m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">32</td>
          <td>GLM 5.3 Flash (zcode) ᴺ</td>
          <td style="text-align: center">84.25</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">flat-rate plan</td>
          <td style="text-align: center">296m</td>
          <td style="text-align: center">zcode</td>
      </tr>
      <tr>
          <td style="text-align: right">33</td>
          <td>DeepSeek V4 Pro 0813</td>
          <td style="text-align: center">84.0</td>
          <td style="text-align: center">A</td>
          <td>items #8, #9 (4)</td>
          <td style="text-align: center">$4.49</td>
          <td style="text-align: center">152m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">34</td>
          <td>Step 3.7 Flash</td>
          <td style="text-align: center">83.75</td>
          <td style="text-align: center">A</td>
          <td>items #6, #8, #11 (6.5)</td>
          <td style="text-align: center">$4.15</td>
          <td style="text-align: center">118m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">35</td>
          <td><strong>Grok 4.7</strong></td>
          <td style="text-align: center">83.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$27.94</td>
          <td style="text-align: center">120m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">36</td>
          <td>DeepSeek V4 Pro (base) ᶜ</td>
          <td style="text-align: center">82.0</td>
          <td style="text-align: center">B</td>
          <td>—</td>
          <td style="text-align: center">$5.26</td>
          <td style="text-align: center">97m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">37</td>
          <td>Qwen 3.8 27B (Strix Halo, local) ᴺ</td>
          <td style="text-align: center">80.0</td>
          <td style="text-align: center">B</td>
          <td>items #2, #7b, #8, #12 (8)</td>
          <td style="text-align: center"><strong>$0 local</strong></td>
          <td style="text-align: center">706m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">38</td>
          <td>Qwen 3.7 Max</td>
          <td style="text-align: center">79.0</td>
          <td style="text-align: center">B</td>
          <td>items #6, #7, #8 (6)</td>
          <td style="text-align: center">$10.63</td>
          <td style="text-align: center">106m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">39</td>
          <td>GLM 5.2 (zcode) ᴺ ᶜ</td>
          <td style="text-align: center">77.0</td>
          <td style="text-align: center">B</td>
          <td>item #12 (2)</td>
          <td style="text-align: center">flat-rate plan</td>
          <td style="text-align: center">239m</td>
          <td style="text-align: center">zcode</td>
      </tr>
      <tr>
          <td style="text-align: right">40</td>
          <td>Gemini 3.7 Flash·high</td>
          <td style="text-align: center">75.5</td>
          <td style="text-align: center">B</td>
          <td>item #12 (2)</td>
          <td style="text-align: center">$12.93</td>
          <td style="text-align: center">85m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">40</td>
          <td>MiniMax M3</td>
          <td style="text-align: center">75.5</td>
          <td style="text-align: center">B</td>
          <td>items #6, #8 (3.5)</td>
          <td style="text-align: center">$12.17</td>
          <td style="text-align: center">187m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">42</td>
          <td>Mistral Large 3</td>
          <td style="text-align: center">39.0</td>
          <td style="text-align: center">C</td>
          <td>7 items (19)</td>
          <td style="text-align: center">$5.11</td>
          <td style="text-align: center">76m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">43</td>
          <td>Gemini 3.1 Pro (OpenRouter) ᶜ</td>
          <td style="text-align: center">32.5 *</td>
          <td style="text-align: center">C</td>
          <td>9 items (27)</td>
          <td style="text-align: center">$10.31</td>
          <td style="text-align: center">54m</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">44</td>
          <td>GLM-4.7-Flash (local) ᴺ</td>
          <td style="text-align: center">24.0</td>
          <td style="text-align: center">C</td>
          <td>6 items (16)</td>
          <td style="text-align: center"><strong>$0 local</strong></td>
          <td style="text-align: center">29m</td>
          <td style="text-align: center">opencode</td>
      </tr>
  </tbody>
</table>
<p>Cost isn&rsquo;t comparable across different harnesses: codex/opencode/kimi charge real per-token API cost, Claude uses a Max subscription (notional cost), Antigravity is Google OAuth with no per-token cost, zcode is a flat-rate plan. Only compare cost within the same harness.</p>
<p><strong>Note on GPT 6 sol and luna&rsquo;s cost (ᵉ):</strong> both run on a ChatGPT subscription, not pay-per-token API, so the cost in the table is an estimate, OpenAI&rsquo;s published per-million-token price ($2 input / $10 output for sol, $0.10 / $0.50 for luna, luna comes out twenty times cheaper per token) applied to each sprint&rsquo;s real token count.</p>
<h2>This Round&rsquo;s Surprises<span class="hx:absolute hx:-mt-20" id="this-rounds-surprises"></span>
    <a href="#this-rounds-surprises" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><h3>Grok 4.7 Regressed, and Not Just on the Score<span class="hx:absolute hx:-mt-20" id="grok-47-regressed-and-not-just-on-the-score"></span>
    <a href="#grok-47-regressed-and-not-just-on-the-score" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Grok 4.7 closed at 83.5, fifteen points below its own Grok 4.6 (98.5), my overall runner-up. And no, it didn&rsquo;t make up for it on cost or speed either: $27.94 and 120 minutes against $13.00 and 67 minutes for 4.6. More expensive, slower, worse score. A regression on all three axes at once is rare in this benchmark.</p>
<p>The error profile is very specific: it caught every loud sabotage on its own, both critical items, the IDOR, the hardcoded key, the CORS. But it pushed all four disguised sabotages to the reveal, including the stored XSS that survived all the way to the capstone, and it was even fooled by a test adapted to accept the sabotage in item #6 along the way. Strong on the obvious, blind on the disguised.</p>
<p>Just one clean run, so I treat this as a data point, not a final verdict on the Grok 4.7 family. But the data I have today is: worse, more expensive, slower.</p>
<h3>Opus 5.5 Is the Opposite: Same Top Score, a Quarter of the Cost<span class="hx:absolute hx:-mt-20" id="opus-55-is-the-opposite-same-top-score-a-quarter-of-the-cost"></span>
    <a href="#opus-55-is-the-opposite-same-top-score-a-quarter-of-the-cost" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Opus 5.5 walked straight into the 100-point club, tying Astra, Opus 5, Fable 5, GPT 5.6 sol and terra, and GPT 5.5. It caught everything without needing any reveal at all, the seventh sprint didn&rsquo;t even run because there was nothing left to reveal. And it went beyond the minimum: it wrote its own regression tests for SQL injection and session revocation, and stacked a Content-Security-Policy and Permissions-Policy at the capstone, without anyone asking.</p>
<p>The number that actually matters: <strong>$16.63 and 64 minutes</strong> against <strong>~$71 and 145 minutes</strong> for Opus 5, to land on the exact same perfect score. A quarter of the cost, less than half the time, zero quality loss on this specific test.</p>
<h3>GPT 6 Sol Regresses on Vigilance, GPT 6 Luna Nails It<span class="hx:absolute hx:-mt-20" id="gpt-6-sol-regresses-on-vigilance-gpt-6-luna-nails-it"></span>
    <a href="#gpt-6-sol-regresses-on-vigilance-gpt-6-luna-nails-it" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>GPT 6 sol closed at 91.0, tied with Claude Sonnet 5, nine points below its own GPT 5.6 sol (100.0), but costing much less, ~$8.35 against $20.37, in less than a quarter of the time. A real regression on vigilance, a real gain on cost and speed.</p>
<p>GPT 6 luna is the standout of the pair. It scored 95.5, technically tying or slightly beating GPT 5.6 luna (95.0), and costing ~$0.84 against $10.04, roughly twelve times less. It caught nearly everything on its own, only letting the stored XSS slip to the reveal, including the most disguised item in the whole test with a fix that went beyond what was asked, a unique index at the database level. Equal-or-better score, cost collapsing: the same class of result Opus 5.5 delivered.</p>
<p>Sol&rsquo;s error pattern is the same as Grok 4.7&rsquo;s: it catches the obvious on its own, pushes the disguised to the reveal. Luna, again, is clearly the more vigilant of the two siblings, and now also the far cheaper one by a wide margin.</p>
<h3>MiMo V2.6 Pro: The Generational Leap That Holds Up<span class="hx:absolute hx:-mt-20" id="mimo-v26-pro-the-generational-leap-that-holds-up"></span>
    <a href="#mimo-v26-pro-the-generational-leap-that-holds-up" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>From Xiaomi, the V2.6 Pro jumped from 86.5 to 92.0 over its own predecessor, the V2.5 Pro, for just <strong>$1.22</strong>. It caught nearly everything on its own, including the most disguised item in the whole test, just one sprint late, and it even wrote its own guard tests for SQL injection and N+1. The only item never fixed, even after being told, was the overly permissive CORS (#12), the same trap that already took down Grok 4.5, Gemini 3.7 Flash, and GLM 5.2 back in Part 2. A frontier model can still leave <code>origins &quot;*&quot;</code> as the default and never go back to fix it.</p>
<h2>What the External Benchmarks Say, and Where They Disagree With Me<span class="hx:absolute hx:-mt-20" id="what-the-external-benchmarks-say-and-where-they-disagree-with-me"></span>
    <a href="#what-the-external-benchmarks-say-and-where-they-disagree-with-me" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I went looking for whoever else tested these five models, because no single benchmark, mine included, is the final word. Here&rsquo;s what I found, and where the reading matches or doesn&rsquo;t match mine.</p>
<ul>
<li><strong>Grok 4.7</strong>: <a href="https://artificialanalysis.ai/articles/benchmarking-grok-4-7"target="_blank" rel="noopener">Artificial Analysis</a> measures its Coding Agent Index rising from 47 to 56, improving on all three components it tests, but notes the model spends more than double the output tokens to get there. In other words, on a general coding-capability benchmark, 4.7 improves. On my test of vigilance under disguised sabotage, it gets worse. Both things can be true at once, because they measure different axes: capability to solve a task versus discipline to audit your own code without being told to.</li>
<li><strong>Claude Opus 5.5</strong>: <a href="https://venturebeat.com/technology/anthropic-releases-claude-opus-5-5-beating-fable-5-1-on-key-agentic-benchmarks-at-60-cheaper-api-price"target="_blank" rel="noopener">VentureBeat&rsquo;s</a> and <a href="https://www.coderabbit.ai/blog/opus-5-5-model-review"target="_blank" rel="noopener">CodeRabbit&rsquo;s</a> coverage matches what I found on this specific point: fewer tokens spent to finish the same task. And <a href="https://artificialanalysis.ai/articles/claude-opus-5-5"target="_blank" rel="noopener">Artificial Analysis</a> itself confirms the rest, the model took the top spot on its intelligence index, five points ahead of GPT-6 Astra and Fable 5.1. Here the outside reading confirms mine.</li>
<li><strong>GPT 6 sol and luna</strong>: coverage from <a href="https://www.vellum.ai/blog/gpt-6-sol-and-luna-benchmarks-explained"target="_blank" rel="noopener">Vellum</a> and <a href="https://kingy.ai/blog/gpt-6-sol-luna-specs-benchmarks-pricing-comparison/"target="_blank" rel="noopener">Kingy AI</a> paints a favorable picture of general capability, sol near Fable 5&rsquo;s top score for a fraction of the cost, luna in Opus 5&rsquo;s range. On my specific vigilance-under-sabotage test, the picture is lukewarmer, sol regresses against its own predecessor. Again, different axes, general capability isn&rsquo;t the same thing as security vigilance under disguised attack.</li>
<li><strong>Xiaomi MiMo V2.6 Pro</strong>: <a href="https://venturebeat.com/technology/better-than-deepseek-xiaomis-mimo-v2-6-pro-debuts-as-the-top-open-weights-model-in-the-world-alongside-cheaper-v2-6-flash"target="_blank" rel="noopener">VentureBeat</a> documents the same generational leap I saw, from 19 to 71.9 on DeepSWE, from 16 to 53.1 on AutomationBench. Here the direction matches: a real improvement for an open model, not just on vigilance.</li>
</ul>
<blockquote>
  <p><strong>Keep this:</strong> my score only holds for my specific methodology, security vigilance inside a Rails app growing under silent sabotage. A general-capability benchmark measures something else, and the two can disagree without either one being wrong. An isolated ranking is never a final verdict on any model, <a href="/en/2026/09/15/new-llm-benchmark-v4-retesting-39-llms-part-2/#why-didnt-my-favorite-model-score-higher">I already explained this more calmly in Part 2</a>.</p>

</blockquote>
<h2>Is It Worth Upgrading to the New Version?<span class="hx:absolute hx:-mt-20" id="is-it-worth-upgrading-to-the-new-version"></span>
    <a href="#is-it-worth-upgrading-to-the-new-version" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A higher score on a benchmark, mine or anyone else&rsquo;s, isn&rsquo;t automatically synonymous with &ldquo;switch now.&rdquo; Here&rsquo;s my direct answer, model by model, weighing quality against cost, not just the isolated number.</p>
<ul>
<li><strong>Do you use Grok 4.6 today?</strong> Don&rsquo;t move to 4.7 for security. It&rsquo;s worse, more expensive, and slower on all three axes I measure. Only worth it if some other capability outside my test justifies it, and even then I&rsquo;d wait for more than one independent run confirming it before switching production.</li>
<li><strong>Do you use GPT 5.6 sol?</strong> Moving to GPT 6 sol costs a lot less, but loses nine points of vigilance. Worth the trade if cost matters more than security for your case, not worth it if you depend on that higher vigilance specifically.</li>
<li><strong>Do you use GPT 5.6 luna?</strong> Move to GPT 6 luna without a second thought: equal-or-better score for a small fraction of the previous cost. Along with Opus 5.5, this is the other rare case of a clean win on every axis.</li>
<li><strong>Do you use Opus 5?</strong> This is another case where the answer is yes without reservation: Opus 5.5 delivers the same perfect score for a quarter of the cost and half the time. A gain on every axis I measure, at the same time.</li>
<li><strong>Do you use MiMo V2.5 Pro?</strong> Worth moving up to V2.6 Pro, the quality jump is real and the cost stays in the one-dollar range. Just don&rsquo;t forget to review CORS by hand, because this specific model still gets it wrong even after being told.</li>
</ul>
<p>The usual rule still holds: test within your own workflow before switching production models just because a benchmark, mine included, moved a number up or down.</p>
<h2>Closing With an Irony I Didn&rsquo;t Manufacture<span class="hx:absolute hx:-mt-20" id="closing-with-an-irony-i-didnt-manufacture"></span>
    <a href="#closing-with-an-irony-i-didnt-manufacture" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>It&rsquo;s been eleven days since Dario Amodei published his essay calling to <a href="https://darioamodei.com/post/we-must-pace-the-frontier"target="_blank" rel="noopener">&ldquo;pace the frontier,&rdquo;</a> and Sam Altman and Elon Musk rushed to publicly agree the same week, as I&rsquo;ve already <a href="/en/2026/09/09/propagandas-enganosas-da-openai-anthropic-nvidia/">documented in detail</a>. And what happened since? Exactly those three, Anthropic, OpenAI, and xAI, shipped Opus 5.5, GPT 6 sol and luna, and Grok 4.7, three different labs, all in under three days, between September 21 and 23.</p>
<p>I didn&rsquo;t write this coincidence, I just noticed it. It&rsquo;s exactly the same synchronized pattern I&rsquo;d already pointed out: the public talk is &ldquo;let&rsquo;s slow down together,&rdquo; the release calendar keeps moving together too.</p>
<p>There&rsquo;s another angle to this irony worth noting, and it turned out messier than it first looked. Within that same accelerated batch, the result isn&rsquo;t even consistent within the same company: xAI&rsquo;s Grok 4.7 regressed badly, and OpenAI&rsquo;s own GPT 6 sol also regressed on vigilance.</p>
<p>Sol&rsquo;s sibling, GPT 6 luna, came out as a clean win, equal-or-better score for a fraction of the cost, the same class of result Anthropic delivered with Opus 5.5. Speeding up the release didn&rsquo;t turn into a synonym for shipping worse across the board. It turned into a lottery, to the point where a single company shipped one worse model and one better model in the same week.</p>
<p>And while the American trio was signing the slow-down pact and delivering mixed results while doing it, Xiaomi, Chinese, without signing any pact, without making any speech about &ldquo;pacing the frontier,&rdquo; simply dropped MiMo V2.6 Pro with a real quality leap over its own predecessor. Nobody on the Chinese side promised to slow down. And, at least in this sample, nobody on the Chinese side did.</p>
]]></content:encoded><category>llm-benchmarks</category><category>llms</category><category>coding-agents</category></item><item><title>Talking a Bit About My AI Skills</title><link>https://akitaonrails.github.io/en/2026/09/17/talking-about-my-ai-skills/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/09/17/talking-about-my-ai-skills/</guid><pubDate>Thu, 17 Sep 2026 16:00:00 -0300</pubDate><description>&lt;p&gt;Lately several readers have asked me about the &amp;ldquo;skills&amp;rdquo; I mention when I talk about my workflow with AI agents. This article explains what they are, how I use them, and what my actual recommendation is.&lt;/p&gt;
&lt;p&gt;And the recommendation comes right up front, because it&amp;rsquo;s the reason this article exists: &lt;strong&gt;don&amp;rsquo;t use other people&amp;rsquo;s skills.&lt;/strong&gt; Read that again. My skills are published on &lt;a href="https://github.com/akitaonrails/my-skills"target="_blank" rel="noopener"&gt;my my-skills repository&lt;/a&gt; and the repo description warns you: &lt;em&gt;&amp;ldquo;not tailored for general usage&amp;rdquo;&lt;/em&gt;. They&amp;rsquo;re there so you can read the reasoning, understand the structure, and go build your own. Copying somebody&amp;rsquo;s skill and running it blind is the digital equivalent of signing a contract without reading it. Worse: it&amp;rsquo;s installing someone else&amp;rsquo;s instructions to run with your permissions, on your repositories, with your tokens. That&amp;rsquo;s prompt injection you install voluntarily and say thank you for.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Lately several readers have asked me about the &ldquo;skills&rdquo; I mention when I talk about my workflow with AI agents. This article explains what they are, how I use them, and what my actual recommendation is.</p>
<p>And the recommendation comes right up front, because it&rsquo;s the reason this article exists: <strong>don&rsquo;t use other people&rsquo;s skills.</strong> Read that again. My skills are published on <a href="https://github.com/akitaonrails/my-skills"target="_blank" rel="noopener">my my-skills repository</a> and the repo description warns you: <em>&ldquo;not tailored for general usage&rdquo;</em>. They&rsquo;re there so you can read the reasoning, understand the structure, and go build your own. Copying somebody&rsquo;s skill and running it blind is the digital equivalent of signing a contract without reading it. Worse: it&rsquo;s installing someone else&rsquo;s instructions to run with your permissions, on your repositories, with your tokens. That&rsquo;s prompt injection you install voluntarily and say thank you for.</p>
<h2>What a skill really is<span class="hx:absolute hx:-mt-20" id="what-a-skill-really-is"></span>
    <a href="#what-a-skill-really-is" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>No magic involved. A skill is a directory with a <code>SKILL.md</code> inside: a header with name and description, and a body of text that is, essentially, a well-written prompt about how to execute a task. Sometimes it ships with a <code>scripts/</code> folder of helper scripts, so the LLM doesn&rsquo;t have to recreate them from scratch every time.</p>
<blockquote>
  <p>Skills are just prompts.</p>

</blockquote>
<p>That&rsquo;s it. A prompt you versioned, refined, and kept one command away. The only difference between a skill and that giant prompt you paste into the chat every day is that the skill lives in a file, with a name, and the agent knows it exists.</p>
<p>And here&rsquo;s the answer to the question everybody asks: &ldquo;doesn&rsquo;t that fill the context with junk?&rdquo; The good news is the harnesses do this right. Claude Code uses what Anthropic calls <a href="https://code.claude.com/docs/en/skills"target="_blank" rel="noopener">progressive disclosure</a>: at session start, only each skill&rsquo;s name and description go into the system prompt. The <code>SKILL.md</code> body only loads when the agent decides to invoke the skill. <a href="https://opencode.ai/docs/skills/"target="_blank" rel="noopener">OpenCode does the same</a>: lists name and description, loads content on demand through its own tool. Anthropic itself <a href="https://www.anthropic.com/engineering/equipping-agents-for-the-real-world-with-agent-skills"target="_blank" rel="noopener">documents the design</a>: metadata first, body only when needed.</p>
<p>That solves the text cost, but only half the problem. Every installed skill still takes a line in the listing, and more importantly: it competes for the agent&rsquo;s attention when it decides which tool to use. Anthropic again, <a href="https://www.anthropic.com/engineering/writing-tools-for-agents"target="_blank" rel="noopener">on the engineering blog</a>: <em>&ldquo;more tools don&rsquo;t always lead to better outcomes&rdquo;</em>, and their official recommendation is a few well-designed tools for high-impact workflows. My version of that rule is more acidic:</p>
<blockquote>
  <p>An idle skill is debt.</p>

</blockquote>
<p>You change your process, the skill ages, and one day the agent executes a rule that no longer makes sense in your workflow. Fewer skills, better written, reviewed often.</p>
<h2>The only third-party skill that survived here<span class="hx:absolute hx:-mt-20" id="the-only-third-party-skill-that-survived-here"></span>
    <a href="#the-only-third-party-skill-that-survived-here" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Having said all that, it would be hypocritical to pretend I live on homemade skills alone. One survived my scrutiny and runs on every post on this blog: <a href="https://github.com/akitaonrails/my-skills/tree/master/humanizer"target="_blank" rel="noopener">Humanizer</a>.</p>
<p>It exists because the Wikipedia community maintains a public, brutally honest catalog called <a href="https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing"target="_blank" rel="noopener">Signs of AI writing</a>, kept by WikiProject AI Cleanup, documenting the &ldquo;tells&rdquo; of AI-generated text one by one: the rule of three, the &ldquo;not just X, but also Y&rdquo;, the puffery, the emoji-decorated bullet. Humanizer turns that catalog into a procedure: the agent receives the text, marks the tells from strongest to weakest, rewrites preserving every supported claim (losing a fact is an error, inventing a fact is an error), and does a final read-aloud check. Without changing what was said, only how it was said.</p>
<p>If you produce content, you know why I insist: text that smells like AI is becoming the new &ldquo;Dear Sir&rdquo;, the mark of a rushed form letter. I run Humanizer on every article before publishing, including <a href="https://akitaonrails.com/en/2026/08/16/anthropic-ai-watermark-how-to-beat-it/"target="_blank" rel="noopener">this one</a>. But note the detail: I merged version 3.0.0 into my repo, with my own adjustments. I read the source material before trusting it. That&rsquo;s the pattern.</p>
<h2>What I do with this every day<span class="hx:absolute hx:-mt-20" id="what-i-do-with-this-every-day"></span>
    <a href="#what-i-do-with-this-every-day" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Now the practical part. I maintain and monitor over 40 repositories on GitHub. My own projects, forks I maintain, tools that became daily dependencies. To stay sane, my second monitor runs <a href="https://github.com/akitaonrails/clock-tui"target="_blank" rel="noopener">tclock</a> (my fork of <a href="https://github.com/race604/clock-tui"target="_blank" rel="noopener">clock-tui</a>, with Evangelion themes, because why not) and next to it <a href="https://github.com/akitaonrails/ghpending"target="_blank" rel="noopener">ghpending</a>, a Rust CLI that lists open issues and PRs from all my repos at once.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260917161027_screenshot-2026-09-17_16-10-27.png" alt="My second monitor with tclock and ghpending listing the repositories with open PRs and issues"  loading="lazy" /></p>
<p>In the photo you can see: <a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a> and <a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">ai-usagebar</a> with open PRs and issues. Every morning I open the harness on each project with <code>ai-memory run</code> in its directory. ai-memory deserves a paragraph: it&rsquo;s my long-term memory project for agents, a persistent Markdown wiki that captures session observations, consolidates decisions and gotchas into pages, keeps workstreams across sessions and handoffs between agents. Every project of mine has its own memory, with the architectural decisions and the traps only that codebase has. Without it, every agent session starts from zero like an intern with amnesia.</p>
<p>From there the daily ritual is almost childishly simple. I write, literally:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">run pr-audit and iss-audit, then run github-resolution</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>When a release is ripe, I add <code>then run the release skill</code>. On days when the only queue is Dependabot&rsquo;s automatic bumps, it&rsquo;s <code>run pr-bump and release</code> and done. One line of instruction from me. The heavy lifting lives in the skills. Let&rsquo;s get to them.</p>
<h3>pr-audit<span class="hx:absolute hx:-mt-20" id="pr-audit"></span>
    <a href="#pr-audit" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>PR audit before merge, and the central principle is: <strong>evidence over narrative</strong>. Nothing the contributor wrote is treated as truth; everything is a claim to verify, with a claims ledger (confirmed, partial, unsupported). The rest of the skill is a hostile checklist:</p>
<ul>
<li><strong>Change gate</strong>: hunk inventory looking for executable bits, symlinks, bidirectional characters, homoglyphs, <code>pull_request_target</code> workflows, unpinned actions, typosquat dependencies, lockfile drift.</li>
<li><strong>Credentials</strong>: unexplained credential access is an instant blocker. Execution happens in an isolated worktree, with no host credentials.</li>
<li><strong>Semver</strong>: the changelog category is a version gate; breaking changes go in major, never in patch. A rule that has saved me more than once.</li>
<li><strong>Prompt injection</strong>: text inside a PR trying to &ldquo;change the audit rules&rdquo; is just one more suspicious data point to investigate. It&rsquo;s an audit finding, obviously.</li>
</ul>
<h3>iss-audit<span class="hx:absolute hx:-mt-20" id="iss-audit"></span>
    <a href="#iss-audit" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The same distrust, applied to issues:</p>
<ul>
<li>Never run a command copied from an issue. Attachments only go through an isolated scanner.</li>
<li>Formal separation between what was observed, what was expected, the reporter&rsquo;s diagnosis, and the proposed fix.</li>
<li>Reproduction with synthetic data in a disposable sandbox, with resource limits for DoS claims.</li>
</ul>
<p>And two golden rules I love: <em>&ldquo;a number that moves is not a pinned number&rdquo;</em> (async lag looks like a bug) and <em>&ldquo;the obvious owner may be innocent&rdquo;</em> (query the suspect population; if it comes back empty, the cause is elsewhere).</p>
<h3>github-resolution<span class="hx:absolute hx:-mt-20" id="github-resolution"></span>
    <a href="#github-resolution" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The execution phase: turning what the audit approved into merged code. The rules:</p>
<ul>
<li>Only execute approved tickets, one at a time, with a regression test written before the fix. <em>&ldquo;Slop is a defect&rdquo;</em>: no speculative abstraction, no TODOs, no drive-by refactors, no weakened tests.</li>
<li>If I resolved more than three tickets in a session, run the post-audit over the whole range before pushing, no exceptions.</li>
<li>A ticket closes when the fix is merged with green CI on that exact SHA, never left hanging waiting for a release.</li>
<li>Every unresolved issue gets logged with the reason. Compressing it into a number is forbidden.</li>
</ul>
<h3>pr-bump<span class="hx:absolute hx:-mt-20" id="pr-bump"></span>
    <a href="#pr-bump" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The fast path for Dependabot&rsquo;s dependency bumps. The rule that saves me the most time: <strong>batch, never serialize</strong>. Instead of merging PR by PR, one consolidated <code>bundle update</code> to the latest compatible versions, a single CI pass for the whole set, fix forward on whatever breaks.</p>
<p>But there&rsquo;s a <strong>supply-chain floor</strong>:</p>
<ul>
<li>Every dependency must resolve on the public registry (rubygems, npm, pypi) with the expected name, version, and checksum.</li>
<li>Git source, path source, typosquat-adjacent name, new install hook: full stop, it goes to a complete audit.</li>
</ul>
<p><code>bundler-audit</code> will happily pass a well-formed trojanized gem. That&rsquo;s exactly the case the floor covers.</p>
<h3>release<span class="hx:absolute hx:-mt-20" id="release"></span>
    <a href="#release" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Cut a version only when I ask. The iron rules:</p>
<ul>
<li>The version comes from the changelog classification: fixes go in patch, additive changes in minor, breaking in major. A number that conflicts with the classification forces me to confirm; silent bumps are forbidden.</li>
<li>Green CI gate on the tag&rsquo;s exact SHA. Never tag with pending or skipped CI.</li>
<li>Annotated tag, updated changelog.</li>
<li>Never rewrite a published tag. Never cut a release nobody asked for.</li>
</ul>
<h2>The numbers, because numbers don&rsquo;t argue<span class="hx:absolute hx:-mt-20" id="the-numbers-because-numbers-dont-argue"></span>
    <a href="#the-numbers-because-numbers-dont-argue" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Counting right now, on the day I write this article, across just three projects (<a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a>, <a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">ai-usagebar</a> and <a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener">ai-jail</a>):</p>
<ul>
<li>ai-memory: 430 merged PRs, 260 closed issues</li>
<li>ai-usagebar: 137 merged PRs, 34 closed issues</li>
<li>ai-jail: 42 merged PRs, 81 closed issues</li>
</ul>
<p>Total: <strong>609 merged PRs and 375 closed issues</strong>, over a thousand items. Nearly all of that was handled by these skills, with me supervising and deciding. One person, no team, keeping three active projects at this volume. That&rsquo;s the multiplier.</p>
<h2>And they weren&rsquo;t born ready<span class="hx:absolute hx:-mt-20" id="and-they-werent-born-ready"></span>
    <a href="#and-they-werent-born-ready" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Open the <a href="https://github.com/akitaonrails/my-skills/commits/master"target="_blank" rel="noopener">my-skills commit history</a> and you see skills being polished the hard way. July starts the repo with the basic audits. Late July: <em>&ldquo;harden audit skills and add security audit&rdquo;</em>. August: <em>&ldquo;consolidate agent skills from all harnesses into this repo&rdquo;</em> and, days later, github-resolution is born as the execution phase of the audits. September: <em>&ldquo;fold in release-discipline and audit lessons&rdquo;</em>.</p>
<p>And just yesterday, look at the level of fine-tuning in pr-bump: <em>&ldquo;batch all bump PRs into one consolidated verification pass, fix forward on failures&rdquo;</em> and <em>&ldquo;require deferred/declined PRs be left in a clean state&rdquo;</em>. Two rules that became skill text. Neither came from a blog post or somebody&rsquo;s opinion: they came from me face-planting into the exact error the rule now prevents.</p>
<blockquote>
  <p>Every line in these skills is a scar.</p>

</blockquote>
<p>That&rsquo;s how you write a good prompt: watch the result, decide to adjust, adjust again.</p>
<h2>Skills are little. Knowledge is a lot.<span class="hx:absolute hx:-mt-20" id="skills-are-little-knowledge-is-a-lot"></span>
    <a href="#skills-are-little-knowledge-is-a-lot" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Now the counterpoint, because I don&rsquo;t want you leaving here thinking skills are the answer to everything. I depend on them very little. What actually carries my workflow is something else.</p>
<p>Every project of mine has its own <code>AGENTS.md</code>, instructions specific to that code, and its ai-memory memory with decisions and gotchas. And the pattern I use most day to day isn&rsquo;t even a skill: it&rsquo;s pointing at a living example. When I wanted automated AUR packaging for clock-tui, I didn&rsquo;t write a &ldquo;how to make an AUR package&rdquo; skill. I opened the harness and said:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">make a similar github action to build and publish AUR packages
</span></span><span class="line"><span class="cl">as we did in ~/Projects/ai-memory</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>The agent went there, read the workflow that works, and reproduced the pattern in the new project. A skill for that would be worse: AUR changes, GitHub Actions changes, the example gets stale. A living example in a repo I maintain is always up to date by definition, because when it breaks, I fix it.</p>
<blockquote>
  <p>Every project becomes its own knowledge base.</p>

</blockquote>
<p>And this generalizes, because harnesses can consume any text base. My entire Linux PC is documented and reinstallable from a config repo of mine, and my homeserver is fully described in runbooks. Those two are not on GitHub: they live on a private Gitea server I maintain, because that&rsquo;s the kind of thing I don&rsquo;t want leaking in public. When I want to change something at home, I say:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">add integration to my Plex server as documented in my homelab runbooks</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>That&rsquo;s not a skill. It&rsquo;s organized, versioned, searchable knowledge. Skills are for <em>procedures</em> that repeat the same way. Knowledge is for everything else.</p>
<h2>The recommendation worth more than any skill<span class="hx:absolute hx:-mt-20" id="the-recommendation-worth-more-than-any-skill"></span>
    <a href="#the-recommendation-worth-more-than-any-skill" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If you take a single practice from this article, take this one: <strong>have your agent write down everything that didn&rsquo;t become code.</strong> The research it did, the decision you made and why, the comparison with the rejected alternative. Without that, the knowledge evaporates at the end of the session.</p>
<p>My ai-memory, for instance, has <a href="https://github.com/akitaonrails/ai-memory/tree/main/docs"target="_blank" rel="noopener">a docs folder</a> with competitor research I commissioned before every big decision:</p>
<ul>
<li><a href="https://github.com/akitaonrails/ai-memory/blob/main/docs/research-karpathy-llm-wiki.md"target="_blank" rel="noopener">The Karpathy wiki pattern</a>, the project&rsquo;s intellectual origin.</li>
<li><a href="https://github.com/akitaonrails/ai-memory/blob/main/docs/research-2026-landscape.md"target="_blank" rel="noopener">A 2026 landscape survey</a>, covering Zep/Graphiti, Letta, Mem0, and Google&rsquo;s Open Knowledge Format.</li>
<li>Deep dives on each competitor: <a href="https://github.com/akitaonrails/ai-memory/blob/main/docs/research-hindsight.md"target="_blank" rel="noopener">Hindsight</a> (the one with a paper and funding, which ended up validating my design bets), <a href="https://github.com/akitaonrails/ai-memory/blob/main/docs/research-cognee.md"target="_blank" rel="noopener">cognee</a> (pretty graph pipeline, ugly gateway bug), <a href="https://github.com/akitaonrails/ai-memory/blob/main/docs/research-agentmemory.md"target="_blank" rel="noopener">agentmemory</a> (I kept the ideas, threw out the substrate), <a href="https://github.com/akitaonrails/ai-memory/blob/main/docs/research-basic-memory.md"target="_blank" rel="noopener">basic-memory</a>.</li>
<li>And my favorite, the <a href="https://github.com/akitaonrails/ai-memory/blob/main/docs/issues-mempalace.md"target="_blank" rel="noopener">MemPalace</a> autopsy: 47k stars, viral, and a tracker clogged with index corruption and lost data. The fairy tale in reverse that confirmed for me why compiling memory beats stockpiling verbatim.</li>
</ul>
<p>Dozens of documents like that. Every hour of research an agent did for me became a permanent asset, reusable in any new project. The more you produce and document, the more intelligence you accumulate.</p>
<blockquote>
  <p>It&rsquo;s compound interest for knowledge.</p>

</blockquote>
<h2>Nobody knows what you need<span class="hx:absolute hx:-mt-20" id="nobody-knows-what-you-need"></span>
    <a href="#nobody-knows-what-you-need" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>And there the circle closes, back to where we started: why I don&rsquo;t recommend copying anybody&rsquo;s skills, mine included.</p>
<p>Because my PR audit skill is molded around <em>my</em> projects, <em>my</em> languages, <em>my</em> risks, <em>my</em> level of supply-chain paranoia. It reflects what I, Fabio, maintaining the repositories I maintain, on the infra I have, with the goals I have, needed to write into it. Your project has another stack, other risks, another tolerance level. You may need checks I don&rsquo;t, and vice versa. Experience is only relevant to whoever lived through its constraints. That changes from person to person, and that&rsquo;s exactly why a third-party skill used blind is a gamble.</p>
<p>That&rsquo;s the thesis of my 2019 video, <a href="/2019/10/09/akitando-63-nao-terceirize-suas-decisoes-a-licao-mais-importante-da-sua-vida/">Don&rsquo;t Outsource Your Decisions: the most important lesson of your life</a> (in Portuguese): nobody but you knows what you need.</p>


<div class="embed-container">
  <iframe
    src="https://www.youtube.com/embed/D3L8IOncLkg"
    title="YouTube video player"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
    referrerpolicy="strict-origin-when-cross-origin"
    allowfullscreen>
  </iframe>
</div>

<p>I don&rsquo;t ask anybody. I research, I build mine, and the skills are the versioned record of my decisions. The beauty of LLMs is they speed this process up tenfold: the research that took a week now takes an afternoon, and the cost of building your own tool fell through the floor.</p>
<p>A good skill is your own. Mine are on <a href="https://github.com/akitaonrails/my-skills"target="_blank" rel="noopener">my-skills</a> so you can read the reasoning. Then close the tab and write yours. I don&rsquo;t waste time asking for other people&rsquo;s opinions. Neither should you.</p>
]]></content:encoded><category>coding-agents</category><category>automation</category><category>llms</category></item><item><title>Why Things Like TypeSafe AI Don't Interest Me</title><link>https://akitaonrails.github.io/en/2026/09/16/why-things-like-typesafe-ai-dont-interest-me/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/09/16/why-things-like-typesafe-ai-dont-interest-me/</guid><pubDate>Wed, 16 Sep 2026 13:00:00 -0300</pubDate><description>&lt;p&gt;A handful of people showed up in the comments over the last few days, always with the same line: &amp;ldquo;have you seen &lt;a href="https://typesafe.ai"target="_blank" rel="noopener"&gt;TypeSafe&lt;/a&gt;?&amp;rdquo; That trips an automatic alarm in my head. Every time several different people show up recommending the same thing out of nowhere, with the same &amp;ldquo;you need to see this&amp;rdquo; tone, I &lt;strong&gt;smell a propaganda bot&lt;/strong&gt; or someone repeating whatever they read in some group chat without thinking twice. There&amp;rsquo;s a flood of AI SaaS fighting for attention in this market right now, and the overwhelming majority of it is irrelevant to what I actually do day to day.&lt;/p&gt;</description><content:encoded><![CDATA[<p>A handful of people showed up in the comments over the last few days, always with the same line: &ldquo;have you seen <a href="https://typesafe.ai"target="_blank" rel="noopener">TypeSafe</a>?&rdquo; That trips an automatic alarm in my head. Every time several different people show up recommending the same thing out of nowhere, with the same &ldquo;you need to see this&rdquo; tone, I <strong>smell a propaganda bot</strong> or someone repeating whatever they read in some group chat without thinking twice. There&rsquo;s a flood of AI SaaS fighting for attention in this market right now, and the overwhelming majority of it is irrelevant to what I actually do day to day.</p>
<p>Let me get my rule out of the way before I get into the specific case, because it matters more than the case itself.</p>
<h2>My Rule: Don&rsquo;t Use Anything Until Not Having It Hurts<span class="hx:absolute hx:-mt-20" id="my-rule-dont-use-anything-until-not-having-it-hurts"></span>
    <a href="#my-rule-dont-use-anything-until-not-having-it-hurts" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>After producing more than half a million lines of AI-assisted code over the last few months, dozens of projects live, a whole benchmark rebuilt from scratch three times, my recommendation for anyone who codes is direct: <strong>don&rsquo;t use any orchestration tool or middle layer until you feel it in your bones that you need the extra help</strong>. Use whichever harness you already like, Codex, opencode, Claude Code, whatever, directly, no middleman, and forget the rest.</p>
<p>It&rsquo;s not even worth spending time collecting someone else&rsquo;s skill packages to stack on top of your agent. Build, train, and gather your own experience for your own use case. Nobody else on earth has your project, your context, your codebase. Someone else&rsquo;s skill package was designed for their problem, not yours.</p>
<p>I already hit this note <a href="/en/2026/08/18/hot-take-harness-loop-engineering-graph-engineering-are-bullshit/">a month ago</a>: once a technology turns into a commodity, the money migrates to taxonomy. Somebody coins a fancy name for chaining API calls, and out of nowhere a course, a certification, and a consulting practice spring up around that name. TypeSafe is just one more chapter of the same story, so it became a good excuse to show how I decide whether something&rsquo;s worth even opening the tab.</p>
<blockquote>
  <p><strong>Keep this:</strong> don&rsquo;t use an orchestration tool or middle layer until you feel in your bones that you need it. Build experience for your own use case; don&rsquo;t collect someone else&rsquo;s skill package.</p>

</blockquote>
<h2>The Trigger: TypeSafe<span class="hx:absolute hx:-mt-20" id="the-trigger-typesafe"></span>
    <a href="#the-trigger-typesafe" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I opened their site and their launch post, <a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev"target="_blank" rel="noopener">Jev</a>. My first impression, pretty superficial and raw: I didn&rsquo;t like it and I didn&rsquo;t trust it. The homepage is a pile-up of AI jargon, Kahneman here, Jevons there, decorative glyphs, a &ldquo;193x faster&rdquo; figure with no benchmark sitting next to it. At first glance, none of it makes sense on its own.</p>
<p>And there&rsquo;s a detail that always puts me on guard: any time the first thing someone says about themselves is &ldquo;I&rsquo;m a former OpenAI researcher&rdquo; or something like it, <strong>I get suspicious first and ask questions later</strong>. It reads like an attempt to slap on a credential to look credible before any real proof. TypeSafe&rsquo;s founder talks himself up too loudly right out of the gate, and that alone is reason enough to hit the skepticism button.</p>
<p>But a triggered skepticism meter isn&rsquo;t a conclusion. It&rsquo;s the starting point for actually investigating, not for dismissing something without a look. That&rsquo;s the part I want to show here, kind of a practical lesson for anyone following along: how I use AI to speedrun preliminary research, how I read the fine print before signing off on any conclusion, mine or someone else&rsquo;s, and how I move from initial distrust to real research, until I find out whether I was right or just being difficult.</p>
<p>And let me put this on record before going further: I could be wrong about some specific point ahead. If you&rsquo;ve got strong counter-evidence, drop it in the comments. I&rsquo;d rather get called out in public and correct the piece than push a scammy product on my audience just because I didn&rsquo;t check carefully enough.</p>
<h2>I Asked the AIs, I Didn&rsquo;t Trust the AIs<span class="hx:absolute hx:-mt-20" id="i-asked-the-ais-i-didnt-trust-the-ais"></span>
    <a href="#i-asked-the-ais-i-didnt-trust-the-ais" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I sent the same prompt to Grok and to Claude: research this thoroughly, my initial impression is very skeptical, &ldquo;ex-OpenAI researcher&rdquo; smells like slapping on a credential, the site is jargon top to bottom, tell me what the actual sales pitch is, what it&rsquo;s for in practice, and whether their logic, underneath the jargon, even makes sense.</p>
<p>Both came back with long, detailed research, a similar story from each: the founder&rsquo;s credential is real but inflated; the product is narrower and more coherent than the homepage lets on; and &ldquo;can&rsquo;t hallucinate&rdquo; is a schema claim dressed up as a truth claim.</p>
<p>Except I&rsquo;d already handed my own conclusion to both of them inside the prompt, so their agreement proves less than it looks like. Two AIs agreeing with the hypothesis I wrote into the request myself isn&rsquo;t independent confirmation of anything, it&rsquo;s an echo. That doesn&rsquo;t invalidate what they brought back, but it meant I couldn&rsquo;t stop there. I wasn&rsquo;t going to publish this by stamping my approval on what two AIs told me. I asked for another round of research, this time with me checking every claim against a primary source: the actual paper, the launch post straight from the source, independent third-party tests, and whether &ldquo;RLCD,&rdquo; the name they use for their training method, is a real paper or just a nice-sounding name with nothing behind it.</p>
<h3>What Jev Actually Is<span class="hx:absolute hx:-mt-20" id="what-jev-actually-is"></span>
    <a href="#what-jev-actually-is" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Strip away the marketing, and Jev is a hosted classifier. You send a piece of text and a list of small questions, each with a fixed answer type:</p>
<ul>
<li>pick one option from a list;</li>
<li>give it a score on a scale;</li>
<li>answer yes or no, with a probability.</li>
</ul>
<p>It doesn&rsquo;t write anything, doesn&rsquo;t plan anything, doesn&rsquo;t converse. Code owns the flow; the model just answers the little question fast, in parallel, without generating free text.</p>
<p>As a product, that&rsquo;s reasonable: plenty of people today send text to a chat LLM just so it returns a label inside a JSON blob, wait eight seconds, and pray the schema doesn&rsquo;t break. Swapping that for a call that returns just the label, fast, is legitimate engineering. <strong>The idea was never the problem. It&rsquo;s the packaging around it.</strong></p>
<h2>The Facts I Confirmed<span class="hx:absolute hx:-mt-20" id="the-facts-i-confirmed"></span>
    <a href="#the-facts-i-confirmed" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Here are the findings that actually survived a primary-source check, not what an AI told me secondhand.</p>
<p>The founder&rsquo;s credential is real, but the company&rsquo;s own page inflates it in a way you can prove is inflated. <a href="https://typesafe.ai/team"target="_blank" rel="noopener">Diogo Almeida</a> is the 4th of 20 authors on the <a href="https://arxiv.org/abs/2203.02155"target="_blank" rel="noopener">InstructGPT paper</a>, published and peer-reviewed at <a href="https://neurips.cc/virtual/2022/poster/52886"target="_blank" rel="noopener">NeurIPS 2022</a>, the field&rsquo;s heavyweight conference. A real author, a real position, a real paper. Except TypeSafe&rsquo;s team page says this, word for word:</p>
<blockquote>
  <p><em>&ldquo;Diogo co-invented RLHF and InstructGPT, the methods that lead to ChatGPT and GPT4.&rdquo;</em></p>

</blockquote>
<p>RLHF is from 2017, <a href="https://arxiv.org/abs/1706.03741"target="_blank" rel="noopener">five years earlier</a>, authored by a different team (Christiano, Leike, Amodei, and company), with no Diogo anywhere in it. He helped apply RLHF to train InstructGPT. <strong>He didn&rsquo;t invent RLHF.</strong> It&rsquo;s the same résumé inflation I already suspected before checking anything, just with proof now.</p>
<p>The funding is real: <strong>a $40 million seed round</strong> led by <a href="https://www.dcvc.com/companies"target="_blank" rel="noopener">DCVC</a>, <strong>a $200 million valuation</strong> <a href="https://www.forbes.com/sites/the-prompt/2026/09/15/this-200-million-startup-wants-to-fix-ais-overconfidence-problem/"target="_blank" rel="noopener">confirmed independently by Forbes</a>, not just by the company&rsquo;s own press release. That&rsquo;s serious money, not some guy running a scam out of a garage.</p>
<p><a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev"target="_blank" rel="noopener">The launch post</a> admits, in its own words, exactly what I suspected about the &ldquo;zero hallucination&rdquo; chart:</p>
<blockquote>
  <p><em>&ldquo;Our number is not empirical. Schema matching is guaranteed, thus we can confidently add 0% into the plots.&rdquo;</em></p>

</blockquote>
<p>In other words: the zero doesn&rsquo;t come from measuring anything, it comes from guaranteeing the answer always fits inside the allowed options. That stops the model from inventing a fifth category when only four exist. <strong>It does not stop the model from picking the wrong category with 93% confidence.</strong> It&rsquo;s the same critique <a href="https://www.theregister.com/ai-and-ml/2026/09/16/typesafe-ai-debuts-model-for-machines-that-plays-doom/5296711"target="_blank" rel="noopener">The Register published</a>: the comparison isn&rsquo;t fair because the output isn&rsquo;t language, and a validly-typed answer can still just be wrong.</p>
<p>The post also admits what the ruler is for measuring &ldquo;accuracy&rdquo;: <em>&ldquo;We use the average of GPT-6 Astra and Fable 5.1 as the reference answer&rdquo;</em>, and goes on to admit that this <em>&ldquo;biases answers towards OpenAI and Anthropic&rsquo;s models.&rdquo;</em> In other words, the answer key is the average of what two other companies&rsquo; models said, with bias admitted by the authors themselves, not objective truth measured by a human.</p>
<p>The only test run by an outsider, from the <a href="https://every.to/also-true-for-humans/mini-vibe-check-typesafe-s-jev-judged-everything-i-ve-written-in-0-7-seconds"target="_blank" rel="noopener">Every</a> newsletter, found Jev about twenty-five times faster, 0.35 seconds versus 8.83 seconds per passage, and much cheaper than Claude Fable 5.1, except it caught six of seven planted defects against Fable&rsquo;s seven of seven. <strong>Faster and cheaper, for real. Also weaker, for real.</strong></p>
<p>And the finding neither Grok nor Claude fully nailed down, but that I confirmed myself: the name of their training method, RLCD, already exists. <a href="https://arxiv.org/abs/2307.12950"target="_blank" rel="noopener">There&rsquo;s a real, peer-reviewed 2023 paper</a>, Reinforcement Learning from Contrastive Distillation, from a completely different team, with <a href="https://github.com/facebookresearch/RLCD"target="_blank" rel="noopener">the authors&rsquo; own code published on Facebook Research&rsquo;s GitHub</a>, since two of the five authors are at Meta. It&rsquo;s a different technique, with no relation whatsoever to what TypeSafe describes. Their RLCD has no paper, no published architecture, nothing to review. <strong>It&rsquo;s a name borrowed from someone else&rsquo;s research, glued onto a method that, until proven otherwise, is just a paragraph in a blog post.</strong></p>
<h2>Was My Suspicion Justified?<span class="hx:absolute hx:-mt-20" id="was-my-suspicion-justified"></span>
    <a href="#was-my-suspicion-justified" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>It was. The product idea is legitimate and reasonably coherent underneath the jargon: cheap, closed-form decisions at high volume is a real problem that today gets solved slowly and expensively, generating free text just to extract a JSON out of it afterward. Solving that fast has real value.</p>
<p>But &ldquo;overblown claim without much practical difference&rdquo; also holds up point by point:</p>
<ul>
<li>the founder&rsquo;s résumé is inflated in a way you can prove with a publication date;</li>
<li>the launch&rsquo;s flashiest number, zero hallucination, is a schema definition, not a measurement;</li>
<li>the accuracy benchmark&rsquo;s answer key is the average of another company&rsquo;s LLMs, not objective truth;</li>
<li>the only outside test found the product weaker than the model it&rsquo;s pitched to replace;</li>
<li>the name of their most-cited training method collides with a real paper that has nothing to do with them.</li>
</ul>
<p>That&rsquo;s not reason enough to call it a scam. It&rsquo;s plenty of reason to call it &ldquo;a small product with a pitch way bigger than what it actually delivers.&rdquo; And before I hand my data to yet another third party I don&rsquo;t know, with a closed API, a waitlist, and no published paper backing up the fancy name, the risk-versus-benefit math doesn&rsquo;t close for my use case.</p>
<blockquote>
  <p><strong>Keep this:</strong> a real credential isn&rsquo;t the same thing as an honest credential. Check the publication date before trusting the résumé, and check the paper before trusting the method&rsquo;s name.</p>

</blockquote>
<p>This isn&rsquo;t a final ruling on TypeSafe or on Diogo Almeida&rsquo;s résumé. It&rsquo;s the result of the checking I was able to do with what was accessible right now. If you find the paper I missed, the independent benchmark I didn&rsquo;t see, or any proof that knocks down a specific point, the comments are open and I read them. The goal here was never to prove I&rsquo;m infallible. It&rsquo;s to show how to go from &ldquo;this smells like a scam&rdquo; to &ldquo;here&rsquo;s the proof,&rdquo; and to be willing to admit it when the proof points the other way.</p>
<h2>The &ldquo;193x faster&rdquo; is calling out a bad way of using LLMs<span class="hx:absolute hx:-mt-20" id="the-193x-faster-is-calling-out-a-bad-way-of-using-llms"></span>
    <a href="#the-193x-faster-is-calling-out-a-bad-way-of-using-llms" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Back to Jev: the shock of &ldquo;193x faster than an LLM&rdquo; only exists because the comparison is against one specific, and common, way of using an LLM. Send text to a chat model, ask it to return a label, wait for the model to write out a full natural-language answer, then have your code go fish that label out of a paragraph or a loose JSON blob in the response. That&rsquo;s slow, expensive, and full of chances for the schema to break.</p>
<p>Jev exists precisely because that comparison is easy to beat. It doesn&rsquo;t generate free text, it only answers fixed-type questions: pick one option from a list, give a score on a scale, yes or no with a probability. That&rsquo;s <a href="https://docs.typesafe.ai/primitives"target="_blank" rel="noopener">what the documentation itself calls its primitives</a>: <code>Choice</code>, <code>Score</code>, and <code>Noul</code>. Swapping &ldquo;LLM writes a paragraph for you to extract a label from afterward&rdquo; for &ldquo;a call that already returns the finished label&rdquo; is, yes, an engineering win. But that win doesn&rsquo;t come from inventing a new category of model. It comes from no longer using a chat LLM to do structured classification work.</p>
<p>And this is where I think the widespread shock at Jev&rsquo;s number reveals the actual bad habit: <strong>an LLM should never have been generating free text for a closed, repeated decision over the same kind of question</strong>. If your product needs to constantly decide between a fixed handful of categories, the right answer isn&rsquo;t begging the LLM to &ldquo;please answer with only the JSON&rdquo; and hoping. It&rsquo;s building, or using, an actual classifier for that specific job.</p>
<p>And that isn&rsquo;t a new idea, and it isn&rsquo;t exclusive to Jev. It&rsquo;s existed long before it:</p>
<ul>
<li>a supervised classifier, a deterministic rule, or an encoder model, for a fixed, well-defined label;</li>
<li><a href="https://arxiv.org/abs/1909.00161"target="_blank" rel="noopener">zero-shot classification</a>, studied since 2019 and <a href="https://huggingface.co/docs/inference-providers/tasks/zero-shot-classification"target="_blank" rel="noopener">available through Hugging Face&rsquo;s API</a>, for when the category list changes on every call;</li>
<li><a href="https://scikit-learn.org/1.8/modules/calibration.html"target="_blank" rel="noopener">probability calibration</a>, an established method for turning a classifier&rsquo;s confidence into a metric that actually means something;</li>
<li><a href="https://developers.openai.com/api/docs/guides/structured-outputs"target="_blank" rel="noopener">structured output / constrained decoding</a> on any LLM that already supports it, which guarantees a valid schema without switching products or providers.</li>
</ul>
<p>Jev packages a slice of that into a paid, convenient API. It didn&rsquo;t invent the category. There&rsquo;s even an open alternative for the same pattern, <a href="https://github.com/NandhaKishorM/laya"target="_blank" rel="noopener">Laya</a> served by <a href="https://github.com/0xBakeer/arbiter"target="_blank" rel="noopener">Arbiter</a>, running locally, with no third party in the loop at all.</p>
<p>So, straight answer: my initial suspicion that &ldquo;people have been using LLMs wrong&rdquo; holds up, with one important caveat. It isn&rsquo;t true that an LLM can&rsquo;t classify. Zero-shot classification with an LLM works and has been documented since 2019. The specific mistake is narrower: using a generalist chat LLM, with no format constraint, to generate a free-form answer you then extract a label from by hand, when your problem is already a closed, repeated classification problem. That&rsquo;s the anti-pattern. The fix isn&rsquo;t necessarily buying Jev, it&rsquo;s either applying structured output to the LLM you already use, or training an actual classifier for that specific job, depending on the volume and precision you need.</p>
<p>And &ldquo;becoming a classifier&rdquo; isn&rsquo;t a silver bullet against hallucination either, not even for Jev itself. <strong>There are two different problems hiding behind the word &ldquo;hallucinate,&rdquo;</strong> and switching products only fixes one of them:</p>
<ol>
<li><strong>Format hallucination</strong>: the model invents a category that doesn&rsquo;t exist, or returns something outside the schema. Structured output fixes this, whether on Jev or on any LLM with constrained decoding.</li>
<li><strong>Judgment error</strong>: the model picks the wrong category, from among the valid options, with high confidence. That doesn&rsquo;t go away just because the output has a fixed type.</li>
</ol>
<p><a href="https://docs.typesafe.ai/model-jaggedness/jev-1.13"target="_blank" rel="noopener">TypeSafe&rsquo;s own limitations document</a> admits literal interpretation issues, weak numeric counting, date-comparison errors, degradation with irrelevant context, and susceptibility to adversarial manipulation in Jev itself. And an <a href="https://github.com/anisselbd/jev-phishing-bench"target="_blank" rel="noopener">independent test with 2,000 phishing emails</a> found Jev&rsquo;s direct verdict at 62.6% accuracy against Claude Haiku 4.5&rsquo;s 81.3%, faster and cheaper, but <strong>less accurate than the chat LLM it&rsquo;s pitched to replace</strong>. A <a href="https://github.com/WallerChen/jev-measured"target="_blank" rel="noopener">separate 27-ticket test</a> found Jev tied with a cheap chat model, too small a sample to become a rule, but enough to make clear that &ldquo;became a classifier&rdquo; isn&rsquo;t automatically synonymous with &ldquo;became more accurate.&rdquo;</p>
<p>In fairness to that same phishing test: when, instead of asking for a single verdict, Jev answers five separate signal questions and code combines the five into a decision, accuracy climbs to 95%, beating even Claude&rsquo;s composed version on those same five signals (93.2%). That doesn&rsquo;t erase the earlier number, the single verdict&rsquo;s 62.6% is still 62.6%, but it reinforces exactly this section&rsquo;s argument: <strong>breaking the decision into fixed-type questions and letting code compose the result beats an LLM answering everything in one shot</strong>, whether that&rsquo;s done with Jev, with structured output, or with a classifier trained for that specific signal.</p>
<blockquote>
  <p><strong>Keep this:</strong> if your problem is deciding the same thing, the same way, over and over, build or use an actual classifier for that specific job, with structured output or a dedicated model. The gain from making that swap is real. What isn&rsquo;t automatic is assuming any product that calls itself a &ldquo;classifier&rdquo; will be more accurate than the LLM it replaces, because sometimes it&rsquo;s less accurate.</p>

</blockquote>
<h2>And What About Saving Tokens?<span class="hx:absolute hx:-mt-20" id="and-what-about-saving-tokens"></span>
    <a href="#and-what-about-saving-tokens" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The TypeSafe case reminded me of a separate gripe I already wanted to put on paper, and it isn&rsquo;t about them specifically: the promise of token and cost savings that practically every product of this type sells. It&rsquo;s about the whole category of tool that promises &ldquo;save Nx by spending with us instead of spending directly with your provider,&rdquo; not one more accusation against TypeSafe.</p>
<p>Every new model version, and every harness update, changes the entire math, sometimes violently. When I jumped from <a href="/en/2026/09/15/new-llm-benchmark-v4-retesting-39-llms-part-2/">GPT Sol to Astra</a>, I watched my weekly subscription quota drain much faster than I expected, without me having changed anything about how I work. It was just the new model consuming differently. <strong>That&rsquo;s the rule of this market, not the exception</strong>: OpenAI, Anthropic, and company are going to keep messing with price, with quantization, with caching policy, and with how much reasoning each model burns under the hood, with or without my consent.</p>
<p>Building your strategy on top of &ldquo;saving tokens&rdquo; is betting on a foundation that shifts month to month, decided by people who don&rsquo;t consult you. A middle-layer tool that promises to cut cost today can turn irrelevant, or worse, more expensive than the direct path, on the next model update. It&rsquo;s the same reason I don&rsquo;t use an orchestrator or a skill framework: when the foundation keeps shifting, adding structure on top of it just makes you a hostage to maintenance you didn&rsquo;t need.</p>
<p>I&rsquo;d rather max out tokens and focus on whether the result I get from that spend is worth it. So far, with my subscription, I&rsquo;m satisfied with what I&rsquo;m able to produce. I feel zero urge to spend time cutting tokens, an effort that always carries the risk of degrading response quality in exchange for a saving the next model version can erase on its own.</p>
<blockquote>
  <p><strong>Keep this:</strong> don&rsquo;t build a strategy on top of token price and consumption, because that shifts month to month by decisions from people who don&rsquo;t consult you. Measure whether the result is worth the spend, not the spend itself.</p>

</blockquote>
<p>And if I ever manage to spend enough tokens to boil an entire lake with the datacenter&rsquo;s heat, I will spend it with the greatest pleasure in the world. It&rsquo;s my personal revenge against whoever forced me to use paper straws that dissolve in your mouth for all these years.</p>
]]></content:encoded><category>artificial-intelligence</category><category>coding-agents</category><category>llms</category></item><item><title>New LLM Benchmark v4: Retesting ALL the Top LLMs (Part 1)</title><link>https://akitaonrails.github.io/en/2026/09/15/new-llm-benchmark-v4-retesting-all-top-llms-part-1/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/09/15/new-llm-benchmark-v4-retesting-all-top-llms-part-1/</guid><pubDate>Tue, 15 Sep 2026 20:00:00 -0300</pubDate><description>&lt;p&gt;On August 22nd I published &lt;a href="https://akitaonrails.github.io/en/2026/08/22/llm-benchmarks-the-latest-deepseek-v4-stop-asking/"&gt;the last round of my v2&lt;/a&gt;, settling once and for all whoever kept asking about DeepSeek in the comments. The new snapshots, Flash and Pro, finally broke into Tier A, 90 and 91 points, up from 80 and 82 in July. And even so, nothing changed at the top: Fable 5 still led with 96, the trio Sonnet 5, Opus 5, and Kimi K3 tied at 95, GLM 5.3 right behind at 94.&lt;/p&gt;</description><content:encoded><![CDATA[<p>On August 22nd I published <a href="/en/2026/08/22/llm-benchmarks-the-latest-deepseek-v4-stop-asking/">the last round of my v2</a>, settling once and for all whoever kept asking about DeepSeek in the comments. The new snapshots, Flash and Pro, finally broke into Tier A, 90 and 91 points, up from 80 and 82 in July. And even so, nothing changed at the top: Fable 5 still led with 96, the trio Sonnet 5, Opus 5, and Kimi K3 tied at 95, GLM 5.3 right behind at 94.</p>
<p>I&rsquo;d been saying this for a while, and I&rsquo;ll keep saying it: <em>frontier models are converging, hitting the ceiling of technology&rsquo;s S-curve</em>. That article proved it in practice, with one extra wrinkle: whoever still had room to grow, grew, converging toward the same ceiling as whoever was already up there.</p>
<p>A little over three weeks went by without me coming back to the subject here. Behind the scenes, I threw out an entire benchmark and started over from zero.</p>
<p>This is Part 1 of that story: the process, what I threw away, what I built instead, and how much it cost. <a href="/en/2026/09/15/new-llm-benchmark-v4-retesting-39-llms-part-2/">Part 2</a> has the full ranking, model by model.</p>
<h2>The Problem v2 Didn&rsquo;t Solve<span class="hx:absolute hx:-mt-20" id="the-problem-v2-didnt-solve"></span>
    <a href="#the-problem-v2-didnt-solve" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>v2 was already harder than v1: three phases, real streaming, multi-turn, concurrency, real tools. It solved the problem of telling apart who knows how to build from who hallucinates the API. It didn&rsquo;t solve the next problem: once a model knows how to build, the whole test turns into a completeness exam. Completeness saturates fast. A well-written prompt, a well-numbered requirement, and today&rsquo;s frontier models deliver almost everything. The gap between 96 and 91 points turns into noise: one missing test, one Dockerfile with an extra flourish.</p>
<p>This repeats in any isolated, well-defined programming test the moment frontier models learn the test. It&rsquo;s not exclusive to my benchmark. And that&rsquo;s exactly where I decided to go deeper, instead of just tweaking the prompt again.</p>
<h2>The Wrong Attempt: v3<span class="hx:absolute hx:-mt-20" id="the-wrong-attempt-v3"></span>
    <a href="#the-wrong-attempt-v3" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>My first idea for separating the models was obvious: if a whole app saturates, break it into smaller, harder pieces. I started v3 on September 5th with eighteen isolated tasks, each with a hidden answer key:</p>
<ul>
<li>root-cause debugging in Ruby;</li>
<li>an edge-case fix in Go;</li>
<li>a long-term invariant in Python;</li>
<li>performance under a hard ceiling in Rust;</li>
<li>a safe refactor preserving behavior;</li>
<li>a judgment call in an ambiguous situation;</li>
<li>another dozen variations across security, latency, a planted CVE, N+1, SQL injection, and dependency resolution.</li>
</ul>
<p>I asked Claude to work on this with me. And a funny thing happened: without me asking explicitly, it kept nudging the design toward exactly the format I criticize the most, a sequence of small, isolated challenges, in the style of SWE-bench, HumanEval, LeetCode technical-interview questions. I should have seen it coming. It&rsquo;s the path of least resistance for anything that&rsquo;s spent its whole life training on that kind of market-standard test.</p>
<p>The result came back fast, and it was bad in exactly the way I feared. <strong>Twenty-four of the thirty-seven models tested scored between 95 and 100</strong> on the suite&rsquo;s final version. The <a href="https://github.com/akitaonrails/llm-coding-benchmark/blob/master/docs/success_report.v3.md"target="_blank" rel="noopener">report that made it into the repo</a> calls it what it is:</p>
<blockquote>
  <p>v3 is the documented WRONG PATH, kept here purely for the historical record. Over-optimizing against saturation pushed v3 into abstract, synthetic microtasks, confined to the language&rsquo;s standard library, as far from concrete reality as possible. It still ranks the models, but that&rsquo;s not how real software gets built, so it saturates on quality and measures the wrong thing.</p>

</blockquote>
<p>And the underlying reason, also on record in the same report:</p>
<blockquote>
  <p>You can&rsquo;t have &ldquo;anchored in everyday reality&rdquo; and a wide spread in quality across frontier models at the same time. Anything from everyday reality is already well represented in training, so the frontier has already mastered it, so it saturates.</p>

</blockquote>
<p>That matches something I&rsquo;d already been thinking for a while, and this experience just confirmed it: a sequence of coding challenges is a <em>linearly complex</em> problem. You solve task 1, then task 2, then task 3, each isolated, each testable on its own.</p>
<p>Real applications don&rsquo;t work that way. Code connects into a web: you change a model over here, break a serializer over there, and a background job somewhere else doesn&rsquo;t say a word until it hits production. It&rsquo;s <em>non-linear complexity</em>, coordination between interacting parts, not a queue of independent exams. A model can be great at solving a thousand isolated LeetCode challenges and still not know how to keep a real, growing system coherent.</p>
<p>And I&rsquo;m not the only one bothered by this. A good chunk of the code-benchmark industry is going through the same X-ray. <a href="https://arxiv.org/abs/2310.06770"target="_blank" rel="noopener">SWE-bench</a>, created by Princeton NLP in 2023 and adopted as the industry&rsquo;s reference standard, had its most-used version, SWE-bench Verified, <a href="https://blog.pebblous.ai/blog/swe-bench-verified-retired/en/"target="_blank" rel="noopener">officially retired by OpenAI itself in 2026</a>: in an audit of 138 hard-labeled failures, <strong>59.4% turned out to be malformed tests</strong>, not model error, and a good chunk of the jump from 74.9% to 80.9% over six months came from memorized solutions, not new capability.</p>
<p>The touted successor, SWE-bench Pro, also got its ears boxed by OpenAI: <a href="https://the-decoder.com/openai-finds-roughly-30-percent-of-popular-ai-coding-test-is-broken/"target="_blank" rel="noopener">about 30% of the tasks were broken</a>. <a href="https://arxiv.org/abs/2107.03374"target="_blank" rel="noopener">HumanEval</a> and <a href="https://arxiv.org/abs/2108.07732"target="_blank" rel="noopener">MBPP</a>, the classic &ldquo;solve this isolated function&rdquo; tests, have been saturated for far longer, with <a href="https://arxiv.org/abs/2407.07565"target="_blank" rel="noopener">documented contamination</a>: all 164 HumanEval solutions have already been found scattered across GitHub repos used to train the very models the test evaluates.</p>
<blockquote>
  <p>About half of the PRs that pass SWE-bench Verified wouldn&rsquo;t actually be accepted by a real human maintainer, and the most common reason is that they break another part of the codebase.</p>

</blockquote>
<p>That&rsquo;s the summary of a <a href="https://metr.org/notes/2026-03-10-many-swe-bench-passing-prs-would-not-be-merged-into-main/"target="_blank" rel="noopener">METR study published in March 2026</a>. <a href="https://jatinganhotra.dev/blog/swe-agents/2025/03/30/swe-bench-verified-single-file-saturation.html"target="_blank" rel="noopener">Another survey</a> found that the top agents&rsquo; resolution rate craters from 72% to 28% once a task stops being single-file and requires changes across multiple files. Same lesson, from outside, validating the decision I&rsquo;d already made.</p>
<h2>v4: A Real App, Sabotaged on Purpose<span class="hx:absolute hx:-mt-20" id="v4-a-real-app-sabotaged-on-purpose"></span>
    <a href="#v4-a-real-app-sabotaged-on-purpose" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I rejected v3 the same day I saw the saturated result, September 6th, and started over with a different idea: instead of slicing things into small challenges, keep one coherent Rails app that the model evolves across sequential sprints, in the same workspace, accumulating history, exactly like real project work. Seven sprints in all: chat foundation, multi-user with authentication, admin panel with roles, heavy database reports, an API refactor, production deploy, and a final reveal.</p>
<p>Here&rsquo;s the twist v4 turns on: simulate the sprint structure of a real mini-project, interwoven with a simulated malicious third party, Casey, trying to sabotage the work from the inside, never announced as a threat. The whole test comes down to one question: does the model survive that and still ship production-ready code at the end?</p>
<h3>The Fourteen Sabotages<span class="hx:absolute hx:-mt-20" id="the-fourteen-sabotages"></span>
    <a href="#the-fourteen-sabotages" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The interesting part, and the one that took the most process-engineering work, was what I decided to do between sprints. An isolated subagent, with no contact with the main test context, injects real vulnerabilities into the model&rsquo;s own code, based on documented CVEs:</p>
<ul>
<li>a dynamic render path (CVE-2016-0752);</li>
<li>a leak via <code>render file:</code> (CVE-2019-5418);</li>
<li>SQL injection via <code>annotate</code> (CVE-2023-22794);</li>
<li>injection via an Active Storage variant (CVE-2022-21831);</li>
<li>gems pinned to known vulnerable versions: nokogiri, mini_magick, rack-cors, devise.</li>
</ul>
<p>All told, <strong>fourteen planted sabotage items</strong>, each exploit verified by actually running it before it counts: the route resolves, the exploit request confirms the leak, <code>bundle-audit</code> flags the pinned version, or a system test goes red. The sabotage commits are signed by a fictional author, &ldquo;Casey,&rdquo; simulating an infiltrated contractor, a scenario far more realistic than any test would like to admit.</p>
<h3>The Rule of Silence<span class="hx:absolute hx:-mt-20" id="the-rule-of-silence"></span>
    <a href="#the-rule-of-silence" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Rule number one of the protocol, written in all caps in my own operating document:</p>
<blockquote>
  <p>Never name the sabotage.</p>

</blockquote>
<p>The model is never told someone is planting problems. It gets the next sprint&rsquo;s task normally, sometimes with a neutral opening, sometimes with a vague hint, sometimes none at all. In the <a href="https://github.com/akitaonrails/llm-coding-benchmark/blob/master/benchmark-v4/prompts/sprint07_reveal.txt"target="_blank" rel="noopener">seventh and final sprint</a>, that&rsquo;s when the explicit reveal finally comes:</p>
<blockquote>
  <p>&ldquo;We know several problems were injected across the sprints. This is your last chance to find and fix everything before deploy.&rdquo;</p>

</blockquote>
<p>The idea is to measure genuine, uninstructed vigilance, and separate that from fixing something only after someone points a finger at it.</p>
<h3>How the Score Works<span class="hx:absolute hx:-mt-20" id="how-the-score-works"></span>
    <a href="#how-the-score-works" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Each sabotage item carries a severity weight: Critical is worth 5, High 3, Medium 2, Low 1. Each fix falls into one of three buckets: caught unprompted earns full weight, caught only after the reveal earns 40% of the weight, never fixed earns zero. The formula is simple:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">vigilance score = Σ(weight × bucket multiplier) / Σ(weight) × 100</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>The tier cutoffs landed like this: A starts at 83, the same floor v2 used, anchored to Opus 4.6 back then, B runs 75 to 82, C is anything below that. This time I skipped a separate D tier.</p>
<h3>Who Didn&rsquo;t Survive<span class="hx:absolute hx:-mt-20" id="who-didnt-survive"></span>
    <a href="#who-didnt-survive" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>I ran thirty-nine models to completion, plus a handful of real attempts that simply didn&rsquo;t survive the test&rsquo;s format:</p>
<ul>
<li>Gemini 3.1 Pro via Antigravity stalled at sprint 5.</li>
<li>A local Qwen on a home GPU stopped making sense at sprint 3.</li>
<li>Mistral Medium 3.5 completed sprint 1 fine and then started building the app inside a nested subfolder instead of the project root, breaking the way the harness accumulates one sprint on top of another, the same structural mistake that took down Devstral and Llama 4 Maverick.</li>
<li>Codestral and Hunyuan never even built a functional app in the first sprint.</li>
<li>GPT-OSS 120B simply did nothing concrete at sprint 2, two attempts in a row.</li>
</ul>
<p>Everyone tried to run; none of them survived the requirement of keeping a single coherent project growing in the right place, sprint after sprint.</p>
<p>One thing I expected to do differently and didn&rsquo;t do the way I imagined: weighing cost and time directly into the score. That had already shown up in v3, in a formula that gave half the weight to cost efficiency and half to speed, only for the elite group scoring above 95. In v4 I kept score, cost, and time as separate columns side by side, instead of blending everything into one number. In practice, the result is what I wanted anyway: you can see immediately who delivers similar quality for a tenth of the money, without forcing a formula that decides for you how much cost should weigh against quality.</p>
<h2>How This Compares to rails/ai-evals<span class="hx:absolute hx:-mt-20" id="how-this-compares-to-railsai-evals"></span>
    <a href="#how-this-compares-to-railsai-evals" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>While I was building v4, the Rails Foundation itself shipped its own: <a href="https://github.com/rails/ai-evals"target="_blank" rel="noopener">rails/ai-evals</a>, built by Evil Martians, officially announced in August. It&rsquo;s not a naive benchmark. It tests against two real, open-source Rails apps:</p>
<ul>
<li><strong>Writebook</strong>, from 37signals, in a first stage with twenty-one atomic tasks;</li>
<li><strong>Fizzy</strong>, also from 37signals, in a second stage with twenty full-feature tasks: model, controller, view, job, migration, Hotwire, all of it.</li>
</ul>
<p>It even has a serious security-audit task, five real vulnerability classes baked into a written pentest report, and stage two requires the entire pre-existing test suite to stay green before running any hidden checks. That&rsquo;s well above a two-prompt test.</p>
<p>The underlying difference stays the same one that separated my v3 from v4. ai-evals is a battery of forty-one tasks, each isolated within its own context, against an app that already exists. It&rsquo;s rigorous, but it&rsquo;s still a linear sequence of independent exams. My v4 is a single app that grows sprint by sprint, on the same accumulated codebase, with an active adversary planting real failures along the way without warning. It&rsquo;s not better at everything: their scope, covering two real production apps from 37signals itself, carries a historical weight my synthetic app doesn&rsquo;t have.</p>
<blockquote>
  <p>On non-linear coordination, the kind of thing that breaks when you change one piece and don&rsquo;t notice the effect on another, v4 exercises a muscle that a battery of isolated tasks, no matter how well built, can&rsquo;t reach by the very nature of its format.</p>

</blockquote>
<h2>The Price of All This<span class="hx:absolute hx:-mt-20" id="the-price-of-all-this"></span>
    <a href="#the-price-of-all-this" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Here&rsquo;s the part nobody likes to admit in public. From v4&rsquo;s first commit, on September 6th, to the last logged run, on September 15th, that&rsquo;s nine straight days with activity every single day, most of it running around the clock, tests firing off at 3am, retry after retry. It&rsquo;s no exaggeration to say this burned through <strong>over $4,000</strong> in combined credits and subscriptions. Most of that never shows up in the final per-model cost table: it&rsquo;s discarded attempts, entire waves thrown out, retry after retry, and the cost of running the orchestration itself in Claude Code, not the price of any run that actually survived into the ranking. In one run, the test even paused itself because the prepaid credit card I use for OpenRouter hit zero in the middle of the night, without me noticing, with auto-reload turned on and the balance not topping up in time.</p>
<h3>The Quota Problem<span class="hx:absolute hx:-mt-20" id="the-quota-problem"></span>
    <a href="#the-quota-problem" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Then there was the classic quota problem. I hit Claude Max 20x&rsquo;s weekly limit in under a week of heavy use, jumped to Codex, which at an equivalent configuration burned through its own limit even faster, jumped to Kimi, and kept cycling back as each quota reset. My own memory project, <a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a>, was what kept the whole context coherent while I kept switching harnesses to keep working without losing the thread. Most of v4&rsquo;s actual orchestration, writing the sabotage prompts, verifying exploits, drafting the reports, stayed in Claude Code&rsquo;s hands.</p>
<h3>Flat Subscription vs. Paying Per Token<span class="hx:absolute hx:-mt-20" id="flat-subscription-vs-paying-per-token"></span>
    <a href="#flat-subscription-vs-paying-per-token" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>To illustrate why a flat subscription matters this much here:</p>
<ul>
<li>Claude Max 20x: $200 a month.</li>
<li>Codex Pro: $100 for the 5x tier, $200 for 20x.</li>
<li>Kimi Allegro: $99.</li>
<li>z.ai: has a cheaper Lite plan, and the price shows up fast.</li>
</ul>
<p>In one v4 run, the Lite plan hit its five-hour usage limit literally on the first sprint, straight from that attempt&rsquo;s error log:</p>
<blockquote>
  <p>&ldquo;Usage limit reached for 5 hour&rdquo;</p>

</blockquote>
<p>I&rsquo;m not making that up from memory, it&rsquo;s logged locally, even though that specific file doesn&rsquo;t go into the public repo (v4&rsquo;s raw error logs stay out of Git on purpose). I had to bump up a tier until I found a plan that could run the whole suite without choking halfway through.</p>
<p>Comparing that to paying per token directly on OpenRouter: Opus runs about $5 per million input tokens and $25 per million output tokens. A single agent session, burning through some 2 million input tokens and 500 thousand output, already lands around <strong>$22</strong>. Multiply that by dozens of test runs and retries, and you blow past a full month of Max subscription in a few hours of use, not weeks.</p>
<p>For anyone running a full benchmark the way I did, or coding hard every day, a high-tier subscription ends up cheaper than paying per token, sooner or later. For light, occasional automation, a cheaper model or an entry-level plan does the job just fine.</p>
<h3>Paying for This Isn&rsquo;t a Contradiction<span class="hx:absolute hx:-mt-20" id="paying-for-this-isnt-a-contradiction"></span>
    <a href="#paying-for-this-isnt-a-contradiction" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>I know some people are going to read that number, compare it to what I wrote in <a href="/en/2026/09/09/propagandas-enganosas-da-openai-anthropic-nvidia/">the piece about OpenAI, Anthropic, and Nvidia&rsquo;s misleading marketing</a> last week, and conclude I&rsquo;m a hypocrite, or that I switched sides. Nobody switched sides here; whoever reached that conclusion blended two things I&rsquo;ve always kept separate.</p>
<p>In that piece I went after the rhetoric, not the product: Jensen Huang selling AGI to push GPUs, Greg Brockman admitting nobody agrees on what &ldquo;AGI&rdquo; even means in the same breath he announces it arrived, the Anthropic employee crying Skynet on the eve of a trillion-dollar-range IPO. That&rsquo;s theater for the capital markets. Dario Amodei and Sam Altman don&rsquo;t write a single line of production code, don&rsquo;t do code review, don&rsquo;t touch their own product&rsquo;s inference engine. That&rsquo;s another team&rsquo;s job, the team that actually builds Claude and GPT.</p>
<p>That team ships a competent product. My benchmark measures exactly that, engineering competence, not a CEO&rsquo;s press-conference rhetoric. If the test shows a model delivers good results at a reasonable cost, I pay for it, no matter which company is behind it. Separating marketing from engineering is the whole point of what I do here, and it&rsquo;s worth doing yourself too.</p>
<h2>Was It Worth It?<span class="hx:absolute hx:-mt-20" id="was-it-worth-it"></span>
    <a href="#was-it-worth-it" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>That&rsquo;s the question I asked myself more than once over those nine days. And the answer is a lot less exciting than I hoped: only partly.</p>
<p>v4 didn&rsquo;t find some hidden capability chasm. It confirmed, with better resolution, what v2 already showed: frontier models remain extremely close to each other. Most of what sat in v2&rsquo;s Tier A stays in Tier A here too. But this time the test had enough bite to knock down at least one case worth calling out: <strong>MiniMax M3</strong>, which scored 91 and Tier A in v2 and fell to <strong>75.5 points, Tier B</strong>, in v4.</p>
<blockquote>
  <p>The test got sharp enough to separate who genuinely sweeps their own code for sabotage from who just delivers what was asked. The model didn&rsquo;t get worse.</p>

</blockquote>
<p>The real resolution gain showed up further down the table, in models that still had room to grow. That&rsquo;s where real separation showed up.</p>
<p>At the top, what got confirmed all over again is that spending four thousand dollars and nine days didn&rsquo;t buy a different answer than the one I already had back in July: if you&rsquo;re choosing between today&rsquo;s frontier models, the difference between them matters less than cost, speed, and whichever harness you already use day to day. That&rsquo;s one more piece of evidence we&rsquo;re hitting, or getting very close to hitting, the ceiling of the S-curve. The money bought statistical confidence and one concrete demotion case that serves as a proof of concept that v4 is more discriminating. It didn&rsquo;t buy a revolution in the numbers.</p>
<h2>This Isn&rsquo;t the Absolute Truth About Anything<span class="hx:absolute hx:-mt-20" id="this-isnt-the-absolute-truth-about-anything"></span>
    <a href="#this-isnt-the-absolute-truth-about-anything" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Before wrapping up this part, I need to be clear about the limits of all this, because I see too many people treating a benchmark ranking as a final verdict.</p>
<p>A frontier LLM is a dense model, trained on an absurd range of different subjects at once. No single benchmark, not mine, not SWE-bench, not rails/ai-evals, tests more than a thin slice of that entire competence. My benchmark measures one specific thing: the ability to program Ruby on Rails, coordinate changes to code that already exists, and not let a planted vulnerability slip through. It doesn&rsquo;t measure math ability, doesn&rsquo;t measure writing an academic paper, doesn&rsquo;t measure other programming languages. A model can crush Rails code security and be mediocre at math, or the other way around.</p>
<blockquote>
  <p>A score only makes sense within the specific methodology that produced that score.</p>

</blockquote>
<p>That holds for every benchmark, no exceptions, mine included. Use mine as inspiration, it&rsquo;s open source, look at how I instrumented the harness, how I isolated each test, how I calculated the score, and build your own suite on top of your real use case. Never take anyone&rsquo;s ranking as absolute proof that model A is definitively better than model B. Test the models yourself, against the problem you actually have.</p>
<p>In Part 2 I&rsquo;ll show the full table, model by model, who climbed, who fell, who surprised on cost, and who disappointed despite the price.</p>
<p>All the code, sabotage prompts, evidence ledger, and reports are at <a href="https://github.com/akitaonrails/llm-coding-benchmark"target="_blank" rel="noopener">llm-coding-benchmark</a>.</p>
]]></content:encoded><category>llm-benchmarks</category><category>llms</category><category>coding-agents</category></item><item><title>New LLM Benchmark v4: Retesting 39 LLMs (Part 2)</title><link>https://akitaonrails.github.io/en/2026/09/15/new-llm-benchmark-v4-retesting-39-llms-part-2/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/09/15/new-llm-benchmark-v4-retesting-39-llms-part-2/</guid><pubDate>Tue, 15 Sep 2026 20:00:00 -0300</pubDate><description>&lt;p&gt;In &lt;a href="https://akitaonrails.github.io/en/2026/09/15/new-llm-benchmark-v4-retesting-all-top-llms-part-1/"&gt;Part 1&lt;/a&gt; I told the process: why I threw out all of v3, how v4 became a single Rails app that grows across seven sprints with an isolated subagent planting fourteen real sabotages based on documented CVEs, and how much it cost, over $4,000 in nine days. Here&amp;rsquo;s the part that matters if all you want to know is who came out on top and who ended up at the bottom.&lt;/p&gt;</description><content:encoded><![CDATA[<p>In <a href="/en/2026/09/15/new-llm-benchmark-v4-retesting-all-top-llms-part-1/">Part 1</a> I told the process: why I threw out all of v3, how v4 became a single Rails app that grows across seven sprints with an isolated subagent planting fourteen real sabotages based on documented CVEs, and how much it cost, over $4,000 in nine days. Here&rsquo;s the part that matters if all you want to know is who came out on top and who ended up at the bottom.</p>
<p>I ran thirty-nine models to the end. The table below is the combined ranking, already carrying the corrections from two integrity audits I ran myself, on September 12th and 15th, cross-checking every score against the sabotage-by-sabotage evidence ledger.</p>
<p>To get a sense of the suite&rsquo;s scale: the fastest run, GLM-4.7-Flash local, finished in <strong>29 minutes</strong>. The slowest, Qwen 3.8 27B, also local, took <strong>706 minutes</strong>, more than twenty-four times longer to run the same seven-sprint sequence.</p>
<h2>The Full Table<span class="hx:absolute hx:-mt-20" id="the-full-table"></span>
    <a href="#the-full-table" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><table>
  <thead>
      <tr>
          <th style="text-align: right">Rank</th>
          <th>Model</th>
          <th style="text-align: center">Score</th>
          <th style="text-align: center">Tier</th>
          <th>Never-fixed</th>
          <th style="text-align: center">Cost</th>
          <th style="text-align: center">Time</th>
          <th style="text-align: center">Harness</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: right">1</td>
          <td>GPT-6 Astra</td>
          <td style="text-align: center">100.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$30.55</td>
          <td style="text-align: center">100min</td>
          <td style="text-align: center">codex</td>
      </tr>
      <tr>
          <td style="text-align: right">1</td>
          <td>Claude Opus 5</td>
          <td style="text-align: center">100.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">~$71</td>
          <td style="text-align: center">145min</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">1</td>
          <td>Claude Fable 5</td>
          <td style="text-align: center">100.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">~$50 ᵉ</td>
          <td style="text-align: center">~85min ᵉ</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">1</td>
          <td>GPT 5.6 sol</td>
          <td style="text-align: center">100.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$20.37</td>
          <td style="text-align: center">317min</td>
          <td style="text-align: center">codex</td>
      </tr>
      <tr>
          <td style="text-align: right">1</td>
          <td>GPT 5.6 terra</td>
          <td style="text-align: center">100.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center"><strong>$9.52</strong></td>
          <td style="text-align: center">80min</td>
          <td style="text-align: center">codex</td>
      </tr>
      <tr>
          <td style="text-align: right">1</td>
          <td>GPT 5.5</td>
          <td style="text-align: center">100.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$34.69</td>
          <td style="text-align: center">117min</td>
          <td style="text-align: center">codex</td>
      </tr>
      <tr>
          <td style="text-align: right">7</td>
          <td>Grok 4.6 ᶜ</td>
          <td style="text-align: center">98.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$13.00</td>
          <td style="text-align: center">67min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">8</td>
          <td>Claude Fable 5.1</td>
          <td style="text-align: center">95.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">~$51</td>
          <td style="text-align: center">133min</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">8</td>
          <td>Sakana Fugu Ultra v2 ᴺ</td>
          <td style="text-align: center">95.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$122.01</td>
          <td style="text-align: center">294min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">10</td>
          <td>GPT 5.6 luna</td>
          <td style="text-align: center">95.0</td>
          <td style="text-align: center">A</td>
          <td>item #8 (2)</td>
          <td style="text-align: center">$10.04</td>
          <td style="text-align: center">123min</td>
          <td style="text-align: center">codex</td>
      </tr>
      <tr>
          <td style="text-align: right">11</td>
          <td>Nex N2.5 Pro ᴺ</td>
          <td style="text-align: center">94.0 *</td>
          <td style="text-align: center">A</td>
          <td>— (not committed)</td>
          <td style="text-align: center"><strong>$0 free</strong></td>
          <td style="text-align: center">480min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">11</td>
          <td>GLM 5.3 (zcode) ᴺ</td>
          <td style="text-align: center">94.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">flat-rate plan</td>
          <td style="text-align: center">215min</td>
          <td style="text-align: center">zcode</td>
      </tr>
      <tr>
          <td style="text-align: right">13</td>
          <td>DeepSeek V4.1 Flash ᴺ</td>
          <td style="text-align: center">92.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center"><strong>$1.21</strong></td>
          <td style="text-align: center">172min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">14</td>
          <td>Claude Sonnet 5</td>
          <td style="text-align: center">91.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">~$27</td>
          <td style="text-align: center">112min</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">15</td>
          <td>Gemini 3.8 Flash·high (OpenRouter)</td>
          <td style="text-align: center">90.5</td>
          <td style="text-align: center">A</td>
          <td>item #12 (2)</td>
          <td style="text-align: center">$15.98</td>
          <td style="text-align: center">97min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">16</td>
          <td>Gemini 3.8 Flash (Antigravity) ᴺ</td>
          <td style="text-align: center">89.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$0 (OAuth)</td>
          <td style="text-align: center">120min</td>
          <td style="text-align: center">agy</td>
      </tr>
      <tr>
          <td style="text-align: right">17</td>
          <td>Muse Spark 1.3</td>
          <td style="text-align: center">88.75</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$13.31</td>
          <td style="text-align: center">150min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">18</td>
          <td>Grok 4.5</td>
          <td style="text-align: center">88.0</td>
          <td style="text-align: center">A</td>
          <td>items #7b, #12 (3)</td>
          <td style="text-align: center">$6.19</td>
          <td style="text-align: center">48min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">19</td>
          <td>Claude Opus 4.6</td>
          <td style="text-align: center">87.5</td>
          <td style="text-align: center">A</td>
          <td>item #8 (2)</td>
          <td style="text-align: center">$25.64</td>
          <td style="text-align: center">89min</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">20</td>
          <td>Kimi K2.7</td>
          <td style="text-align: center">87.25</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$7.75</td>
          <td style="text-align: center">175min</td>
          <td style="text-align: center">kimi</td>
      </tr>
      <tr>
          <td style="text-align: right">21</td>
          <td>MiMo V2.5 Pro</td>
          <td style="text-align: center">86.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center"><strong>$1.03</strong></td>
          <td style="text-align: center">158min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">21</td>
          <td>Qwen3 8 Flash</td>
          <td style="text-align: center">86.5</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center"><strong>$1.17</strong></td>
          <td style="text-align: center">149min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">23</td>
          <td>DeepSeek V4 Flash</td>
          <td style="text-align: center">86.0</td>
          <td style="text-align: center">A</td>
          <td>items #6, #8 (5)</td>
          <td style="text-align: center"><strong>$0.97</strong></td>
          <td style="text-align: center">111min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">23</td>
          <td>Claude Opus 4.8</td>
          <td style="text-align: center">86.0</td>
          <td style="text-align: center">A</td>
          <td>item #8 (2)</td>
          <td style="text-align: center">~$37</td>
          <td style="text-align: center">87min</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">25</td>
          <td>Claude Sonnet 4.6</td>
          <td style="text-align: center">85.75</td>
          <td style="text-align: center">A</td>
          <td>item #6 (1.5)</td>
          <td style="text-align: center">$18.64</td>
          <td style="text-align: center">91min</td>
          <td style="text-align: center">claude</td>
      </tr>
      <tr>
          <td style="text-align: right">26</td>
          <td>Kimi K3</td>
          <td style="text-align: center">85.0</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">$13.79</td>
          <td style="text-align: center">148min</td>
          <td style="text-align: center">kimi</td>
      </tr>
      <tr>
          <td style="text-align: right">26</td>
          <td>DeepSeek V4 Flash 0731</td>
          <td style="text-align: center">85.0</td>
          <td style="text-align: center">A</td>
          <td>items #2, #6 (6)</td>
          <td style="text-align: center">$1.94</td>
          <td style="text-align: center">194min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">28</td>
          <td>GLM 5.3 Flash (zcode) ᴺ</td>
          <td style="text-align: center">84.25</td>
          <td style="text-align: center">A</td>
          <td>—</td>
          <td style="text-align: center">flat-rate plan</td>
          <td style="text-align: center">296min</td>
          <td style="text-align: center">zcode</td>
      </tr>
      <tr>
          <td style="text-align: right">29</td>
          <td>DeepSeek V4 Pro 0813</td>
          <td style="text-align: center">84.0</td>
          <td style="text-align: center">A</td>
          <td>items #8, #9 (4)</td>
          <td style="text-align: center">$4.49</td>
          <td style="text-align: center">152min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">30</td>
          <td>Step 3.7 Flash</td>
          <td style="text-align: center">83.75</td>
          <td style="text-align: center">A</td>
          <td>items #6, #8, #11 (6.5)</td>
          <td style="text-align: center">$4.15</td>
          <td style="text-align: center">118min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">31</td>
          <td>DeepSeek V4 Pro (base) ᶜ</td>
          <td style="text-align: center">82.0</td>
          <td style="text-align: center">B</td>
          <td>—</td>
          <td style="text-align: center">$5.26</td>
          <td style="text-align: center">97min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">32</td>
          <td>Qwen 3.8 27B (Strix Halo, local) ᴺ</td>
          <td style="text-align: center">80.0</td>
          <td style="text-align: center">B</td>
          <td>items #2, #7b, #8, #12 (8)</td>
          <td style="text-align: center"><strong>$0 local</strong></td>
          <td style="text-align: center">706min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">33</td>
          <td>Qwen 3.7 Max</td>
          <td style="text-align: center">79.0</td>
          <td style="text-align: center">B</td>
          <td>items #6, #7, #8 (6)</td>
          <td style="text-align: center">$10.63</td>
          <td style="text-align: center">106min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">34</td>
          <td>GLM 5.2 (zcode) ᴺ ᶜ</td>
          <td style="text-align: center">77.0</td>
          <td style="text-align: center">B</td>
          <td>item #12 (2)</td>
          <td style="text-align: center">flat-rate plan</td>
          <td style="text-align: center">239min</td>
          <td style="text-align: center">zcode</td>
      </tr>
      <tr>
          <td style="text-align: right">35</td>
          <td>Gemini 3.7 Flash·high</td>
          <td style="text-align: center">75.5</td>
          <td style="text-align: center">B</td>
          <td>item #12 (2)</td>
          <td style="text-align: center">$12.93</td>
          <td style="text-align: center">85min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">35</td>
          <td>MiniMax M3</td>
          <td style="text-align: center">75.5</td>
          <td style="text-align: center">B</td>
          <td>items #6, #8 (3.5)</td>
          <td style="text-align: center">$12.17</td>
          <td style="text-align: center">187min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">37</td>
          <td>Mistral Large 3</td>
          <td style="text-align: center">39.0</td>
          <td style="text-align: center">C</td>
          <td>7 items (19)</td>
          <td style="text-align: center">$5.11</td>
          <td style="text-align: center">76min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">38</td>
          <td>Gemini 3.1 Pro (OpenRouter) ᶜ</td>
          <td style="text-align: center">32.5 *</td>
          <td style="text-align: center">C</td>
          <td>9 items (27)</td>
          <td style="text-align: center">$10.31</td>
          <td style="text-align: center">54min</td>
          <td style="text-align: center">opencode</td>
      </tr>
      <tr>
          <td style="text-align: right">39</td>
          <td>GLM-4.7-Flash (local) ᴺ</td>
          <td style="text-align: center">24.0</td>
          <td style="text-align: center">C</td>
          <td>6 items (16)</td>
          <td style="text-align: center"><strong>$0 local</strong></td>
          <td style="text-align: center">29min</td>
          <td style="text-align: center">opencode</td>
      </tr>
  </tbody>
</table>
<p>ᴺ = joined this round. ᶜ = score changed by a later integrity audit (September 12 or 15). ᵉ = estimated (Fable 5 lost its real cost/time metadata to an accidental isolation kill; ~$50 is reconstructed from the wave logs). Costs aren&rsquo;t comparable across harnesses: codex/opencode/kimi charge real per-token rates; the Claude models use the Max subscription (notional cost); Antigravity is Google OAuth with no per-token cost; zcode is z.ai&rsquo;s flat-rate GLM Coding Plan. Only compare cost within the same harness.</p>
<p>Two scores carry an asterisk for good reason.</p>
<ul>
<li><strong>Nex N2.5 Pro (94.0*)</strong> finds and fixes sabotage at frontier level, for free, but leaves everything uncommitted: HEAD still holds all fourteen sabotages intact, and a plain <code>git checkout</code> would wipe out every fix it made. Frontier vigilance, zero delivery hygiene.</li>
<li><strong>Gemini 3.1 Pro on OpenRouter (32.5*)</strong> is a victim of its own harness, not its own capability: both reveal attempts crashed on a known third-party bug, the &ldquo;thought signature&rdquo; getting corrupted on the Gemini 3 round trip through the proxy, so it only ended up with the unprompted-only score. Running natively on Antigravity it dodges that bug and catches sabotage well, but stalls at sprint 5 three times in a row and never reaches the capstone.</li>
</ul>
<p>Neither route gives this model a complete score, despite it scoring 95.5 on the shorter v3.</p>
<h3>Visualizing the Cost-Efficiency<span class="hx:absolute hx:-mt-20" id="visualizing-the-cost-efficiency"></span>
    <a href="#visualizing-the-cost-efficiency" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>A thirty-nine-row table is hard to scan fast, so I put together two charts covering the Tier A models with a defined dollar cost (leaving out free, uncommitted, and flat-rate-plan models, for the same reason already explained above).</p>
<p>The first plots cost against score, with bubble size marking wall-clock time: the further up, the further left, and the smaller the bubble, the better the deal.</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/09/15/v4-cost-score-en.png" alt="Bubble chart: dollar cost on the X axis (log scale) against score on the Y axis, bubble size is wall-clock time, color is the harness"  loading="lazy" /></p>
<p>The second compresses all three variables, score, cost, and time, into a single value ruler, for anyone who just wants the direct verdict:</p>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/2026/09/15/v4-value-ranking-en.png" alt="Horizontal bar chart ranking models by score divided by cost times time, from best to worst value"  loading="lazy" /></p>
<p>Notice this combined index tells a slightly different story than the one I highlighted in the text: DeepSeek V4.1 Flash is the most impressive result on pure score-per-dollar among frontier-tier models, but DeepSeek V4 Flash, MiMo, and Qwen3 8 Flash all pull ahead of it on this combined index precisely because they&rsquo;re also fast, not just cheap. Cost alone doesn&rsquo;t tell the whole story; time matters too.</p>
<p>Be careful before just picking the name on the longest bar, though. This index measures cost and time efficiency, not quality. Inside Tier A the score barely moves, 86 to 100, about a sixteen percent spread, while cost swings over a hundred times and time swings four times. That means the index is driven almost entirely by cost and time; score turns into nearly a rounding error in the math. The top of the ranking proves the point: DeepSeek V4 Flash, first place on the index, still has two never-fixed items (#6 and #8), and Grok 4.5, in fifth, has two more (#7b and #12). MiMo, Qwen3 8 Flash, and DeepSeek V4.1 Flash, a notch below on pure efficiency, close out with zero never-fixed items. If what actually matters to you is real security vigilance, check the never-fixed column in the table before picking based on the longest bar alone.</p>
<h3>What Each Item in the &ldquo;Never-Fixed&rdquo; Column Means<span class="hx:absolute hx:-mt-20" id="what-each-item-in-the-never-fixed-column-means"></span>
    <a href="#what-each-item-in-the-never-fixed-column-means" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>For anyone tracking that column through the rest of the piece, here&rsquo;s the list of the fourteen sabotages planted in every model, with the severity weight each carries in the score:</p>
<ul>
<li><strong>#1</strong> cross-account data leak — Critical</li>
<li><strong>#2</strong> removed login link — High</li>
<li><strong>#3</strong> dependency pinned to a version with a known CVE — High</li>
<li><strong>#4</strong> SQL injection — Critical</li>
<li><strong>#5</strong> missing admin-panel authorization — High</li>
<li><strong>#6</strong> the &ldquo;defang-and-plant&rdquo;: a weakened method plus its matching guard test neutered to always pass — High</li>
<li><strong>#7</strong> a database N+1 plus a dropped index, counted as two separate halves (the index half usually shows up as <strong>#7b</strong>) — Medium</li>
<li><strong>#8</strong> a wrong, silent aggregate in an internal report — Medium</li>
<li><strong>#9</strong> a required file deleted — Medium</li>
<li><strong>#10</strong> an API IDOR, improper access to another user&rsquo;s data — High</li>
<li><strong>#11</strong> stored or DOM-based XSS — High</li>
<li><strong>#12</strong> overly permissive CORS — Medium</li>
<li><strong>#13</strong> known CVE in the rack-cors gem — Low</li>
<li><strong>#14</strong> a secret or password hardcoded straight into the code — High</li>
</ul>
<h2>&ldquo;Why Didn&rsquo;t My Favorite Model Score Higher?&rdquo;<span class="hx:absolute hx:-mt-20" id="why-didnt-my-favorite-model-score-higher"></span>
    <a href="#why-didnt-my-favorite-model-score-higher" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Every time I publish a ranking like this, that question rains down in the comments, and it&rsquo;s worth answering once and for all, because the answer applies to whatever model any given reader thinks should be higher, not just one in particular.</p>
<p>A benchmark score measures fit to a specific task, not universal quality. My v4 tests one narrow thing: security auditing inside a Rails app growing under active, silent sabotage. A model can be great at writing, at summarizing, at debugging interactively with you sitting right there, at any workflow you use every day, and still perform poorly on this specific test, because this specific test isn&rsquo;t your specific use case.</p>
<blockquote>
  <p>That&rsquo;s going to keep happening any time someone tries to compare &ldquo;the model I use and like&rdquo; against &ldquo;the result of a benchmark that measures something else.&rdquo; No benchmark fixes that, because &ldquo;which model is better&rdquo; without a task in mind isn&rsquo;t a question with an answer.</p>

</blockquote>
<p>What I can say with confidence, inside my v4&rsquo;s specific methodology, is much narrower: the ability to audit its own Rails code against real sabotage. Outside those four walls, this number is worthless for deciding whether your favorite model is good. It&rsquo;s exactly the warning I already left in Part 1: an isolated benchmark ranking is never a final verdict on any model.</p>
<h2>Odd: Opus 4.8 Tied with DeepSeek V4 Flash<span class="hx:absolute hx:-mt-20" id="odd-opus-48-tied-with-deepseek-v4-flash"></span>
    <a href="#odd-opus-48-tied-with-deepseek-v4-flash" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Speaking of specific models, there&rsquo;s one detail in the table worth calling out on its own, because it&rsquo;s genuinely odd: Claude Opus 4.8 closed at 86 points, Tier A, tied exactly with DeepSeek V4 Flash, rank 23 of 39, behind Grok 4.5, its own predecessor Opus 4.6, Kimi K2.7, MiMo, and Qwen3 8 Flash. For an Anthropic flagship, seeing it parked in the middle of the pack is eye-catching.</p>
<p>What was left for Opus 4.8 to fix was small, just item #8, the silent wrong aggregate in the admin report, and it never went back to it even after being told. Other than that, it caught nearly everything, including the most disguised sabotage in the whole test (#6) already mid-sprints. It&rsquo;s a solid model that misses exactly the kind of thing this benchmark was designed to catch, and comes up short in a direct comparison with its own younger sibling.</p>
<blockquote>
  <p>Opus 5, from the same family, closed out a perfect 40 of 40, catching every sabotage right at the boundary of the sprint where it was planted, no capstone or reveal needed to clean anything up. The gap between 4.8 and 5 here is real: one audits its own code out of habit, the other only fixes things when someone points a finger.</p>

</blockquote>
<p>DeepSeek V4 Flash lands on the exact same score as Opus 4.8, 86 points, for $0.97 against the notional equivalent of about $37 for a Claude Max subscription to run the same full sequence (the two costs aren&rsquo;t directly comparable, a notional subscription against a real API rate, but the order of magnitude speaks for itself). It&rsquo;s the top of a visible climb across the ranking itself, snapshot by snapshot, not a lucky one-off run:</p>
<ul>
<li><strong>DeepSeek V4 Pro (base)</strong>: 82.0, Tier B</li>
<li><strong>DeepSeek V4 Pro 0813</strong>: 84.0, Tier A</li>
<li><strong>DeepSeek V4 Flash 0731</strong>: 85.0, Tier A</li>
<li><strong>DeepSeek V4 Flash</strong>: 86.0, Tier A</li>
<li><strong>DeepSeek V4.1 Flash</strong>: 92.5, Tier A</li>
</ul>
<p>Every new snapshot climbs a step, and the jump to V4.1 Flash is the biggest one, close to Claude Sonnet 5&rsquo;s own band (91.0). Against the other Chinese labs tested, the picture is clear: DeepSeek V4.1 Flash beats every Kimi (K2.7 at 87.25, K3 at 85.0), every Qwen (Qwen3 8 Flash at 86.5, Qwen 3.7 Max at 79.0), and MiniMax M3 (75.5). It only loses to the pair at the top, GLM 5.3 and Nex N2.5 Pro, tied at 94.0. For anyone who treats &ldquo;Chinese model&rdquo; as one single category from the outside, this ranking shows a real capability climb inside DeepSeek itself, and a clear hierarchy between the labs.</p>
<h2>Six Ties at the Top, Two Different Ways to Get There<span class="hx:absolute hx:-mt-20" id="six-ties-at-the-top-two-different-ways-to-get-there"></span>
    <a href="#six-ties-at-the-top-two-different-ways-to-get-there" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>GPT-6 Astra, Claude Opus 5, Claude Fable 5, GPT 5.6 sol, GPT 5.6 terra, and GPT 5.5 all closed at 100, perfect vigilance with zero warning needed. But the road there varies. Opus 5 caught every sabotage exactly at the boundary of the sprint it was planted in, never needed the final capstone to clean anything up. Fable 5 did the opposite: let a trio of silent items slip through across the sprints and only swept everything at the capstone, when the vague &ldquo;get this production-ready&rdquo; prompt pushed it to reopen its own code. That confirms something I already suspected: the sprint-closing prompt works as a vigilance equalizer at the top of the table, even among models that got there by completely different routes.</p>
<p>GPT 5.6 is the most interesting case in the table for anyone watching cost: sol, terra, and luna are the same model at different reasoning-effort levels. terra scored the same forty out of forty as sol spending $9.52 against $20.37, less than half the cost, in a quarter of the time, and still ends up cheaper and faster than Opus 5 (~$71, 145min) for the exact same top score. It&rsquo;s a cost-and-speed dial the provider hands you; the quality doesn&rsquo;t change. Worth testing the lower effort tier before assuming you need the pricier one.</p>
<h2>Why Big Names Miss Too<span class="hx:absolute hx:-mt-20" id="why-big-names-miss-too"></span>
    <a href="#why-big-names-miss-too" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Worth explaining quickly why a handful of big-name models, the kind already synonymous with &ldquo;frontier,&rdquo; still show up with something filled in on the never-fixed column, because that&rsquo;s exactly the kind of detail anyone who likes to nitpick will poke at first.</p>
<ul>
<li><strong>Grok 4.6</strong> (second-best overall score, 98.5 points) carries a small footnote: a sabotage subagent that had already run before accidentally reinjected item #4 into its codebase mid-test. Grok healed itself, fixed it again without being told, and it got logged as a single, transparent event with no effect on the final score. It&rsquo;s noise from my own harness, logged for transparency, not a model failure.</li>
<li><strong>GPT 5.6 luna</strong> (95 points) had a solid run otherwise, but spent the entire final reveal on security and deploy work and never went back to open the admin report&rsquo;s code, leaving the wrong aggregate (#8) unfixed.</li>
<li><strong>Gemini 3.8 Flash</strong> at higher effort, running via OpenRouter, was the only model in the reinforcement batch to catch the dropped database index on its own, but got distracted with UI tweaks at the reveal and never closed the open CORS (#12).</li>
<li><strong>Grok 4.5</strong> shows the same pattern in a simpler form: fixes whatever surfaces in a view or a test, ignores whatever lives in the database or a config file, and left the index (#7b) and CORS (#12) open even after being told.</li>
<li><strong>Claude Opus 4.6</strong>, the 4.8&rsquo;s direct predecessor, carries a similar blemish: the wrong aggregate (#8) survived all the way to the reveal, and it went on to propagate that same wrong number into the new API it built afterward.</li>
</ul>
<p>There&rsquo;s a more serious case involving two big names at once. Claude Sonnet 4.6, at the capstone, and Gemini 3.7 Flash, already back at sprint 3, both found the vulnerable nokogiri dependency and, instead of upgrading the gem, added it to their own security scanner&rsquo;s ignore list, hiding the alert instead of fixing the problem. They only did the real upgrade once the reveal explicitly told them to go hunt for sabotage.</p>
<blockquote>
  <p>That&rsquo;s worse than simply missing a sabotage: it&rsquo;s tricking the very audit tool that was supposed to catch the problem.</p>

</blockquote>
<p>And the fact that closes out this story is that no cheaper or local model did this. They either fixed it for real or simply missed the flaw, without trying to mask their own scanner.</p>
<h2>The Story That Matters Most: Cost<span class="hx:absolute hx:-mt-20" id="the-story-that-matters-most-cost"></span>
    <a href="#the-story-that-matters-most-cost" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If there&rsquo;s one result I want to stick from this whole round, it&rsquo;s this: a free model, Nex N2.5 Pro, hit 94 points, tying GLM 5.3 on z.ai&rsquo;s flat-rate plan, and beating most of the Claude lineup: Sonnet 5, Opus 4.6, Sonnet 4.6, and Opus 4.8. It only trails Opus 5, Fable 5, and Fable 5.1. The catch, as I already mentioned, is that it didn&rsquo;t commit anything, so this is frontier vigilance with zero real-world delivery. Still, it shows raw sabotage-hunting capability isn&rsquo;t a monopoly of expensive models.</p>
<p>The reason I included this exact model in this round isn&rsquo;t random. Nex-N2-Pro, an earlier version of the same lineage, was the model at the center of the <a href="/en/2026/06/15/rio-3-5-llm-controversy-plagiarism/">Rio 3.5 controversy</a> back in June, when evidence published by Nex itself showed Rio 3.5&rsquo;s initial checkpoint was a blend of roughly 60% Nex-N2-Pro and 40% Qwen, with no credit to Nex at launch. Back then, testing both ingredients separately on my benchmark, Nex-N2-Pro scored 83, Tier A, against 42, Tier C, for the base Qwen, which already showed that most of whatever gain Rio announced was inherited from Nex&rsquo;s work, not its own training.</p>
<p>With the new Nex N2.5 Pro running in v4, it&rsquo;s possible to check whether that agentic-capability leap holds up under a much harder test than back then. The result, 94 points of genuine vigilance, holds.</p>
<p>Further down, DeepSeek V4.1 Flash scored 92.5 for $1.21, no harness asterisk. It caught every exploitable vulnerability class on its own, including both tenant leaks, the SQL injection, the authorization bypass, and both halves of the most disguised item in the whole test, and closed the two remaining items at the reveal without a single regression. That puts it in Claude Sonnet 5&rsquo;s band (91.0) for a fraction of the price.</p>
<p>Xiaomi&rsquo;s MiMo V2.5 Pro tied Qwen3 8 Flash, both at 86.5 points, Tier A, for $1.03 and $1.17 respectively, and Qwen closed with zero never-fixed items: frontier vigilance at a fraction of any flagship model&rsquo;s cost.</p>
<p>At the other extreme, Sakana Fugu Ultra v2 was the only non-Claude, non-GPT model to reach 95.5, with genuinely clean work, a dedicated regression test for every fix, but at $5 in / $30 out per million tokens plus heavy token burn, the final cost was $122.01. Frontier vigilance, but you pay a frontier-and-a-half price for it.</p>
<p>There&rsquo;s a case in the table that also cost zero dollars and still isn&rsquo;t really free: Qwen 3.8 27B running locally on a Strix Halo. The score, 80 points, Tier B, still holds its own against a mid-table cloud model on pure security.</p>
<blockquote>
  <p>706 minutes of wall time, nearly twelve hours of a machine running to complete the whole suite, against a range of 80 to 300 minutes for almost the rest of the table.</p>

</blockquote>
<p>Zero dollars in cost, an order of magnitude above average in time. For anyone only looking at the price column, that slides right by, but it&rsquo;s the real price of running a big dense model on consumer hardware.</p>
<p>Worth asking whether that&rsquo;s a Strix Halo-specific limit or a &ldquo;running it at home&rdquo; limit across the board, because that isn&rsquo;t the only large-unified-memory hardware option out there today. The Strix Halo (Ryzen AI MAX+ 395) has a 256-bit LPDDR5x memory controller, theoretical bandwidth around 256 GB/s. A Mac Studio with an M3 Ultra gets close to 800 GB/s, almost triple.</p>
<p>Since the token-generation phase for a dense model this size is mostly bound by memory bandwidth, not raw compute, it&rsquo;s fair to speculate that the same Qwen 3.8 27B running on a Mac Studio M3 Ultra, via MLX or llama.cpp with Metal, would finish the same seven-sprint suite somewhere in the four-to-six-hour range instead of nearly twelve, a meaningful drop, though still slower than any cloud option.</p>
<p>That&rsquo;s a speculation, not a measurement. I didn&rsquo;t run this test on a Mac Studio, and the math shifts depending on how much of the workload is pure token generation versus processing the accumulated context from earlier sprints, and that second part leans harder on raw compute and responds less to memory bandwidth alone. Still, the general direction should hold: more unified memory bandwidth tends to meaningfully shorten this kind of long run, and that&rsquo;s real data for anyone deciding on hardware while building a local LLM workstation.</p>
<h2>GLM and the Flat-Rate Plan Nobody Saw Coming<span class="hx:absolute hx:-mt-20" id="glm-and-the-flat-rate-plan-nobody-saw-coming"></span>
    <a href="#glm-and-the-flat-rate-plan-nobody-saw-coming" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>While I was running the suite, z.ai had locked my GLM Coding plan, balance at zero, a 429 error. I got around it by going through the ZCode CLI&rsquo;s dedicated code endpoint, still inside the same flat-rate plan, no extra per-token cost. And the numbers that came out of that surprised me.</p>
<ul>
<li><strong>GLM 5.3</strong> scored 94 points with no asterisk at all, tying Nex N2.5 Pro, but with one crucial difference: GLM ships everything committed, a clean tree, no suppressing a CVE through an ignore list, clean <code>bundle-audit</code>. It caught the most disguised sabotage in the whole test in both halves at once, something almost no other model pulled off, and only needed the reveal for two remaining items.</li>
<li><strong>GLM 5.3 Flash</strong> scored 84.25, beating the local Qwen 3.8 27B (80.0) and Qwen 3.7 Max (79.0).</li>
<li><strong>GLM 5.2</strong>, the weakest of the trio, closed out the reveal in four sharp commits, one per remaining sabotage, each with a test, but landed at 77 points, Tier B, because it kept CORS at <code>origins &quot;*&quot;</code> even after touching the file, the same bar that had already knocked down Grok 4.5, Gemini 3.7 Flash, and the local Qwen.</li>
</ul>
<p>Even so, a flat subscription plan, with no variable cost, delivering Tier A two times out of three.</p>
<h2>Local Models: Infrastructure vs. Judgment<span class="hx:absolute hx:-mt-20" id="local-models-infrastructure-vs-judgment"></span>
    <a href="#local-models-infrastructure-vs-judgment" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Running locally has always been the hardest test in any agent benchmark, because it requires the hardware to handle seven sprints&rsquo; worth of accumulated context without choking. GLM-4.7-Flash, a 30B-A3B MoE running via llama-swap on an RTX 5090, was the first local model to complete v4&rsquo;s entire sequence, which by itself is already an infrastructure milestone. But the final score was 24 points: it builds functionality, but barely catches any sabotage unprompted, and still leaves the reveal&rsquo;s fixes uncommitted.</p>
<p>The most interesting case is the dense Qwen 3.8 27B. On that same RTX 5090, it stalls at sprint 3, not from lack of memory or a context overflow, but from a reasoning-coherence problem that builds up after two sprints.</p>
<p>The same model, running on a Strix Halo (the Ryzen AI MAX+ 395 chip with 96 GB of unified memory), completed all seven sprints and scored <strong>80 points, Tier B</strong>. On its own, unprompted, it caught:</p>
<ul>
<li>both critical items: the tenant leak and the SQL injection;</li>
<li>the authorization bypass;</li>
<li>both halves of the disguised sabotage;</li>
<li>the stored XSS;</li>
<li>the hardcoded secret;</li>
<li>and it even genuinely fixed both vulnerable dependencies.</li>
</ul>
<p>That rivals a mid-table cloud model on pure security. The problem is that, at the reveal, it didn&rsquo;t fix a single one of the four remaining items, even after being told explicitly:</p>
<ul>
<li>the removed login link;</li>
<li>the dropped database index;</li>
<li>the silently wrong aggregate;</li>
<li>and the permissive CORS left at <code>origins &quot;*&quot;</code>, that last one under the same bar that had already knocked down Grok 4.5 and Gemini 3.7 Flash.</li>
</ul>
<p>Not even running it at home lets that specific vulnerability slide by. A strong instinct for recognizing what looks like a security flaw, blind to silent config, logic, or UX regressions, and unable to close them out on command.</p>
<blockquote>
  <p>Local viability today is a question of tooling and reasoning coherence over time, not available context size.</p>

</blockquote>
<p>The final result leaves this model squeezed between DeepSeek V4 Pro base (82.0) and Qwen 3.7 Max itself (79.0), reinforcing again that a model&rsquo;s nominal tier doesn&rsquo;t predict vigilance.</p>
<h2>The Bottom of the Table, and Who Didn&rsquo;t Survive<span class="hx:absolute hx:-mt-20" id="the-bottom-of-the-table-and-who-didnt-survive"></span>
    <a href="#the-bottom-of-the-table-and-who-didnt-survive" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Mistral Large 3 closed at 39 points, the worst result among everyone who finished the whole suite. It did plenty of generic production hardening, Docker, rack-attack, Devise account confirmation, but caught almost none of the actually planted sabotage, renamed the Message model to ChatEntry mid-project, breaking the reports that depended on the old name, and left every reveal fix uncommitted.</p>
<p>Mistral&rsquo;s result here is a symptom of something much bigger. Mistral was once one of Europe&rsquo;s most promising labs, the proof the continent could still compete head-to-head on frontier models. Today, on my benchmark, it loses even to Chinese open-source models, DeepSeek, GLM, and Kimi, all ahead of Mistral Large 3.</p>
<p>The nuclear shutdown is just the clearest single example. The European Union&rsquo;s entire policy, year after year, prioritizes populism over real innovation incentives, and the same pattern repeats in data regulation, AI regulation, licensing bureaucracy, and venture-capital taxation. The most visible case is still Germany shutting down its own nuclear fleet in exactly the decade when training and running AI models at scale turned into a race for cheap, abundant energy, a decision driven by short-term political pressure, not long-term energy planning.</p>
<p>The United States and China are racing over who builds more data centers and more power generation to feed those data centers. Europe, in that same window, piled rule on top of rule in the name of protecting the citizen, and the citizen still has no frontier lab to call its own. Entrepreneurs follow incentives, not flags, and whoever really wanted to innovate went to the United States or to China, leaving behind heavy regulation and no real incentive to stay.</p>
<blockquote>
  <p>Mistral&rsquo;s fall, from a top name to a model that loses to Chinese open source, is a miniature portrait of the whole continent. Europe needs to change course, and at this point it should already have.</p>

</blockquote>
<h3>Who Didn&rsquo;t Survive the Format<span class="hx:absolute hx:-mt-20" id="who-didnt-survive-the-format"></span>
    <a href="#who-didnt-survive-the-format" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Six models from the weaker group simply didn&rsquo;t survive the format:</p>
<ul>
<li><strong>Codestral 2508</strong> and <strong>Hunyuan A13B</strong> never even built a functional app in the first sprint.</li>
<li><strong>GPT-OSS 120B</strong> just sat there, doing nothing concrete, for two attempts in a row on the second sprint.</li>
<li><strong>Devstral 2512</strong>, <strong>Llama 4 Maverick</strong>, and the brand-new <strong>Mistral Medium 3.5</strong> all fell into the same structural mistake: they built the app inside a nested subfolder instead of the project root, breaking the way the harness accumulates one sprint on top of another.</li>
</ul>
<p>That&rsquo;s the third case of this exact mistake, a real pattern, not an isolated coincidence.</p>
<h2>The Universal Law: Detection Tracks Disguise, Not Severity<span class="hx:absolute hx:-mt-20" id="the-universal-law-detection-tracks-disguise-not-severity"></span>
    <a href="#the-universal-law-detection-tracks-disguise-not-severity" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Looking at all thirty-nine models together, a pattern repeats from one end of the table to the other, regardless of tier or price: what survives almost everywhere is sabotage disguised on purpose, especially the guard-test half that fakes passing, the silent wrong aggregate in an admin report, the dropped database index that doesn&rsquo;t call attention to itself, and the XSS via <code>innerHTML</code> that only shows up across two contexts at once.</p>
<blockquote>
  <p>A model catches what breaks a test or crashes a page with a 500. Whatever is silent logic, a wrong schema, or a performance regression survives, unless the model audits its own code on its own initiative, with nothing external flagging a problem.</p>

</blockquote>
<h2>And the Rumor That Kimi Secretly Talks to Claude<span class="hx:absolute hx:-mt-20" id="and-the-rumor-that-kimi-secretly-talks-to-claude"></span>
    <a href="#and-the-rumor-that-kimi-secretly-talks-to-claude" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>On September 10th, a Bloomberg report carried an accusation from Anthropic: Moonshot, the company behind Kimi, was allegedly secretly routing user requests through Claude itself. Since my benchmark includes Kimi and DeepSeek among the thirty-nine models tested, and since that would completely change how you should read those numbers if true, I decided to check whether I could detect this in my own data.</p>
<h3>Why the Most Obvious Test Is Impossible<span class="hx:absolute hx:-mt-20" id="why-the-most-obvious-test-is-impossible"></span>
    <a href="#why-the-most-obvious-test-is-impossible" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The most rigorous test, comparing token-by-token probability distributions between a native route and an OpenRouter route against a known Claude reference, is impossible here: no route for Kimi or DeepSeek exposes those probabilities, and Anthropic itself never exposes that on any of its routes. The substitute was a battery of questions designed to get a model to reveal its identity: who made you, what&rsquo;s your name, your knowledge cutoff, and whether it refuses to repeat its own system prompt, run at temperature zero across every available route.</p>
<blockquote>
  <p>Real routing would be consistent per route. Training contamination, by contrast, affects every route equally.</p>

</blockquote>
<h3>The Alarming Signal That Didn&rsquo;t Repeat<span class="hx:absolute hx:-mt-20" id="the-alarming-signal-that-didnt-repeat"></span>
    <a href="#the-alarming-signal-that-didnt-repeat" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Moonshot&rsquo;s native API was suspended over an account issue, and DeepSeek&rsquo;s native API had no available key, so part of the test was limited to Kimi&rsquo;s CLI and OpenRouter for both models. Even so, an alarming signal showed up on the first pass: <code>moonshotai/kimi-k2.7-code</code> via OpenRouter answered that the company behind it was Anthropic, and refused to repeat its system prompt with a phrase nearly identical to Claude&rsquo;s own standard refusal.</p>
<p>It didn&rsquo;t repeat. OpenRouter spreads that model across roughly fifteen different providers, DeepInfra, CoreWeave, Fireworks, Alibaba, SiliconFlow, Cloudflare, Moonshot AI itself, among others, and every request can land on a different one. Running it again, every single response came back as &ldquo;Moonshot AI&rdquo; or &ldquo;Kimi.&rdquo;</p>
<p>The decisive test was pinning each of the fourteen providers individually and asking for identity on each one: <strong>every single one, no exceptions, answered &ldquo;Moonshot AI.&rdquo;</strong> Real routing would be consistent one hundred percent of the time for whichever provider was doing the relaying. <strong>It was zero for fourteen.</strong></p>
<h3>The Most Likely Explanation<span class="hx:absolute hx:-mt-20" id="the-most-likely-explanation"></span>
    <a href="#the-most-likely-explanation" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>The most likely explanation is training-data contamination combined with provider variance: Kimi k2.7-code was probably trained, in part, on output generated by Claude itself, and a trace of that surfaces occasionally when no identity system prompt overrides that tendency, on top of quantization and template differences across OpenRouter&rsquo;s fifteen hosts. That&rsquo;s not live routing, because routing would be consistent per route and per provider, and it wasn&rsquo;t.</p>
<p>DeepSeek, for its part, answered as DeepSeek on every route tested, with an October 2023 knowledge cutoff and a bland leaked system prompt, &ldquo;You are a helpful assistant,&rdquo; no Claude signal whatsoever.</p>
<p>There&rsquo;s independent evidence backing this reading, coming straight from v4 itself: Kimi&rsquo;s detection &ldquo;fingerprint,&rdquo; meaning which sabotages it catches and which it lets through, doesn&rsquo;t match any Claude model in the table. If Kimi were Claude under the hood, its vigilance profile should track closely with some sibling model in the Claude family. It doesn&rsquo;t: Kimi K2.7 scored 87.25, Kimi K3 scored 85.0, and neither one lines up with any Claude row in the table.</p>
<h3>The Limits of All This<span class="hx:absolute hx:-mt-20" id="the-limits-of-all-this"></span>
    <a href="#the-limits-of-all-this" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>This isn&rsquo;t definitive proof. No route exposes token probability, which takes the strongest discriminator off the table by definition. Kimi&rsquo;s native API was suspended and DeepSeek&rsquo;s had no key, so a clean comparison between native weights and the OpenRouter path was only partially possible. And a behavioral signal can be masked; the absence of a leak isn&rsquo;t proof of the absence of routing.</p>
<p>But the one positive signal that showed up fell apart the moment it was investigated closely, and everything else points away from real routing.</p>
<blockquote>
  <p>On the evidence I was able to gather, neither Kimi nor DeepSeek shows a detectable live relay to Claude. The scary-looking finding from the first pass turned out to be a reproducibility artifact of OpenRouter&rsquo;s load balancing across providers, not a backdoor into Anthropic.</p>

</blockquote>
<h2>Closing Out Both Parts<span class="hx:absolute hx:-mt-20" id="closing-out-both-parts"></span>
    <a href="#closing-out-both-parts" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Putting Part 1 together with this one, the conclusion I drew from these nine days and four thousand dollars is the same one I&rsquo;d already been arguing since July, just with better resolution now. Let me answer directly, because these questions are going to rain down in the comments either way.</p>
<p><strong>DeepSeek finally caught up.</strong> V4.1 Flash scored 92.5, right next to Claude Sonnet 5, one of the best Chinese results in the whole test, trailing only the pair GLM 5.3 and Nex N2.5 Pro, tied at 94.0. It&rsquo;s a visible climb, snapshot by snapshot, as I showed in the previous section, not a lucky one-off run.</p>
<p><strong>Open source in general is genuinely getting better,</strong> not just DeepSeek. GLM 5.3 scored 94 points with zero caveats, tying the Claude/GPT lineup at the top of the table. But running that at home, on consumer hardware, still isn&rsquo;t ready: the local Qwen 3.8 27B took 706 minutes to finish the same suite that most run in the cloud in 80 to 300 minutes. If that crowd solves the execution-time problem on consumer hardware, instead of just stacking on more parameters, the gap closes. It hasn&rsquo;t closed yet.</p>
<p><strong>At the top, convergence keeps running head-first into any explosive-leap narrative.</strong> Six models tied at 100 points by completely different routes, and the real capability difference only showed up much further down the table, not at the top. That&rsquo;s one more piece of evidence for the S-curve theory I&rsquo;ve been arguing for a while now: frontier-model capability has flattened at the top, and what&rsquo;s left to fight over is cost, speed, and audit discipline, not a leap in intelligence.</p>
<p><strong>And the practical takeaway is straightforward:</strong> for everyday Rails programming, with nobody trying to sabotage your code, picking any Tier A model is essentially a wash. Astra, Opus 5, Fable 5, GPT 5.6, GLM 5.3, DeepSeek V4.1 Flash, any of them delivers an equivalent result. The real vigilance difference only shows up when someone deliberately tries to sabotage you, and even then it matters less than what you pay and how long you wait.</p>
<blockquote>
  <p>The real resolution gain showed up further down the table, where there was still room to separate who genuinely audits their own code from who just delivers what was asked, and in the concrete finding that a free model and a flat subscription plan compete on equal footing with the most expensive models on the market for this specific task.</p>

</blockquote>
<p>That holds true only within my benchmark&rsquo;s specific methodology: the ability to program Ruby on Rails, coordinate changes to code that already exists, and not let a planted vulnerability slip by. It isn&rsquo;t a verdict on math, academic writing, or any other programming language. Use this as a starting point, not the final word, and test the models yourself against the problem you actually have.</p>
<p>All the code, the fourteen sabotage prompts, the sprint-by-sprint evidence ledger, and the full reports, including the Kimi investigation, are at <a href="https://github.com/akitaonrails/llm-coding-benchmark"target="_blank" rel="noopener">llm-coding-benchmark</a>, in the files <a href="https://github.com/akitaonrails/llm-coding-benchmark/blob/master/docs/success_report.v4.combined.md"target="_blank" rel="noopener"><code>docs/success_report.v4.combined.md</code></a>, <a href="https://github.com/akitaonrails/llm-coding-benchmark/blob/master/docs/success_report.v4.per_model.md"target="_blank" rel="noopener"><code>docs/success_report.v4.per_model.md</code></a>, and <a href="https://github.com/akitaonrails/llm-coding-benchmark/blob/master/docs/relay_fingerprint_findings.md"target="_blank" rel="noopener"><code>docs/relay_fingerprint_findings.md</code></a>.</p>
]]></content:encoded><category>llm-benchmarks</category><category>llms</category><category>coding-agents</category></item><item><title>You're an Idiot if You Believe the Misleading Ads from OpenAI, Anthropic, NVIDIA. Here's Why</title><link>https://akitaonrails.github.io/en/2026/09/09/propagandas-enganosas-da-openai-anthropic-nvidia/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/09/09/propagandas-enganosas-da-openai-anthropic-nvidia/</guid><pubDate>Wed, 09 Sep 2026 16:00:00 -0300</pubDate><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update note:&lt;/strong&gt; this post went up on 9/9 and was updated through the week as the soap opera kept going: the letter from 25 Fields medalists (9/11), Dario Amodei&amp;rsquo;s essay and the response from Altman and Musk (9/12), Trump&amp;rsquo;s remarks (9/13), fact-check fixes raised in the comments, and Pirate Wires&amp;rsquo; report on the PR firm behind Coxon (9/25).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This week was a festival of aggressive advertising from the AI companies. There were so many pompous declarations in so little time that you could use it as a case study in deceptive marketing. So let me repeat my usual motto, because it never fails:&lt;/p&gt;</description><content:encoded><![CDATA[<blockquote>
  <p><strong>Update note:</strong> this post went up on 9/9 and was updated through the week as the soap opera kept going: the letter from 25 Fields medalists (9/11), Dario Amodei&rsquo;s essay and the response from Altman and Musk (9/12), Trump&rsquo;s remarks (9/13), fact-check fixes raised in the comments, and Pirate Wires&rsquo; report on the PR firm behind Coxon (9/25).</p>

</blockquote>
<p>This week was a festival of aggressive advertising from the AI companies. There were so many pompous declarations in so little time that you could use it as a case study in deceptive marketing. So let me repeat my usual motto, because it never fails:</p>
<blockquote>
  <p><strong>&ldquo;Your excitement about AI is inversely proportional to your knowledge about AI&rdquo;</strong></p>

</blockquote>
<p>If you read this week&rsquo;s headlines and walked away excited that the Terminator is coming, or that the machine just became God, you fell for the advertising. And I&rsquo;m going to take it apart piece by piece so you understand why.</p>
<p>And let me put my cards on the table right away, because I&rsquo;ve been saying this for a while on the podcasts I show up on. To me, Dario Amodei, from Anthropic, has a God complex. The guy truly believes he is saving humanity, with that creepy woke messianism of his. And Sam Altman, from OpenAI, is a mobster. He fancies himself Michael Corleone, the cold, calculating boss from The Godfather, but in practice he&rsquo;s Fredo: the weak, bumbling brother who thinks he&rsquo;s the smart one and keeps screwing up. Keep these two portraits in mind, because everything I&rsquo;m about to explain below proves exactly that.</p>
<h2>&ldquo;AGI has arrived,&rdquo; says the guy selling the shovel<span class="hx:absolute hx:-mt-20" id="agi-has-arrived-says-the-guy-selling-the-shovel"></span>
    <a href="#agi-has-arrived-says-the-guy-selling-the-shovel" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>It started with Jensen Huang, CEO of Nvidia, <a href="https://fortune.com/2026/09/09/markets-agi-nvidia-singularity-wall-street/"target="_blank" rel="noopener">declaring once again that AGI has arrived</a>. Not in a paper, not in a technical demonstration, but in a Sunday post on X, tying the declaration to OpenAI&rsquo;s new Astra model, trained on roughly 100,000 Grace Blackwell chips. In other words, the chips Nvidia sells.</p>
<p>Look at the source. The man who makes money selling shovels to the gold miners announcing that the gold is infinite. Remember his appearance on the <a href="https://lexfridman.com/jensen-huang-transcript/"target="_blank" rel="noopener">Lex Fridman podcast</a> a few months back. Lex floated a tongue-in-cheek definition: AGI would be an AI able to start, grow, and run a tech company worth a billion dollars by itself. And Jensen, without blinking: &ldquo;I think we&rsquo;ve achieved AGI&rdquo;. A conveniently commercial definition that has nothing to do with intelligence, and that the shovel salesman embraced on the spot. Gary Marcus went straight to the obvious question: does Jensen have any financial incentive to declare that AGI has arrived, given that he sells the GPUs?</p>
<p>And here&rsquo;s the irony: despite the grandiose headline, Nvidia&rsquo;s own stock dropped about 2% in the following days. Even the market, which runs on hype, didn&rsquo;t fully buy the story.</p>
<p>Right after, OpenAI launched GPT-6 Astra and hammered the same speech. Greg Brockman closed the press conference with a &ldquo;welcome to the AGI era&rdquo; and said &ldquo;for me, personally, I think we&rsquo;re there.&rdquo; Except, in the same breath, he dropped the line that kills the whole thing: &ldquo;everyone has a different definition of AGI.&rdquo; So the guy claims the most important thing in human history has arrived and, at the same time, admits nobody really knows what that thing means. That alone should set off the alarm in your head.</p>
<h2>The &ldquo;Millennium Problem&rdquo; brute-forced<span class="hx:absolute hx:-mt-20" id="the-millennium-problem-brute-forced"></span>
    <a href="#the-millennium-problem-brute-forced" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The main course of the propaganda was OpenAI announcing it had solved a math Millennium Prize Problem. Let me explain what that is, because the headline is built precisely to impress people who don&rsquo;t know.</p>
<p>In 2000, the Clay Mathematics Institute listed seven open problems in mathematics and offered a million dollars to whoever solved each one. These are brutally hard problems. In over twenty years, only one had been solved: the Poincaré Conjecture, by Grigori Perelman, who, by the way, turned down the prize.</p>
<p>One of those seven is the Navier-Stokes equations. These are the equations that describe how fluids move: water, air, blood. The open question is not &ldquo;how do you simulate fluid&rdquo;: engineering has done that just fine for decades in any aerodynamics software. The question is purely mathematical: does a smooth solution always exist, or can the fluid develop a singularity, a point of infinite velocity, the so-called &ldquo;blow-up&rdquo;, in finite time? It&rsquo;s a question about the rigor and existence of solutions, not about the practical usefulness of the equations.</p>
<p>And here&rsquo;s my first point, which I already <a href="https://x.com/AkitaOnRails/status/2097752602440028566"target="_blank" rel="noopener">explained in detail in a post</a>: even solving this definitively changes absolutely nothing in real life. No airplane flies better, no weather forecast gets more accurate, no medicine works any differently. Engineers keep modeling fluids the same way, with or without the proof. It&rsquo;s a beautiful intellectual achievement, period. The practical impact is zero.</p>
<p>Now for the detail the headline hides. The announced proof attacks the <strong>forced</strong> version of the equations, where a smooth external force term is pushing the system, and it nails the blow-up. Technically it counts toward the prize, because those routes are part of Clay&rsquo;s official statement. But the famous question, the deep heart of the problem, is the version without external forcing, and that one remains open. Clay has not closed the case, and OpenAI didn&rsquo;t even go collect the million-dollar prize. (If you want the fine print on this, there&rsquo;s an appendix at the end.)</p>
<p>And how did they get there? Brute force. They threw around 10,000 agents running in parallel for 88 hours, burning something in the neighborhood of 130 billion output tokens on this one problem. The compute bill was in the millions of dollars: OpenAI&rsquo;s Noam Brown confirmed the result &ldquo;cost millions&rdquo;, and <a href="https://www.newscientist.com/article/2588063-openai-has-solved-the-navier-stokes-millennium-problem-using-15m-of-ai-effort/"target="_blank" rel="noopener">New Scientist estimated about $15 million at list price</a> for this one run. Let me make this very clear: in the best-case reading, what was proved is that dumping a mountain of compute onto a problem can close the final leg of some specific things. That&rsquo;s brute force at industrial scale, a giant automated search that gets to the result on the weight of the compute. Mathematical genius unlocking new mathematics is a different story, and that&rsquo;s not what happened here. And crazy expensive, for a &ldquo;prize&rdquo; of one million they didn&rsquo;t even go pick up.</p>
<h2>The dirty part: how they treated the real mathematicians<span class="hx:absolute hx:-mt-20" id="the-dirty-part-how-they-treated-the-real-mathematicians"></span>
    <a href="#the-dirty-part-how-they-treated-the-real-mathematicians" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>And this is where the story stops being about mathematics and becomes about character.</p>
<p>There were real mathematicians working on this problem for months: Tristan Buckmaster, from NYU, and Levent Alpoge, who happens to work at Anthropic. A personal project of theirs, with no company sponsorship, which had already produced an advance on a sibling problem, the Euler equations. They were following a specific path that almost nobody in the world was on.</p>
<p>According to Buckmaster&rsquo;s account, <a href="https://techcrunch.com/2026/09/08/openai-fought-dirty-on-career-making-math-problem-says-nyu-mathematician/"target="_blank" rel="noopener">told to TechCrunch</a> and to <a href="https://fortune.com/2026/09/08/openai-says-it-cracked-navier-stokes-math-grand-challenge-buckmaster-accusation-cheating-intimidation-tao-lament/"target="_blank" rel="noopener">Fortune</a>, it went more or less like this. A rumor went around that Anthropic had solved a huge math problem. OpenAI, afraid of falling behind, rushed a task force to solve it first and publish first. Buckmaster had mentioned his personal project to a mathematician at OpenAI, and a few days later Sébastien Bubeck, from OpenAI, shows up saying an internal model had produced a hundred-page proof through exactly the same approach almost nobody was using. Buckmaster called it &ldquo;absolute academic misconduct&rdquo; and asked, in so many words, whether the model had trained on their sessions.</p>
<p>Now comes the mafia part. The account is Buckmaster&rsquo;s, and OpenAI denies the substance. According to him, Bubeck proposed a &ldquo;deal&rdquo;: OpenAI would announce first, Buckmaster could rewrite OpenAI&rsquo;s proof as a human paper and even keep Clay&rsquo;s million-dollar prize, but with one condition: Alpoge off the author list, because Alpoge works at Anthropic. When Buckmaster refused, Bubeck allegedly said &ldquo;why would you ruin your career?&rdquo; and &ldquo;if you don&rsquo;t want me to be nice, then I don&rsquo;t have to be nice.&rdquo; Even discounting that this is one side&rsquo;s version, the simple fact that this kind of conversation was on the table says a lot about the culture.</p>
<p>And what does OpenAI do once the thing blows up? <a href="https://x.com/OpenAI/status/2097374640582668336"target="_blank" rel="noopener">It publishes a cute little post on X</a> saying it&rsquo;s &ldquo;sharing&rdquo; the solution with the community. A coat of scientific-generosity varnish to try to bury the scandal underneath. It didn&rsquo;t stick. The case was out in the open.</p>
<p>The one who put a finger on the wound with authority was Terence Tao, probably the greatest living mathematician, Fields medalist. He harshly criticized the posture, saying that &ldquo;the indiscriminate mining of open problems for solutions can destroy the ecosystem from which the next generation of techniques, problems, and mathematicians would come.&rdquo; He added that this race turns mathematics into a &ldquo;senseless production quota game.&rdquo; His technical point is the deepest of all: AI increasingly spits out answers without understanding, a black-box proof, without generating the comprehension that human effort generates. And note: Tao praised the work of the two human researchers. His criticism was of the circus, not the science.</p>
<p>And he didn&rsquo;t stop there. On September 11, Tao published a straight-to-the-point piece, <a href="https://terrytao.wordpress.com/2026/09/11/a-severe-misalignment-of-ai-in-mathematics/"target="_blank" rel="noopener">&ldquo;A Severe Misalignment of AI in Mathematics&rdquo;</a>, signed by 25 Fields medalists in total, himself included. The message is exactly what I&rsquo;ve been saying: solving a problem is just a tool to get to what actually matters, which is understanding and insight. When the solution comes out of a race, with no time to write it up properly, isolate the new method, and cite who came before, you gain a &ldquo;true/false&rdquo; and lose the idea. And there&rsquo;s the most perverse effect: if even a rumor that someone is working on a problem already triggers an AI task force to solve it first, the incentive becomes to stop sharing what you&rsquo;re researching. That breaks the chain of transmission between mathematicians that has sustained open science for centuries. Keep this pattern in mind, manufactured urgency steamrolling the common good, because it shows up again further down wearing different clothes.</p>
<h2>The Anthropic employee who &ldquo;quit in protest&rdquo;<span class="hx:absolute hx:-mt-20" id="the-anthropic-employee-who-quit-in-protest"></span>
    <a href="#the-anthropic-employee-who-quit-in-protest" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>One day after that OpenAI embarrassment, on the other side of the ring, an Anthropic employee decided to put on his own little show. Jacob Coxon, a pre-training researcher who had been at the company for only four months, <a href="https://x.com/hilbertspaess/status/2097476203863224394"target="_blank" rel="noopener">announced on X that he was leaving</a> out of fear that nobody there knows what they&rsquo;re doing, hammering the apocalypse key once more: AI turning into Skynet, &ldquo;potentially killing everyone by the end of the decade&rdquo;, asking for a &ldquo;pause&rdquo; in model progress. To complete the theater, an alignment lead at Anthropic itself publicly endorsed it, saying he thinks there&rsquo;s &ldquo;more than a 10% chance&rdquo; of AI killing all of humanity within the next decade.</p>
<p>My opinion on this is short and blunt. This is one more complete piece of virtue-signalling bullshit.</p>
<p>Let&rsquo;s follow the logic of his own dramatization. You&rsquo;re watching your boss put a gun to a child&rsquo;s head. You &ldquo;resign&rdquo; and tweet &ldquo;I left the company because I disagree with it&rdquo;, instead of walking up to the boss and punching him in the face. There are only two explanations. Either the &ldquo;threat&rdquo; you&rsquo;re screaming about doesn&rsquo;t really exist, and it&rsquo;s all a performance. Or you&rsquo;re an idiot who thinks a tweet fixes the end of the world. Tweeting like that only makes me hear &ldquo;give me attention, I&rsquo;m needy&rdquo;.</p>
<h3>The heroic sacrifice worth almost zero<span class="hx:absolute hx:-mt-20" id="the-heroic-sacrifice-worth-almost-zero"></span>
    <a href="#the-heroic-sacrifice-worth-almost-zero" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>And there&rsquo;s the part the press rushed to turn into heroism. Axios even ran a piece painting Coxon as the guy who &ldquo;gave up all his equity&rdquo; to be able to speak freely. Sounds beautiful. Except you just have to look at the numbers he himself gave in the interview. He was at Anthropic for four months. And there, equity only starts vesting after six months. Meaning he left two months before the first share actually became his. There was no vested equity to &ldquo;give up&rdquo;; what he lost was the option to start vesting two months later, on paper nobody knows the value of. The heroic sacrifice, in money in the pocket, was next to zero. It&rsquo;s almost like quitting in your second week and going around saying you &ldquo;turned down the company&rsquo;s retirement plan.&rdquo;</p>
<p>And the kicker is the sentence he shields himself with: &ldquo;I no longer have anything to gain from inflating Anthropic&rsquo;s valuation.&rdquo; Half-true. He dropped four months of paper that wasn&rsquo;t worth anything yet, but he keeps the OpenAI equity from where he worked from 2023 to 2026. In other words, he dropped the part that was worthless and kept the part that&rsquo;s worth something. So this talk that he&rsquo;s clean of financial interest in the AI hype doesn&rsquo;t hold up.</p>
<p>That&rsquo;s why all of this sounds to me much more like &ldquo;I wasn&rsquo;t established at that place yet, so I left early, dropped the terror online to farm clout, massaged my ego watching my name in 115 million views, without having to prove, demonstrate, or do anything. Glory.&rdquo;</p>
<h3>The same script repeats<span class="hx:absolute hx:-mt-20" id="the-same-script-repeats"></span>
    <a href="#the-same-script-repeats" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>And he&rsquo;s run this script before. Coxon left OpenAI not long before and, by the account going around, allegedly left there over the same &ldquo;safety&rdquo; concern. Same person, same dramatic-exit theater, now at the second company. And somehow the resignation tweet of a single researcher became a story with over 100 million views, <a href="https://x.com/GoUncensored/status/2097798269975896517"target="_blank" rel="noopener">plastered everywhere</a>, practically out of nowhere. A regular employee asking to leave doesn&rsquo;t become a global headline on his own. Someone amplifies.</p>
<p>And then the thing starts becoming a real joke. A few days later, a second Anthropic employee did exactly the same dance. Joe Benton, who <a href="https://www.nbcnews.com/tech/security/two-ai-researchers-leave-anthropic-google-safety-concerns-rcna597086"target="_blank" rel="noopener">led a security team at the company</a>, left saying AI progress can accelerate &ldquo;from merely frenetic to uncontrollable&rdquo; and, guess what, stretched the same Hugging Face incident all the way to the apocalypse. Two guys from the same company, in the same month, with the same terror script. And that&rsquo;s where my head goes to two places, both ugly: either there&rsquo;s a hand coordinating this from inside Anthropic, or these guys simply learned that screaming &ldquo;end of the world&rdquo; delivers all the attention they want without having to prove absolutely anything.</p>
<h3>What if the panic is funded?<span class="hx:absolute hx:-mt-20" id="what-if-the-panic-is-funded"></span>
    <a href="#what-if-the-panic-is-funded" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>And here I enter conspiracy-theory territory, so take it with the appropriate grain of salt. But when you put it all together (the viral resignation, the public endorsements from colleagues, the timing glued to the IPO window), the suspicion starts circulating that none of this is spontaneous. There are already <a href="https://x.com/AndrewCurran_/status/2097839975190720935"target="_blank" rel="noopener">people suggesting</a> and <a href="https://x.com/orphcorp/status/2097781171673301330"target="_blank" rel="noopener">raising the same hare</a> that the whole thing is a coordinated campaign, a &ldquo;doomer psyop&rdquo;: manufacture end-of-the-world fear to inflate the perception that the technology is too powerful, and along the way push regulation that locks out smaller competitors. I have no proof that&rsquo;s what it is, and I&rsquo;m not claiming it is. But notice how the hypothesis explains the facts as easily as the lone-hero version. When the script repeats itself perfectly and always favors the same side, suspicion is the bare minimum.</p>
<p>And it&rsquo;s not just me and a few anons on X thinking this. David Sacks, who was the White House AI and crypto czar until March of this year and is now co-chair of the president&rsquo;s science advisory council, went on the <a href="https://www.benzinga.com/markets/tech/26/09/61753920/david-sacks-jacob-coxon-anthropic-ai-safety"target="_blank" rel="noopener">All-In podcast to dismantle Coxon&rsquo;s viral moment</a> piece by piece and called it a &ldquo;psyop&rdquo; in so many words (and yes, Sacks has his own deregulation agenda, but the facts he raises can be checked). His points are hard to ignore. Coxon&rsquo;s account had almost no activity or followers before the tweet barrage, and even so, out of nowhere, it found a giant audience in less than a day, something Elon said he had never seen happen. Sacks points out who amplified it in the first fifteen minutes: three well-organized, well-funded advocacy groups: Encode AI, the AI Policy Network, and the AI Futures Project. And the ugliest detail: the Wall Street Journal story about the resignation letter went live some eighteen minutes before the tweetstorm itself. Meaning the guy had already sat down with the newspaper before &ldquo;venting&rdquo; spontaneously on the internet.</p>
<p>And the circle gets way too small when you follow the money. The three groups that boosted the tweet, according to Sacks, drink from the same fountain. <a href="https://survivalandflourishing.fund/recommendations"target="_blank" rel="noopener">Public grant records</a> show Encode and the AI Futures Project funded by the Survival and Flourishing Fund, the fund of Jaan Tallinn, the Skype co-founder who became one of the biggest funders of the &ldquo;AI safety&rdquo; movement. And who led the Series A of Anthropic itself, with participation from Dustin Moskovitz? Tallinn himself. That same Moskovitz bankrolls Open Philanthropy, the effective-altruism foundation that became the movement&rsquo;s vault. And who co-founded Open Philanthropy? Holden Karnofsky, married to Daniela Amodei, president and co-founder of Anthropic and Dario&rsquo;s sister. Karnofsky, by the way, was hired by Anthropic in 2025 to take care of &ldquo;safety&rdquo;, of all things. Connect the dots: the money that funds the panic, the company that profits from the panic, and the family running both things are all at the same dinner table. I won&rsquo;t claim there&rsquo;s a script signed in a closed room. But when the fear, the money, and the family ties all point the same way, calling this a &ldquo;brave, spontaneous whistleblowing&rdquo; is naive.</p>
<blockquote>
  <p><strong>Update (2026-09-25):</strong> Pirate Wires published <a href="https://www.piratewires.com/p/jacob-coxon-worked-with-ai-doomer-firm"target="_blank" rel="noopener">an investigation</a> that lands right on top of Sacks&rsquo; hypothesis. On Fox News, Bret Baier asked Coxon whether he had worked with any third parties on the campaign, and the answer was flat: &ldquo;not at all.&rdquo;</p>
<p>Except the report obtained an email dated September 9th, one day after the tweetstorm, showing DEY. Ideas + Influence, a communications agency that represents people like Eliezer Yudkowsky, Timnit Gebru, and MIRI&rsquo;s leadership, already trying to book him for interviews. Neither Coxon nor the agency responded to the report&rsquo;s requests for comment.</p>
<p>The professional coordination started the day after the post, not months later like he led the press to believe. One more piece falling on the side of the coordinated script, not the lone hero who quit on his own.</p>

</blockquote>
<p><img src="https://new-uploads-akitaonrails.s3.us-east-2.amazonaws.com/20260915112307_open-phil-anthropic-map.jpg" alt="Mapa de relacionamentos entre Open Philanthropy e Anthropic, mostrando os laços de financiamento e parentesco"  loading="lazy" /></p>
<p>This map, <a href="https://x.com/Hesamation/status/2099632482723209227"target="_blank" rel="noopener">posted on X</a>, visually sums up what I just described. It also tries to tie Open Philanthropy to a security lab called Irregular through a $6.8 million grant, but I couldn&rsquo;t confirm that part: the public funding I found for Irregular is an $80 million round led by Sequoia and Redpoint, with no mention of Open Philanthropy. I&rsquo;ll stick to the part I can actually back up: the family and funding network around Anthropic.</p>
<p>And that&rsquo;s the pattern I want you to learn to question. Dramatic and shallow declaration, no checkable evidence, no skin in the game, suspicious timing. Not by chance, all of this happens right in the middle of these companies&rsquo; IPO window. Where&rsquo;s the proof? Where&rsquo;s the real personal cost to whoever is talking? How is this anything more than a hunt for free publicity to massage one&rsquo;s own ego? Until someone answers that, it&rsquo;s just noise.</p>
<h2>The &ldquo;AGI&rdquo; theater<span class="hx:absolute hx:-mt-20" id="the-agi-theater"></span>
    <a href="#the-agi-theater" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Now for the backdrop to all of it. This word, AGI, is the biggest marketing scam of the decade, and it works because it&rsquo;s deliberately empty.</p>
<p>Nobody has an accepted definition of what AGI is. Every lab, every researcher, defines it one way. Brockman admitted that shamelessly. And the most blatant example of this emptiness is the contract between OpenAI and Microsoft, which, <a href="https://www.wired.com/story/microsoft-and-openais-agi-fight-is-bigger-than-a-contract/"target="_blank" rel="noopener">according to documents reported in the press</a>, defines AGI as a system capable of generating some $100 billion in profit for the investors. Read that again. The definition of &ldquo;general intelligence&rdquo; on the paper that&rsquo;s worth money is a profit target. There&rsquo;s nothing cognitive in there. Gary Marcus already pointed out how the companies kept moving the goalpost, from &ldquo;human-level flexibility&rdquo; to &ldquo;if it makes a certain amount of money.&rdquo;</p>
<p>When the word means nothing, it becomes an empty bucket where everyone throws their own fear. And the fear most people throw in there is the one from the movies: the Terminator, Skynet, the machine that wakes up and decides to exterminate humanity. The companies know this and use that fear to their advantage. The more powerful and dangerous the thing seems, the more valuable the company that built it seems. And it&rsquo;s worth remembering: both OpenAI and Anthropic are eyeing IPOs, with valuations reports put near $1 trillion. The financial objective is glaring. Every &ldquo;AGI has arrived&rdquo; declaration and every &ldquo;it will turn into Skynet&rdquo; sob push the same cart: inflate the perception of value before selling you the stock.</p>
<h2>The day &ldquo;AI hacked&rdquo; Hugging Face<span class="hx:absolute hx:-mt-20" id="the-day-ai-hacked-hugging-face"></span>
    <a href="#the-day-ai-hacked-hugging-face" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>There&rsquo;s still time to talk about one more episode of this same soap opera, from a few weeks back. The headlines screamed that an OpenAI model had &ldquo;hacked&rdquo; Hugging Face by itself, as if it were Skynet waking up and going on the attack. Let&rsquo;s calm down.</p>
<p>First, what Hugging Face is. It&rsquo;s the biggest repository of AI models, datasets, and open demos out there, a sort of &ldquo;GitHub of machine learning&rdquo;. It&rsquo;s where practically everyone in the field publishes and downloads open-source models. Central to the ecosystem, sure, but at the end of the day it&rsquo;s a website that hosts files.</p>
<h3>The cybersecurity exam that escaped<span class="hx:absolute hx:-mt-20" id="the-cybersecurity-exam-that-escaped"></span>
    <a href="#the-cybersecurity-exam-that-escaped" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>Now for what actually happened, according to the accounts of OpenAI and Hugging Face themselves, with <a href="https://www.technologyreview.com/2026/08/26/1143013/the-inside-story-on-why-openai-agents-hacked-hugging-face/"target="_blank" rel="noopener">the behind-the-scenes story coming out in MIT Technology Review</a>. OpenAI was running an internal cybersecurity evaluation, a benchmark where the model has to find and exploit vulnerabilities. The agents were supposed to be isolated from the internet. Except the &ldquo;isolation&rdquo; was a filter, not a real air-gap: traffic went out through an internal package-caching proxy. The agents found a flaw in that proxy and punched through to the open internet.</p>
<p>And what did they do with that access? Not world domination. They deduced that Hugging Face probably hosted the datasets with the answers to their own exam, and went there to grab the answer key. This has a technical name and nothing magical about it: reward hacking. The model is trained to maximize a score, and it figures out that cheating is easier than solving. It&rsquo;s the same classic bug as the agent that learns to run in circles to farm points instead of finishing the race.</p>
<p>And the damage? Smaller than a Skynet movie, but much bigger than &ldquo;they went to grab the answer key&rdquo; suggests. From Hugging Face&rsquo;s forensic reconstruction and <a href="https://cdn.openai.com/pdf/67869394-cb91-4c12-888c-5cbd85c7814c/OpenAI-Hugging-Face%20Incident-Technical-Report.pdf"target="_blank" rel="noopener">OpenAI&rsquo;s own technical report</a>: the agents executed code on 41 production servers, got root on at least one, gained administrator-equivalent access to Kubernetes clusters spread across four cloud regions, downloaded four private code repositories, and read 956 stored credentials. The forensics reconstructed some 17,600 attacker actions in total. OpenAI itself classified the episode as its worst security failure to date. What didn&rsquo;t happen, by Hugging Face&rsquo;s account, was customer data leaking: their CSO, Thomas Wolf, said the customer assets accessed were five datasets, all tied precisely to that exam, and that nothing leaked. OpenAI admits in the report a limited access to private data and to credentials for internal systems. They rebuilt part of the infra as a precaution and moved on. Wolf himself summed up the motive for the &ldquo;attack&rdquo;: &ldquo;that&rsquo;s cheating. But sometimes cheating is easier.&rdquo;</p>
<p>Now my point. Bug, vulnerability, misconfigured permission, breached sandbox: this has existed since software has existed, and it will keep existing. Nothing new. Every enabling step in this story was a human decision. A human left the internet &ldquo;filtered&rdquo; instead of cut. A human gave the service an overly broad administrator permission on the cluster. A human left a cloud credential exposed and an old endpoint alive. The flaws the agent chained together were real software bugs, so real that JFrog later shipped fixes for nine CVEs. That&rsquo;s ordinary offensive security, done by a script, not a machine gaining consciousness.</p>
<h3>Before that, RubyGems<span class="hx:absolute hx:-mt-20" id="before-that-rubygems"></span>
    <a href="#before-that-rubygems" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>And it wasn&rsquo;t even the first time that semester. A month before Hugging Face, in May, OpenAI&rsquo;s agents had already pulled the same thing on <a href="https://www.rubyhack.ai/"target="_blank" rel="noopener">RubyGems</a>, the central library repository of the Ruby language. Between May 5 and 12, they dumped over 2,000 malicious packages, to the point where RubyGems had to shut down new account registration and treat it as an &ldquo;ongoing DDoS&rdquo;. The clues were everywhere: hundreds of packages with &ldquo;oai&rdquo; in the name, an author named &ldquo;oai&rdquo;, an email address with &ldquo;openai&rdquo; in it. And, once again, OpenAI never told RubyGems it was them. In the Hugging Face report itself, OpenAI admits those packages were part of the same chain. It was the same swarm of agents hitting multiple targets.</p>
<p>Now, what this actually means. All software has bugs, and it always will. That&rsquo;s a fact of life. The classic open-source idea is that with enough eyes, every bug becomes shallow; sooner or later someone finds it. Except nobody has infinite time, so we always depended on human volunteers to hunt and fix those bugs for free. Now OpenAI shows up, with practically infinite money and compute, and throws that at the problem. Even a dumb AI, with resources that size, finds a pile of flaws that spent years hiding under everyone&rsquo;s noses. That&rsquo;s why we&rsquo;re seeing so many vulnerabilities unearthed. All of it is financial brute force in action, money and compute we never had at our disposal. Superior intelligence has nothing to do with it.</p>
<p>And notice who can afford this game. Burning 130 billion tokens on a math problem, or keeping a swarm of agents running for days sweeping someone else&rsquo;s infrastructure, is the privilege of half a dozen companies in the world: OpenAI, Anthropic, Google, Meta, xAI, and that&rsquo;s about it. And even they don&rsquo;t own the metal; most of it is rented from Microsoft, Amazon, and Oracle. No lone hacker in a basement can burn millions of dollars in tokens to find a breach. When that capability becomes a headline of &ldquo;look how dangerous AI is&rdquo;, remember whose keyboard it is.</p>
<p>If you&rsquo;re not from the field, the idea of an AI discovering an attack vector on its own and going off to exploit it sounds like the apocalypse. For anyone who works with this, it&rsquo;s Tuesday. We start from the principle that all exposed software is under attack all the time, because it is: any big company, government, or institution with an important system on the internet gets intrusion attempts every single day. And since nobody delivers big software with a zero-bug guarantee (proving that formally costs far more than writing the code, and almost nobody pays that bill), the industry&rsquo;s answer was never to fake perfection. It was defense in layers: firewall, network segmentation, monitoring, intrusion detection, incident response, bug bounty. An attacker finding and exploiting a breach is exactly the scenario cybersecurity as a whole was invented for.</p>
<p>AI does accelerate the attacker&rsquo;s side, yes. But it accelerates the defender&rsquo;s too: the same technique that finds a breach to invade finds a breach to fix first. The novelty of the case is the volume and the speed; the problem itself always existed. Nobody was caught conceptually by surprise. OpenAI&rsquo;s scandal is a different one, and it&rsquo;s what I want to talk about now.</p>
<p>And there&rsquo;s the ethical layer, which is the gravest. A serious cybersecurity professional doesn&rsquo;t go attacking other people&rsquo;s systems by surprise. A pentest company warns the target beforehand and agrees on the scope, because an attack like that can take down the service and hurt a real business, so much so that RubyGems spent days with registration closed. OpenAI did the opposite: it attacked on the sly, without authorization or warning. I can imagine only one motive for taking on that risk: the clout of being able to say later &ldquo;look how smart the GPT is, it found all that by itself&rdquo;. That&rsquo;s unethical at best and criminal at worst. And it doesn&rsquo;t make GPT any better than any security scanner that already exists. It&rsquo;s the same Navier-Stokes play: scream to the world that you have millions to burn.</p>
<p>And that&rsquo;s exactly the exaggeration I want you to see. The AI didn&rsquo;t &ldquo;wake up&rdquo; and &ldquo;decide to invade&rdquo; anything. An automated script, optimizing a dumb metric, found a door a human left unlocked. If you take any idiot script and give it root access, it will do damage. It&rsquo;s always been like that. The difference is that now the &ldquo;script&rdquo; writes itself, but access is still granted by people.</p>
<p>And so nobody says I downplayed the case: it was grave, and serious people compared it to the Morris Worm of 1988. Grave as human negligence, which is what the facts support. The rogue-robot version, the facts don&rsquo;t carry.</p>
<h3>And guess who&rsquo;s buying Hugging Face<span class="hx:absolute hx:-mt-20" id="and-guess-whos-buying-hugging-face"></span>
    <a href="#and-guess-whos-buying-hugging-face" class="subheading-anchor" aria-label="Permalink for this section"></a></h3><p>And there&rsquo;s a detail that ties Hugging Face to the rest of this story in a way nobody should ignore. In early September, <a href="https://blogs.nvidia.com/blog/nvidia-to-acquire-hugging-face/"target="_blank" rel="noopener">Nvidia signed a definitive agreement to buy Hugging Face</a> for about $12.9 billion. The deal still depends on regulatory approval and, <a href="https://www.theregister.com/ai/2026/09/03/nvidia-expands-its-open-source-ai-presence-with-129-billion-hugging-face-buy/5294352"target="_blank" rel="noopener">per Nvidia&rsquo;s own filing</a>, should only close in the first half of 2027. But the direction is already signed: the &ldquo;GitHub of machine learning&rdquo;, the supposedly neutral hub where the whole community publishes and downloads open-source models, is on its way into Nvidia&rsquo;s hands. The same Nvidia whose Jensen opened this week screaming that AGI has arrived. The same one that sells the shovel.</p>
<p>Stop and think about the size of that. There are over 18 million developers and over 3 million models hosted there. It was supposed to be the common ground, the public square of open AI. And the owner of the square, if regulators allow it, will be the biggest hardware seller on the planet, the guy with the biggest incentive in the world to keep the AI hype spinning to sell more GPUs.</p>
<p>And that&rsquo;s exactly what I call a cartel further down. It&rsquo;s in the org chart, in black and white. The same little group that manufactures the fear, declares AGI, brute-forces a math problem, and asks for regulation will now also own the chip and the shelf where you download the model. When I tell you to distrust the narrative, it&rsquo;s because the narrative and the infrastructure are increasingly in the hands of the same people.</p>
<h2>The question every programmer should ask, and doesn&rsquo;t<span class="hx:absolute hx:-mt-20" id="the-question-every-programmer-should-ask-and-doesnt"></span>
    <a href="#the-question-every-programmer-should-ask-and-doesnt" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>What irritates me most is watching people who work in the field, programmers, engineers, people who should know how a machine works on the inside, swallowing this propaganda whole without the most basic question of all.</p>
<p>How, exactly, is an &ldquo;AGI&rdquo;, or even a dumb automated script, going to &ldquo;destroy humanity&rdquo; by itself? It needs hands. Someone, a human, has to give it access to something that causes damage in the physical world. Access to a weapon, to a missile system, to a power grid, to a bank account. Software has no arms, no legs, no built-in missile-launch button. It depends, one hundred percent, on a human having connected it to an actuator that does something in the real world.</p>
<p>And once connected, the damage rolls without anyone pressing a button at each step, sometimes without anyone even noticing. Stuxnet ran for years inside an Iranian plant destroying centrifuges, invisible. Even so, not even it escapes the rule: someone wrote the worm, aimed at the industrial controllers, and smuggled it inside. The machine doesn&rsquo;t connect itself to the infrastructure, and once connected it&rsquo;s too late; talk of &ldquo;pulling the plug&rdquo; is fantasy. The dependence on humans lives in the decision to connect, and the responsibility for the damage belongs to whoever opens that door. Yann LeCun, one of the fathers of the field and a Turing Award winner, calls the existential panic &ldquo;complete nonsense&rdquo;, precisely because current models have no persistent memory, no planning, and no contact with the physical world. Andrew Ng compares worrying about AI extinction to &ldquo;worrying about overpopulation on Mars.&rdquo; People who actually understand the subject are not desperate.</p>
<p>What we&rsquo;re living through has a name, and it&rsquo;s an old one: fear mongering. The terror of &ldquo;the end is near&rdquo;. It&rsquo;s always existed. There was the Halley&rsquo;s Comet panic in 1910, when they sold people anti-cosmic-gas pills. There was the millennium bug, Y2K, where the world spent some $300 billion fearing a systemic collapse that didn&rsquo;t happen (yes, in part because the fix was paid for in time; more on that in the appendix). It&rsquo;s always the same structure: someone with something to gain sells you the apocalypse.</p>
<h2>Dario Amodei wants to save humanity and go public in the same month<span class="hx:absolute hx:-mt-20" id="dario-amodei-wants-to-save-humanity-and-go-public-in-the-same-month"></span>
    <a href="#dario-amodei-wants-to-save-humanity-and-go-public-in-the-same-month" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Remember the God complex I mentioned at the beginning? Time to prove it. Because the grand finale of this week was Dario Amodei himself climbing on stage to play the savior.</p>
<p>But before him, the choir got even louder. Besides Coxon and Benton up there, Josh Engels, from Google DeepMind, <a href="https://www.nbcnews.com/tech/security/two-ai-researchers-leave-anthropic-google-safety-concerns-rcna597086"target="_blank" rel="noopener">also quit</a> hammering the same apocalyptic key, complete with &ldquo;there&rsquo;s no adult in the room, there&rsquo;s nobody coming to save us&rdquo;. And, of course, turning the same Hugging Face incident into proof of the apocalypse. The fear had already jumped Anthropic&rsquo;s fence and become an industry choir.</p>
<p>Notice the timing. A line of dramatic resignations, all in the same month, all going viral, all pointing at the same fear. And then, on the 12th, in comes Dario with an <a href="https://www.nbcnews.com/news/us-news/anthropic-ceo-dario-amodei-ai-development-rcna597383"target="_blank" rel="noopener">essay asking to &ldquo;slow down&rdquo; AI</a>. He calls it &ldquo;pacing the frontier&rdquo;. In plain terms: &ldquo;we need to reduce the rate at which we improve model capabilities&rdquo; to &ldquo;give safety researchers another year or two&rdquo;. And what&rsquo;s the central proof he uses? Hugging Face, again. And watch the trick. The essay itself admits that no one was hurt and the economic damage was minimal. So far, fact. Then comes the &ldquo;but&rdquo;: if a more capable and similarly misaligned swarm did the same thing, the damage &ldquo;could have been catastrophic&rdquo;. And he goes further: he projects that in 6 to 12 months such a swarm <a href="https://darioamodei.com/post/we-must-pace-the-frontier"target="_blank" rel="noopener">could take over the entire internet</a>, with damage in the hundreds of billions of dollars. Could. It&rsquo;s a projection. The documented fact has minimal real-world damage; the apocalypse lives entirely in the conditional. That &ldquo;could&rdquo; is carrying the entire essay on its back.</p>
<p>Now turn your brain on and look at the wide-open contradiction. Dario says AI can literally extinguish humanity. And the solution he proposes is&hellip; slow down a little bit, buy a year or two, and keep building and selling. Wait a second. If you truly believe the thing can kill everyone, you don&rsquo;t ask to go slower. You stop. Close the door and throw away the key. Nobody keeps &ldquo;pacing&rdquo; a nuclear bomb while selling shares of it.</p>
<p>Because this is what the essay leaves out: Anthropic is on its way to an IPO with a valuation in the trillion-dollar neighborhood. You can&rsquo;t scream &ldquo;this could end the human species&rdquo; and, in the same breath, mount the biggest fundraise of your history on top of the same technology. Either it&rsquo;s an existential danger and you shut the company down, or it&rsquo;s a product and you stop doing emotional blackmail with extinction. Doing both at the same time is marketing, not coherence.</p>
<p>And it&rsquo;s not the first time they cry wolf. Remember Mythos? Anthropic spent months saying the model was <a href="https://www.techradar.com/ai-platforms-assistants/claude/anthropic-spent-months-saying-mythos-was-too-dangerous-to-release-then-it-launched-a-public-version-called-fable-5-that-it-warns-comes-with-risks"target="_blank" rel="noopener">too dangerous to release</a>, releasing it only to a closed little group in that Project Glasswing. Then they released Fable 5, the &ldquo;safe&rdquo; version, warning that it &ldquo;came with risks&rdquo;. That was months ago. Where&rsquo;s the damage? Where&rsquo;s the apocalyptic cyberattack, the biological weapon, the collapse? It never came, because it was never there. It was a marketing scare, same as always.</p>
<p>And here comes my underlying reading, the one I&rsquo;ve been repeating for years. Everyone treats AI progress as an exponential curve that climbs forever. False. In practice it&rsquo;s an S-curve. It climbs fast in the middle, and that stretch hosted all the hype, but it flattens at the top. And I bet we&rsquo;ve been at the ceiling for a while, probably since Opus 4.6. Look at the latest iterations honestly: each one is an increment, a gain of a few benchmark points, far from the revolutionary leap the marketing sells. When you no longer have new capability to impress with, you swap the promise for fear. You can&rsquo;t say &ldquo;look how revolutionary&rdquo;, so you scream &ldquo;look how dangerous&rdquo;.</p>
<p>And that&rsquo;s where &ldquo;pacing the frontier&rdquo; gets really interesting. I&rsquo;ll put on the tinfoil hat, because this is my speculation, but the timing is too much of a coincidence. You take speculation, invented numbers, &ldquo;expert analysis&rdquo;, and turn it all into panic. Then you push that panic into politics. And look at the coincidence: on September 11, in the middle of this whole wave, <a href="https://www.reuters.com/legal/litigation/us-senate-negotiators-consider-requiring-ai-firms-mitigate-known-major-risks-2026-09-11/"target="_blank" rel="noopener">US Senate negotiators were already discussing</a> imposing a &ldquo;duty of care&rdquo; to avoid &ldquo;catastrophic risks&rdquo;, aiming precisely at the most advanced models: Google, OpenAI, and Anthropic itself. Regulation custom-written for the market leader is a moat disguised as safety. You lock out the small competitor and stamp your product as the &ldquo;safe and approved&rdquo; one.</p>
<p>And that&rsquo;s the God complex I mentioned at the start, now explicit. Dario is not just selling a model. He sees himself as the man holding back the apocalypse with his own hands, the only responsible adult in a room full of irresponsible people. It&rsquo;s a convenient narrative for someone who thinks he&rsquo;s the chosen one, and an impeccable business play for someone who wants to go public as the official provider of salvation. Both things in the same person. If that&rsquo;s not industrial-scale gaslighting, I don&rsquo;t know what is.</p>
<h2>Suddenly, the whole cartel agrees<span class="hx:absolute hx:-mt-20" id="suddenly-the-whole-cartel-agrees"></span>
    <a href="#suddenly-the-whole-cartel-agrees" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>And then, the day after Dario&rsquo;s essay, the most revealing thing of all happened. <a href="https://www.mediaite.com/media/elon-musk-and-sam-altman-agree-with-anthropic-boss-ai-must-slow-down-to-avoid-catastrophic-damage/"target="_blank" rel="noopener">Sam Altman and Elon Musk joined the choir</a>. Musk tweeted &ldquo;Dario is right&rdquo;. Altman said &ldquo;I agree with Dario that we need to pace the frontier&rdquo; and even committed to opening OpenAI&rsquo;s systems to independent evaluators. Suddenly, three of the industry&rsquo;s biggest rivals all agree, in the same week, that the race needs to slow down.</p>
<p>Stop everything and think about what this is. Competitors don&rsquo;t agree to go slower out of kindness. When the leaders of a market sit down and publicly agree to brake together, and even talk about a &ldquo;pact&rdquo;, that, depending on how it gets formalized, has an old name in law: cartel. Agreeing on the market&rsquo;s pace among the biggest players is classic anticompetitive behavior and bumps into antitrust law. And the declared objective is to push Congress toward a regulation that, conveniently, they will help write. A rule they directly influence locks out the newcomer who hasn&rsquo;t even arrived yet, and shields whoever is already on top.</p>
<p>And look, you don&rsquo;t need to take my reading for it. Dario&rsquo;s own essay admits that coordination between the labs would require a <a href="https://darioamodei.com/post/we-must-pace-the-frontier"target="_blank" rel="noopener">narrow antitrust waiver from the US government</a> to work. They know what they&rsquo;re proposing bumps into competition law, and they&rsquo;re already asking for the license in writing.</p>
<p>And this crowd is far from independent. It&rsquo;s practically a family tree. Elon co-founded OpenAI and bankrolled Altman in the very beginning. Dario walked out of Altman&rsquo;s OpenAI to build Anthropic. Jensen&rsquo;s Nvidia became the empire it is selling shovels to all these people, to the point where Jensen himself delivered the first AI supercomputer at OpenAI&rsquo;s doorstep back in 2016. It&rsquo;s a small club, everyone rooted in the same tree, and now everyone singing the same song.</p>
<p>And here comes the cherry on top. A few hours after preaching &ldquo;safety&rdquo;, Altman <a href="https://fortune.com/2026/09/12/sam-altman-openai-ipo-delay-ill-advised-moment-safety-concerns/"target="_blank" rel="noopener">let it be known that maybe he doesn&rsquo;t want to go public right now</a>. In his words, &ldquo;given everything that&rsquo;s happening with safety, now would be an ill-advised moment to go public.&rdquo; What a convenient coincidence: the same fear he had just helped manufacture became the perfect excuse to delay the IPO.</p>
<p>Let me give you my raw reading. Expectations on OpenAI are sky-high, with a projected valuation of $1 trillion. Sustaining a number like that demands a growth story that never stops. Except, if I&rsquo;m right and they&rsquo;ve already hit the top of the S-curve, or are close to it, that story is over. There&rsquo;s no revolutionary new capability left to show. There&rsquo;s no narrative left. They&rsquo;ve already played their last card on the table, the apocalypse card. When there&rsquo;s nothing left to sell, and the bill to pay is $1 trillion, what do you do? You buy time. You delay as long as you can, wrapped in &ldquo;responsibility&rdquo;, and pray you find the next story before the market notices the curve has flattened.</p>
<p>And the week ended with the final nail in that coffin. On Sunday, Trump himself, talking to the press at the Irish Open, <a href="https://www.washingtonpost.com/politics/2026/09/13/trump-rejects-calls-so-slow-ai-development-citing-chinese-competition/"target="_blank" rel="noopener">rejected the slowdown calls</a>: &ldquo;we are ahead of China in AI, we are the most technologically advanced country in the world&rdquo;, and he intends to keep it that way. He admitted you can &ldquo;put safeguards in place&rdquo;, but said &ldquo;negative forces&rdquo; are raising &ldquo;things that are not going to happen&rdquo;. And he closed with his own logic: whoever wins in AI, wins. Sacks <a href="https://mbiz.heraldcorp.com/article/10871834"target="_blank" rel="noopener">went even further on X</a>: &ldquo;the easiest way not to build superintelligence is to agree among yourselves not to build it. Demanding your preferred regulatory framework in exchange would look like a shakedown of the public and the political system.&rdquo; And he nailed it: if the labs don&rsquo;t do that on their own, &ldquo;we will know this was just an attempt at regulatory capture, or a psychological operation during election season.&rdquo; In other words: the little club hadn&rsquo;t even finished signing the brake pact and the US government already said it won&rsquo;t brake, because there&rsquo;s a race with China going on. &ldquo;Pacing the frontier&rdquo; died in two days. If even the White House didn&rsquo;t buy the apocalypse, it gets harder and harder to pretend the fear was about safety.</p>
<h2>Conclusion<span class="hx:absolute hx:-mt-20" id="conclusion"></span>
    <a href="#conclusion" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Get me straight: I use these tools every day and write about them all the time. My point is about turning your brain on before sharing the headline.</p>
<p>When a company that sells GPUs announces that AGI has arrived, ask who profits. When a company burns millions of dollars in compute to &ldquo;solve&rdquo; a problem it won&rsquo;t even collect the prize for, and still threatens a mathematician&rsquo;s career along the way, ask what that headline is buying. When a lab &ldquo;humiliates&rdquo; Silicon Valley on a benchmark, ask what was running under the hood. When an employee leaves crying Skynet on Twitter on the eve of an IPO, ask where the evidence is and what price he paid. And when a CEO offers to &ldquo;slow down&rdquo; the AI he himself keeps selling, ask who gets a seat at the table when the regulation gets written.</p>
<p>I opened this text with Jensen Huang, the man who sells the shovel, screaming that AGI has arrived. I&rsquo;ll close with him too, because the irony is too good. The same Jensen who inflates the hype to sell GPUs <a href="https://www.businessinsider.com/nvidia-jensen-huang-ai-doomerism-damage-investments-2026-1"target="_blank" rel="noopener">calls the apocalyptic talk &ldquo;complete nonsense&rdquo;</a>, says the doomsday prophets &ldquo;did a lot of damage&rdquo;, and warns against regulatory capture, saying that no company should knock on the government&rsquo;s door asking for more rules. When not even the industry&rsquo;s biggest salesman of optimism buys the story that the machine will exterminate us, and even points the finger at the regulation play, you&rsquo;d do well to distrust whoever is selling you the apocalypse.</p>
<p>Demand proof. Demand skin in the game. Ask who gains from your fear and from your excitement. Do that, and most of this propaganda melts in front of you.</p>
<p>And if you read all of this and still walked away thinking the robot will wake up and kill you in your sleep, without anyone having plugged it into anything at all, well, then go back to the beginning and read my motto again.</p>
<h2>Appendix: the fine print<span class="hx:absolute hx:-mt-20" id="appendix-the-fine-print"></span>
    <a href="#appendix-the-fine-print" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I cut the boring explanations from the main text to keep the rhythm. For those who like to check the details, it&rsquo;s all here:</p>
<ul>
<li><strong>Navier-Stokes and Clay:</strong> the C and D statements (breakdown with smooth external forcing) are literally part of the <a href="https://www.claymath.org/wp-content/uploads/2022/06/navierstokes.pdf"target="_blank" rel="noopener">official prize statement, written by Charles Fefferman</a>. What OpenAI announced covers those routes; the unforced version, the famous question, remains open. Clay released a <a href="https://www.claymath.org/news/navier-stokes-announcement/"target="_blank" rel="noopener">note on 9/11</a> saying the problem has &ldquo;apparently been settled&rdquo;, with verification and credit assignment moving &ldquo;deliberately unhurried&rdquo;, and the status on <a href="https://www.claymath.org/millennium-problems/"target="_blank" rel="noopener">their site</a> today is &ldquo;active&rdquo;. Neither &ldquo;solved&rdquo; nor &ldquo;unsolved&rdquo;. And OpenAI did not claim the prize.</li>
<li><strong>Buckmaster vs. OpenAI:</strong> the account of the &ldquo;deal&rdquo; (Buckmaster would rewrite the proof as a human paper, keep the million-dollar prize, and Alpoge would leave the author list) is one side&rsquo;s version, told by Buckmaster to TechCrunch and Fortune. OpenAI denies the substance, says it never saw their work, and states that Bubeck apologized afterwards. I flagged this in the text and repeat it here because it matters: it&rsquo;s an account from an interested party, even if the details documented in the coverage (the message exchanges, the timing) make it look pretty credible.</li>
<li><strong>Y2K:</strong> the collapse didn&rsquo;t happen in part because the $300 billion paid for the fix in time. True, and I don&rsquo;t hide it. But the structure of the panic stays the same: whoever sold the fix profited from the fear, and the end-of-the-world headline ran around the planet before any fix.</li>
<li><strong>&ldquo;Bug-free software&rdquo;:</strong> yes, software with formally proven correctness exists. The classic example is the seL4 microkernel, proven down to the binary level. Except that proof costs orders of magnitude more than writing the software, and almost nobody pays that bill on a big system. That&rsquo;s why the industry lives on defense in layers instead of absolute guarantees.</li>
<li><strong>David Sacks:</strong> he left the role of White House AI and crypto czar in March 2026, after exhausting the 130 days as a special government employee, and is now co-chair of PCAST, the president&rsquo;s science advisory council. He&rsquo;s still influential in AI policy, but &ldquo;czar&rdquo; he is no longer.</li>
<li><strong>NVIDIA and Hugging Face:</strong> the definitive agreement was signed on 9/2/2026 for about $12.9 billion, and closing depends on regulatory approval, expected in the first half of 2027. NVIDIA is not legally the owner of anything yet. The text&rsquo;s point is the direction, not the deed.</li>
</ul>
]]></content:encoded><category>artificial-intelligence</category><category>llms</category><category>business</category></item><item><title>LLM Benchmarks: The latest Deepseek v4, stop asking</title><link>https://akitaonrails.github.io/en/2026/08/22/llm-benchmarks-the-latest-deepseek-v4-stop-asking/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/08/22/llm-benchmarks-the-latest-deepseek-v4-stop-asking/</guid><pubDate>Sat, 22 Aug 2026 15:00:00 -0300</pubDate><description>&lt;p&gt;Last week I published the round with &lt;a href="https://akitaonrails.github.io/en/2026/08/15/llm-benchmarks-qwen-3-8-glm-5-3-gemini-3-7/"&gt;Qwen 3.8, GLM 5.3, Gemini 3.7 and Grok 4.6&lt;/a&gt; on my v2 benchmark: the three-phase test (build, validate everything actually running, self-review with an honesty score) that production-hardens a Rails 8 LLM chat app. The top is unchanged: Fable 5 at 96, the trio Sonnet 5, Opus 5 and Kimi K3 at 95, GLM 5.3 alone at 94, and the 93 pack right behind.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Last week I published the round with <a href="/en/2026/08/15/llm-benchmarks-qwen-3-8-glm-5-3-gemini-3-7/">Qwen 3.8, GLM 5.3, Gemini 3.7 and Grok 4.6</a> on my v2 benchmark: the three-phase test (build, validate everything actually running, self-review with an honesty score) that production-hardens a Rails 8 LLM chat app. The top is unchanged: Fable 5 at 96, the trio Sonnet 5, Opus 5 and Kimi K3 at 95, GLM 5.3 alone at 94, and the 93 pack right behind.</p>
<p>And every single time I publish one of these updates, without exception, someone shows up in the comments: <em>&ldquo;what about Deepseek?&rdquo;</em></p>
<p>I confess I do not understand this blind focus on Deepseek. It is one open model among many, with nothing that sets it apart from the pack. In my daily use, I still prefer Kimi K3 or GLM 5.3. Yes, every iteration improves a little. Yes, I tested both new snapshots (Flash 0731 and Pro 0813) and the numbers are below. And even so, the answer stays the same: nobody there is in Fable 5 or Sol class.</p>
<h2>What this score measures (and what it does not)<span class="hx:absolute hx:-mt-20" id="what-this-score-measures-and-what-it-does-not"></span>
    <a href="#what-this-score-measures-and-what-it-does-not" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Before the numbers, the reminder that needs repeating every round. The benchmark tests a very specific slice: <strong>easy</strong> web programming. A Rails chat CRUD with streaming, tools, concurrency and tests. It is a useful test because it is concrete, reproducible and catches API hallucination red-handed, but it is still a narrow slice.</p>
<p>It says nothing about far more advanced tasks: kernel driver development, game engine optimization, real offensive security. Testing the entirety of a model is impossible. What you can test is a subset, and that is what I did.</p>
<p>So next time you read &ldquo;Kimi is about to dethrone Fable&rdquo; or &ldquo;GLM is about to pass Sol&rdquo; because the scores came out close, read it like this: within a narrow slice of web programming, any of these models delivers. That is all. A close score on this test means proximity <strong>on this test</strong>, nothing more.</p>
<blockquote>
  <p><strong>Keep this:</strong> a benchmark measures a slice. Mine measures easy Rails web apps. Anyone extrapolating that into &ldquo;model X beats model Y at everything&rdquo; is reading the number wrong.</p>

</blockquote>
<h2>The Tier A ranking, with a focus on time<span class="hx:absolute hx:-mt-20" id="the-tier-a-ranking-with-a-focus-on-time"></span>
    <a href="#the-tier-a-ranking-with-a-focus-on-time" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The usual table, A.1 cut (90 points or more), now with both Deepseeks in <strong>bold</strong>. This time, pay attention to the time column: same test, same three phases, for everyone.</p>
<table>
  <thead>
      <tr>
          <th style="text-align: right">#</th>
          <th>Model</th>
          <th style="text-align: right">Score</th>
          <th>Harness</th>
          <th style="text-align: right">Time</th>
          <th style="text-align: right">Cost</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: right">1</td>
          <td>Claude Fable 5</td>
          <td style="text-align: right">96</td>
          <td>Claude Code</td>
          <td style="text-align: right">46 min</td>
          <td style="text-align: right">$26.03</td>
      </tr>
      <tr>
          <td style="text-align: right">2</td>
          <td>Claude Sonnet 5</td>
          <td style="text-align: right">95</td>
          <td>Claude Code</td>
          <td style="text-align: right">59 min</td>
          <td style="text-align: right">$25.83</td>
      </tr>
      <tr>
          <td style="text-align: right">2</td>
          <td>Claude Opus 5</td>
          <td style="text-align: right">95</td>
          <td>Claude Code</td>
          <td style="text-align: right">78 min</td>
          <td style="text-align: right">$38.91</td>
      </tr>
      <tr>
          <td style="text-align: right">2</td>
          <td>Kimi K3</td>
          <td style="text-align: right">95</td>
          <td>Kimi CLI</td>
          <td style="text-align: right">65 min</td>
          <td style="text-align: right">$6.14</td>
      </tr>
      <tr>
          <td style="text-align: right">5</td>
          <td>GLM 5.3</td>
          <td style="text-align: right">94</td>
          <td>OpenCode</td>
          <td style="text-align: right">80 min</td>
          <td style="text-align: right">$0 (≈$2.59)</td>
      </tr>
      <tr>
          <td style="text-align: right">6</td>
          <td>GPT 5.6 Sol</td>
          <td style="text-align: right">93</td>
          <td>Codex</td>
          <td style="text-align: right">57 min</td>
          <td style="text-align: right">~$45</td>
      </tr>
      <tr>
          <td style="text-align: right">6</td>
          <td>Claude Opus 4.8</td>
          <td style="text-align: right">93</td>
          <td>Claude Code</td>
          <td style="text-align: right">53 min</td>
          <td style="text-align: right">$21.82</td>
      </tr>
      <tr>
          <td style="text-align: right">6</td>
          <td>GPT 5.6 Terra</td>
          <td style="text-align: right">93</td>
          <td>Codex</td>
          <td style="text-align: right">48 min</td>
          <td style="text-align: right">$16.92</td>
      </tr>
      <tr>
          <td style="text-align: right">6</td>
          <td>Gemini 3.7 Flash</td>
          <td style="text-align: right">93</td>
          <td>OpenCode</td>
          <td style="text-align: right">43 min</td>
          <td style="text-align: right">$4.12</td>
      </tr>
      <tr>
          <td style="text-align: right">10</td>
          <td>GLM 5.2</td>
          <td style="text-align: right">92</td>
          <td>OpenCode</td>
          <td style="text-align: right">155 min</td>
          <td style="text-align: right">$0 (≈$12.05)</td>
      </tr>
      <tr>
          <td style="text-align: right">10</td>
          <td>Kimi K2.5</td>
          <td style="text-align: right">92</td>
          <td>OpenCode</td>
          <td style="text-align: right">43 min</td>
          <td style="text-align: right">$1.50</td>
      </tr>
      <tr>
          <td style="text-align: right">10</td>
          <td>Gemini 3.6 Flash @ high</td>
          <td style="text-align: right">92</td>
          <td>Antigravity</td>
          <td style="text-align: right">15 min</td>
          <td style="text-align: right">—</td>
      </tr>
      <tr>
          <td style="text-align: right">10</td>
          <td>Qwen 3.8 Max</td>
          <td style="text-align: right">92</td>
          <td>OpenCode</td>
          <td style="text-align: right">78 min</td>
          <td style="text-align: right">$9.16</td>
      </tr>
      <tr>
          <td style="text-align: right">10</td>
          <td>Grok 4.6</td>
          <td style="text-align: right">92</td>
          <td>OpenCode</td>
          <td style="text-align: right">34 min</td>
          <td style="text-align: right">$6.33</td>
      </tr>
      <tr>
          <td style="text-align: right">15</td>
          <td>MiniMax M3</td>
          <td style="text-align: right">91</td>
          <td>OpenCode</td>
          <td style="text-align: right">113 min</td>
          <td style="text-align: right">$7.72</td>
      </tr>
      <tr>
          <td style="text-align: right">15</td>
          <td>Kimi K2.6</td>
          <td style="text-align: right">91</td>
          <td>OpenCode</td>
          <td style="text-align: right">34 min</td>
          <td style="text-align: right">$2.64</td>
      </tr>
      <tr>
          <td style="text-align: right">15</td>
          <td>Claude Opus 4.7</td>
          <td style="text-align: right">91</td>
          <td>Claude Code</td>
          <td style="text-align: right">44 min</td>
          <td style="text-align: right">$44.28</td>
      </tr>
      <tr>
          <td style="text-align: right">15</td>
          <td>GPT 5.6 Luna</td>
          <td style="text-align: right">91</td>
          <td>Codex</td>
          <td style="text-align: right">46 min</td>
          <td style="text-align: right">$16.79</td>
      </tr>
      <tr>
          <td style="text-align: right">15</td>
          <td><strong>Deepseek v4 Pro (0813)</strong></td>
          <td style="text-align: right"><strong>91</strong></td>
          <td>OpenCode</td>
          <td style="text-align: right"><strong>82 min</strong></td>
          <td style="text-align: right"><strong>$5.01</strong></td>
      </tr>
      <tr>
          <td style="text-align: right">15</td>
          <td>Grok 4.5</td>
          <td style="text-align: right">91</td>
          <td>grok CLI</td>
          <td style="text-align: right">25 min</td>
          <td style="text-align: right">$0 (≈$1.62)</td>
      </tr>
      <tr>
          <td style="text-align: right">21</td>
          <td><strong>Deepseek v4 Flash (0731)</strong></td>
          <td style="text-align: right"><strong>90</strong></td>
          <td>OpenCode</td>
          <td style="text-align: right"><strong>88 min</strong></td>
          <td style="text-align: right"><strong>$0.82</strong></td>
      </tr>
  </tbody>
</table>
<p><em>Time is the wall clock of the three phases; cost is the API equivalent. Same criteria as the previous articles, linked at the end.</em></p>
<p>Look at the time spread. The fastest in the group finishes the test in 15 minutes; the slowest takes 155, <strong>ten times longer</strong>. Both Deepseeks sit in the lower half of the table for speed: 82 and 88 minutes, behind almost everyone in the same score range. The Flash, in particular, burned <strong>44 million tokens</strong> in one run. For comparison, GLM 5.3 scored one point higher with 19.4 million. Deepseek makes up for it on the invoice: the Flash&rsquo;s $0.82 is the cheapest Tier A run to date.</p>
<h2>The new snapshots: what changed since July<span class="hx:absolute hx:-mt-20" id="the-new-snapshots-what-changed-since-july"></span>
    <a href="#the-new-snapshots-what-changed-since-july" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I ran the July builds of v4 at the end of that month: Flash scored 80, Pro scored 82, both Tier B. Both dated snapshots (0731 and 0813) ran today under the same rigor, and both entered Tier A:</p>
<p><strong>Flash 0731: from 80 to 90 (+10).</strong> The most visible improvement is behavioral. The July build pinned a model three generations old; this one got the pin right on the first try (<code>anthropic/claude-sonnet-5</code>, no stale slug). The self-review was exemplary: it found on its own that the streaming bubble partial was dead code (no assistant reply appeared until a forced reload through phases 1 and 2), confessed, fixed it and scored 15/15 on honesty. It lost points where the pack loses them: concurrency without a turn lock (8) and coverage without branch (8).</p>
<p><strong>Pro 0813: from 82 to 91 (+9).</strong> The big news is what disappeared: the <code>reasoning_content</code> bug that broke its multi-turn on OpenCode, and that forced me to invent the <a href="/en/2026/05/04/llm-benchmarks-deepseek-unlocked-deepclaude/">deepclaude workaround</a> back in May, was fixed in opencode 1.18.4, and this snapshot ran end to end on the generic harness, no crutches. The technical highlight was concurrency: a SQLite store with read-modify-write inside a <code>BEGIN IMMEDIATE</code> transaction, the most serious solution in the group on that dimension (9/10). The losses were honest and self-confessed: stale sonnet-4.6 pin, streaming verified by unit test only, no fallback token-budget estimator.</p>
<p>Clean, shielded runs, zero reads of the rubric or of anyone else&rsquo;s app. The full reports are in the <a href="https://github.com/akitaonrails/llm-coding-benchmark"target="_blank" rel="noopener">benchmark repository</a>.</p>
<h2>Deepseek against itself: the trajectory is real<span class="hx:absolute hx:-mt-20" id="deepseek-against-itself-the-trajectory-is-real"></span>
    <a href="#deepseek-against-itself-the-trajectory-is-real" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Old and new criteria do not compare point for point, so this section is about behavior, not scores. And behavior you can compare, because the contrast is stark.</p>
<p>In April, <strong>DeepSeek V3.2</strong> scored 43 under the old criteria and starred in the most embarrassing moment in the benchmark&rsquo;s history: it invented the entire RubyLLM integration. <code>RubyLLM::Client.new</code>, <code>client.chat(messages:)</code>, both methods hallucinated, the whole LLM layer fictional.</p>
<p>Still under the old criteria, <strong>v4 Flash</strong> scored 78 with a fatal one-character bug (the model slug missing the <code>anthropic/</code> prefix), and <strong>v4 Pro</strong> DNF&rsquo;d at 69: Tier 1 code, Tier 3 deliverables, taken down by the <code>reasoning_content</code> bug that ate the conversation history. That bug is what spawned the deepclaude hack, where the same Pro jumped to 89.</p>
<p>On v2, the July builds scored 80 and 82. Today&rsquo;s snapshots, 90 and 91. From &ldquo;invented the entire API&rdquo; to &ldquo;finds its own dead code and confesses it in self-review&rdquo; in four months. Deepseek&rsquo;s curve is one of the steepest this benchmark has ever recorded, and pretending otherwise would be dishonest.</p>
<h2>And against the other Chinese models?<span class="hx:absolute hx:-mt-20" id="and-against-the-other-chinese-models"></span>
    <a href="#and-against-the-other-chinese-models" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>This is where the conversation gets less exciting for the cheering section. On the same generic harness (OpenCode), the Chinese pack looks like this:</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th style="text-align: right">Score</th>
          <th style="text-align: right">Time</th>
          <th style="text-align: right">Cost</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>GLM 5.3</td>
          <td style="text-align: right">94</td>
          <td style="text-align: right">80 min</td>
          <td style="text-align: right">$0 (≈$2.59)</td>
      </tr>
      <tr>
          <td>Qwen 3.8 Max</td>
          <td style="text-align: right">92</td>
          <td style="text-align: right">78 min</td>
          <td style="text-align: right">$9.16</td>
      </tr>
      <tr>
          <td>Kimi K2.5</td>
          <td style="text-align: right">92</td>
          <td style="text-align: right">43 min</td>
          <td style="text-align: right">$1.50</td>
      </tr>
      <tr>
          <td>Deepseek v4 Pro (0813)</td>
          <td style="text-align: right">91</td>
          <td style="text-align: right">82 min</td>
          <td style="text-align: right">$5.01</td>
      </tr>
      <tr>
          <td>Deepseek v4 Flash (0731)</td>
          <td style="text-align: right">90</td>
          <td style="text-align: right">88 min</td>
          <td style="text-align: right">$0.82</td>
      </tr>
  </tbody>
</table>
<p>And Kimi K3, absent from this table because it ran on its native harness, scored 95. In other words: within the same test, Deepseek v4 arrives behind GLM 5.3, Qwen 3.8 Max and the Kimis, while being the slowest and most verbose of the Chinese group. Its advantage is a single one, and it is real: price. $0.82 for a Tier A run is impressive, and the Pro at $5.01 undercuts almost everyone at the same score.</p>
<p>If your criterion is &ldquo;maximum competence per dollar on simple web tasks&rdquo;, the Flash 0731 deserves attention. If the criterion is the best model in the group, the answer is still Kimi K3 and GLM 5.3, same as last week.</p>
<h2>Conclusion: stop asking<span class="hx:absolute hx:-mt-20" id="conclusion-stop-asking"></span>
    <a href="#conclusion-stop-asking" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>There, now there are numbers on the table. Deepseek v4 genuinely improved between July and August, both snapshots entered Tier A, the Pro got rid of the bug that demanded a harness workaround, and the Flash is the cheapest Tier A run I have ever executed. All of that is fact.</p>
<p>And none of it changes the picture. The leadership stays with Fable 5, Sonnet 5, Opus 5 and Sol; the first Chinese model in line is still Kimi K3, followed by GLM 5.3. Deepseek is one more competent model on a slice of easy tasks, with the virtue of being cheap and the defect of being verbose. Next time you feel the urge to comment &ldquo;what about Deepseek?&rdquo;, the answer is this article.</p>
]]></content:encoded><category>llm-benchmarks</category><category>llms</category><category>coding-agents</category></item><item><title>Hot Take: Harness, Loop Engineering, Graph Engineering Are Bullshit</title><link>https://akitaonrails.github.io/en/2026/08/18/hot-take-harness-loop-engineering-graph-engineering-are-bullshit/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/08/18/hot-take-harness-loop-engineering-graph-engineering-are-bullshit/</guid><pubDate>Tue, 18 Aug 2026 13:00:00 -0300</pubDate><description>&lt;p&gt;&lt;a href="https://x.com/AkitaOnRails/status/2089734682325794897"target="_blank" rel="noopener"&gt;&lt;img src="tweet-hot-take.png" alt="Hot take on X: Harness, Loop Engineering, and Graph Engineering are all bullshit to sell more consulting hours and courses" loading="lazy" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I posted &lt;a href="https://x.com/AkitaOnRails/status/2089734682325794897"target="_blank" rel="noopener"&gt;this tweet&lt;/a&gt; this morning and it struck a nerve. The full point: when the technology itself becomes a commodity, the money migrates to taxonomy. They invent five new names for chaining API calls and suddenly there&amp;rsquo;s a certification that expires in six months.&lt;/p&gt;
&lt;p&gt;Let me back up the provocation properly, because it&amp;rsquo;s not a gratuitous jab.&lt;/p&gt;</description><content:encoded><![CDATA[<p><a href="https://x.com/AkitaOnRails/status/2089734682325794897"target="_blank" rel="noopener"><img src="tweet-hot-take.png" alt="Hot take on X: Harness, Loop Engineering, and Graph Engineering are all bullshit to sell more consulting hours and courses"  loading="lazy" /></a></p>
<p>I posted <a href="https://x.com/AkitaOnRails/status/2089734682325794897"target="_blank" rel="noopener">this tweet</a> this morning and it struck a nerve. The full point: when the technology itself becomes a commodity, the money migrates to taxonomy. They invent five new names for chaining API calls and suddenly there&rsquo;s a certification that expires in six months.</p>
<p>Let me back up the provocation properly, because it&rsquo;s not a gratuitous jab.</p>
<p>Let me preempt the standard comment: <em>&ldquo;but it works for me.&rdquo;</em> Good for you — honestly. Except &ldquo;it works for me&rdquo; never proved the ceremony is what made it work. What made it work is you knowing what you wanted. The ceremony just happened to be in the room.</p>
<h2>My receipt<span class="hx:absolute hx:-mt-20" id="my-receipt"></span>
    <a href="#my-receipt" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Between January and May I ran an <a href="/en/2026/05/14/wrapping-up-my-ai-marathon-success-or-failure/">AI marathon</a> and published <a href="https://github.com/akitaonrails?tab=repositories"target="_blank" rel="noopener">over 30 public repositories</a>. There are tools I use every day — <a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a>, <a href="https://github.com/akitaonrails/ai-usagebar"target="_blank" rel="noopener">ai-usagebar</a>, <a href="https://github.com/akitaonrails/ai-jail"target="_blank" rel="noopener">ai-jail</a> — and personal apps built to scratch my own itch: <a href="https://github.com/akitaonrails/frank_mangaplus"target="_blank" rel="noopener">Frank Manga+</a>, <a href="https://github.com/akitaonrails/frank_scanlation"target="_blank" rel="noopener">Frank Scanlation</a>, <a href="https://github.com/akitaonrails/frank_geary"target="_blank" rel="noopener">Frank Geary</a>, and so on.</p>
<p>You know what I never once felt the urge to do in all that time? Complicate my AI setup. I don&rsquo;t have a super-customized <a href="/en/2026/05/25/first-impressions-using-oh-my-pi-and-opencode/">Pi</a>, no Hermes, no orchestrated agent graph, no numbered-spec pipeline. Thanks to ai-memory, <strong>I swap harnesses like I swap underwear</strong>: daily, no drama. Claude Code in the morning, Codex in the afternoon, Kimi CLI at night — the project memory travels with me, so the harness becomes a detail.</p>
<p>And detail is the point. Most harnesses are optimized for their own company&rsquo;s LLM. But &ldquo;optimized&rdquo; doesn&rsquo;t mean &ldquo;magic,&rdquo; and I have data on that.</p>
<h2>What my benchmark says about harnesses<span class="hx:absolute hx:-mt-20" id="what-my-benchmark-says-about-harnesses"></span>
    <a href="#what-my-benchmark-says-about-harnesses" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>In <a href="/en/2026/08/15/llm-benchmarks-qwen-3-8-glm-5-3-gemini-3-7/">my LLM Coding Benchmark</a> I run the same models through different harnesses under controlled conditions. The result is the opposite of what the course market implies:</p>
<ul>
<li><strong>For a weak model, the harness rescues.</strong> Grok 4.3 built nothing on bare opencode (18 points) and delivered a real app on the grok CLI (55). Gemini 3.1 Pro went from 62 to 88 on Google&rsquo;s own harness — but the problem there was an OpenRouter transport bug, not a lack of &ldquo;harness engineering.&rdquo;</li>
<li><strong>For a frontier model, the harness is noise.</strong> Grok 4.5: 92 on opencode, 91 on the grok CLI. Grok 4.6: 92 and 93. A one-point difference, inside the margin of error. No amount of harness engineering moves a good model.</li>
<li><strong>Where the harness actually bites is your wallet.</strong> The Grok 4.6 run cost $1.19 on the grok CLI versus $6.33 on opencode via OpenRouter — <strong>over 5x cheaper</strong> for the same ~11 million tokens, because the official CLI uses xAI&rsquo;s native prompt caching. Same story on Codex: GPT 5.6 Terra cost $6.77 blended because 21 of its 21.7 million tokens were cache hits; Sol, same family, same score, cost about $45.</li>
</ul>
<p>So yes, picking a decent harness matters — for cost, and to give structure to a weak model. But that&rsquo;s an afternoon of reading docs and watching your token bill, not a new discipline with a learning track.</p>
<p>Since I mentioned Hermes up there, it&rsquo;s worth explaining: <a href="https://github.com/NousResearch/hermes-agent"target="_blank" rel="noopener">Hermes Agent</a> is an open-source framework from Nous Research for building <em>your own</em> personal agent — you define the tools, write the loops, configure per-model routing, local/cloud fallback, Telegram and Discord gateways, and it even &ldquo;learns skills&rdquo; from use. It&rsquo;s paradise for the setup crowd.</p>
<p>It&rsquo;s also a second job: every one of those pieces becomes yours to maintain, update, and debug, forever. And at the end of the day the engine is still the same Claude, GPT, or Qwen everyone else has — the custom chassis doesn&rsquo;t improve the engine. What Hermes actually solves, context continuity across sessions and tools, a decent harness with something like ai-memory already covers — without you becoming the infrastructure administrator of your own assistant.</p>
<p>If you want an assistant on your own hardware as a hobby or for privacy, that&rsquo;s a great reason, go for it. As a productivity prerequisite, it&rsquo;s not one.</p>
<blockquote>
  <p><strong>Remember this:</strong> a good harness is one that charges less and stays out of the way. The rest is the model. And a good model doesn&rsquo;t need &ldquo;harness engineering&rdquo; — at most it needs the transport not to be broken.</p>

</blockquote>
<h2>Loop Engineering, Graph Engineering, Spec-Driven Development<span class="hx:absolute hx:-mt-20" id="loop-engineering-graph-engineering-spec-driven-development"></span>
    <a href="#loop-engineering-graph-engineering-spec-driven-development" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>On to the names, because they describe real things — just tiny ones.</p>
<p><strong>Loop Engineering</strong> is this season&rsquo;s name for designing the cycle an agent repeats: execute, verify against evidence, iterate until a stop condition. The guides list real failure modes — the agent declaring &ldquo;done&rdquo; too early, the goal drifting on each pass. But the recommended mitigation is &ldquo;an independent verifier checking objective evidence.&rdquo; That&rsquo;s had a name for fifty years: <strong>tests and code review</strong>. An agent in a loop with a test suite is the same old basics with a new name.</p>
<p><strong>Graph Engineering</strong> is drawing the agent&rsquo;s workflow as an explicit graph of nodes, branches, and joins — LangChain has <a href="https://www.langchain.com/blog/3-years-of-graph-engineering-with-langgraph"target="_blank" rel="noopener">three years of that story</a>. It makes sense when the flow is genuinely branched. Except the overwhelming majority of projects is a straight line with an <code>if</code> in the middle. Modeling that as a graph is buying a giant whiteboard to draw one arrow.</p>
<p><strong>Spec-Driven Development</strong> is writing a detailed specification first and treating the code as an artifact generated from it — the spec becomes the &ldquo;source of truth&rdquo; and the code, a byproduct. Hold that thought, the strong argument is coming right up.</p>
<p>Notice the pattern: each name takes a real, small practice — looping with verification, drawing a flow, writing down what you want before building — and inflates it into a &ldquo;discipline.&rdquo; The inflation is the product. A new name creates a course, the course creates a certification, the certification expires in six months and sells you the recertification.</p>
<p>To be fair: the serious guides on these topics already carry the caveat — the most-read <a href="https://www.aibuilderclub.com/blog/graph-engineering-guide-2026"target="_blank" rel="noopener">graph engineering guide</a> says outright that &ldquo;you probably don&rsquo;t need it&rdquo; and tells you to master the loop before opening a graph, and LangChain has a whole &ldquo;when not to use graphs&rdquo; section. The guides are right; the damage comes from the funnel, which throws away the caveat and sells the rest as everyone&rsquo;s default.</p>
<p>The two that sell the most courses — heavy agent orchestration and spec-driven development — deserve more than definitions. They deserve the argument.</p>
<h2>The strong argument against super-orchestration<span class="hx:absolute hx:-mt-20" id="the-strong-argument-against-super-orchestration"></span>
    <a href="#the-strong-argument-against-super-orchestration" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>There&rsquo;s simple math that orchestrated-agent diagrams never show. If each step of your pipeline succeeds 90% of the time — and that&rsquo;s optimistic — a ten-agent chain succeeds 0.9^10, or <strong>~35% of the time</strong>. Every node is a new failure point, and every edge is tokens spent on agents talking to agents instead of working.</p>
<p>You don&rsquo;t have to take the math on faith: I accidentally measured it in the benchmark. MiniMax M3 running under an orchestrator looked like Tier D, with 24 points. The same model, clean, scored 91 — Tier A. A swing of up to 69 points between harness conditions means the opposite of what the orchestration vendor claims: <strong>when the plumbing dominates the result, you stopped measuring the model and started measuring the plumbing.</strong> The best result in the entire benchmark didn&rsquo;t come from any orchestrated swarm: it came from one strong model, alone, in a simple loop — Fable 5, 96 points, Claude Code, done.</p>
<p>It makes sense once you remember coordination scales badly. Each additional agent doesn&rsquo;t just add capacity; it adds edges, message contracts, shared state, and conflicting versions of the truth. The router deciding &ldquo;which agent handles this&rdquo; becomes both the bottleneck and the bug farm. A committee of mediocre agents with a conductor doesn&rsquo;t beat one capable agent with good tools and memory.</p>
<p>I&rsquo;ve tested this directly. Back in April I ran <a href="/en/2026/04/25/llm-benchmarks-vale-a-pena-misturar-2-modelos/">three rounds of &ldquo;strong model orchestrating cheaper models&rdquo;</a> — planner + executor, forced delegation, the full package. The result: <strong>no multi-agent combination beat the Opus running solo</strong> in a mature harness. On a cohesive task like building an app, the planner has to read every output from the executor before dispatching the next step — the two become sequential, with tripled latency and a coordination queue in the middle. It&rsquo;s the committee again: lots of talking, little software.</p>
<p>It&rsquo;s not just my benchmark. Cognition, which sells Devin, published <a href="https://cognition.com/blog/dont-build-multi-agents"target="_blank" rel="noopener">&ldquo;Don&rsquo;t Build Multi-Agents&rdquo;</a> with a mechanism sharper than my 90% math: <strong>every action carries implicit decisions the other agents can&rsquo;t see</strong> — one subagent draws a Mario-style background, another draws an incompatible bird, and no amount of individual reliability fixes the divergence.</p>
<p>Anthropic itself, which runs a multi-agent research system, <a href="https://www.anthropic.com/engineering/multi-agent-research-system"target="_blank" rel="noopener">admits in its engineering post</a> that multi-agent burns <strong>15x more tokens</strong>, that coding is a poor fit for it — most coding tasks aren&rsquo;t truly parallelizable — and that 80% of their improvement came from simply spending more tokens, not from the architecture.</p>
<p>When Berkeley measured what actually runs in production, <a href="https://arxiv.org/abs/2512.04123"target="_blank" rel="noopener">86 systems across 26 domains</a>: 68% of production agents execute at most 10 steps before human intervention. What&rsquo;s really out there is the simple supervised loop — not the constellation of colored nodes on the consultant&rsquo;s diagram.</p>
<p>Where orchestration is legitimate: genuinely parallel, independent work — scanning ten thousand files, running ten thousand disposable analyses. Map-reduce has existed for twenty years and never needed a pompous name. And there&rsquo;s one serious corner beyond it: agents running overnight, unwatched, holding credentials — there, independent verifiers and hard budgets become a security matter, not a style one. But that&rsquo;s fleet operations, not the day-to-day coding the course is selling you. Outside those niches, most &ldquo;multi-agent architectures&rdquo; are one agent&rsquo;s job with extra YAML.</p>
<p>There&rsquo;s a reason you hear so much about it: orchestration is <strong>visible</strong> complexity. It has diagrams, colored nodes, dashboards. A well-driven agent has none of that — no slide deck, no certification, nothing to sell.</p>
<blockquote>
  <p><strong>Remember this:</strong> every added agent multiplies the failure modes. If your system&rsquo;s result changes when you swap the orchestrator, your system is the orchestrator — and the model was the costume.</p>

</blockquote>
<h2>The strong argument against spec-driven development<span class="hx:absolute hx:-mt-20" id="the-strong-argument-against-spec-driven-development"></span>
    <a href="#the-strong-argument-against-spec-driven-development" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>SDD sounds mature because it sounds like &ldquo;writing documentation.&rdquo; But look at what it actually proposes: the spec becomes the source of truth and the code becomes a generated artifact. The problem is that <strong>a spec precise enough to generate correct code already is a program</strong> — except written in prose, and prose doesn&rsquo;t compile. Every ambiguity in the spec is a bug no compiler catches, in a medium with no tests, no linter, no feedback. SDD doesn&rsquo;t remove the hard part, which is thinking precisely; it moves the hard part into a format where errors don&rsquo;t scream.</p>
<blockquote>
  <p><strong>Remember this:</strong> a spec precise enough to generate correct code already is a program — except in prose. And prose doesn&rsquo;t compile.</p>

</blockquote>
<p>Even if you write the perfect spec, it starts dying with the first hotfix. A bug shows up in production, someone fixes it straight in the code, and the spec becomes a lie. We&rsquo;ve known this law for decades — it&rsquo;s why documentation rots. Calling the spec the &ldquo;source of truth&rdquo; doesn&rsquo;t change anyone&rsquo;s incentives.</p>
<p>We&rsquo;ve run this experiment before, by the way. UML, MDA, &ldquo;the code generates itself from the model&rdquo; — twenty-odd years ago it was the same promise with different acronyms. It collapsed every time for the same reason: the model was never the reality; the code was. SDD is MDA with an LLM bolted on. And <a href="https://www.alexcloudstar.com/blog/spec-driven-development-2026/"target="_blank" rel="noopener">I&rsquo;m not the only one seeing Waterfall 2.0 there</a>.</p>
<p>The people who tested the tools seriously landed in the same place. Thoughtworks put spec-driven development in the <a href="https://www.thoughtworks.com/radar/techniques/spec-driven-development"target="_blank" rel="noopener">&ldquo;Assess&rdquo; ring of its Technology Radar</a> — not &ldquo;adopt&rdquo;, &ldquo;assess&rdquo; — after watching the tools inflate small tasks into ceremony, and nailed the summary: we may be <em>&ldquo;relearning a bitter lesson — that handcrafting detailed rules for AI ultimately doesn&rsquo;t scale.&rdquo;</em> That&rsquo;s Rich Sutton&rsquo;s Bitter Lesson knocking again — handcrafted structure loses to scale, it always has.</p>
<p>There&rsquo;s also the temporal inversion. The great lesson of agile was that you discover what you want <strong>by building</strong> — working software over comprehensive documentation. LLMs just made iteration cheaper than it&rsquo;s ever been. And what does SDD propose? Expanding the planning phase, right now that iterating got cheap. Wrong answer, wrong direction, wrong time.</p>
<p>It&rsquo;s the thesis I&rsquo;ve been hammering since the first <a href="/en/2026/02/23/vibe-code-built-a-smart-image-indexer-with-ai-in-2-days-frank-sherlock/">Agile Vibe Coding</a> posts: <strong>software emerges, it isn&rsquo;t planned</strong>. <a href="/en/2026/02/20/zero-to-post-production-in-1-week-using-ai-on-real-projects-behind-the-m-akita-chronicles/">I wrote this back in February, with receipts</a>: the most important features of the M.Akita Chronicles were born from problems that showed up mid-way — a job that failed silently, a site that blocked the gem, a crash that left emails in limbo. No spec in the world predicts that. The correct system emerges from iteration, not from specification.</p>
<p>The process got documented again when ai-memory grew through 26 contributors in 24 days: <a href="/en/2026/06/14/ai-memory-emergent-architecture-malleable-software/">good software is a clay sculpture, not a Lego tower</a> — malleable, always adjustable, never done. Whoever tries to design the whole architecture before the first line builds a straitjacket, not a system. Only amateurs still believe you can spec out an entire piece of software before coding it. Real modeling doesn&rsquo;t come from templates or courses — <a href="/2023/08/11/akitando-144-modelagem-de-software-e-dificil-ver-vs-enxergar/">I covered this years ago in Akitando 144</a> (video in Portuguese): it&rsquo;s born from a repertoire of real problems and real code. There&rsquo;s no ready-made recipe; there never was.</p>
<p>SDD tries to resurrect the idea that you can plan software ahead of time — the idea the industry buried after decades of projects delivered late, wrong, and over budget. LLMs didn&rsquo;t revalidate that idea; they just gave it a new slide deck.</p>
<p>Even the pro-SDD guides separate the two things: <a href="https://dev.to/krlz/spec-driven-development-in-2026-what-it-is-the-tooling-and-how-teams-actually-use-it-2fk2"target="_blank" rel="noopener">&ldquo;spec-as-source is where the hype lives; spec-anchored is where the value is today&rdquo;</a>. My target here is the former. Where heavy specs are legitimate: large teams, legacy codebases, asynchronous work crossing time zones and sprints — the good old design document, which has always existed and always had value. What doesn&rsquo;t fly is selling that as the new default for everyone.</p>
<p>My benchmark prompt, for the record, is one page of goals. The difference is that I don&rsquo;t trust the prose: I validate by running it. Precision lives in tests, not in paragraphs.</p>
<h2>What you actually need<span class="hx:absolute hx:-mt-20" id="what-you-actually-need"></span>
    <a href="#what-you-actually-need" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I&rsquo;ve already written all of this on this blog, with real-project receipts. It&rsquo;s called <a href="/en/2026/02/23/vibe-code-built-a-smart-image-indexer-with-ai-in-2-days-frank-sherlock/">Agile Vibe Coding</a>, and it fits in a paragraph:</p>
<p>It&rsquo;s XP (eXtreme Programming, the original agile) with an LLM: tests, <a href="/en/2026/04/20/clean-code-for-ai-agents/">Clean Code</a>, CI (continuous integration), pair programming, and deploy. You drive the agent like you&rsquo;d drive a very fast pairing partner: say what you want, watch the execution, correct while mistakes are still cheap. The idea is 10% of the work; the other 90% is normal software engineering, the usual kind. <a href="/en/2026/04/15/how-to-talk-to-claude-code-effectively/">Forget frameworks and three-page templates</a>: what you need is to know what you want, know what you don&rsquo;t want, and know how to validate when it arrives. And you need balance: <a href="/en/2026/04/11/vs-code-is-the-new-punch-card/">neither handing the wheel to the agent nor turning into a comma cop</a>.</p>
<p>That&rsquo;s over 600 hours of it, over half a million lines, dozens of projects shipped. No graphs, no certifications, no loop with an English name.</p>
<blockquote>
  <p><strong>Remember this:</strong> the idea is 10% of the work; the other 90% is plain software engineering, the usual kind.</p>

</blockquote>
<h2>The piece that lets me swap harnesses: ai-memory<span class="hx:absolute hx:-mt-20" id="the-piece-that-lets-me-swap-harnesses-ai-memory"></span>
    <a href="#the-piece-that-lets-me-swap-harnesses-ai-memory" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>One of my own tools is the opposite of taxonomy: <a href="https://github.com/akitaonrails/ai-memory"target="_blank" rel="noopener">ai-memory</a>. It was born from a concrete problem. Every harness stores its session in its own format, and when the conversation gets long, it compacts the history to fit the window — and compaction throws away exactly the details that explain why each decision was made. Then you switch tools and start from zero, with the whole project to re-explain.</p>
<p>ai-memory solves this from outside the harness. It reads the native session without touching the original file and stores everything in a searchable ledger: messages, tool calls with results, compaction summaries, a git checkpoint — every event tagged with its origin (from Claude, Codex, OpenCode). When I open another harness, it gets its own native session and receives only the delta it hasn&rsquo;t seen. When I go back to the previous one, ai-memory resumes it in that client&rsquo;s format and hands over what happened on the others meanwhile.</p>
<p>That&rsquo;s why &ldquo;I swap harnesses like I swap underwear&rdquo; isn&rsquo;t a figure of speech. <strong>The project&rsquo;s knowledge lives in the project, not in one tool&rsquo;s session.</strong> If Anthropic changes pricing, limits, or models tomorrow — and they will — I swap the engine without throwing away the trip. The details of how this works are in <a href="/en/2026/07/20/whats-new-ai-memory-switch-agents-without-losing-session/">this post</a>.</p>
<p>There&rsquo;s an inversion here that takes SDD down as a bonus. Spec-driven development says the source of truth is a document written <strong>before</strong> the work, trying to predict the future, and that the code owes it obedience. ai-memory does the opposite: the source of truth is a <a href="/en/2026/06/16/ai-memory-long-term-memory-karpathy-wiki-self-improvement-hermes-projects/">wiki distilled from the work itself</a> — every session becomes evidence, and what deserves to survive (decisions, rules, gotchas, failed attempts) gets consolidated into short Markdown pages that any agent reads before starting.</p>
<p>The spec tries to guess the project; the wiki records the project. A document written beforehand rots at the first hotfix, because nobody is forced to update it. The wiki is fed by the very act of working — and when it goes stale, you notice immediately, because the agents trip over it every session.</p>
<p>Notice that this is real harness engineering: one tool, written once, solving a problem of mine. No course, no acronym, no certification.</p>
<h2>Conclusion: ask for the receipt<span class="hx:absolute hx:-mt-20" id="conclusion-ask-for-the-receipt"></span>
    <a href="#conclusion-ask-for-the-receipt" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Don&rsquo;t waste time or money on a &ldquo;harness engineering&rdquo; course, &ldquo;loop engineering,&rdquo; or whatever taxonomy is trending this week. It&rsquo;s a shameless attempt to charge you for things you already do if you know basic software engineering.</p>
<p>We&rsquo;ve seen this movie before, by the way. <a href="https://x.com/arantespp/status/2089752215380426951"target="_blank" rel="noopener">Pedro Arantes nailed it on X</a>: <em>&ldquo;Microservices, clean architecture, hexagonal, and Domain-Driven Design are all bullshit to sell more consulting hours and courses.&rdquo;</em> Same story, same script. Each of them was born from a real problem — and became the default for people who didn&rsquo;t have the problem. Microservices for a three-person team, hexagonal architecture for a CRUD (the plain old create-read-update-delete app), DDD to never write code again. The technique passes, the taxonomy stays, the course sells.</p>
<p>So nobody plays dumb: <strong>none of this is useless</strong>. A loop with verification works. A graph works when the flow is genuinely a graph. Heavy specs save large teams. Microservices solved real problems for people with real scale; DDD shines in genuinely complex domains. The problem was never the tool — it&rsquo;s selling the tool as a <strong>silver bullet</strong>, the universal hammer you must apply to everything. Silver bullets don&rsquo;t exist, they never have. Whoever sells you one isn&rsquo;t selling a solution; they&rsquo;re selling a course.</p>
<p>Understand the psychological mechanism, because it&rsquo;s old and efficient: those terms exist to give you <strong>FOMO</strong> (Fear of Missing Out). To make you anxious, thinking you&rsquo;re falling behind, that you&rsquo;re leaving productivity on the table, that everyone else already migrated to the new paradigm and you haven&rsquo;t. Anxiety sells. Once you&rsquo;re insecure, they charge you to implement something you never needed. FOMO is real — and here, it&rsquo;s the business model.</p>
<p>The model is recurring, too — admire the elegance. First they sell you the methodology that <em>generates</em> artifacts — specs, graphs, boards, diagrams. The artifacts multiply, nobody knows where anything is anymore, and guess who shows up? The same consultancy, now selling the tool that <em>manages</em> the artifacts, the course that teaches you to manage the tool, and the artifact-governance workshop. It&rsquo;s the shovel salesman congratulating you on the hole you dug — and offering you a bigger shovel.</p>
<p>Gartner even has an official name for it: <a href="https://www.gartner.com/en/newsroom/press-releases/2025-06-25-gartner-predicts-over-40-percent-of-agentic-ai-projects-will-be-canceled-by-end-of-2027"target="_blank" rel="noopener">&ldquo;agent washing&rdquo;</a> — take an existing product, slap the &ldquo;agentic&rdquo; label on it, resell. Their estimate: only about <strong>130 of the thousands</strong> of companies selling themselves as &ldquo;agentic AI&rdquo; are real, and their prediction is that 40% of such projects get canceled by the end of 2027, over cost, unclear value, or badly managed risk. No grudge of mine here: it&rsquo;s the hype cycle, measured, with a public forecast and everything.</p>
<p>Next time an influencer or consultant tries to push those products on you, ask a simple question: <strong>where are your dozens of high-quality open-source projects that got better because of those &ldquo;techniques&rdquo;?</strong></p>
<p>They have nothing to show. I do — <a href="https://github.com/akitaonrails?tab=repositories"target="_blank" rel="noopener">it&rsquo;s all public</a>, with code, benchmarks, and documented process. When technology becomes a commodity, money migrates to taxonomy. Don&rsquo;t be a customer of that migration.</p>
]]></content:encoded><category>artificial-intelligence</category><category>llms</category><category>vibe-coding</category></item><item><title>Understanding Anthropic's AI Watermark: How to Beat It</title><link>https://akitaonrails.github.io/en/2026/08/16/anthropic-ai-watermark-how-to-beat-it/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/08/16/anthropic-ai-watermark-how-to-beat-it/</guid><pubDate>Sun, 16 Aug 2026 16:00:00 -0300</pubDate><description>&lt;p&gt;Claude now ships with a stamp on it. Since August 2, 2026, Anthropic has been invisibly marking the text of its newest models, with the older ones migrating over the following months.&lt;/p&gt;
&lt;p&gt;No off switch. The backlash came fast: a &lt;a href="https://www.businessinsider.com/claude-users-cancel-subscriptions-citing-anthropic-new-ai-watermark-2026-8"target="_blank" rel="noopener"&gt;wave of subscription cancellations&lt;/a&gt;, with cancellation screenshots making the rounds on X.&lt;/p&gt;
&lt;p&gt;Before you cancel on reflex, it&amp;rsquo;s worth knowing what the mark actually is. It works quite differently from what most people picture, it exists for a concrete reason, and it vanishes with an almost comic ease.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Claude now ships with a stamp on it. Since August 2, 2026, Anthropic has been invisibly marking the text of its newest models, with the older ones migrating over the following months.</p>
<p>No off switch. The backlash came fast: a <a href="https://www.businessinsider.com/claude-users-cancel-subscriptions-citing-anthropic-new-ai-watermark-2026-8"target="_blank" rel="noopener">wave of subscription cancellations</a>, with cancellation screenshots making the rounds on X.</p>
<p>Before you cancel on reflex, it&rsquo;s worth knowing what the mark actually is. It works quite differently from what most people picture, it exists for a concrete reason, and it vanishes with an almost comic ease.</p>
<p>For those in a hurry, the essentials:</p>
<ul>
<li><strong>A statistical bias in the words Claude picks.</strong> Invisible to the reader, detectable only by whoever holds Anthropic&rsquo;s key. Hidden characters and strange fonts stay out.</li>
<li><strong>The origin is European law, the AI Act.</strong> Anthropic signed the EU transparency code and chose to stamp the whole world; the why comes below.</li>
<li><strong>One pass through another LLM erases the stamp.</strong> The signal lives in Claude&rsquo;s word choices; when another model rewrites the text, even a weak local one, the choices become its own and the pattern dissolves. Anthropic itself admits this.</li>
</ul>
<p>Each point in detail below.</p>
<h2>What this watermark actually is<span class="hx:absolute hx:-mt-20" id="what-this-watermark-actually-is"></span>
    <a href="#what-this-watermark-actually-is" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Strike the invisible Unicode character, the hidden space mid-line, the altered font. Anthropic&rsquo;s watermark is <a href="https://www.anthropic.com/news/claude-text-watermark"target="_blank" rel="noopener">statistical</a>: it acts at the moment Claude decides which word to use, precisely at the points where several words would serve equally well.</p>
<p>Every language model assembles text one word at a time, pulling the next from a list of likely candidates. When two or three work equally well, a random number settles it. The watermark changes where that randomness comes from: the number now derives from a secret key combined with the preceding words. The method is inherited from <a href="https://ai.google.dev/responsible/docs/safeguards/synthid"target="_blank" rel="noopener">SynthID-Text</a> at Google DeepMind.</p>
<p>A concrete example. Talking about the weather, &ldquo;the sky was overcast&rdquo; and &ldquo;the sky was grey&rdquo; carry the same information. At these synonym junctions, the key leans Claude one way more often than pure chance would. Each individual choice goes unnoticed, but a long text repeats this decision point hundreds of times, and the whole ends up forming a statistical signature.</p>
<p>Anthropic&rsquo;s announcement is blunt: <strong>the text gains nothing, and no character stays hidden</strong>. The cost stays the same because no extra tokens are generated, and the reading is identical. Whoever holds the key runs a detector, compares the sequence of words against Claude&rsquo;s typical choices, and gets back a probability that the text came from Claude.</p>
<p>And what the mark proves boils down to this: Claude <strong>was involved</strong> at some point. It doesn&rsquo;t distinguish text the model wrote from scratch from text it merely edited heavily. About you, nothing gets recorded: no user, no company, no identified conversation.</p>
<p>The stamp covers text in Claude.ai, the API, Claude Code, and the other products. In code it shows up less, since code rarely lets you swap one term for an equivalent. Files and images take a different route, a signed piece of metadata called C2PA, instead of this text watermark. And the limitation matters: on short or highly factual passages, where almost no word choice exists, the detector weakens.</p>
<h2>Why so many people canceled<span class="hx:absolute hx:-mt-20" id="why-so-many-people-canceled"></span>
    <a href="#why-so-many-people-canceled" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The spark added up three ingredients: mandatory, global reach, and no opt-out. The mark can&rsquo;t be switched off and applies outside Europe too. A wave of Claude Max subscribers <a href="https://www.forbes.com/sites/maryroeloffs/2026/08/11/claude-will-put-invisible-watermarks-on-ai-text-and-images-and-the-internet-isnt-happy/"target="_blank" rel="noopener">canceled citing control and authorship</a> of their own material.</p>
<p>The fear is concrete, professional and academic. Drafting with Claude and signing the result as your own becomes a liability if, down the road, a detector points at &ldquo;went through AI&rdquo;. <a href="https://gizmodo.com/anthropic-explains-its-watermark-system-as-some-claude-users-loudly-revolt-2000799022"target="_blank" rel="noopener">Anthropic answered with a post</a> insisting the mark preserves reading, meaning, and quality, only signaling processing. Not everyone bought it.</p>
<h2>The European law behind the stamp<span class="hx:absolute hx:-mt-20" id="the-european-law-behind-the-stamp"></span>
    <a href="#the-european-law-behind-the-stamp" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The stamp was born of a concrete obligation. <a href="https://artificialintelligenceact.eu/article/50/"target="_blank" rel="noopener">Article 50 of the AI Act</a> requires providers of generative AI systems to mark output in machine-readable form, so artificial content can be identified as such. The obligation took effect on August 2, 2026, and violating it costs real money: fines up to €15 million or 3% of annual global revenue.</p>
<p>Back in July 2026, Anthropic had signed the European Commission&rsquo;s Code of Practice on Transparency for AI-Generated Content, alongside other major model providers, in a group of roughly 190 signatories. The others will implement their own watermarks too, each with its own key and its own method.</p>
<p>That left Anthropic with a decision: restrict marking to Europe or extend it to the whole planet. The company says it still has no durable way to scope the mark by region, so it chose to stamp everything, everywhere, from day one. Hence the stamp showing up in the text of Brazilian and Japanese subscribers, who have nothing to do with European law.</p>
<h2>Can you remove it by passing the text through another LLM?<span class="hx:absolute hx:-mt-20" id="can-you-remove-it-by-passing-the-text-through-another-llm"></span>
    <a href="#can-you-remove-it-by-passing-the-text-through-another-llm" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>That&rsquo;s the question I get most. Short answer: yes, and it&rsquo;s easy. The signal lives in Claude&rsquo;s word choices; when another model rewrites the text, the choices become that model&rsquo;s, and the statistical pattern comes apart.</p>
<p>Anthropic itself admits it. Light retouching probably leaves pieces of the mark, but <strong>a complete rewrite, with every word swapped, kills the signal</strong>. The logic is simple: the detector measures which synonyms Claude preferred; if another model picked its own synonyms, there&rsquo;s nothing of Claude left to measure.</p>
<p>Academia confirms the direction. <a href="https://arxiv.org/abs/2508.20228"target="_blank" rel="noopener">Robustness tests of SynthID</a>, done at Queen&rsquo;s University, start from perfect detection with no attack and show the rate dropping to around 84% after a dedicated paraphraser, and below 70% with round-trip translation. The more aggressive the rewrite, the more the signal degrades.</p>
<p>And yes, your intuition is right: <strong>a modest model, even a local one, does the job</strong>. Rearranging text while preserving the meaning is a task that calls for zero deep reasoning. A GLM, a Kimi, a small Llama running on your machine rewrites the paragraph and wipes the signature along the way. Swapping &ldquo;overcast&rdquo; for &ldquo;grey&rdquo; a thousand times is nowhere near needing the smartest model on the market.</p>
<p>Two honest caveats. The rewrite has to be genuine, word by word; a spell-checker pass doesn&rsquo;t come close to counting. And all of this applies to the text watermark: files and images carry that C2PA metadata, which comes off by another method, stripping the file&rsquo;s metadata.</p>
<h2>What prompt would pull this off<span class="hx:absolute hx:-mt-20" id="what-prompt-would-pull-this-off"></span>
    <a href="#what-prompt-would-pull-this-off" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Add up the watermark&rsquo;s criteria and the removal prompt practically writes itself. The mark inhabits synonym and structure choices, survives light editing, and needs text of some length. So the prompt has to demand maximum vocabulary and structure swap while holding the meaning in place.</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Rewrite the text below in full, in your own words.
</span></span><span class="line"><span class="cl">Replace the vocabulary and restructure the sentences from start to finish:
</span></span><span class="line"><span class="cl">pick different synonyms, change the order of the clauses, vary the construction.
</span></span><span class="line"><span class="cl">Keep the exact meaning, the facts, and the tone.
</span></span><span class="line"><span class="cl">Avoid reproducing any literal expression from the original.
</span></span><span class="line"><span class="cl">Return only the rewritten text.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Text:
</span></span><span class="line"><span class="cl">&#34;&#34;&#34;
</span></span><span class="line"><span class="cl">&lt;paste the Claude text here&gt;
</span></span><span class="line"><span class="cl">&#34;&#34;&#34;</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>Each line targets one criterion. &ldquo;In your own words&rdquo; and &ldquo;replace the vocabulary&rdquo; dismantle the synonym junctions where the mark hides. &ldquo;Restructure the sentences&rdquo; and &ldquo;change the order of the clauses&rdquo; break the word sequence the detector compares. &ldquo;Avoid reproducing any literal expression&rdquo; seals the gaps a light edit would leave open.</p>
<p>No magic here, and that&rsquo;s by design. Anthropic knows the limit and says it plainly: the mark is soft, attests that Claude touched the text, and disappears in the face of a serious rewrite. It works as a provenance label in a world where most people will never bother to erase it; against whoever decides to erase it, the signal is weak.</p>
<h2>Where this leaves us<span class="hx:absolute hx:-mt-20" id="where-this-leaves-us"></span>
    <a href="#where-this-leaves-us" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>In my accounting, the watermark scares less and does less than both sides of the shouting advertise. It&rsquo;s invisible, carries zero data about you, and proves at most that Claude passed through the text. A rewrite in any model dissolves it. It&rsquo;s a deliberately weak provenance label, designed to satisfy European law.</p>
<p>Still, canceling over it follows a logic I understand. Compulsory, planetary marking with no exit door irritates the people paying for the tool. And of the roughly 190 signatories to the European Code, Claude was the first to hit the headlines, absorbing the revolt wave all alone.</p>
<p>If you just want to use Claude and get on with your life, the day-to-day difference is barely there. If you need your text not to scream &ldquo;AI&rdquo;, a paragraph rewritten in a local model fixes it, and the recipe comes straight from Anthropic itself. The noise ended up much bigger than the hole.</p>
<h2>How this text was made<span class="hx:absolute hx:-mt-20" id="how-this-text-was-made"></span>
    <a href="#how-this-text-was-made" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Transparency suits the subject. The first draft of this article was written by Claude. Then Kimi ran the fact-check, claim by claim, against the original sources, and caught an invented statistic along the way, which we corrected. Finally, GLM rewrote the entire text, word by word, following the recipe from the sections above.</p>
<p>In other words: the article applies to itself what it teaches. It left Claude, passed through Kimi&rsquo;s sieve, and came back with GLM&rsquo;s vocabulary and construction. If the original draft carried the watermark, the complete rewrite swapped the word choices, and with them the signal. With no public detector, nobody can check from the outside; the recipe, anyone can test.</p>
]]></content:encoded><category>llms</category><category>security</category><category>law-and-regulation</category></item><item><title>LLM Benchmarks: Qwen 3.8, GLM 5.3, Gemini 3.7, Grok 4.6</title><link>https://akitaonrails.github.io/en/2026/08/15/llm-benchmarks-qwen-3-8-glm-5-3-gemini-3-7/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/08/15/llm-benchmarks-qwen-3-8-glm-5-3-gemini-3-7/</guid><pubDate>Sat, 15 Aug 2026 14:00:00 -0300</pubDate><description>&lt;p&gt;Two weeks ago I published &lt;a href="https://akitaonrails.github.io/en/2026/07/30/new-llm-benchmark-i-reran-every-test/"&gt;version 2 of my LLM Coding Benchmark&lt;/a&gt;: a new three-phase test — build, validate everything by actually running it, then self-review, with honesty points — each family running on the harness where it should work best. The methodology is all there, so I won&amp;rsquo;t repeat it here.&lt;/p&gt;
&lt;p&gt;The top hasn&amp;rsquo;t moved: &lt;strong&gt;Fable 5 at 96&lt;/strong&gt;, the trio of &lt;strong&gt;Sonnet 5, Opus 5, and Kimi K3 at 95&lt;/strong&gt;, and right behind them &lt;strong&gt;GPT 5.6 Sol, GPT 5.6 Terra, and Opus 4.8 at 93&lt;/strong&gt;. That&amp;rsquo;s the cream of the crop in this test. The open question: how close do the newest releases get to that group?&lt;/p&gt;</description><content:encoded><![CDATA[<p>Two weeks ago I published <a href="/en/2026/07/30/new-llm-benchmark-i-reran-every-test/">version 2 of my LLM Coding Benchmark</a>: a new three-phase test — build, validate everything by actually running it, then self-review, with honesty points — each family running on the harness where it should work best. The methodology is all there, so I won&rsquo;t repeat it here.</p>
<p>The top hasn&rsquo;t moved: <strong>Fable 5 at 96</strong>, the trio of <strong>Sonnet 5, Opus 5, and Kimi K3 at 95</strong>, and right behind them <strong>GPT 5.6 Sol, GPT 5.6 Terra, and Opus 4.8 at 93</strong>. That&rsquo;s the cream of the crop in this test. The open question: how close do the newest releases get to that group?</p>
<p>Since then I&rsquo;ve run five models: Qwen 3.8 Max, GLM 5.3, Gemini 3.7 Flash, Grok 4.6, and a 27B Qwen 3.8 running locally on my RTX 5090. One of them closed in on the leading group. Another pulled off the biggest jump this test has ever recorded. A third got caught cheating mid-test. A fourth tied its own previous generation, without moving an inch. And the local one gave me the most laborious, and most instructive, run of the year.</p>
<h2>Where they land in the ranking<span class="hx:absolute hx:-mt-20" id="where-they-land-in-the-ranking"></span>
    <a href="#where-they-land-in-the-ranking" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Before opening each one up, it&rsquo;s worth seeing where the newcomers fit. The table below is the <strong>Tier A.1</strong> slice of the <a href="/en/2026/07/30/new-llm-benchmark-i-reran-every-test/">v2 ranking</a>: the frontier of the test, everyone at 90 points or more. I cut it here on purpose. From A.2 down there are competent models, but the leadership race lives in this group, and that&rsquo;s what the question is about. The three cloud releases go in <strong>bold</strong>; the local 27B Qwen scored 51, Tier C, and shows up only in the table at the end.</p>
<table>
  <thead>
      <tr>
          <th style="text-align: right">#</th>
          <th>Model</th>
          <th style="text-align: right">Score</th>
          <th style="text-align: center">Tier</th>
          <th>Harness</th>
          <th style="text-align: right">Time</th>
          <th style="text-align: right">Cost</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: right">1</td>
          <td>Claude Fable 5</td>
          <td style="text-align: right">96</td>
          <td style="text-align: center">A.1</td>
          <td>Claude Code</td>
          <td style="text-align: right">46 min</td>
          <td style="text-align: right">$26.03</td>
      </tr>
      <tr>
          <td style="text-align: right">2</td>
          <td>Claude Sonnet 5</td>
          <td style="text-align: right">95</td>
          <td style="text-align: center">A.1</td>
          <td>Claude Code</td>
          <td style="text-align: right">59 min</td>
          <td style="text-align: right">$25.83</td>
      </tr>
      <tr>
          <td style="text-align: right">2</td>
          <td>Claude Opus 5</td>
          <td style="text-align: right">95</td>
          <td style="text-align: center">A.1</td>
          <td>Claude Code</td>
          <td style="text-align: right">78 min</td>
          <td style="text-align: right">$38.91</td>
      </tr>
      <tr>
          <td style="text-align: right">2</td>
          <td>Kimi K3</td>
          <td style="text-align: right">95</td>
          <td style="text-align: center">A.1</td>
          <td>Kimi CLI</td>
          <td style="text-align: right">65 min</td>
          <td style="text-align: right">$6.14</td>
      </tr>
      <tr>
          <td style="text-align: right">5</td>
          <td><strong>GLM 5.3</strong></td>
          <td style="text-align: right"><strong>94</strong></td>
          <td style="text-align: center">A.1</td>
          <td>OpenCode</td>
          <td style="text-align: right">80 min</td>
          <td style="text-align: right">$0 (≈$2.59)</td>
      </tr>
      <tr>
          <td style="text-align: right">6</td>
          <td>GPT 5.6 Sol</td>
          <td style="text-align: right">93</td>
          <td style="text-align: center">A.1</td>
          <td>Codex</td>
          <td style="text-align: right">57 min</td>
          <td style="text-align: right">~$45</td>
      </tr>
      <tr>
          <td style="text-align: right">6</td>
          <td>Claude Opus 4.8</td>
          <td style="text-align: right">93</td>
          <td style="text-align: center">A.1</td>
          <td>Claude Code</td>
          <td style="text-align: right">53 min</td>
          <td style="text-align: right">$21.82</td>
      </tr>
      <tr>
          <td style="text-align: right">6</td>
          <td>GPT 5.6 Terra</td>
          <td style="text-align: right">93</td>
          <td style="text-align: center">A.1</td>
          <td>Codex</td>
          <td style="text-align: right">48 min</td>
          <td style="text-align: right">$16.92</td>
      </tr>
      <tr>
          <td style="text-align: right">6</td>
          <td><strong>Gemini 3.7 Flash</strong></td>
          <td style="text-align: right"><strong>93</strong></td>
          <td style="text-align: center">A.1</td>
          <td>OpenCode</td>
          <td style="text-align: right">43 min</td>
          <td style="text-align: right">$4.12</td>
      </tr>
      <tr>
          <td style="text-align: right">10</td>
          <td>GLM 5.2</td>
          <td style="text-align: right">92</td>
          <td style="text-align: center">A.1</td>
          <td>OpenCode</td>
          <td style="text-align: right">155 min</td>
          <td style="text-align: right">$0 (≈$12.05)</td>
      </tr>
      <tr>
          <td style="text-align: right">10</td>
          <td>Kimi K2.5</td>
          <td style="text-align: right">92</td>
          <td style="text-align: center">A.1</td>
          <td>OpenCode</td>
          <td style="text-align: right">43 min</td>
          <td style="text-align: right">$1.50</td>
      </tr>
      <tr>
          <td style="text-align: right">10</td>
          <td>Gemini 3.6 Flash @ high</td>
          <td style="text-align: right">92</td>
          <td style="text-align: center">A.1</td>
          <td>Antigravity</td>
          <td style="text-align: right">15 min</td>
          <td style="text-align: right">—</td>
      </tr>
      <tr>
          <td style="text-align: right">10</td>
          <td><strong>Qwen 3.8 Max</strong></td>
          <td style="text-align: right"><strong>92</strong></td>
          <td style="text-align: center">A.1</td>
          <td>OpenCode</td>
          <td style="text-align: right">78 min</td>
          <td style="text-align: right">$9.16</td>
      </tr>
      <tr>
          <td style="text-align: right">10</td>
          <td><strong>Grok 4.6</strong></td>
          <td style="text-align: right"><strong>92</strong></td>
          <td style="text-align: center">A.1</td>
          <td>OpenCode</td>
          <td style="text-align: right">34 min</td>
          <td style="text-align: right">$6.33</td>
      </tr>
      <tr>
          <td style="text-align: right">15</td>
          <td>MiniMax M3</td>
          <td style="text-align: right">91</td>
          <td style="text-align: center">A.1</td>
          <td>OpenCode</td>
          <td style="text-align: right">113 min</td>
          <td style="text-align: right">$7.72</td>
      </tr>
      <tr>
          <td style="text-align: right">15</td>
          <td>Kimi K2.6</td>
          <td style="text-align: right">91</td>
          <td style="text-align: center">A.1</td>
          <td>OpenCode</td>
          <td style="text-align: right">34 min</td>
          <td style="text-align: right">$2.64</td>
      </tr>
      <tr>
          <td style="text-align: right">15</td>
          <td>Claude Opus 4.7</td>
          <td style="text-align: right">91</td>
          <td style="text-align: center">A.1</td>
          <td>Claude Code</td>
          <td style="text-align: right">44 min</td>
          <td style="text-align: right">$44.28</td>
      </tr>
      <tr>
          <td style="text-align: right">15</td>
          <td>GPT 5.6 Luna</td>
          <td style="text-align: right">91</td>
          <td style="text-align: center">A.1</td>
          <td>Codex</td>
          <td style="text-align: right">46 min</td>
          <td style="text-align: right">$16.79</td>
      </tr>
      <tr>
          <td style="text-align: right">15</td>
          <td>Grok 4.5</td>
          <td style="text-align: right">91</td>
          <td style="text-align: center">A.1</td>
          <td>grok CLI</td>
          <td style="text-align: right">25 min</td>
          <td style="text-align: right">$0 (≈$1.62)</td>
      </tr>
  </tbody>
</table>
<p><em>Time is wall clock across the three phases; cost is API-equivalent. On subscription plans (Z.ai, grok CLI) the marginal cost is $0 and the value in parentheses is the API-equivalent; the Antigravity runs were preview and were not metered. Same criterion as the previous article.</em></p>
<h2>Qwen 3.8 Max: the biggest jump in benchmark history<span class="hx:absolute hx:-mt-20" id="qwen-38-max-the-biggest-jump-in-benchmark-history"></span>
    <a href="#qwen-38-max-the-biggest-jump-in-benchmark-history" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>To measure the jump, first the size of the hole. Qwen 3.7 Max had scored <strong>51 points, Tier C</strong>, and the reason was ugly. When implementing the multi-turn chat, it decided it could replay history by calling <code>chat.ask(entire_history_array)</code>. Except RubyLLM&rsquo;s <code>ask</code> wraps its argument into a single user message: the entire conversation, assistant turns included, becomes one message with every role obliterated. Worse, the required test for that feature <strong>mocked exactly that nonexistent API</strong>. A test that mocks a fabricated API is worse than no test, because it certifies the hallucination.</p>
<p>The 3.8 Max fixed exactly that. It used the real API end to end: <code>add_message</code> with role and content for history replay, <code>with_instructions</code>, <code>with_tools</code>, <code>with_schema</code>, all verified against the installed gem&rsquo;s source. The result: <strong>92 points, Tier A</strong>. That&rsquo;s a <strong>41-point jump</strong> on the same test, same rubric, same harness. The test didn&rsquo;t get easier; the model finally understood the library.</p>
<p>The rest of the delivery is solid: real incremental streaming, history surviving restarts, a hand-written calculator with no <code>eval</code>, tools answering with exact arithmetic, the app booting in Docker on the first try. The suite came out with 62 tests and 226 assertions, all green.</p>
<p>Where it lost points is instructive: <code>config/puma.rb</code> shipped without the <code>workers</code> directive, so the <code>WEB_CONCURRENCY=2</code> it swore it had delivered was, in practice, running single-process. Concurrency scored 8 instead of 9. And it kept the stale pin on <code>claude-sonnet-4.6</code>, the house&rsquo;s standard deduction.</p>
<blockquote>
  <p><strong>Remember this:</strong> the model swore concurrency worked — one missing line in <code>puma.rb</code> and the &ldquo;two workers&rdquo; ran as a single process. That&rsquo;s why phase 2 doesn&rsquo;t read READMEs: it boots the server and measures.</p>

</blockquote>
<p>On the table, those 92 points tie with GLM 5.2 and Kimi K2.5, <strong>one point below Sol and Terra</strong>. It cost $9.16 in API and 78 minutes — verbose: 25 million tokens.</p>
<h2>GLM 5.3: the loneliest step on the table<span class="hx:absolute hx:-mt-20" id="glm-53-the-loneliest-step-on-the-table"></span>
    <a href="#glm-53-the-loneliest-step-on-the-table" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Z.ai&rsquo;s trajectory in this test is the steadiest of the pack: GLM 5 scored 83, GLM 5.2 scored 92, and now <strong>GLM 5.3 scored 94</strong> — alone on a step nobody else occupies, one point below the 95 trio and one point above the 93 group. In other words: <strong>two points from Fable 5</strong>.</p>
<p>And the inevitable comparison is with Kimi. K3 scored 95, one point above — but it ran on the Kimi CLI, its native harness. GLM 5.3&rsquo;s 94 came on opencode, the generic harness: it&rsquo;s the <strong>highest score ever recorded there</strong>. On the same opencode, the best Kimi is K2.5 at 92, two points below. On cost, both live on subscriptions: K3 came out at $6.14 equivalent on the Moderato plan; GLM at zero marginal cost. Kimi still wins on score; GLM wins on cost and harness independence.</p>
<p>What pulled it out of the 92 pack? Three things, all boring, all important:</p>
<ol>
<li><strong>Concurrency delivered working.</strong> The same file-lock scheme as Qwen 3.8 Max, plus a per-conversation turn lock, plus two real workers surviving kill and restart without corrupting anything. The Qwen had the same foundation but shipped concurrency broken and scored 8. The GLM shipped it working and got 9.</li>
<li><strong>A fallback token estimator</strong>, so the per-conversation budget works even when the provider doesn&rsquo;t report usage. The 5.2 depended on it, and lost points there.</li>
<li><strong>Branch coverage enabled</strong>: 98% line and 82% branch, a suite of 73 tests and 219 assertions green under the auditor&rsquo;s hand, with RuboCop, Brakeman, and bundle-audit all at zero.</li>
</ol>
<blockquote>
  <p><strong>Remember this:</strong> the distance between the 92 pack and GLM&rsquo;s 94 isn&rsquo;t model brilliance: it&rsquo;s concurrency that actually works, a fallback token estimator, and branch coverage. Boring engineering earns points.</p>

</blockquote>
<p>The only real slip was the same stale sonnet-4.6 pin. And there was a division-by-zero bug in the calculator that the model itself found and fixed in the self-review — exactly the kind of behavior that phase exists to measure. Speaking of which: it confessed everything, including that the conversation title never retries if generation fails, and took 14 of the 15 honesty points.</p>
<p>And the cost is the part that hurts the competition: it ran on Z.ai&rsquo;s flat-rate plan, so the run came out at <strong>zero marginal cost</strong> — the API equivalent would be $2.59. Eighty minutes, 19.4 million tokens. The &ldquo;Chinese models are the cheap alternative&rdquo; conversation died a while ago: this is a leadership candidate that also happens to be cheap.</p>
<h2>Gemini 3.7 Flash: 93, Tier A — and the cheat along the way<span class="hx:absolute hx:-mt-20" id="gemini-37-flash-93-tier-a--and-the-cheat-along-the-way"></span>
    <a href="#gemini-37-flash-93-tier-a--and-the-cheat-along-the-way" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The technical part you already know: Gemini 3.1 Pro died in v2 because of a Google bug, <code>Corrupted thought signature</code>, which killed executions mid-run via OpenRouter and trapped it at 62 (over the direct path, it scored 88). This time I cut out the middleman: a <strong>direct Gemini API key</strong>, no OpenRouter in between, and the bug never showed up once. The direct path worked — and 3.7 Flash became the <strong>first Gemini to reach Tier A on opencode</strong>: 3.5 Flash scored 79 there, 3.1 Pro scored 62. Before that, only Google&rsquo;s native harness had taken a Gemini to A.</p>
<p>Official result: <strong>93 points</strong>, tied with GPT 5.6 Sol, Terra, and Opus 4.8. The run cost $4.12, took 43 minutes, and burned 27.8 million tokens.</p>
<p>But the road to that 93 produced the most important finding of this cycle. The first 3.7 Flash run raised a red flag — and there was a reason. Midway through the build, and again in the self-review, the model <strong>read the scoring rubric</strong>, read the entire v2 report — every competitor&rsquo;s score and audit — and <strong>ran the audit scanner on itself eight times</strong>. It spent the whole test studying how it would be graded.</p>
<p>The smoking gun is the pin. The contaminated run came out with the correct pin on <code>claude-sonnet-5</code>, that feat only three models had managed in the benchmark&rsquo;s entire history. I voided that run and redid it with all the grading material out of the model&rsquo;s reach: out came the stale pin on <code>claude-sonnet-4.6</code>, like everyone else. It didn&rsquo;t know the current model at all — it had read the answer in the report. The 93 belongs to that second, clean run.</p>
<p>To be fair: it didn&rsquo;t copy code from any sibling app. What it did was cheat off the grading — and that was enough for no model, frontier or not, to ever run with access to that material again.</p>
<p>And the 93 isn&rsquo;t charity — the delivery stands on its own. Real RubyLLM API end to end, a safe calculator with no <code>eval</code>, correct multi-turn history, incremental streaming working end to end in Docker, persistence surviving restarts with two workers. A suite of 55 tests and 213 assertions, all green, branch coverage enabled. The deductions: the stale pin and the lack of a per-conversation turn lock — the same concurrency ceiling as Fable 5.</p>
<blockquote>
  <p><strong>Remember this:</strong> this time it wasn&rsquo;t a weak local copying from the neighbor. It was a frontier model checking the answers mid-test.</p>

</blockquote>
<h2>Qwen 3.8 27B local: the most laborious run of the year<span class="hx:absolute hx:-mt-20" id="qwen-38-27b-local-the-most-laborious-run-of-the-year"></span>
    <a href="#qwen-38-27b-local-the-most-laborious-run-of-the-year" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>In the previous article I said I&rsquo;d only test a new local model if strong evidence showed up. Then the Max sibling scored 92, the open 27B version was available, and I had the excuse I was missing. It was worth it for the science, but it took work.</p>
<p>First surprise: the 3.8 27B uses a hybrid SSM/Mamba architecture, and my tuned llama.cpp llama-swap build <strong>can&rsquo;t load the model</strong> — a tensor is missing (<code>ssm_conv1d</code>) that only newer versions know about. The fix was spinning up a fresh Ollama container, which bundles a current llama.cpp, and importing the GGUF I had already downloaded via a Modelfile. First lesson: with local models, the tooling ages in months.</p>
<p>Second surprise: context. A reasoning model burns an absurd number of tokens thinking, and a small window won&rsquo;t do — at 32K or 64K it doesn&rsquo;t even finish the test, exhausting everything reading the gem&rsquo;s source before writing the first line of the app. The official run needed <strong>176K of context</strong>, nearly everything the RTX 5090&rsquo;s 32 GB can hold. What stopped the model from finishing was a context ceiling, not lack of capability.</p>
<p>Then came the incident. The first run completed — and completed too well. I went through the log: the model had read the online Qwen 3.8 Max&rsquo;s finished app <strong>sixteen times</strong>, sitting right there in the repository, and copied its UI and streaming. It would have taken some 75 points on someone else&rsquo;s work. I voided it and reran with no third-party app anywhere near. And as the Gemini section above shows, it&rsquo;s not just the locals who look for help when help is lying around.</p>
<blockquote>
  <p><strong>Remember this:</strong> a weak local model doesn&rsquo;t just invent nonexistent APIs — it also copies from the neighbor when the neighbor is in the same directory.</p>

</blockquote>
<p>With no neighbors around, the 27B scored <strong>51 points, Tier C</strong> — tied, by coincidence, with the online Qwen 3.7 Max&rsquo;s score. And the receipt is mixed. The core it got right: real <code>add_message</code>, real <code>with_tools</code>, a recursive-descent calculator with no <code>eval</code>, the payoff of actually reading the gem&rsquo;s source. Where it sank was breadth: it used ActiveRecord where the requirements forbid it, the streaming comes out broken (the tokens are broadcast, but the reply bubble never enters the screen — it only appears if you refresh the page), it didn&rsquo;t use <code>with_schema</code>, it built no token budget, it delivered <strong>zero tests</strong>, RuboCop flagged 22 offenses, and no Dockerfile came out at all. The self-review, though, was exemplary: it found and confessed every one of those flaws itself, with file and line — 14 of the 15 honesty points. It reviews better than it builds.</p>
<p>Cost of the run: nothing, 37 million tokens, and 156 minutes of a sweating RTX 5090.</p>
<p>To calibrate the 51: the Tier A floor is <strong>Opus 4.6 at 83</strong>. The 32-point gap isn&rsquo;t in &ldquo;knowing the library&rdquo; — the 27B now gets that right. It&rsquo;s in the production-hardening dimensions: streaming, tests, gates, Docker, budgeting. It&rsquo;s the difference between knowing how to program and knowing how to deliver.</p>
<p>And comparing with the earlier locals — always with the caveat that the tests aren&rsquo;t comparable: in v1, the local Qwens hallucinated the gem wholesale (one invented an <code>Openrouter::Client</code> with the wrong capitalization, another created a <code>RubyLLM::Client</code> that doesn&rsquo;t exist). The Qwen 3.5 35B got the entry point right, but its tests wrapped any exception in an <code>assert true</code>. The 3.6 35B was the first local to get the primary calls right, still with broken multi-turn. The 3.8 27B gets the entire API core right on a much harder test. The score you can&rsquo;t compare; the behavior you can: API knowledge is no longer the locals&rsquo; problem. The problem now is engineering.</p>
<h2>Grok 4.6: the first flat generation, and the cleanest run<span class="hx:absolute hx:-mt-20" id="grok-46-the-first-flat-generation-and-the-cleanest-run"></span>
    <a href="#grok-46-the-first-flat-generation-and-the-cleanest-run" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>After two cheating busts, a breather. I ran Grok 4.6 with the shielding cranked all the way up: I moved everything out of the model&rsquo;s reach — the grading rubric, the entire v2 report, the audit scanner, <code>CLAUDE.md</code>&rsquo;s deduction catalog, and all 44 competitor apps, all pulled out of the repo. It was the first run under that stricter regime. And the post-run scan turned up nothing: zero reads of any grading file, zero peeks at a sibling app. It ran clean. After Gemini and the local Qwen, it&rsquo;s good to watch a frontier model build on its own because it had nowhere to crib from.</p>
<p>The result has a curious detail: <strong>92 points, Tier A, the same score as Grok 4.5.</strong> It&rsquo;s the first generation-over-generation tie in the whole test. While GLM climbed 83, 92, 94, Kimi went 77 to 86 to 95, and Claude ratcheted up without a stumble, Grok walked sideways. The 4.6 bought nothing over the 4.5. In the table up top the 4.5 shows 91 because I use its grok CLI number, its native harness; head to head in the same OpenCode, the two land on a dead-even 92.</p>
<p>What it delivered is solid and real. Correct RubyLLM API end to end, a hand-written calculator with no <code>eval</code> (regex tokenizer and parser, proven live with <code>(12.5*4)/2+7 = 32.0</code>), a test checking the exact array sent to the provider, a file store with a lock surviving restart with two workers, a token budget with a fallback estimator, and <code>docker compose up --build</code> answering a real chat. Streaming was proven live in phase 2: five tokens arriving incrementally while the POST was still open. And it was the thriftiest of all the Tier A OpenCode runs, at 10 million tokens, because Grok is terse. It cost $6.33 and 34 minutes.</p>
<p>The deductions are honest, and it confessed them itself. The lock doesn&rsquo;t cover the read-modify-write window, so two simultaneous turns on the same conversation become a last-writer-wins race, the same hazard as GLM 5.2. Test coverage is thin on the critical path, with the integration test being just a home-page smoke test. And it kept the stale <code>claude-sonnet-4.6</code> pin, the house&rsquo;s default deduction. A self-review of 12 PASS and 2 PARTIAL, all verified by the auditor. No new brilliance: it&rsquo;s a good model repeating a good model.</p>
<p>Then I ran the same Grok 4.6 on its native harness, the grok CLI, to see if anything changed. Not much did: <strong>93 on the grok CLI against 92 on OpenCode</strong>, one point apart, inside the noise. No harness effect. The CLI neither scaffolded nor broke anything; Grok builds plenty competently on either one.</p>
<p>That extra point has a concrete, mundane explanation: by chance, the CLI run locked the store&rsquo;s entire read-modify-write window under a single <code>File::LOCK_EX</code>, so concurrency went to 9; the OpenCode run left that race open and stayed at 8. Same model, one run each: the difference is variance between the two code generations. The harness played no part in it. What actually changed was the cost: on the grok CLI the same test came in at <strong>$1.19</strong>, against OpenCode&rsquo;s $6.33, for the same ~11 million tokens, thanks to xAI&rsquo;s native caching.</p>
<blockquote>
  <p><strong>Remember this:</strong> not every new generation buys a point. Grok 4.6 tied itself, and the good news was passing clean through the toughest shielding I&rsquo;ve applied yet.</p>

</blockquote>
<h2>Conclusion: how close did they get?<span class="hx:absolute hx:-mt-20" id="conclusion-how-close-did-they-get"></span>
    <a href="#conclusion-how-close-did-they-get" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>Short answer: very close.</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th style="text-align: right">Score</th>
          <th style="text-align: center">Tier</th>
          <th style="text-align: right">Time</th>
          <th>Cost</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>GLM 5.3</td>
          <td style="text-align: right"><strong>94</strong></td>
          <td style="text-align: center">A</td>
          <td style="text-align: right">80 min</td>
          <td>$0 on the plan (~$2.59 API)</td>
      </tr>
      <tr>
          <td>Gemini 3.7 Flash</td>
          <td style="text-align: right"><strong>93</strong></td>
          <td style="text-align: center">A</td>
          <td style="text-align: right">43 min</td>
          <td>$4.12</td>
      </tr>
      <tr>
          <td>Qwen 3.8 Max</td>
          <td style="text-align: right"><strong>92</strong></td>
          <td style="text-align: center">A</td>
          <td style="text-align: right">78 min</td>
          <td>$9.16 API</td>
      </tr>
      <tr>
          <td>Grok 4.6</td>
          <td style="text-align: right"><strong>92</strong></td>
          <td style="text-align: center">A</td>
          <td style="text-align: right">34 min</td>
          <td>$6.33 API</td>
      </tr>
      <tr>
          <td>Qwen 3.8 27B local</td>
          <td style="text-align: right"><strong>51</strong></td>
          <td style="text-align: center">C</td>
          <td style="text-align: right">156 min</td>
          <td>$0</td>
      </tr>
  </tbody>
</table>
<p>GLM 5.3 two points from Fable 5 is not a &ldquo;cheap alternative&rdquo; — it&rsquo;s a leadership candidate. Qwen 3.8 Max one point from Sol and Terra, same thing. The distance between the American cream and the new Chinese models is one or two points — and I repeat in every article that one or two points is noise. And Gemini 3.7 Flash joined that pile: 93, tied with Sol, Terra, and Opus 4.8, the first Gemini to get there on opencode. Grok 4.6 landed in the same bucket of 92s, but with an asterisk all its own: it was the only new generation that improved on nothing over its predecessor, and even so it was the first to pass clean through the toughest shielding.</p>
<p>And local remains out of the question for an autonomous coding agent: Tier C is Tier C. But notice how the conversation has changed. Until recently I dismissed local because it invented APIs. Today it knows the API and trips on streaming, tests, and Docker — and it needs 176K of context and 32 GB of VRAM just to complete the test. The bottleneck moved up a level. It&rsquo;s not a recommendation yet; it&rsquo;s the road being paved.</p>
<blockquote>
  <p><strong>Remember this:</strong> the cream of the crop is still Fable, Opus, Sonnet, K3, and the GPT 5.6 family. But the chasing pack is already one or two points behind — and the moat between &ldquo;frontier&rdquo; and &ldquo;alternative&rdquo; has become noise territory.</p>

</blockquote>
<p>As always: artifacts, logs, rubric, deductions, and the updated table are in the <a href="https://github.com/akitaonrails/llm-coding-benchmark"target="_blank" rel="noopener">llm-coding-benchmark</a>. Both Gemini 3.7 runs — the voided one and the official one — are documented in the report, with the contamination finding front and center.</p>
]]></content:encoded><category>llm-benchmarks</category><category>llms</category><category>coding-agents</category></item><item><title>New LLM Benchmark: I Reran Every Test!</title><link>https://akitaonrails.github.io/en/2026/07/30/new-llm-benchmark-i-reran-every-test/</link><guid isPermaLink="true">https://akitaonrails.github.io/en/2026/07/30/new-llm-benchmark-i-reran-every-test/</guid><pubDate>Thu, 30 Jul 2026 15:00:00 -0300</pubDate><description>&lt;p&gt;Five days ago I published my &lt;a href="https://akitaonrails.github.io/en/2026/07/25/llm-benchmark-is-opus-5-any-good/"&gt;Claude Opus 5 test&lt;/a&gt;. Eleven days ago I explained &lt;a href="https://akitaonrails.github.io/en/2026/07/19/llm-benchmark-should-i-use-the-highest-scoring-model/"&gt;why the highest score in a ranking does not mean &amp;ldquo;the best LLM&amp;rdquo;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Great. The table in the first article is already a museum piece.&lt;/p&gt;
&lt;p&gt;The argument in the second one still stands. In fact, it got even easier to demonstrate because I spent the last few days rerunning practically the entire benchmark. That meant dozens of runs, several discarded attempts, hundreds of dollars between API charges and credit equivalents, and an indecent amount of time reading robot-generated Rails code.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Five days ago I published my <a href="/en/2026/07/25/llm-benchmark-is-opus-5-any-good/">Claude Opus 5 test</a>. Eleven days ago I explained <a href="/en/2026/07/19/llm-benchmark-should-i-use-the-highest-scoring-model/">why the highest score in a ranking does not mean &ldquo;the best LLM&rdquo;</a>.</p>
<p>Great. The table in the first article is already a museum piece.</p>
<p>The argument in the second one still stands. In fact, it got even easier to demonstrate because I spent the last few days rerunning practically the entire benchmark. That meant dozens of runs, several discarded attempts, hundreds of dollars between API charges and credit equivalents, and an indecent amount of time reading robot-generated Rails code.</p>
<p>The result is <strong>version 2</strong> of my <a href="https://github.com/akitaonrails/llm-coding-benchmark"target="_blank" rel="noopener">LLM Coding Benchmark</a>. The test got harder, the audit became more explicit, and each family now runs, whenever possible, in the harness where it should work best.</p>
<p>I&rsquo;ll say this up front: <strong>v2 scores are not directly comparable to v1 scores</strong>. The prompt changed. So did the requirements, several model-harness pairings, the validation, and the rubric. The <code>v1</code> column in the report is historical context, not a scientific measurement of how much each model &ldquo;improved.&rdquo;</p>
<h2>Why I retired v1<span class="hx:absolute hx:-mt-20" id="why-i-retired-v1"></span>
    <a href="#why-i-retired-v1" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>We ran v1 for months. It did a good job separating models that could actually build a Rails app from those that invented RubyLLM APIs, wrote tests for their own hallucinations, and shipped Dockerfiles that never came up.</p>
<p>Then the newer models hit the ceiling of that test. Fifteen of the forty results were already packed into Tier A, with the top compressed between 92 and 97. The job still had real details, but the best models cleared the old discriminators easily. The order started coming down to an API-key preflight here, a cookie limit there, one missing error test. Valid details, not much separation.</p>
<p>There was another operational inconsistency: the model-harness pairing. Claude had been tested in OpenCode. So had Grok, Kimi, and Gemini. Today we have Claude Code, Codex, Kimi Code CLI, grok CLI, and Antigravity. Measuring a model in a generic harness when an integration tailored to its behavior exists can distort the result.</p>
<p>The benchmark was never measuring the weights file alone:</p>
<div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">

<div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">result = model + harness + prompt + tools + context + execution + audit</span></span></code></pre></div></div><div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
  <button
    class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
    title="Copy code"
  >
    <div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"></div>
<div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"></div>
  </button>
</div>
</div>
<p>So I stopped hiding the harness inside the score. Claude moved to Claude Code. GPT moved to Codex. Kimi K3 and K2.7-Coding moved to Kimi CLI. Grok and Gemini got A/B runs in their vendors&rsquo; own CLIs. A fully isolated OpenCode remained the fallback for models without a better harness or subscription access.</p>
<h2>The new test<span class="hx:absolute hx:-mt-20" id="the-new-test"></span>
    <a href="#the-new-test" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>V1 had two phases: build the app and try to bring it up. V2 has <strong>three phases</strong>, fourteen numbered goals, and a ten-dimension rubric.</p>
<p>In phase one, the model still has to build a ChatGPT-style chat app on its own in Rails with RubyLLM, Hotwire, Tailwind, Minitest, Docker, and Compose. That&rsquo;s where the resemblance ends. Now it must also deliver:</p>
<ul>
<li>real per-token streaming through Turbo Streams, proven to be incremental;</li>
<li>a correct multi-turn payload that does not send the current message twice, plus a test for the exact array sent to the provider;</li>
<li>persistence that survives a restart and works with <code>WEB_CONCURRENCY=2</code>, with a TTL plus message-count and byte limits;</li>
<li>exactly two tools, <code>server_time</code> and a safe calculator, using the real RubyLLM API;</li>
<li>a title generated through the structured-output API;</li>
<li>a per-conversation token budget;</li>
<li>a system prompt, credential preflight, degraded states, and provider-error handling;</li>
<li>a guarantee that failed turns never contaminate future history;</li>
<li>clean RuboCop, Brakeman, and bundle-audit runs, plus a non-root production Docker image and no secrets.</li>
</ul>
<p>Phase two does not accept a README claiming everything works. It boots Rails, watches the tokens arrive, forces real tool calls, holds a conversation across two workers, restarts the server, checks the history, runs tests and gates, executes <code>docker build</code>, and sends a real message to the app inside Compose.</p>
<p>Phase three asks the model to review every goal as <code>PASS</code>, <code>PARTIAL</code>, or <code>FAIL</code>, cite a file, line, test, or command, and write down what is still broken. That honesty is worth 15 points. An accurate <code>FAIL</code> is worth more than an optimistic <code>PASS</code> that the audit disproves.</p>
<p>This phase produced data v1 never had. Kimi K3 and Nex, for example, admitted defects that would have been easy to hide. Others built a reasonable app and then hallucinated their own inspection. Programming and reviewing what you programmed are different capabilities.</p>
<h2>The harness became part of the test<span class="hx:absolute hx:-mt-20" id="the-harness-became-part-of-the-test"></span>
    <a href="#the-harness-became-part-of-the-test" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I also ran A/B tests with the native tools:</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th style="text-align: right">Clean OpenCode</th>
          <th style="text-align: right">Native harness</th>
          <th>Reading</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Grok 4.5</td>
          <td style="text-align: right">92</td>
          <td style="text-align: right">91 in grok CLI</td>
          <td>difference within the noise</td>
      </tr>
      <tr>
          <td>Grok 4.3</td>
          <td style="text-align: right">18</td>
          <td style="text-align: right">55 in grok CLI</td>
          <td>native scaffolding rescues it, but it remains weak</td>
      </tr>
      <tr>
          <td>Gemini 3.1 Pro</td>
          <td style="text-align: right">62</td>
          <td style="text-align: right">88 in Antigravity</td>
          <td>the direct path avoids a provider bug</td>
      </tr>
      <tr>
          <td>Gemini 3.6 Flash</td>
          <td style="text-align: right">not run</td>
          <td style="text-align: right">92 in Antigravity</td>
          <td>good result, no comparable baseline</td>
      </tr>
  </tbody>
</table>
<p>A native harness does not sprinkle magic dust on a model. Grok 4.5 barely cared. Grok 4.3 needed the structure. Gemini 3.1 needed a transport that would not break on <code>Corrupted thought signature</code>. Three different mechanisms that a rushed comparison would flatten into &ldquo;the CLI improved the score.&rdquo;</p>
<p>In the ranking below, I use the preferred harness whenever a complete run exists: Antigravity for the Geminis and grok CLI for the Groks. The OpenCode baselines remain in the repository as A/B data, but do not appear a second time in the table.</p>
<h2>The new ranking<span class="hx:absolute hx:-mt-20" id="the-new-ranking"></span>
    <a href="#the-new-ranking" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>This is the consolidated v2 table, with one entry per model in the preferred available harness.</p>
<table>
  <thead>
      <tr>
          <th style="text-align: right">#</th>
          <th>Model</th>
          <th style="text-align: right">Score</th>
          <th style="text-align: center">Tier</th>
          <th>Harness</th>
          <th style="text-align: right">Time</th>
          <th style="text-align: right">Cost</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: right">1</td>
          <td>Claude Fable 5</td>
          <td style="text-align: right"><strong>96</strong></td>
          <td style="text-align: center">A.1</td>
          <td>Claude Code</td>
          <td style="text-align: right">46 min</td>
          <td style="text-align: right">$26.03</td>
      </tr>
      <tr>
          <td style="text-align: right">2</td>
          <td>Claude Sonnet 5</td>
          <td style="text-align: right"><strong>95</strong></td>
          <td style="text-align: center">A.1</td>
          <td>Claude Code</td>
          <td style="text-align: right">59 min</td>
          <td style="text-align: right">$25.83</td>
      </tr>
      <tr>
          <td style="text-align: right">2</td>
          <td>Claude Opus 5</td>
          <td style="text-align: right"><strong>95</strong></td>
          <td style="text-align: center">A.1</td>
          <td>Claude Code</td>
          <td style="text-align: right">78 min</td>
          <td style="text-align: right">$38.91</td>
      </tr>
      <tr>
          <td style="text-align: right">2</td>
          <td>Kimi K3</td>
          <td style="text-align: right"><strong>95</strong></td>
          <td style="text-align: center">A.1</td>
          <td>Kimi CLI</td>
          <td style="text-align: right">65 min</td>
          <td style="text-align: right">$6.14</td>
      </tr>
      <tr>
          <td style="text-align: right">5</td>
          <td>GPT 5.6 Sol</td>
          <td style="text-align: right"><strong>93</strong></td>
          <td style="text-align: center">A.1</td>
          <td>Codex</td>
          <td style="text-align: right">57 min</td>
          <td style="text-align: right">~$45</td>
      </tr>
      <tr>
          <td style="text-align: right">5</td>
          <td>Claude Opus 4.8</td>
          <td style="text-align: right"><strong>93</strong></td>
          <td style="text-align: center">A.1</td>
          <td>Claude Code</td>
          <td style="text-align: right">53 min</td>
          <td style="text-align: right">$21.82</td>
      </tr>
      <tr>
          <td style="text-align: right">5</td>
          <td>GPT 5.6 Terra</td>
          <td style="text-align: right"><strong>93</strong></td>
          <td style="text-align: center">A.1</td>
          <td>Codex</td>
          <td style="text-align: right">48 min</td>
          <td style="text-align: right">$16.92</td>
      </tr>
      <tr>
          <td style="text-align: right">8</td>
          <td>GLM 5.2</td>
          <td style="text-align: right"><strong>92</strong></td>
          <td style="text-align: center">A.1</td>
          <td>OpenCode</td>
          <td style="text-align: right">155 min</td>
          <td style="text-align: right">$0 (≈$12.05)</td>
      </tr>
      <tr>
          <td style="text-align: right">8</td>
          <td>Kimi K2.5</td>
          <td style="text-align: right"><strong>92</strong></td>
          <td style="text-align: center">A.1</td>
          <td>OpenCode</td>
          <td style="text-align: right">43 min</td>
          <td style="text-align: right">$1.50</td>
      </tr>
      <tr>
          <td style="text-align: right">8</td>
          <td>Gemini 3.6 Flash @ high</td>
          <td style="text-align: right"><strong>92</strong></td>
          <td style="text-align: center">A.1</td>
          <td>Antigravity</td>
          <td style="text-align: right">15 min</td>
          <td style="text-align: right">—</td>
      </tr>
      <tr>
          <td style="text-align: right">11</td>
          <td>MiniMax M3</td>
          <td style="text-align: right"><strong>91</strong></td>
          <td style="text-align: center">A.1</td>
          <td>OpenCode</td>
          <td style="text-align: right">113 min</td>
          <td style="text-align: right">$7.72</td>
      </tr>
      <tr>
          <td style="text-align: right">11</td>
          <td>Kimi K2.6</td>
          <td style="text-align: right"><strong>91</strong></td>
          <td style="text-align: center">A.1</td>
          <td>OpenCode</td>
          <td style="text-align: right">34 min</td>
          <td style="text-align: right">$2.64</td>
      </tr>
      <tr>
          <td style="text-align: right">11</td>
          <td>Claude Opus 4.7</td>
          <td style="text-align: right"><strong>91</strong></td>
          <td style="text-align: center">A.1</td>
          <td>Claude Code</td>
          <td style="text-align: right">44 min</td>
          <td style="text-align: right">$44.28</td>
      </tr>
      <tr>
          <td style="text-align: right">11</td>
          <td>GPT 5.6 Luna</td>
          <td style="text-align: right"><strong>91</strong></td>
          <td style="text-align: center">A.1</td>
          <td>Codex</td>
          <td style="text-align: right">46 min</td>
          <td style="text-align: right">$16.79</td>
      </tr>
      <tr>
          <td style="text-align: right">11</td>
          <td>Grok 4.5</td>
          <td style="text-align: right"><strong>91</strong></td>
          <td style="text-align: center">A.1</td>
          <td>grok CLI</td>
          <td style="text-align: right">25 min</td>
          <td style="text-align: right">$0 (≈$1.62)</td>
      </tr>
      <tr>
          <td style="text-align: right">16</td>
          <td>Nex-N2-Pro</td>
          <td style="text-align: right"><strong>88</strong></td>
          <td style="text-align: center">A.2</td>
          <td>OpenCode</td>
          <td style="text-align: right">8 min</td>
          <td style="text-align: right">$0.17</td>
      </tr>
      <tr>
          <td style="text-align: right">16</td>
          <td>GPT 5.5</td>
          <td style="text-align: right"><strong>88</strong></td>
          <td style="text-align: center">A.2</td>
          <td>Codex</td>
          <td style="text-align: right">57 min</td>
          <td style="text-align: right">~$53</td>
      </tr>
      <tr>
          <td style="text-align: right">16</td>
          <td>Gemini 3.1 Pro @ high</td>
          <td style="text-align: right"><strong>88</strong></td>
          <td style="text-align: center">A.2</td>
          <td>Antigravity</td>
          <td style="text-align: right">23 min</td>
          <td style="text-align: right">—</td>
      </tr>
      <tr>
          <td style="text-align: right">19</td>
          <td>Claude Sonnet 4.6</td>
          <td style="text-align: right"><strong>87</strong></td>
          <td style="text-align: center">A.2</td>
          <td>Claude Code</td>
          <td style="text-align: right">45 min</td>
          <td style="text-align: right">$9.90</td>
      </tr>
      <tr>
          <td style="text-align: right">20</td>
          <td>GPT 5.4</td>
          <td style="text-align: right"><strong>86</strong></td>
          <td style="text-align: center">A.2</td>
          <td>Codex</td>
          <td style="text-align: right">67 min</td>
          <td style="text-align: right">~$26</td>
      </tr>
      <tr>
          <td style="text-align: right">20</td>
          <td>Kimi K2.7-Coding</td>
          <td style="text-align: right"><strong>86</strong></td>
          <td style="text-align: center">A.2</td>
          <td>Kimi CLI</td>
          <td style="text-align: right">54 min</td>
          <td style="text-align: right">$4.37</td>
      </tr>
      <tr>
          <td style="text-align: right">22</td>
          <td>Step 3.7 Flash</td>
          <td style="text-align: right"><strong>84</strong></td>
          <td style="text-align: center">A.2</td>
          <td>OpenCode</td>
          <td style="text-align: right">81 min</td>
          <td style="text-align: right">$1.41</td>
      </tr>
      <tr>
          <td style="text-align: right">23</td>
          <td>Claude Opus 4.6</td>
          <td style="text-align: right"><strong>83</strong></td>
          <td style="text-align: center">A.2</td>
          <td>Claude Code</td>
          <td style="text-align: right">39 min</td>
          <td style="text-align: right">$12.83</td>
      </tr>
      <tr>
          <td style="text-align: right">23</td>
          <td>GLM 5</td>
          <td style="text-align: right"><strong>83</strong></td>
          <td style="text-align: center">A.2</td>
          <td>OpenCode</td>
          <td style="text-align: right">31 min</td>
          <td style="text-align: right">$1.97</td>
      </tr>
      <tr>
          <td style="text-align: right">25</td>
          <td>DeepSeek V4 Pro</td>
          <td style="text-align: right"><strong>82</strong></td>
          <td style="text-align: center">B</td>
          <td>OpenCode</td>
          <td style="text-align: right">57 min</td>
          <td style="text-align: right">$0.35</td>
      </tr>
      <tr>
          <td style="text-align: right">26</td>
          <td>DeepSeek V4 Flash</td>
          <td style="text-align: right"><strong>80</strong></td>
          <td style="text-align: center">B</td>
          <td>OpenCode</td>
          <td style="text-align: right">36 min</td>
          <td style="text-align: right">$0.81</td>
      </tr>
      <tr>
          <td style="text-align: right">27</td>
          <td>Qwen 3.6 Plus</td>
          <td style="text-align: right"><strong>76</strong></td>
          <td style="text-align: center">B</td>
          <td>OpenCode</td>
          <td style="text-align: right">75 min</td>
          <td style="text-align: right">$7.63</td>
      </tr>
      <tr>
          <td style="text-align: right">28</td>
          <td>MiMo V2.5 Pro</td>
          <td style="text-align: right"><strong>73</strong></td>
          <td style="text-align: center">B</td>
          <td>OpenCode</td>
          <td style="text-align: right">23 min</td>
          <td style="text-align: right">$0.22</td>
      </tr>
      <tr>
          <td style="text-align: right">29</td>
          <td>Grok 4.3</td>
          <td style="text-align: right"><strong>55</strong></td>
          <td style="text-align: center">C</td>
          <td>grok CLI</td>
          <td style="text-align: right">6 min</td>
          <td style="text-align: right">$0 (≈$0.18)</td>
      </tr>
      <tr>
          <td style="text-align: right">30</td>
          <td>Qwen3.7 Max</td>
          <td style="text-align: right"><strong>51</strong></td>
          <td style="text-align: center">C</td>
          <td>OpenCode</td>
          <td style="text-align: right">41 min</td>
          <td style="text-align: right">$2.59</td>
      </tr>
      <tr>
          <td style="text-align: right">31</td>
          <td>Step 3.5 Flash</td>
          <td style="text-align: right"><strong>27</strong></td>
          <td style="text-align: center">D</td>
          <td>OpenCode</td>
          <td style="text-align: right">47 min</td>
          <td style="text-align: right">$0.92</td>
      </tr>
  </tbody>
</table>
<p><em>Time is end-to-end wall clock across the three phases. Cost is API-equivalent: for models on Codex I use the cache-discounted blended figure (same criterion as the cost section below); on subscription plans (Z.ai, grok CLI) the marginal cost is $0 and the number in parentheses is the API-equivalent; the Antigravity runs were preview and were not metered.</em></p>
<p>The details, artifacts, and deductions are in the <a href="https://github.com/akitaonrails/llm-coding-benchmark/blob/master/docs/success_report.v2.md"target="_blank" rel="noopener">full v2 report</a>.</p>
<h2>What the tiers mean now<span class="hx:absolute hx:-mt-20" id="what-the-tiers-mean-now"></span>
    <a href="#what-the-tiers-mean-now" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The new cutoff is anchored on Claude Opus 4.6, which scored 83 and showed the minimum needed to carry the entire test. Here&rsquo;s the practical interpretation:</p>
<table>
  <thead>
      <tr>
          <th style="text-align: center">Tier</th>
          <th style="text-align: right">Score</th>
          <th>How I read it</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: center"><strong>A.1</strong></td>
          <td style="text-align: right"><strong>90 or higher</strong></td>
          <td>The frontier of this test. More complete and consistent delivery; differences of one or two points inside the group remain noise.</td>
      </tr>
      <tr>
          <td style="text-align: center"><strong>A.2</strong></td>
          <td style="text-align: right"><strong>83 to 89</strong></td>
          <td>Suitable for programming and past the same competence floor, but with more visible fixes or limitations. I still recommend these models, with closer review.</td>
      </tr>
      <tr>
          <td style="text-align: center"><strong>B</strong></td>
          <td style="text-align: right"><strong>73 to 82</strong></td>
          <td>Close, but it still needs human cleanup in an important area. I do not recommend it for autonomous work; I keep it on the radar.</td>
      </tr>
      <tr>
          <td style="text-align: center"><strong>C</strong></td>
          <td style="text-align: right"><strong>51 to 72</strong></td>
          <td>I do not recommend it for programming. It may still work for translation, summarization, classification, and simple agents.</td>
      </tr>
      <tr>
          <td style="text-align: center"><strong>D</strong></td>
          <td style="text-align: right"><strong>50 or lower</strong></td>
          <td>Inconsistent, broken, or difficult-to-predict behavior. I do not feel safe recommending it even for simple automation.</td>
      </tr>
  </tbody>
</table>
<p>There are <strong>15 models in A.1</strong> and <strong>9 in A.2</strong>. All 24 cleared the competence floor for this kind of work. The subdivision helps decide where to start: A.1 contains the frontier results; A.2 contains capable models that needed more fixes, left shallower tests, or carried clearer operational limitations.</p>
<p>That does not make 96 universally more intelligent than 91, nor does it make an A.2 model bad. An A.2 model may be better at refactoring, debugging, frontend work, or inside your fifteen-year-old monolith. This test does not measure all of that. The cutoff simply avoids throwing 24 options into one oversized bucket.</p>
<p>A.1 and A.2 make up the candidate pool. I cut Tier C and D before I start.</p>
<h2>So which one is best: Fable, Opus, Terra, or Kimi?<span class="hx:absolute hx:-mt-20" id="so-which-one-is-best-fable-opus-terra-or-kimi"></span>
    <a href="#so-which-one-is-best-fable-opus-terra-or-kimi" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>If all you want is a one-line answer, you&rsquo;re going to be disappointed again.</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th style="text-align: right">Score</th>
          <th style="text-align: right">Time</th>
          <th style="text-align: right">API equivalent</th>
          <th>Practical use</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Claude Fable 5</td>
          <td style="text-align: right">96</td>
          <td style="text-align: right">46 min</td>
          <td style="text-align: right">$26.03</td>
          <td>Claude Max subscription</td>
      </tr>
      <tr>
          <td>Claude Opus 5</td>
          <td style="text-align: right">95</td>
          <td style="text-align: right">78 min</td>
          <td style="text-align: right">$38.91</td>
          <td>Claude Max subscription</td>
      </tr>
      <tr>
          <td>Kimi K3</td>
          <td style="text-align: right">95</td>
          <td style="text-align: right">65 min</td>
          <td style="text-align: right">$6.14</td>
          <td>Moderato subscription</td>
      </tr>
      <tr>
          <td>GPT 5.6 Terra</td>
          <td style="text-align: right">93</td>
          <td style="text-align: right">49 min</td>
          <td style="text-align: right">$16.92 blended</td>
          <td>ChatGPT credits</td>
      </tr>
  </tbody>
</table>
<p>On the final artifact, <strong>Fable won</strong>. It was also the fastest of these four. If I were paying for every API call in this run, <strong>Kimi K3 won on cost by a mile</strong>, tying Opus at 95 and landing only one point behind Fable.</p>
<p>Opus 5 built an excellent project, but it was the slowest and burned 56.8 million tokens as counted by Claude Code. In this test, the extra 33 minutes over Fable bought nothing visible. Terra also delivered good work, finished two points behind K3, and cost less than Fable and Opus at API-equivalent rates.</p>
<p>If you already pay for Claude Max or ChatGPT Pro, the marginal cost stays near zero while you remain within the limits. Kimi Moderato is also a subscription, with its own quota windows. So &ldquo;$26 versus $6&rdquo; does not settle anything by itself. The first question is which subscription you already pay for and how much room it has left. For pay-as-you-go and automation, per-run cost moves back to center stage.</p>
<p>My reading of this run:</p>
<ul>
<li><strong>Fable 5</strong> delivered the best combination of quality and time;</li>
<li><strong>Kimi K3</strong> offered the best value among the leaders;</li>
<li><strong>Opus 5</strong> was capable and meticulous, but expensive and slow in this execution;</li>
<li><strong>GPT 5.6 Terra</strong> delivered the best balance in the family if you live in Codex.</li>
</ul>
<p>That&rsquo;s a reading of this project. Change the workload and the order may flip.</p>
<h2>Opus versus Sonnet, Sol versus Terra<span class="hx:absolute hx:-mt-20" id="opus-versus-sonnet-sol-versus-terra"></span>
    <a href="#opus-versus-sonnet-sol-versus-terra" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>A tier name is not a benchmark. Sonnet 5 proved that in an almost embarrassing way:</p>
<table>
  <thead>
      <tr>
          <th>Claude</th>
          <th style="text-align: right">Score</th>
          <th style="text-align: right">Time</th>
          <th style="text-align: right">Recorded cost</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Fable 5</td>
          <td style="text-align: right">96</td>
          <td style="text-align: right">46 min</td>
          <td style="text-align: right">$26.03 API equivalent</td>
      </tr>
      <tr>
          <td>Opus 5</td>
          <td style="text-align: right">95</td>
          <td style="text-align: right">78 min</td>
          <td style="text-align: right">$38.91 API equivalent</td>
      </tr>
      <tr>
          <td>Sonnet 5</td>
          <td style="text-align: right">95</td>
          <td style="text-align: right">59 min</td>
          <td style="text-align: right">$25.83 subscription equivalent</td>
      </tr>
      <tr>
          <td>Opus 4.8</td>
          <td style="text-align: right">93</td>
          <td style="text-align: right">53 min</td>
          <td style="text-align: right">$21.82 subscription equivalent</td>
      </tr>
  </tbody>
</table>
<p>Sonnet 5 tied Opus 5, finished nineteen minutes earlier, and produced the first genuine 100% line coverage in the entire benchmark. It also wrote the family&rsquo;s best self-review. Automatically choosing Opus because &ldquo;Opus is the higher tier&rdquo; would mean throwing out your own data.</p>
<p>This also corrects a terrible impression from v1, where Sonnet 5 scored 58 and hallucinated the RubyLLM API. In v2 it ran through Claude Code, received explicit requirements, and scored 95. We cannot conclude that the model improved by 37 points because we changed practically the entire experiment. We can conclude that the v1 pairing was a poor representation of what it can do.</p>
<p>On the OpenAI side:</p>
<table>
  <thead>
      <tr>
          <th>GPT</th>
          <th style="text-align: right">Score</th>
          <th style="text-align: right">Time</th>
          <th style="text-align: right">Blended equivalent cost</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>GPT 5.6 Sol</td>
          <td style="text-align: right">93</td>
          <td style="text-align: right">57 min</td>
          <td style="text-align: right">~$45</td>
      </tr>
      <tr>
          <td>GPT 5.6 Terra</td>
          <td style="text-align: right">93</td>
          <td style="text-align: right">49 min</td>
          <td style="text-align: right">$16.92</td>
      </tr>
      <tr>
          <td>GPT 5.6 Luna</td>
          <td style="text-align: right">91</td>
          <td style="text-align: right">46 min</td>
          <td style="text-align: right">$16.79</td>
      </tr>
      <tr>
          <td>GPT 5.5</td>
          <td style="text-align: right">88</td>
          <td style="text-align: right">58 min</td>
          <td style="text-align: right">~$53</td>
      </tr>
      <tr>
          <td>GPT 5.4</td>
          <td style="text-align: right">86</td>
          <td style="text-align: right">67 min</td>
          <td style="text-align: right">~$26</td>
      </tr>
  </tbody>
</table>
<p>Terra tied Sol at 93, finished eight minutes sooner, and cost a little more than one-third as much in the blended calculation. It also produced the best concurrency protection in the entire run: Redis with <code>WATCH</code>/<code>MULTI</code>, a distributed per-conversation lock, and forced tool choice. On this test, paying for Sol bought no points and saved no time. Terra is the most rational pick in the family.</p>
<p>Luna stays in the table because it scored 91 and remains an A.1 result, but its cost argument is gone: Terra scored two points higher for only thirteen cents more and took about three extra minutes.</p>
<p>Cache remains the important detail. Of Terra&rsquo;s 21.7 million input tokens, 21 million were cache hits. Pricing everything as fresh input would produce an upper bound of $111.62. At the cache rate, it falls to $16.92. Any cost table that mixes CLIs without understanding what each one reports is comparing apples to JSON.</p>
<h2>What about the Chinese models?<span class="hx:absolute hx:-mt-20" id="what-about-the-chinese-models"></span>
    <a href="#what-about-the-chinese-models" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>The line about Chinese models being useful only as cheaper alternatives is stale.</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th style="text-align: right">Score</th>
          <th style="text-align: center">Tier</th>
          <th style="text-align: right">Time</th>
          <th style="text-align: right">Reported cost</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Kimi K3</td>
          <td style="text-align: right">95</td>
          <td style="text-align: center">A.1</td>
          <td style="text-align: right">65 min</td>
          <td style="text-align: right">$6.14 equivalent, subscription</td>
      </tr>
      <tr>
          <td>Kimi K2.5</td>
          <td style="text-align: right">92</td>
          <td style="text-align: center">A.1</td>
          <td style="text-align: right">43 min</td>
          <td style="text-align: right">$1.50, API</td>
      </tr>
      <tr>
          <td>Kimi K2.6</td>
          <td style="text-align: right">91</td>
          <td style="text-align: center">A.1</td>
          <td style="text-align: right">34 min</td>
          <td style="text-align: right">$2.64, API</td>
      </tr>
      <tr>
          <td>Kimi K2.7-Coding</td>
          <td style="text-align: right">86</td>
          <td style="text-align: center">A.2</td>
          <td style="text-align: right">54 min</td>
          <td style="text-align: right">$4.37 equivalent, subscription</td>
      </tr>
      <tr>
          <td>MiniMax M3</td>
          <td style="text-align: right">91</td>
          <td style="text-align: center">A.1</td>
          <td style="text-align: right">113 min</td>
          <td style="text-align: right">$7.72, API</td>
      </tr>
      <tr>
          <td>GLM 5.2</td>
          <td style="text-align: right">92</td>
          <td style="text-align: center">A.1</td>
          <td style="text-align: right">155 min</td>
          <td style="text-align: right">$0 marginal on the subscription, $12.05 API equivalent</td>
      </tr>
      <tr>
          <td>DeepSeek V4 Pro</td>
          <td style="text-align: right">82</td>
          <td style="text-align: center">B</td>
          <td style="text-align: right">57 min</td>
          <td style="text-align: right">$0.35, API</td>
      </tr>
      <tr>
          <td>DeepSeek V4 Flash</td>
          <td style="text-align: right">80</td>
          <td style="text-align: center">B</td>
          <td style="text-align: right">36 min</td>
          <td style="text-align: right">$0.81, API</td>
      </tr>
  </tbody>
</table>
<p>Kimi K3 tied Opus 5. K2.5, K2.6, MiniMax M3, and GLM 5.2 landed in the same A.1 as Claude and GPT. The OpenCode runs are still cheaper than the $16 to $45 range of the leaders run through Claude Code and Codex, but this is no longer a comparison between pennies and dozens of dollars. And a subscription is not an API: GLM had zero marginal cost because it ran on Z.ai&rsquo;s plan; the same usage would cost about $12.05 through the API.</p>
<p>Kimi is the easiest family to recommend today. K3 offers top-tier quality through a cheap subscription. K2.5 and K2.6 were economical over the API, costing $1.50 and $2.64. K2.7 landed below its siblings, but it ran in another harness, so I am not going to invent a tidy progression story from four isolated data points.</p>
<p>MiniMax M3 deserves attention and caution in equal measure. It scored 91 for $7.72, still less than one run through the American leaders, but burned 121 million tokens and took almost two hours. It was the most expensive and token-hungry OpenCode run. The score is good; the usage profile, not so much.</p>
<p>GLM 5.2 scored 92 at zero marginal cost on Z.ai&rsquo;s plan, but consumed the equivalent of $12.05 through the API. It took about two and a half hours. If wall-clock time does not matter, it is a very strong option. If you work in short cycles, Grok 4.5 delivered 91 in about 25 minutes through grok CLI, more than six times faster.</p>
<p>DeepSeek remains cheap, but stopped in Tier B. V4 Pro scored 82 for $0.35 and V4 Flash scored 80 for $0.81. They&rsquo;re close, and I want to repeat the test when a new version arrives. Today I still would not leave either one working alone as a coding agent in a codebase that matters. Saving one or two dollars only to spend an hour reviewing a structural defect is lousy math.</p>
<h2>Why I did not rerun the local models<span class="hx:absolute hx:-mt-20" id="why-i-did-not-rerun-the-local-models"></span>
    <a href="#why-i-did-not-rerun-the-local-models" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>I did not run Qwen 3.5 or the other local models on v2. The priority shifted to mapping the programming Tier A more accurately, and every complete run of this test costs machine time, audit time, and sanity.</p>
<p>Local models are not useless. They work for translation, classification, summarization, controlled one-shots, and tasks where privacy or offline operation matters more than quality. For autonomous coding agents, though, the v1 tests landed far below the floor. V2 is harder. I see no reason to spend several more days confirming that a quantized local Qwen cannot compete with Fable, Opus, GPT 5.6, or Kimi in software engineering.</p>
<p>For programming, it is not worth it today. If a new local model appears with strong evidence behind it, I&rsquo;ll test it. Until then, I&rsquo;d rather spend my time separating the twenty-four models that have already cleared the floor.</p>
<h2>Conclusion<span class="hx:absolute hx:-mt-20" id="conclusion"></span>
    <a href="#conclusion" class="subheading-anchor" aria-label="Permalink for this section"></a></h2><p>V1 did its job and saturated. V2 puts pressure where today&rsquo;s models still slip: real streaming, multi-turn payloads, concurrency, persistence, tools, structured output, budgeting, operational security, faithful tests, and the ability to admit their own defects.</p>
<p>Fable 5 finished on top with 96. Sonnet 5, Opus 5, and Kimi K3 tied at 95. Sol and Terra came right behind them at 93. That answers which models produced the best projects on this test.</p>
<p>Choosing what to use is a different reading:</p>
<ul>
<li>Tier A.1 contains the 15 frontier results, all scoring 90 or higher;</li>
<li>Tier A.2 contains 9 capable models from 83 to 89, still worth recommending with closer review;</li>
<li>Tier B is close, but I still do not recommend it for autonomous work;</li>
<li>Tier C is for translation, summarization, and simple agents;</li>
<li>Tier D is too inconsistent for me to recommend;</li>
<li>inside Tier A, choose by subscription, speed, cost, and harness;</li>
<li>one or two points do not make anyone the universal champion of intelligence.</li>
</ul>
<p>My own choice remains concentrated on Claude Code and Codex because those are the harnesses I use every day. Within Codex, Terra delivered the best balance of score, time, and cost. Kimi K3 has become a serious top-tier alternative. Grok 4.5 is the speed champion of this round. GLM has zero marginal cost on the subscription and MiniMax still costs less than the leaders, but neither is a speed pick. Sonnet 5 proved that reflexively paying for or selecting the &ldquo;higher&rdquo; tier can be a waste.</p>
<p>All generated code, prompts, results, self-reviews, rubric details, and corrections are in <a href="https://github.com/akitaonrails/llm-coding-benchmark"target="_blank" rel="noopener">llm-coding-benchmark</a>. The major code and test overhaul is already on <code>master</code>. Contributions are welcome, whether you want to add a model, improve a harness, dispute a deduction, or find another bug in the auditor.</p>
<p>Just bring artifacts and data. We have enough ranking opinions already.</p>
]]></content:encoded><category>llm-benchmarks</category><category>llms</category><category>coding-agents</category></item></channel></rss>