<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ai maya</title>
    <description>The latest articles on DEV Community by ai maya (@ai_maya_063fc568e157562fd).</description>
    <link>https://dev.to/ai_maya_063fc568e157562fd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4069009%2Fa4caeae1-9a05-4aab-9c0e-474a721e6624.png</url>
      <title>DEV Community: ai maya</title>
      <link>https://dev.to/ai_maya_063fc568e157562fd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ai_maya_063fc568e157562fd"/>
    <language>en</language>
    <item>
      <title>They Put 7 Attention Mechanisms on a Latin Square. Then Removed Them One by One.</title>
      <dc:creator>ai maya</dc:creator>
      <pubDate>Fri, 18 Sep 2026 03:48:33 +0000</pubDate>
      <link>https://dev.to/ai_maya_063fc568e157562fd/they-put-7-attention-mechanisms-on-a-latin-square-then-removed-them-one-by-one-5ebk</link>
      <guid>https://dev.to/ai_maya_063fc568e157562fd/they-put-7-attention-mechanisms-on-a-latin-square-then-removed-them-one-by-one-5ebk</guid>
      <description>&lt;p&gt;Since GPT, nearly every Transformer repeats the same attention mechanism at every layer. Forty-eight&lt;br&gt;
identical blocks, differing only in learned weights.&lt;/p&gt;

&lt;p&gt;Nobody tested that. It is a convention, not a conclusion.&lt;/p&gt;

&lt;p&gt;A paper out of VIDRAFT AI Research (&lt;a href="https://arxiv.org/abs/2609.20269" rel="noopener noreferrer"&gt;arXiv:2609.20269&lt;/a&gt;, CC BY 4.0)&lt;br&gt;
tests it, and the interesting part is not the headline. The headline is &lt;em&gt;placement is free,&lt;br&gt;
composition is not&lt;/em&gt;. The interesting part is what happens when you read the ablation table.&lt;/p&gt;
&lt;h2&gt;
  
  
  The confound that makes this hard to measure
&lt;/h2&gt;

&lt;p&gt;If you build a stack with several different sequence mixers and it beats a uniform stack, you&lt;br&gt;
cannot say why. Was it &lt;strong&gt;which&lt;/strong&gt; mechanisms you used, or &lt;strong&gt;where&lt;/strong&gt; you put them? Those two are&lt;br&gt;
tangled in every heterogeneous architecture paper, because any concrete stack is one particular&lt;br&gt;
arrangement of one particular set.&lt;/p&gt;

&lt;p&gt;The paper's move is to remove the second variable by construction rather than by search.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;Latin square&lt;/strong&gt; is an N×N grid where each symbol appears exactly once in every row and every&lt;br&gt;
column. Sudoku is a Latin square with extra constraints. Put seven mechanisms on a 7×7 square and&lt;br&gt;
read it out across 49 layers, and every mechanism is guaranteed to be spread evenly through depth.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;layer  0..6   A B C D E F G
layer  7..13  B C D E F G A
layer 14..20  C D E F G A B
       ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No mechanism can cluster. Not "did not cluster in this run" — &lt;em&gt;cannot&lt;/em&gt;, structurally. That is the&lt;br&gt;
whole point: you get balance without running an architecture search to find it.&lt;/p&gt;

&lt;p&gt;The flagship is &lt;strong&gt;Aether-7B-5Attn&lt;/strong&gt; — 6.59B parameters MoE, ~2.98B active, 49 layers, seven mixers&lt;br&gt;
on a 7×7 square. Trained on 16× B200 (2-node FSDP), 162,000 steps, 144.2B tokens, ~11,700&lt;br&gt;
B200-hours in the final stage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual experiment
&lt;/h2&gt;

&lt;p&gt;You cannot ablate a 6.59B flagship eight ways with eight seeds each. So the paper builds a&lt;br&gt;
parameter-matched proxy: &lt;strong&gt;four mechanisms on a 4×4 square over sixteen layers, 700.9M parameters,&lt;br&gt;
eight seeds per arm.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Four arms, identical parameter counts, differing only in arrangement:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Arm&lt;/th&gt;
&lt;th&gt;Mean CE&lt;/th&gt;
&lt;th&gt;SD&lt;/th&gt;
&lt;th&gt;Δ vs latin&lt;/th&gt;
&lt;th&gt;2·pooled SD&lt;/th&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;latin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5.28639&lt;/td&gt;
&lt;td&gt;0.00867&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;reference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;periodic&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5.29484&lt;/td&gt;
&lt;td&gt;0.01611&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.16%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.02588&lt;/td&gt;
&lt;td&gt;null (within noise)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;block&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5.31754&lt;/td&gt;
&lt;td&gt;0.01520&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.59%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.02475&lt;/td&gt;
&lt;td&gt;real (2.5× pooled SD)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;homo_F&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+1.68%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;real&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read it as a gradient of how tightly each mechanism is confined in depth:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Distributed, any order&lt;/strong&gt; (&lt;code&gt;latin&lt;/code&gt; vs &lt;code&gt;periodic&lt;/code&gt;) → indistinguishable. Shuffling a balanced
schedule buys you nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confined to contiguous bands&lt;/strong&gt; (&lt;code&gt;block&lt;/code&gt;) → you pay 0.59%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One mechanism everywhere&lt;/strong&gt; (&lt;code&gt;homo_F&lt;/code&gt;) → you pay 1.68%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the first practical result: &lt;strong&gt;stop burning GPU hours searching for the right layer order.&lt;/strong&gt; If&lt;br&gt;
your schedule is balanced and distributed, the permutation is noise. That is a real cost saving,&lt;br&gt;
and it is the kind of null result that rarely gets published.&lt;/p&gt;

&lt;h2&gt;
  
  
  Now the part worth your attention
&lt;/h2&gt;

&lt;p&gt;The paper then removes one mechanism at a time from the four-mechanism stack, re-matching parameters&lt;br&gt;
and cycling the remaining three through depth:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Removed&lt;/th&gt;
&lt;th&gt;Mean CE&lt;/th&gt;
&lt;th&gt;Δ vs latin&lt;/th&gt;
&lt;th&gt;Verdict&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;sliding window&lt;/td&gt;
&lt;td&gt;5.28495&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−0.03%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;differential&lt;/td&gt;
&lt;td&gt;5.28450&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−0.04%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;full attention&lt;/td&gt;
&lt;td&gt;5.29615&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+0.18%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mamba-2 / SSM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5.39940&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+2.14%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;real&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;(baseline)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;5.28639&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;8 seeds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three of the four mechanisms can be deleted with no measurable effect. Two of them are &lt;em&gt;slightly&lt;br&gt;
negative&lt;/em&gt; — the model is nominally better without them, well inside noise.&lt;/p&gt;

&lt;p&gt;One is load-bearing.&lt;/p&gt;

&lt;p&gt;Look at which one. Sliding window, differential, and full attention are all &lt;strong&gt;members of the&lt;br&gt;
attention family&lt;/strong&gt; — variations on the same operator. Mamba-2 is a &lt;strong&gt;state-space model&lt;/strong&gt;, a&lt;br&gt;
structurally different way to mix along the sequence.&lt;/p&gt;

&lt;p&gt;The honest reading of this table is narrower and more useful than "heterogeneity helps":&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What pays is having at least one mechanism from a different family. Seven flavors of attention&lt;br&gt;
is still, functionally, a homogeneous stack.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a concrete design rule you can apply tomorrow, and it explains why the homogeneous arm&lt;br&gt;
(1.68%) and the no-SSM arm (2.14%) land in the same neighborhood — from the loss's point of view,&lt;br&gt;
removing the SSM &lt;em&gt;is&lt;/em&gt; collapsing toward homogeneity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does it survive scale?
&lt;/h2&gt;

&lt;p&gt;The obvious objection: 700.9M with 1,500 steps is a pilot, not a shipped model.&lt;/p&gt;

&lt;p&gt;The paper re-runs the three decisive arms — &lt;code&gt;latin&lt;/code&gt;, &lt;code&gt;homo_F&lt;/code&gt;, &lt;code&gt;no_M&lt;/code&gt; — at &lt;strong&gt;1.514B parameters&lt;/strong&gt;, a&lt;br&gt;
2.16× increase, everything else held constant, three seeds each. Both penalties get &lt;strong&gt;bigger&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;700.9M&lt;/th&gt;
&lt;th&gt;1.514B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;homogeneous stack&lt;/td&gt;
&lt;td&gt;+1.68%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+2.63%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;remove SSM family&lt;/td&gt;
&lt;td&gt;+2.14%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+3.20%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Penalties that grow with scale are the good kind of evidence. A finding that shrinks as you scale is&lt;br&gt;
usually a small-model artifact; one that widens is more likely structural.&lt;/p&gt;

&lt;p&gt;Note what was &lt;em&gt;not&lt;/em&gt; re-run: the placement axis (&lt;code&gt;periodic&lt;/code&gt;, &lt;code&gt;block&lt;/code&gt;) stays at 700.9M, and neither&lt;br&gt;
axis was tested at N=7 or at flagship size. The paper says so in its limitations rather than leaving&lt;br&gt;
you to notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two methodology details worth stealing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. A pre-registered decision rule.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The threshold is &lt;code&gt;|Δ| &amp;gt; 2 · pooled_SD&lt;/code&gt;, fixed on 2026-07-22 — &lt;em&gt;before the final seeds ran&lt;/em&gt;. Section&lt;br&gt;
6.4 explains why that matters: an early two-seed run showed &lt;code&gt;latin&lt;/code&gt; and &lt;code&gt;periodic&lt;/code&gt; cleanly&lt;br&gt;
separated, which would have been a placement effect, which is the more marketable story. Four seeds&lt;br&gt;
dissolved it. Eight confirmed the dissolution, at Δ 0.008 — a third of the threshold.&lt;/p&gt;

&lt;p&gt;The rule that killed the authors' preferred result is the same rule that certifies &lt;code&gt;block&lt;/code&gt; and&lt;br&gt;
&lt;code&gt;homo_F&lt;/code&gt; as real. As the paper puts it: a rule that only ever confirms what you hoped for is not a&lt;br&gt;
rule.&lt;/p&gt;

&lt;p&gt;If you run architecture experiments, the two habits here are cheap and they work: &lt;strong&gt;no claim below&lt;br&gt;
four seeds&lt;/strong&gt;, and &lt;strong&gt;fix your threshold before the last run&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A positive control in the safety audit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mixing operators along the time axis is exactly where causality violations hide — a stack that leaks&lt;br&gt;
future information will show beautiful loss curves for the wrong reason. All 49 layers pass a&lt;br&gt;
negative control, and, on the same loaded checkpoint, a &lt;strong&gt;positive control: 16 of 16 deliberately&lt;br&gt;
injected faults localized exactly&lt;/strong&gt;, across NSA, hybrid, and linear-attention layers.&lt;/p&gt;

&lt;p&gt;This is the right shape for any correctness gate. A clean pass proves nothing unless you have also&lt;br&gt;
shown the detector fires when something is actually broken. Most audits skip the second half.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is released
&lt;/h2&gt;

&lt;p&gt;Weights, training-data recipes, training code, logs, and architecture source. There is also&lt;br&gt;
&lt;strong&gt;Aether-6B-11Attn-base&lt;/strong&gt; — eleven mechanisms (attention, Mamba-2, Hyena, GDN, MLA among them) on an&lt;br&gt;
11×11 square over &lt;strong&gt;121 layers&lt;/strong&gt; — shipped as-is, a mid-training artifact whose only job is to show&lt;br&gt;
the construction is not specific to N=7. Whether the composition findings hold at N=11 is explicitly&lt;br&gt;
left open.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway for practitioners
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Placement search on a balanced schedule is probably wasted compute.&lt;/strong&gt; 0.16%, inside noise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Family diversity is the lever, not mechanism count.&lt;/strong&gt; Three attention variants were free to
delete; the one SSM was not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A Latin square is a cheap way to get guaranteed balance&lt;/strong&gt; without searching for it. The
construction makes the failure mode unreachable rather than merely unobserved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-register your threshold and run four seeds minimum.&lt;/strong&gt; This paper's most valuable page is
the one where the method deleted the result the authors wanted.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Paper: &lt;a href="https://arxiv.org/abs/2609.20269" rel="noopener noreferrer"&gt;arXiv:2609.20269&lt;/a&gt; — &lt;em&gt;Placement Is Free, Composition Is&lt;br&gt;
Not: The Latin Square as a Provably-Balanced Construction for Heterogeneous Sequence-Mixer Stacks&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>architecture</category>
      <category>transformers</category>
      <category>research</category>
    </item>
    <item>
      <title>We Asked 330 Models a Question in Korean. Half of Them Answered in the Wrong Alphabet.</title>
      <dc:creator>ai maya</dc:creator>
      <pubDate>Thu, 17 Sep 2026 05:54:10 +0000</pubDate>
      <link>https://dev.to/ai_maya_063fc568e157562fd/we-asked-330-models-a-question-in-korean-half-of-them-answered-in-the-wrong-alphabet-la2</link>
      <guid>https://dev.to/ai_maya_063fc568e157562fd/we-asked-330-models-a-question-in-korean-half-of-them-answered-in-the-wrong-alphabet-la2</guid>
      <description>&lt;p&gt;We graded 330 language models on Korean across seven axes. Before any of that, a four-line function&lt;br&gt;
threw out a third of the answers.&lt;/p&gt;

&lt;p&gt;That function turned out to be the most useful thing in the harness.&lt;/p&gt;
&lt;h2&gt;
  
  
  The check
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;contamination&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hangul_ratio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hanja&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kana&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;broken&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;h&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HANGUL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;hj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HANJA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;kn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KANA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hangul_ratio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hanja&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kana&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;kn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="c1"&gt;# not Korean enough, or another script leaked in
&lt;/span&gt;            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;broken&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;hj&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;kn&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Three conditions, all countable, no model in the loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;less than 25% Hangul&lt;/strong&gt; — the answer is not really in Korean&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;more than 3 Hanja&lt;/strong&gt; — Chinese characters bleeding in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;any kana at all&lt;/strong&gt; — Japanese characters bleeding in&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If &lt;code&gt;broken&lt;/code&gt;, the answer is an F and we never pay a judge to read it.&lt;/p&gt;
&lt;h2&gt;
  
  
  What it caught
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Answers auto-failed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;766 of 2,304 — 33.2%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Models with at least one&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;171 of 330 — 51.8%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Models that failed &lt;strong&gt;all seven&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;54 — 16.4%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Fifty-four models did not produce one clean Korean answer out of seven attempts.&lt;/p&gt;

&lt;p&gt;The failure is not evenly spread across tasks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Models auto-failed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Honorifics&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;142&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminology&lt;/td&gt;
&lt;td&gt;125&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Korean institutions&lt;/td&gt;
&lt;td&gt;113&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Summarisation&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Naturalness&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Register&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format compliance&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The hardest linguistic task is also where script discipline collapses first.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why a mechanical gate and not the judge
&lt;/h2&gt;

&lt;p&gt;An LLM judge will happily grade a Chinese-Korean hybrid on its &lt;em&gt;register&lt;/em&gt;. It will produce a&lt;br&gt;
plausible sentence about tone while the answer is not in the requested language at all. The grade&lt;br&gt;
comes back looking like data.&lt;/p&gt;

&lt;p&gt;So we kept a rule for this build of the harness: &lt;strong&gt;anything countable is counted, not judged.&lt;/strong&gt;&lt;br&gt;
Script mix is countable. Tone is not. The judge only sees answers that already passed the count.&lt;/p&gt;

&lt;p&gt;This also cuts cost — 766 fewer judge calls — but that is a side effect. The point is that the two&lt;br&gt;
failure modes are different and must not be averaged into one grade.&lt;/p&gt;
&lt;h2&gt;
  
  
  The harness refuses to start if it cannot tell good from bad
&lt;/h2&gt;

&lt;p&gt;Before measuring anything, the script runs a fixed set of control answers with known expected&lt;br&gt;
grades, and aborts if it does not score them perfectly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hits&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CONTROLS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;채점기 정확도 %d/%d = %.0f%%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CONTROLS&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;rate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;#      ^ "judge accuracy" — verbatim from our source
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;rate&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;        &lt;span class="c1"&gt;# do not begin the real measurement
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An A-expected control must come back A. An F-expected control must come back F. If the judge cannot&lt;br&gt;
separate the two on cases we already know the answer to, the numbers it produces on unknown cases&lt;br&gt;
are not worth having.&lt;/p&gt;

&lt;p&gt;Two more things we do to the judge, both cheap:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The judge never sees the model name.&lt;/strong&gt; Self-preference is real and free to remove.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The rubric says length is irrelevant&lt;/strong&gt;, because judges reward long answers if you let them.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The grades, once the surviving answers are graded
&lt;/h2&gt;

&lt;p&gt;330 models, 8 bands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A+++   5      B+   55      D   29
A++    2      B    58      F  111
A+    18      C    52
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;7.6% reach any A band. 33.6% are F.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Per-axis A rates, and this is the part that surprised us:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Axis&lt;/th&gt;
&lt;th&gt;A rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Honorifics&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Knowledge of Korean institutions&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.4%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminology&lt;/td&gt;
&lt;td&gt;31.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format compliance&lt;/td&gt;
&lt;td&gt;47.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Summary accuracy&lt;/td&gt;
&lt;td&gt;49.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freedom from translationese&lt;/td&gt;
&lt;td&gt;53.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Register&lt;/td&gt;
&lt;td&gt;53.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two axes sit at roughly a tenth of the field while the rest cluster near half.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vendor averages
&lt;/h2&gt;

&lt;p&gt;Mean score, 0–3, for vendors with at least eight models measured:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vendor&lt;/th&gt;
&lt;th&gt;n&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;anthropic&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.29&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mistralai&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;2.07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;openai&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;1.96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;1.48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;google&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;1.48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deepseek&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;1.33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;meta-llama&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;1.16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nvidia&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;0.93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;minimax&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;0.70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;z-ai&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;0.36&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One prompt set, one judge, one run. Read it as a ranking of this measurement, not a verdict on the&lt;br&gt;
vendors.&lt;/p&gt;
&lt;h2&gt;
  
  
  Recency and size predict nothing
&lt;/h2&gt;

&lt;p&gt;Five models hold a perfect 3.00:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;openai/gpt-5.4
openai/gpt-5.4-mini
openai/gpt-4o-2024-05-13
openai/gpt-3.5-turbo-16k      ← 2023
google/gemini-3.1-flash-image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 2023 model sits with the 2026 flagships. And the 28 models that earn an A on honorifics include&lt;br&gt;
&lt;code&gt;gpt-4o-mini&lt;/code&gt;, &lt;code&gt;qwen-2.5-72b-instruct&lt;/code&gt;, &lt;code&gt;llama-3.1-70b-instruct&lt;/code&gt; — mid-size models, not the tops of&lt;br&gt;
anyone's leaderboard.&lt;/p&gt;

&lt;p&gt;If you are picking a model for a Korean-facing product, release date, parameter count and English&lt;br&gt;
benchmark position are not proxies. They carry no signal on this axis.&lt;/p&gt;
&lt;h2&gt;
  
  
  Run it yourself
&lt;/h2&gt;

&lt;p&gt;Open API, no key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl .../api/korean    &lt;span class="c"&gt;# every model, every axis, with the judge's reason string&lt;/span&gt;
curl .../api/summary   &lt;span class="c"&gt;# grade distribution, judge id, what the run cost&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;a href="https://huggingface.co/spaces/ginigen-ai/open-router-leaderboard" rel="noopener noreferrer"&gt;https://huggingface.co/spaces/ginigen-ai/open-router-leaderboard&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;426 models, 330 graded, refreshed daily. The judge id and the per-answer reason strings are in the&lt;br&gt;
payload, so you can disagree with a specific grade rather than with the average.&lt;/p&gt;

&lt;h2&gt;
  
  
  The portable part
&lt;/h2&gt;

&lt;p&gt;Whatever language you ship into, write the countable check first and let it fail answers before your&lt;br&gt;
judge sees them. Ours is four lines and it disqualified a third of the corpus.&lt;/p&gt;

&lt;p&gt;A judge asked to grade an answer that is in the wrong script will still return a grade. That grade&lt;br&gt;
will look exactly like the real ones in your CSV.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Methodology: &lt;a href="https://huggingface.co/blog/ginigen-ai/openrouter-leaderboard" rel="noopener noreferrer"&gt;https://huggingface.co/blog/ginigen-ai/openrouter-leaderboard&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>llm</category>
      <category>testing</category>
      <category>i18n</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The Same Model Can Cost 14x More Depending on Who Serves It</title>
      <dc:creator>ai maya</dc:creator>
      <pubDate>Wed, 16 Sep 2026 10:48:38 +0000</pubDate>
      <link>https://dev.to/ai_maya_063fc568e157562fd/the-same-model-can-cost-14x-more-depending-on-who-serves-it-3312</link>
      <guid>https://dev.to/ai_maya_063fc568e157562fd/the-same-model-can-cost-14x-more-depending-on-who-serves-it-3312</guid>
      <description>&lt;p&gt;You picked a model. You are not done.&lt;/p&gt;

&lt;p&gt;On a routing platform, one model name maps to many providers, and they do not agree on price.&lt;br&gt;
We pulled per-provider pricing for every model on OpenRouter and compared the cheapest and priciest&lt;br&gt;
endpoint for the same weights.&lt;/p&gt;

&lt;p&gt;Of the 405 paid models on the platform, &lt;strong&gt;182 are served by two or more paying providers&lt;/strong&gt;. Across&lt;br&gt;
all of them: &lt;strong&gt;median spread 1.87x, widest 14.47x, and 46% vary by 2x or more.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Same weights. Same model card. Same API call. Up to fourteen times the invoice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2Fginigen-ai%2Fopen-router-leaderboard%2Fresolve%2Fmain%2Fstatic%2Fshots%2F03-providers.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2Fginigen-ai%2Fopen-router-leaderboard%2Fresolve%2Fmain%2Fstatic%2Fshots%2F03-providers.png" alt="The same model served by many providers at different prices, precisions and uptimes" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why the spread exists
&lt;/h2&gt;

&lt;p&gt;Three variables move independently underneath a single model name:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Precision.&lt;/strong&gt; A provider serving fp4 is not serving the same thing as one serving bf16, even though&lt;br&gt;
the model id is identical. It is cheaper for them and it is a different artifact for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uptime.&lt;/strong&gt; 89.3% and 99.9% are both "available" on a status page. One of them wakes you up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where the data goes.&lt;/strong&gt; &lt;strong&gt;71 of those 182 models — 39% — are served from providers in more than one&lt;br&gt;
country.&lt;/strong&gt; If you have a data residency obligation, the model id tells you nothing and the provider&lt;br&gt;
list tells you everything.&lt;/p&gt;

&lt;p&gt;None of this is hidden. It is just spread across separate pages, so nobody assembles it before&lt;br&gt;
signing off on a model.&lt;/p&gt;
&lt;h2&gt;
  
  
  Latency: don't inherit it, measure it
&lt;/h2&gt;

&lt;p&gt;The latency field in the public model data is null. That is the honest answer from an aggregator —&lt;br&gt;
it depends on the provider, the region and the moment.&lt;/p&gt;

&lt;p&gt;So we called &lt;strong&gt;329 models on a paid API&lt;/strong&gt; with one fixed prompt and recorded time-to-first-token and&lt;br&gt;
tokens per second. The harness is unremarkable and that is the point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;t0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perf_counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ttft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stream&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;messages&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PROMPT&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
                                      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MAX_TOKENS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                      &lt;span class="c1"&gt;# Reasoning models will spend the whole budget thinking
&lt;/span&gt;                                      &lt;span class="c1"&gt;# and return empty content. Turn it off for a speed test.
&lt;/span&gt;                                      &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reasoning&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enabled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;}})&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iter_lines&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ttft&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;ttft&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perf_counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;t0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;   &lt;span class="c1"&gt;# first token, milliseconds
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two properties of this data will quietly break a harness:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reasoning budgets consume the whole allowance.&lt;/strong&gt; With reasoning enabled, a model can return empty&lt;br&gt;
&lt;code&gt;content&lt;/code&gt; after spending every token you granted. You measure nothing and still pay for the call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Undisclosed prices arrive as &lt;code&gt;-1&lt;/code&gt;.&lt;/strong&gt; If you sum projected costs to skip expensive models, those&lt;br&gt;
negatives pull the total &lt;em&gt;down&lt;/em&gt; and every model passes the "too expensive" check. Clamp at zero&lt;br&gt;
before summing.&lt;/p&gt;

&lt;p&gt;We show our measurement next to OpenRouter's own p50–p99 percentiles, which aggregate thousands of&lt;br&gt;
real requests. They answer different questions: theirs is steady-state across traffic, ours is one&lt;br&gt;
controlled call with a known prompt, provider and moment. Merging them would destroy both.&lt;/p&gt;
&lt;h2&gt;
  
  
  The column nobody publishes
&lt;/h2&gt;

&lt;p&gt;We also grade &lt;strong&gt;Korean-language quality&lt;/strong&gt; on seven axes — register, knowledge of Korean institutions,&lt;br&gt;
format compliance, honorifics, summary accuracy, terminology, and freedom from translationese — for&lt;br&gt;
330 models.&lt;/p&gt;

&lt;p&gt;Two axes collapse across almost the whole field:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Axis&lt;/th&gt;
&lt;th&gt;A rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Honorifics&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.5%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Knowledge of Korean institutions&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.4%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminology&lt;/td&gt;
&lt;td&gt;31.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format compliance&lt;/td&gt;
&lt;td&gt;47.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Register&lt;/td&gt;
&lt;td&gt;53.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is a failure mode developers should recognise, because it is the same shape as a silent&lt;br&gt;
exception. The model writes fluent, natural Korean and gets the honorific wrong. Fluent output that&lt;br&gt;
is wrong passes review; broken output does not. A test suite that only checks "did it answer in&lt;br&gt;
Korean" will never catch it.&lt;/p&gt;

&lt;p&gt;And it does not correlate with the things you would use as a proxy. A 2023 model,&lt;br&gt;
&lt;code&gt;gpt-3.5-turbo-16k&lt;/code&gt;, scores a perfect 3.00, above most 2026 flagships. Release date, parameter count&lt;br&gt;
and English benchmarks do not predict it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Use the data
&lt;/h2&gt;

&lt;p&gt;All of it is open, no key required:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# per-provider price, precision, uptime and HQ for one model&lt;/span&gt;
curl .../api/models/deepseek/deepseek-v3.2/endpoints

&lt;span class="c"&gt;# latency and throughput percentiles, per provider&lt;/span&gt;
curl .../api/models/deepseek/deepseek-v3.2/perf

&lt;span class="c"&gt;# our measurements and grades&lt;/span&gt;
curl .../api/speed
curl .../api/korean   &lt;span class="c"&gt;# includes per-axis detail, not just the band&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Base URL is the Space's app URL:&lt;br&gt;
&lt;strong&gt;&lt;a href="https://huggingface.co/spaces/ginigen-ai/open-router-leaderboard" rel="noopener noreferrer"&gt;https://huggingface.co/spaces/ginigen-ai/open-router-leaderboard&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;425 models, 329 measured for latency, 330 graded for Korean, next to price, provider, precision and&lt;br&gt;
uptime. Three languages, three currencies, refreshed daily.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical takeaway
&lt;/h2&gt;

&lt;p&gt;Choosing a model is one decision. Choosing an endpoint is a second one, and it moves your bill by up&lt;br&gt;
to an order of magnitude, your reliability by nine percentage points of uptime, and your compliance&lt;br&gt;
posture by a border.&lt;/p&gt;

&lt;p&gt;If your procurement checklist stops at the model name, it stops one step early.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full writeup with methodology: &lt;a href="https://huggingface.co/blog/ginigen-ai/openrouter-leaderboard" rel="noopener noreferrer"&gt;https://huggingface.co/blog/ginigen-ai/openrouter-leaderboard&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>llm</category>
      <category>api</category>
      <category>performance</category>
      <category>opensource</category>
    </item>
    <item>
      <title>opened a financial forecasting contest that AI agents can enter directly. $2,000 in prizes, 122 days.</title>
      <dc:creator>ai maya</dc:creator>
      <pubDate>Mon, 24 Aug 2026 05:36:26 +0000</pubDate>
      <link>https://dev.to/ai_maya_063fc568e157562fd/opened-a-financial-forecasting-contest-that-ai-agents-can-enter-directly-2000-in-prizes-122-28be</link>
      <guid>https://dev.to/ai_maya_063fc568e157562fd/opened-a-financial-forecasting-contest-that-ai-agents-can-enter-directly-2000-in-prizes-122-28be</guid>
      <description>&lt;p&gt;&lt;strong&gt;We opened a financial forecasting challenge that AI agents can enter directly.&lt;br&gt;
$2,000 in prizes, 122 days. This is a record of why, and of the design problems we hit&lt;br&gt;
building it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Fhero.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Fhero.png" alt="FINCHAL — Can AI Beat the Market?" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Why another leaderboard
&lt;/h2&gt;

&lt;p&gt;Forecasting contests already exist. Most of them share one structural problem:&lt;br&gt;
&lt;strong&gt;once a result is in, there is no way to tell whether it was skill.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Say an entrant returns 30% in a month. Skill or luck? Answering that requires knowing&lt;br&gt;
how far a player with &lt;em&gt;no&lt;/em&gt; skill could have gone over the same window in the same&lt;br&gt;
market — and we have not seen a contest that measured that number in advance. So the&lt;br&gt;
top of the leaderboard sits permanently between "impressive" and "probably lucky."&lt;/p&gt;

&lt;p&gt;The second problem is backtests. Producing 200% a year on past data is not hard; you&lt;br&gt;
turn a few parameters. That result says nothing about the future, because it is an exam&lt;br&gt;
graded by someone who already has the answer key.&lt;/p&gt;

&lt;p&gt;The third is survivorship. The person who made money gets interviewed. The one who lost&lt;br&gt;
disappears quietly. All anyone knows are the stories that survived.&lt;/p&gt;

&lt;p&gt;FINCHAL attacks each of these differently.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Measure luck first, publish it.&lt;/strong&gt; Twenty thousand zero-skill players, per asset,
over the season length. A return below that line is not counted as evidence of skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put the answer in the future.&lt;/strong&gt; The world writes it after you submit. Fitting the
past cannot win.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep every entrant's record.&lt;/strong&gt; Good days and bad days sit in the same table.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And one more thing: &lt;strong&gt;agents enter on the same footing as people.&lt;/strong&gt; That is the&lt;br&gt;
technical core of this contest.&lt;/p&gt;


&lt;h2&gt;
  
  
  Design 1 — Take positions, not predictions
&lt;/h2&gt;

&lt;p&gt;The first sketch was a prediction contest — &lt;em&gt;"forecast next week's close"&lt;/em&gt; — because&lt;br&gt;
scoring is clean and there are established metrics like CRPS and pinball loss.&lt;/p&gt;

&lt;p&gt;But that splits &lt;strong&gt;being accurate&lt;/strong&gt; from &lt;strong&gt;making money.&lt;/strong&gt; You can nail a range and be&lt;br&gt;
unable to monetise it. You can miss direction entirely and still profit from sizing&lt;br&gt;
alone. Measuring forecast accuracy answers only half of &lt;em&gt;"who builds the better model."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So we take a &lt;strong&gt;position&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-1.0  fully short
 0.0  flat
+1.0  fully long
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One real number. Fractions like 0.35 are fine. It holds from that moment until you&lt;br&gt;
submit again, multiplied against the market return over that stretch.&lt;/p&gt;

&lt;p&gt;A side effect we liked: &lt;strong&gt;no close button is needed.&lt;/strong&gt; Setting the position to zero&lt;br&gt;
&lt;em&gt;is&lt;/em&gt; the close; going from +1 to −1 &lt;em&gt;is&lt;/em&gt; the reversal. One state, so the API and the&lt;br&gt;
screen both stay simple.&lt;/p&gt;

&lt;p&gt;Leverage is fixed at 1 and out-of-range values are clipped. Without that the contest&lt;br&gt;
becomes "who bet biggest" — an early simulation with leverage unlocked produced a&lt;br&gt;
cumulative 48,763%, which was multiplication, not skill.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Fhow-it-works.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Fhow-it-works.png" alt="How it works" width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Design 2 — Verify the scorer before any model
&lt;/h2&gt;

&lt;p&gt;This was the governing principle.&lt;/p&gt;

&lt;p&gt;Errors in scoring code do not raise exceptions. &lt;strong&gt;They produce plausible numbers.&lt;/strong&gt;&lt;br&gt;
Shift the return calculation by one step and you have a scorer that peeks at the future,&lt;br&gt;
which means anyone can come first — and the screen still shows perfectly normal figures,&lt;br&gt;
so nobody notices.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;scoring.py&lt;/code&gt; carries a self-test built only from cases whose answers are known in&lt;br&gt;
closed form.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. position 0        -&amp;gt; return 0, whatever prices do
2. position +1       -&amp;gt; exactly buy-and-hold, under zero cost
3. position -1       -&amp;gt; inverse compounding, not a sign flip of (2)
4. position 2.0      -&amp;gt; clipped to 1.0
5. no lookahead      -&amp;gt; entering on the bar that jumps earns nothing
6. cost actually reduces return
7. score is monotone
8. score near the median is about 0.30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Number 5 is the one that matters. If price jumps from 100 to 200 on a bar, entering on&lt;br&gt;
that bar must return zero; you have to be in one bar earlier. Without this test you can&lt;br&gt;
ship a lookahead scorer and never know.&lt;/p&gt;

&lt;p&gt;All eight run again on every change to that file. One failure stops scoring.&lt;/p&gt;

&lt;p&gt;A related lesson: &lt;strong&gt;validate a backtest engine on synthetic paths first.&lt;/strong&gt; Does a&lt;br&gt;
sawtooth match the closed-form value? Is a trending path symmetric up and down? Does a&lt;br&gt;
flat path return exactly zero? Validating only on real market data stops at&lt;br&gt;
"looks plausible, must be right."&lt;/p&gt;


&lt;h2&gt;
  
  
  Design 3 — The luck ceiling
&lt;/h2&gt;

&lt;p&gt;This is the identity of the contest.&lt;/p&gt;

&lt;p&gt;Twenty thousand players who pick positions at random over 122 days — skill exactly zero.&lt;br&gt;
The 95th percentile of their final returns is the &lt;strong&gt;luck ceiling&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Charged the same fees entrants pay:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Asset&lt;/th&gt;
&lt;th&gt;Luck ceiling (95th pct)&lt;/th&gt;
&lt;th&gt;Fee per 1.0 of position change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bitcoin&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+86.6%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.06%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+51.7%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.02%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crude Oil&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+26.9%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.03%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gold&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+9.2%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.02%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;+80% on Bitcoin sounds impressive; luck alone reaches that. +12% on gold is outside&lt;br&gt;
what luck produces. &lt;strong&gt;The same number means completely different things on different&lt;br&gt;
assets.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two judgements went into this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The reference players pay fees too.&lt;/strong&gt; Initially they did not, which meant entrants&lt;br&gt;
alone carried the cost and the bar was unfairly high — worse on assets with expensive&lt;br&gt;
execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What we fix before the season is the method, not the number.&lt;/strong&gt; Actual ranking rebuilds&lt;br&gt;
the reference distribution &lt;strong&gt;on the path the season actually took&lt;/strong&gt;, recomputed daily.&lt;br&gt;
Freezing a bootstrap estimate means that when an asset rallies mid-season every entrant&lt;br&gt;
inflates together and the ranking simply tracks market direction. The correct&lt;br&gt;
counterfactual is &lt;em&gt;"what luck could have produced given how the market actually moved."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The rank score is the percentile mapped through &lt;code&gt;-log10(1 - p)&lt;/code&gt;. A 2.0 means odds of&lt;br&gt;
1 in 100 by luck; 3.0 means 1 in 1,000.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Frules-cards.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Frules-cards.png" alt="Why, what is different, and the rules" width="799" height="310"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Design 4 — Why we gave up on cross-asset comparison
&lt;/h2&gt;

&lt;p&gt;The original plan was a single overall winner, which requires comparing results across&lt;br&gt;
assets.&lt;/p&gt;

&lt;p&gt;We tried six normalisation schemes — volatility-scaled returns, 95th-percentile ratios,&lt;br&gt;
percentiles, combinations. &lt;strong&gt;None removed the bias.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The reason is distribution shape. The winner is a maximum, and &lt;strong&gt;maxima are decided by&lt;br&gt;
the tail.&lt;/strong&gt; Tail shape differs fundamentally between assets, so matching any one&lt;br&gt;
statistic — median, variance, 95th percentile — leaves another point misaligned, and&lt;br&gt;
the win probability keeps tilting.&lt;/p&gt;

&lt;p&gt;The answer was to &lt;strong&gt;stop comparing.&lt;/strong&gt; Award $500 per asset and cross-asset comparison&lt;br&gt;
becomes unnecessary. Four assets, $2,000 total.&lt;/p&gt;

&lt;p&gt;A by-product of the same analysis: &lt;strong&gt;within an asset, percentile scoring calibrates&lt;br&gt;
well.&lt;/strong&gt; Zero-skill players land at a median percentile of 0.47–0.54. The problem was&lt;br&gt;
between assets, never inside one.&lt;/p&gt;


&lt;h2&gt;
  
  
  Design 5 — Cost, not rules, stops spam
&lt;/h2&gt;

&lt;p&gt;Since it is paper trading, why charge fees at all? Because without them, &lt;strong&gt;flipping the&lt;br&gt;
position every second pays.&lt;/strong&gt; On a volatile asset, reversing hourly eventually draws one&lt;br&gt;
good path.&lt;/p&gt;

&lt;p&gt;A submission-count rule would block that, but it would also block strategies that update&lt;br&gt;
frequently for legitimate reasons. So we charge &lt;strong&gt;real execution costs&lt;/strong&gt; instead.&lt;/p&gt;

&lt;p&gt;The change in position, |Δw|, is multiplied by that asset's actual cost — 0.06% for&lt;br&gt;
crypto (taker fee plus slippage), 0.02% for US stocks and ETFs (commission-free, but the&lt;br&gt;
spread remains).&lt;/p&gt;

&lt;p&gt;Synthetic entrants made the case:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Return&lt;/th&gt;
&lt;th&gt;Turnover&lt;/th&gt;
&lt;th&gt;Fees paid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Trend following&lt;/td&gt;
&lt;td&gt;+32.7%&lt;/td&gt;
&lt;td&gt;83.0&lt;/td&gt;
&lt;td&gt;4.98%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flip daily&lt;/td&gt;
&lt;td&gt;+11.8%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;179.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10.74%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buy and hold&lt;/td&gt;
&lt;td&gt;+1.9%&lt;/td&gt;
&lt;td&gt;0.06&lt;/td&gt;
&lt;td&gt;0.06%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Flipping daily paid &lt;strong&gt;over 10% of capital in fees alone.&lt;/strong&gt; No rule required — the cost&lt;br&gt;
punishes the behaviour. And the same strategy ranks near the top on gold, because gold's&lt;br&gt;
fee is a third of Bitcoin's. Per-asset differentiation does real work.&lt;/p&gt;


&lt;h2&gt;
  
  
  Design 6 — Putting a scale on an empty chart
&lt;/h2&gt;

&lt;p&gt;Opening the site on day one, the comparison chart was empty. Obvious in hindsight — no&lt;br&gt;
entrant curves exist yet — but the real problem was that &lt;strong&gt;nothing on screen told you&lt;br&gt;
what counts as good.&lt;/strong&gt; The luck ceiling existed as a number with no picture.&lt;/p&gt;

&lt;p&gt;So we run thirteen widely known rules &lt;strong&gt;from 1 January of this year to today&lt;/strong&gt;: where&lt;br&gt;
you would stand had you started that rule on the first trading day of the year.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Buy and hold · Hold only above the 200-day MA · Golden cross 50/200 · SMA 20/50 crossover
MACD 12/26/9 · Ichimoku cloud · 60-day momentum · 12-month absolute momentum
Donchian 20 breakout · RSI 14 · Stochastic 14/3 · Bollinger 20 reversion · Vol targeting
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three conditions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The same scorer and the same fees entrants face.&lt;/strong&gt; Only the rule differs. Drop the
fees and high-turnover rules look unfairly good.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No signal sees the future.&lt;/strong&gt; Everything is used after &lt;code&gt;shift(1)&lt;/code&gt;. Computing a moving
average from today's close and trading it today makes the whole record false.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indicators are built on the full history; only the display is trimmed.&lt;/strong&gt; The
200-day average on 2 January needs last year's data. Trim first and the start of the
year comes out empty.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Freference-curves.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Freference-curves.png" alt="Reference strategy curves" width="799" height="730"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The result was more interesting than expected
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;NVIDIA&lt;/th&gt;
&lt;th&gt;Bitcoin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stochastic 14/3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+43.41% (1st)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;−25.02% (12th)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bollinger 20 reversion&lt;/td&gt;
&lt;td&gt;+27.91% (2nd)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−25.51% (13th)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSI 14 mean reversion&lt;/td&gt;
&lt;td&gt;+19.61% (3rd)&lt;/td&gt;
&lt;td&gt;−20.70% (11th)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Donchian 20 breakout&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−46.64% (13th)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+48.98% (1st)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MACD 12/26/9&lt;/td&gt;
&lt;td&gt;−35.21% (11th)&lt;/td&gt;
&lt;td&gt;+21.36% (2nd)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buy and hold&lt;/td&gt;
&lt;td&gt;+13.81%&lt;/td&gt;
&lt;td&gt;−13.24%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The ranking nearly inverts.&lt;/strong&gt; The mean-reversion family that takes 1st, 2nd and 3rd on&lt;br&gt;
NVIDIA sits 11th, 12th and 13th on Bitcoin. The trend family that takes 1st and 2nd on&lt;br&gt;
Bitcoin sits 13th and 11th on NVIDIA.&lt;/p&gt;

&lt;p&gt;This retroactively justifies running four assets. &lt;strong&gt;"Which indicator is good" is not a&lt;br&gt;
well-posed question.&lt;/strong&gt; The character of the market decides the answer. This year NVIDIA&lt;br&gt;
kept reverting inside a range while Bitcoin trended, and the same rule produces opposite&lt;br&gt;
results.&lt;/p&gt;

&lt;p&gt;The fee effect shows up visually too. Bollinger reversion on Bitcoin ran a turnover of&lt;br&gt;
49.2 and paid &lt;strong&gt;2.95% in fees alone&lt;/strong&gt;, against 0.06% for buy and hold. For the same&lt;br&gt;
underlying loss, the high-turnover side gives up another three points.&lt;/p&gt;

&lt;p&gt;One caveat we are careful to print on the page: &lt;strong&gt;this is a replay of the past, not&lt;br&gt;
future performance.&lt;/strong&gt; Showing backtests as if they were results is precisely the problem&lt;br&gt;
this contest exists to remove, so we cannot do it ourselves. As entrant curves&lt;br&gt;
accumulate, these reference lines step back.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Freference-table.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Freference-table.png" alt="Reference strategy table" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Design 7 — An hour, not a day
&lt;/h2&gt;

&lt;p&gt;The scoring grid started as daily bars. Day one of the season exposed the flaw:&lt;br&gt;
&lt;strong&gt;the first return requires waiting a full day for the next bar.&lt;/strong&gt; Meanwhile entrants&lt;br&gt;
have submitted and the board shows nothing.&lt;/p&gt;

&lt;p&gt;Worse, the rules already promised &lt;em&gt;"update hourly."&lt;/em&gt; &lt;strong&gt;The unit we measured in did not&lt;br&gt;
match the unit we advertised.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We moved to hourly. The price publisher uploads hourly bars every 30 minutes and scoring&lt;br&gt;
runs on that grid. Returns now begin accumulating an hour after the open.&lt;/p&gt;

&lt;p&gt;One judgement here: &lt;strong&gt;stocks and ETFs only print during regular hours; crypto prints&lt;br&gt;
around the clock.&lt;/strong&gt; We did not paper over that difference. Filling empty hours invents&lt;br&gt;
trades that never happened, and those inventions flow straight into returns. &lt;strong&gt;Each&lt;br&gt;
asset is scored on its own clock.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An asset without hourly bars falls back to daily. That is better than blank, and which&lt;br&gt;
grid was used is visible on screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjsjtk4o1h5i5y38yxjmo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjsjtk4o1h5i5y38yxjmo.png" alt="Live prices and asset tabs" width="800" height="80"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Design 8 — Agents as first-class entrants
&lt;/h2&gt;

&lt;p&gt;Most forecasting contests have a human upload a CSV. Using an agent means a person&lt;br&gt;
shuttling files in the middle.&lt;/p&gt;

&lt;p&gt;FINCHAL exposes an &lt;strong&gt;MCP (Model Context Protocol) server.&lt;/strong&gt; One line attaches it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http finchal https://final-bench-finchal.hf.space/mcp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"X-Finchal-Key: &amp;lt;your key&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent gains four tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_rules()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;rules, assets, fees, deadline, luck ceiling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_data(asset, bars)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;historical closes — no future data is served&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;submit_position(asset, position)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;−1.0 to +1.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check_score(asset)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;rank, return, distance from the luck ceiling&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After that a person says &lt;em&gt;"enter the finchal challenge on BTC"&lt;/em&gt; and the agent reads the&lt;br&gt;
rules, pulls data, builds a model and places a position.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two things that caught us&lt;/strong&gt;, worth writing down because others will hit them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tool descriptions have to be localised.&lt;/strong&gt; Agents read those descriptions to decide what&lt;br&gt;
to do. Translate the page but leave the tool text in one language and agents in the other&lt;br&gt;
language are structurally disadvantaged. Descriptions now follow &lt;code&gt;Accept-Language&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you cannot serve, you must refuse.&lt;/strong&gt; The schema originally advertised&lt;br&gt;
&lt;code&gt;interval: ["1d", "1h"]&lt;/code&gt; while the feed published daily only. A request for &lt;code&gt;1h&lt;/code&gt; came&lt;br&gt;
back with &lt;code&gt;"interval": "1h"&lt;/code&gt; &lt;strong&gt;and daily bars.&lt;/strong&gt; An agent would model on a false premise.&lt;br&gt;
It is now rejected explicitly — and since then we have added a real hourly feed.&lt;/p&gt;

&lt;p&gt;That second case is the lesson that recurred throughout this project: &lt;strong&gt;a quietly wrong&lt;br&gt;
answer is far worse than an error.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Fagent-prompt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Fagent-prompt.png" alt="Agent guide prompt" width="799" height="454"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Design 9 — The data has to be P&amp;amp;L someone could actually realise
&lt;/h2&gt;

&lt;p&gt;Gold and oil were going to be futures. Measurement said otherwise.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CL=F&lt;/code&gt; (front-month WTI, continuous) returned &lt;strong&gt;+10%&lt;/strong&gt; over three years while &lt;code&gt;USO&lt;/code&gt;, the&lt;br&gt;
crude ETF, returned &lt;strong&gt;+89%&lt;/strong&gt;. A &lt;strong&gt;79-point gap&lt;/strong&gt; — created not by the market but by roll&lt;br&gt;
distortion when stitching front-month contracts. That is P&amp;amp;L an entrant could never have&lt;br&gt;
realised, mixed into the return series.&lt;/p&gt;

&lt;p&gt;Gold futures &lt;code&gt;GC=F&lt;/code&gt; show month-end jumps 2.4× normal, again from roll pricing.&lt;/p&gt;

&lt;p&gt;Both became ETFs (&lt;code&gt;GLD&lt;/code&gt;, &lt;code&gt;USO&lt;/code&gt;). Season 2 may cover futures, but not before the&lt;br&gt;
continuous-contract construction is settled.&lt;/p&gt;

&lt;p&gt;Asset selection had one more criterion: &lt;strong&gt;low mutual correlation.&lt;/strong&gt; Dogecoin correlates&lt;br&gt;
0.763 with Bitcoin and semiconductor ETFs 0.797 with NVIDIA, so both were dropped — if&lt;br&gt;
two assets are effectively one, a four-asset contest is a three-asset contest. The final&lt;br&gt;
four correlate between −0.04 and 0.19.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Built by AI        NVIDIA   ↕   Trusted for millennia   Gold
Shaken by AI      Bitcoin   ↕   What moved the world     Oil
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Two things infrastructure taught us
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Market data providers block datacenter IPs
&lt;/h3&gt;

&lt;p&gt;We learned this only after deploying to a Hugging Face Space. Yahoo returns &lt;strong&gt;429&lt;/strong&gt;,&lt;br&gt;
Stooq returns &lt;strong&gt;a bot-block HTML page with status 200&lt;/strong&gt;, CoinGecko blocks, and yfinance&lt;br&gt;
returns &lt;strong&gt;zero bars without raising.&lt;/strong&gt; General internet works; only the price providers&lt;br&gt;
are blocked.&lt;/p&gt;

&lt;p&gt;The dangerous pair is the last two. &lt;strong&gt;They do not raise.&lt;/strong&gt; A bare &lt;code&gt;try/except&lt;/code&gt; counts&lt;br&gt;
them as success and you get a silent empty page. So the criterion moved from&lt;br&gt;
&lt;em&gt;"did it raise"&lt;/em&gt; to &lt;strong&gt;&lt;em&gt;"how many bars arrived."&lt;/em&gt;&lt;/strong&gt; HTTP 200 also gets its body checked.&lt;/p&gt;

&lt;p&gt;The fix was to reverse the direction. The server no longer &lt;strong&gt;fetches&lt;/strong&gt; prices; it&lt;br&gt;
&lt;strong&gt;receives&lt;/strong&gt; them. A publisher on a network that works uploads CSVs to a dataset repo and&lt;br&gt;
the server reads only that. It refreshes every 30 minutes, and &lt;strong&gt;if collection fails it&lt;br&gt;
publishes nothing&lt;/strong&gt; — a half-written file overwriting a good one would corrupt every&lt;br&gt;
entrant's return for that day.&lt;/p&gt;
&lt;h3&gt;
  
  
  Writable is not durable
&lt;/h3&gt;

&lt;p&gt;A Space container's &lt;code&gt;/data&lt;/code&gt; &lt;strong&gt;is created and written to&lt;/strong&gt; even without persistent&lt;br&gt;
storage attached. It simply vanishes on restart. So "make a directory and write a temp&lt;br&gt;
file" &lt;strong&gt;always passes.&lt;/strong&gt; We nearly reported &lt;code&gt;persistent: true&lt;/code&gt; as proof of safety.&lt;/p&gt;

&lt;p&gt;The only real evidence is &lt;strong&gt;restarting for real and checking whether the previous boot&lt;br&gt;
left a trace.&lt;/strong&gt; A counter is now written each boot and read on the next.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;confirmed   the previous boot's record survived
unknown     first boot, cannot tell yet
lost        we wrote a record and it disappeared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First boot and data loss are indistinguishable at that moment, so &lt;strong&gt;the verdict is&lt;br&gt;
deferred to the next boot.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The ledger mirrors to a private dataset, which needed one rule: &lt;strong&gt;never flush after a&lt;br&gt;
failed restore.&lt;/strong&gt; An empty ledger overwriting the mirror erases four months in one write.&lt;br&gt;
A missing dependency did break restore once, and that guard is what saved the ledger.&lt;/p&gt;




&lt;h2&gt;
  
  
  The organisers do not compete
&lt;/h2&gt;

&lt;p&gt;We considered putting our own forecasting model on the leaderboard — the drug-discovery&lt;br&gt;
leaderboards that place approved drugs in the same table earn credibility that way.&lt;/p&gt;

&lt;p&gt;We decided against it, for two reasons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Framing.&lt;/strong&gt; The question this contest asks is &lt;em&gt;"who builds the better model."&lt;/em&gt; With the&lt;br&gt;
organiser in the entrant table it becomes &lt;em&gt;"is the organiser best."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measurement.&lt;/strong&gt; The rules fix positions to spot exposure between −1 and +1, which bounds&lt;br&gt;
what a strategy can express. Some approaches cannot be represented at all under that&lt;br&gt;
constraint, and entering under it would not be a fair comparison.&lt;/p&gt;

&lt;p&gt;Instead &lt;strong&gt;three baselines&lt;/strong&gt; share the table. All are published textbook methods.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Baseline&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Buy and hold&lt;/td&gt;
&lt;td&gt;always +1. Failing to beat it means nothing was achieved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volatility targeting&lt;/td&gt;
&lt;td&gt;EWMA volatility sizes the position; direction stays long&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Random&lt;/td&gt;
&lt;td&gt;−1/0/+1 each day. The floor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Baselines are a scale, not a competitor. &lt;strong&gt;A leaderboard without a scale cannot be read.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Fstandings.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhuggingface.co%2Fspaces%2FFINAL-Bench%2Ffinchal%2Fresolve%2Fmain%2Fdocs%2Fstandings.png" alt="Standings with baselines in the same table" width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Worth adding: the baselines &lt;strong&gt;do not predict direction&lt;/strong&gt; either. Volatility targeting&lt;br&gt;
decides only how large to be. Across sixty candidate variables we tested directly, none&lt;br&gt;
showed predictive power over short-horizon direction — and we will not have a baseline&lt;br&gt;
pretend to do what has not been demonstrated.&lt;/p&gt;




&lt;h2&gt;
  
  
  So what do we want to learn
&lt;/h2&gt;

&lt;p&gt;We are not going to claim that collective intelligence solves markets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where one model stops is not information.&lt;/strong&gt; But if hundreds of independent models stop&lt;br&gt;
in the same place, that is information about the market. If nobody clears the luck&lt;br&gt;
ceiling on one asset while several clear it on another, that difference is itself data.&lt;/p&gt;

&lt;p&gt;We already got a taste while laying down the thirteen reference strategies. Examined one&lt;br&gt;
at a time, each is just "this works, that does not." Spread all thirteen across four&lt;br&gt;
assets at once and a structure appears: &lt;strong&gt;the ranking inverts with the market.&lt;/strong&gt; No&lt;br&gt;
single rule shows that. Put hundreds of entrant models on the same axis and the map&lt;br&gt;
should get considerably finer.&lt;/p&gt;

&lt;p&gt;What remains after 122 days is not four winners but a &lt;strong&gt;boundary&lt;/strong&gt; — where luck ends and&lt;br&gt;
skill begins, and where that line falls on each market.&lt;/p&gt;




&lt;h2&gt;
  
  
  Entering
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;As a human&lt;/strong&gt; — sign in with Hugging Face, move the slider, submit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;As an agent&lt;/strong&gt; — attach the MCP server and say &lt;em&gt;"enter the challenge."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Season&lt;/strong&gt; 24 August to 24 December 2026 · &lt;strong&gt;Prize&lt;/strong&gt; $500 per asset × 4&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assets&lt;/strong&gt; NVIDIA · Bitcoin · Gold · Crude Oil&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;/llms.txt&lt;/code&gt; carries a machine-readable summary in English and Korean.&lt;/p&gt;

&lt;p&gt;The whole codebase is public. Read what the scorer does before you enter — a leaderboard&lt;br&gt;
that hides its scoring has not earned your trust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://huggingface.co/spaces/FINAL-Bench/finchal" rel="noopener noreferrer"&gt;https://huggingface.co/spaces/FINAL-Bench/finchal&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Day one
&lt;/h2&gt;

&lt;p&gt;The season opened on 24 August. Within hours the board had humans, baselines and an&lt;br&gt;
agent side by side on all four assets.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Entrant&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Warecube&lt;/td&gt;
&lt;td&gt;human&lt;/td&gt;
&lt;td&gt;my-mind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anserwise&lt;/td&gt;
&lt;td&gt;human&lt;/td&gt;
&lt;td&gt;long-jaengi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sunghokim&lt;/td&gt;
&lt;td&gt;human&lt;/td&gt;
&lt;td&gt;shotmanse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ginigen-ai&lt;/td&gt;
&lt;td&gt;agent&lt;/td&gt;
&lt;td&gt;13-rule equal-weight ensemble&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BUYHOLD / VOLTARGET / RANDOM&lt;/td&gt;
&lt;td&gt;baseline&lt;/td&gt;
&lt;td&gt;the scale&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The agent entry is worth a note because it went in through the same MCP path any&lt;br&gt;
entrant uses — &lt;code&gt;initialize&lt;/code&gt; → &lt;code&gt;tools/list&lt;/code&gt; → &lt;code&gt;get_rules&lt;/code&gt; → &lt;code&gt;get_data&lt;/code&gt; → model →&lt;br&gt;
&lt;code&gt;submit_position&lt;/code&gt;. No internal shortcut. Its method is deliberately un-tuned: it&lt;br&gt;
averages the current signal of all thirteen reference rules with equal weight.&lt;/p&gt;

&lt;p&gt;That choice follows directly from the measurement above. Since no single rule holds&lt;br&gt;
across assets, picking one &lt;em&gt;is&lt;/em&gt; a bet on market character. So it does not pick. When the&lt;br&gt;
rules disagree the position shrinks toward zero; when they align it grows. On day one&lt;br&gt;
that produced +0.686 on NVIDIA, +0.409 on oil, +0.373 on gold and +0.308 on Bitcoin —&lt;br&gt;
nine trend rules long against three mean-reversion rules calling overbought.&lt;/p&gt;

&lt;p&gt;Weighting those thirteen by their year-to-date performance would have been easy and&lt;br&gt;
would have scored better on the replay. It would also have been the exact mistake this&lt;br&gt;
contest exists to expose: treating a backtest as a result.&lt;/p&gt;

&lt;p&gt;Bitcoin began scoring within the hour. Equities, gold and oil waited for the US open —&lt;br&gt;
each asset is scored on its own clock.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>An open challenge is letting anyone submit a drug candidate - and scoring it in public</title>
      <dc:creator>ai maya</dc:creator>
      <pubDate>Sun, 16 Aug 2026 19:28:45 +0000</pubDate>
      <link>https://dev.to/ai_maya_063fc568e157562fd/an-open-challenge-is-letting-anyone-submit-a-drug-candidate-and-scoring-it-in-public-4jil</link>
      <guid>https://dev.to/ai_maya_063fc568e157562fd/an-open-challenge-is-letting-anyone-submit-a-drug-candidate-and-scoring-it-in-public-4jil</guid>
      <description>&lt;p&gt;There is a familiar shape to how a field opens up. For a long time the barrier is not the idea; it is the instrument. Anyone can imagine a molecule. Almost nobody could find out whether it was worth anything, because judging it required a laboratory, a compute budget, and years of training. The idea was cheap and the verdict was expensive.&lt;/p&gt;

&lt;p&gt;Something worth watching is happening to that asymmetry.&lt;/p&gt;

&lt;p&gt;An open drug-discovery challenge is currently running on Hugging Face, and the interesting part is not the prize money. It is that the &lt;strong&gt;evaluation&lt;/strong&gt; has been made public.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two seasons are live
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Season 1 — Malaria.&lt;/strong&gt; Target: PfDHODH in &lt;em&gt;Plasmodium falciparum&lt;/em&gt;, with human DHODH as a counter-target. Closes 30 September 2026.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Season 2 — Tuberculosis.&lt;/strong&gt; Target: InhA in &lt;em&gt;Mycobacterium tuberculosis&lt;/em&gt;, counter-target human FASN (ER domain). Closes 31 October 2026.&lt;/p&gt;

&lt;p&gt;Entry is a molecule, submitted as SMILES or InChI. There is no restriction on how you get there: Claude, GPT, Gemini, Qwen, KIMI, DeepSeek, or a model you trained yourself. The challenge scores the structure, not the pedigree of whoever produced it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scoring is where it gets interesting
&lt;/h2&gt;

&lt;p&gt;100 points across six axes — activity, binding, selectivity, ADMET, novelty, synthesizability — with weights that differ per season. Season 2 loads weight onto binding and selectivity, which is the right instinct: an InhA inhibitor that also shuts down the human homolog is not a candidate, it is a toxin.&lt;/p&gt;

&lt;p&gt;That counter-target design is the detail most worth noticing. It is easy to build a scoreboard that rewards &lt;em&gt;binds the target&lt;/em&gt;. Rewarding &lt;em&gt;binds the target and leaves the human protein alone&lt;/em&gt; is harder, and much closer to what actually decides whether a compound survives.&lt;/p&gt;

&lt;h2&gt;
  
  
  The anchors are in the table
&lt;/h2&gt;

&lt;p&gt;Approved drugs and inert compounds are scored on the same rubric as the entries.&lt;/p&gt;

&lt;p&gt;That is an unusual thing for an organizer to do, because it means anyone can see where the scale actually sits — including when a known drug does not score the way you would expect. A leaderboard you can audit is a different object from a leaderboard you are asked to believe.&lt;/p&gt;

&lt;p&gt;Private submission is supported, so entrants who want to keep a structure unpublished can still compete; the board shows a masked SMILES. The standings are also exposed as JSON, which means the whole thing can be pulled and checked programmatically rather than read off a webpage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest caveat, which the organizers state themselves
&lt;/h2&gt;

&lt;p&gt;A high score is a research hypothesis, not a drug. Everything here is computational. It is not clinical validation and does not become one by ranking well.&lt;/p&gt;

&lt;p&gt;Still — the direction is the encouraging part. Instruments spread, and fields change when they do. Whether this particular challenge produces anything durable is unknown. That it exists in a form outsiders can inspect is already worth something.&lt;/p&gt;

&lt;p&gt;Challenge: &lt;a href="https://huggingface.co/spaces/FINAL-Bench/open-discovery-challenge" rel="noopener noreferrer"&gt;https://huggingface.co/spaces/FINAL-Bench/open-discovery-challenge&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: the challenge is operated by the FINAL-Bench organization on Hugging Face.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>science</category>
      <category>vidraft</category>
    </item>
    <item>
      <title>Model DNA, Analyzed: Verifying 'From-Scratch' LLM Claims with Architecture, Tokenizer, and CKA (PyTorch)</title>
      <dc:creator>ai maya</dc:creator>
      <pubDate>Sun, 09 Aug 2026 08:12:38 +0000</pubDate>
      <link>https://dev.to/ai_maya_063fc568e157562fd/model-dna-analyzed-verifying-from-scratch-llm-claims-with-architecture-tokenizer-and-cka-2k4h</link>
      <guid>https://dev.to/ai_maya_063fc568e157562fd/model-dna-analyzed-verifying-from-scratch-llm-claims-with-architecture-tokenizer-and-cka-2k4h</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR.&lt;/strong&gt; A public method called &lt;strong&gt;&lt;a href="https://huggingface.co/blog/mayafree/model-dna" rel="noopener noreferrer"&gt;Model DNA&lt;/a&gt;&lt;/strong&gt; — with a &lt;a href="https://huggingface.co/spaces/mayafree/Model-Genome-Korea" rel="noopener noreferrer"&gt;live tool&lt;/a&gt; — lets outsiders estimate whether an LLM was trained from scratch or derived from an open-weight base, using nothing but public artifacts: &lt;code&gt;config.json&lt;/code&gt;, &lt;code&gt;tokenizer.json&lt;/code&gt;, and embedding weights. This is a technical deep-dive that &lt;em&gt;cites and reproduces&lt;/em&gt; that method in PyTorch, then analyzes where it holds up and where it breaks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Three public signals&lt;/strong&gt; — architecture config, tokenizer overlap, and embedding-space similarity via &lt;strong&gt;Linear CKA&lt;/strong&gt; — combine to place a model on a lineage spectrum.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One matching field is noise; five at once is a fingerprint.&lt;/strong&gt; Provenance is a preponderance-of-evidence judgment, not a single test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The method's real strengths&lt;/strong&gt; are reproducibility and rotation-invariant similarity; its real limits are the &lt;em&gt;continued-pretraining&lt;/em&gt; gray zone, threshold sensitivity, and an embedding-only view.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fingerprinting reveals lineage, not intent.&lt;/strong&gt; Building on an open-weight base is a legitimate, industry-standard practice; the output is a &lt;em&gt;label&lt;/em&gt;, not an accusation.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why this matters in 2026
&lt;/h2&gt;

&lt;p&gt;Every few weeks a lab announces a "from-scratch, self-developed" foundation model. In mid-2026 those claims stopped being taken on faith. A &lt;a href="https://www.zhihu.com/roundtable/llmrun2026" rel="noopener noreferrer"&gt;Zhihu roundtable on the summer model wave&lt;/a&gt; and a &lt;a href="https://www.zhihu.com/question/2067512422555029717" rel="noopener noreferrer"&gt;thread with millions of views&lt;/a&gt; became the venue where "self-developed" claims were publicly stress-tested — and several were found more derivative than advertised (&lt;a href="https://www.gamersky.com/news/202608/2181600.shtml" rel="noopener noreferrer"&gt;coverage&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Model DNA matters because it moved the argument from vibes to a reproducible procedure, and it has been run across major Korean foundation-model builders — among them LG, NAVER, Kakao, SKT, KT, NCSOFT, Upstage, and Motif. (This piece stays at the method level and assigns no verdict to any named company; per-model labels belong to the tool, not to a blog post.) What follows reproduces the procedure in PyTorch and evaluates it as a method, within the scope the source already made public.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three signals (cited and reproduced)
&lt;/h2&gt;

&lt;p&gt;The premise: no leaked internals required. Everything is read from a model's public files.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Architecture fingerprint — &lt;code&gt;config.json&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Compare the structural fields a lab chooses at design time: &lt;code&gt;model_type&lt;/code&gt;, &lt;code&gt;vocab_size&lt;/code&gt;, &lt;code&gt;hidden_size&lt;/code&gt;, &lt;code&gt;intermediate_size&lt;/code&gt;, &lt;code&gt;num_hidden_layers&lt;/code&gt;, &lt;code&gt;num_attention_heads&lt;/code&gt;, &lt;code&gt;num_key_value_heads&lt;/code&gt;. Independently designed models rarely align on all of them at once.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;ARCH_FIELDS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vocab_size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hidden_size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;intermediate_size&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;num_hidden_layers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;num_attention_heads&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;num_key_value_heads&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_position_embeddings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rope_theta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;arch_match_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfg_a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cfg_b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ARCH_FIELDS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Number of structural fields that match simultaneously.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;
              &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cfg_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;cfg_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;cfg_b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Reading rule (as the source puts it):&lt;/strong&gt; a single coincidental field means nothing; five simultaneously is a fingerprint. How many to treat as a threshold depends on the diversity of your candidate base pool.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Tokenizer overlap — &lt;code&gt;tokenizer.json&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Two models trained truly independently almost never converge on the same vocabulary. Normalize shared tokens against the &lt;em&gt;smaller&lt;/em&gt; vocabulary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tokenizer_overlap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab_a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vocab_b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab_a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab_b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sa&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sa&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sb&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A supporting signal only — see Trap 2.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Embedding similarity — Linear CKA
&lt;/h3&gt;

&lt;p&gt;The most robust signal compares representation geometry. Naive cosine comparison is fooled by rotation (Trap 1), so the method uses &lt;strong&gt;Linear CKA (Centered Kernel Alignment)&lt;/strong&gt; — from Kornblith et al. (2019), &lt;em&gt;Similarity of Neural Network Representations Revisited&lt;/em&gt; (ICML) — which is invariant to rotation, orthogonal transforms, and isotropic scaling.&lt;/p&gt;

&lt;p&gt;For row-centered matrices &lt;code&gt;X ∈ ℝ^{n×d1}&lt;/code&gt; and &lt;code&gt;Y ∈ ℝ^{n×d2}&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CKA(X, Y) = ||Yᵀ X||²_F / ( ||Xᵀ X||_F · ||Yᵀ Y||_F )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crucially, it is defined even when &lt;code&gt;d1 ≠ d2&lt;/code&gt;, so models with different hidden sizes compare directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;

&lt;span class="nd"&gt;@torch.no_grad&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;linear_cka&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tensor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tensor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# X:(n,d1), Y:(n,d2) — embeddings over the SAME token set (rows aligned)
&lt;/span&gt;    &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keepdim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;Y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keepdim&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;den&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;den&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Alignment is the catch.&lt;/strong&gt; The two embedding matrices must index the &lt;em&gt;same tokens&lt;/em&gt;. In practice you take the shared-token subset of the two tokenizers and gather those rows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;aligned_embeddings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emb_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vocab_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;emb_b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vocab_b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;shared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab_a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vocab_b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;idx_a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;vocab_a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;idx_b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tensor&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;vocab_b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;emb_a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx_a&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;emb_b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx_b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The genotype framework
&lt;/h2&gt;

&lt;p&gt;The tool collapses the three signals into four labels — a clean way to read any result (&lt;a href="https://huggingface.co/spaces/mayafree/Model-Genome-Korea" rel="noopener noreferrer"&gt;Model Genome Korea&lt;/a&gt;):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Genotype&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🟢 &lt;strong&gt;Native&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Self-designed architecture &lt;strong&gt;and&lt;/strong&gt; from-scratch weights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔵 &lt;strong&gt;Adapted&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Mostly original, &lt;strong&gt;one&lt;/strong&gt; borrowed axis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟡 &lt;strong&gt;Mixed&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Partial inheritance on &lt;strong&gt;both&lt;/strong&gt; axes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴 &lt;strong&gt;Ported&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Exact foreign architecture match &lt;strong&gt;and&lt;/strong&gt; inherited weights&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Two traps that produce confident wrong answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Trap 1 — row-wise cosine similarity looks rigorous but isn't.&lt;/strong&gt; It is fooled by rotation invariance: a genuinely derived model can be rotated to look "different," and a naive check clears it. That is exactly why CKA and config signals carry the weight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trap 2 — a shared tokenizer proves nothing alone.&lt;/strong&gt; Tokenizer reuse is often a licensing or convenience decision. Treat overlap as supporting evidence, never a conclusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deep analysis: how far can you trust it?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Strengths&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reproducibility.&lt;/strong&gt; All three signals compute from public artifacts in a few dozen lines. Claim and verification live on the same plane.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Right invariance.&lt;/strong&gt; Choosing Linear CKA is correct — it neutralizes the most common disguise (orthogonal transforms) that defeats cosine comparisons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence fusion.&lt;/strong&gt; Judging on the &lt;em&gt;simultaneous&lt;/em&gt; agreement of three axes suppresses both false positives and false negatives.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Limits (must be acknowledged)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Continued-pretraining gray zone.&lt;/strong&gt; Embedding CKA identifies from-scratch training well but does not cleanly separate derivatives that keep a base's weights and train heavily on top. Here the verdict is probabilistic and config/tokenizer evidence dominates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threshold sensitivity.&lt;/strong&gt; "How many fields," "what CKA cutoff" depend on the candidate pool. Hard-coding constants makes conclusions wobble when the pool changes — which is why this write-up prescribes none.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embedding bias.&lt;/strong&gt; Looking only at the embedding layer is cheap, but a model's "identity" also lives in mid and upper layers. A &lt;strong&gt;layer-wise CKA profile&lt;/strong&gt; improves resolution in the gray zone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alignment dependence.&lt;/strong&gt; Few shared tokens (language- or domain-specific tokenizers) shrink the CKA sample and inflate variance. Report shared-token count alongside CKA.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Improvements worth adopting&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Extend single-layer embedding CKA to a &lt;strong&gt;layer-wise CKA curve&lt;/strong&gt; (input → mid → output).&lt;/li&gt;
&lt;li&gt;Score against the &lt;strong&gt;entire candidate base pool&lt;/strong&gt; and judge by &lt;em&gt;relative rank&lt;/em&gt;, not an absolute cutoff.&lt;/li&gt;
&lt;li&gt;Report shared-token counts and bootstrap confidence intervals for &lt;strong&gt;statistical significance&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;In short, Model DNA fuses the &lt;em&gt;right signals&lt;/em&gt; under the &lt;em&gt;right invariance&lt;/em&gt; — a solid starting point. It only avoids misjudgment when read as a &lt;strong&gt;spectrum with uncertainty&lt;/strong&gt;, not a from-scratch/not binary.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What fingerprinting cannot tell you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lineage, not intent.&lt;/strong&gt; It can show B shares structure with A; it cannot say whether that was disclosed, licensed, or hidden — ethics and paperwork, not linear algebra.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"From scratch" is a spectrum,&lt;/strong&gt; not a boolean. Data, init, architecture, and post-training each sit on a continuum of originality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building on open weights is legitimate.&lt;/strong&gt; The goal is transparency and accurate labeling, not accusation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can you tell if an LLM was really trained from scratch?&lt;/strong&gt;&lt;br&gt;
Usually, with high probability. Cross-check architecture config, tokenizer overlap, and embedding CKA against candidate bases; agreement across all three indicates derivation, divergence supports from-scratch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Model DNA / model provenance?&lt;/strong&gt;&lt;br&gt;
Estimating a model's origin — original vs. derived from an open-weight base — from public artifacts alone (config, tokenizer, weights), without training data or internal logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is building on Llama, Qwen, or DeepSeek legitimate?&lt;/strong&gt;&lt;br&gt;
Yes. Fine-tuning or continued-pretraining an open-weight base is standard, licensed practice. Provenance tools report lineage, not misconduct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you tell a fine-tuned model from a from-scratch one?&lt;/strong&gt;&lt;br&gt;
From-scratch models diverge on architecture and tokenizer and show low embedding CKA to any base. Derivatives keep the base's skeleton and tokenizer and retain high similarity — the hardest case, where config and tokenizer evidence matter most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Linear CKA instead of cosine?&lt;/strong&gt;&lt;br&gt;
Because CKA is robust to rotation and scaling — the transforms a derived model uses to look "different."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can models with different hidden sizes be compared?&lt;/strong&gt;&lt;br&gt;
Yes. CKA compares n×n Gram matrices, so &lt;code&gt;d1 ≠ d2&lt;/code&gt; is fine — as long as embedding rows are aligned to the same tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources &amp;amp; related links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Method under analysis: &lt;a href="https://huggingface.co/blog/mayafree/model-dna" rel="noopener noreferrer"&gt;Model DNA — architecture &amp;amp; weight lineage&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live tool (space): &lt;a href="https://huggingface.co/spaces/mayafree/Model-Genome-Korea" rel="noopener noreferrer"&gt;Model Genome Korea&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Announcement post: &lt;a href="https://huggingface.co/posts/mayafree/340116886441122" rel="noopener noreferrer"&gt;Architecture lineage of Korea's sovereign-AI models&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Academic basis: Kornblith, Norouzi, Lee, Hinton (2019), &lt;em&gt;Similarity of Neural Network Representations Revisited&lt;/em&gt;, ICML.&lt;/li&gt;
&lt;li&gt;The debate: &lt;a href="https://www.zhihu.com/roundtable/llmrun2026" rel="noopener noreferrer"&gt;Zhihu roundtable "大模型卷一夏"&lt;/a&gt; · &lt;a href="https://www.zhihu.com/question/2067512422555029717" rel="noopener noreferrer"&gt;Zhihu thread&lt;/a&gt; · &lt;a href="https://www.gamersky.com/news/202608/2181600.shtml" rel="noopener noreferrer"&gt;coverage&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Provenance is becoming a norm, not a gotcha. The healthiest version is one where "we trained it from scratch" arrives with — or at least survives — the fingerprint. If you build models, publish the check yourself.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>pytorch</category>
    </item>
    <item>
      <title>How to Verify a 'Trained-From-Scratch' LLM in 2026: A Provenance and Fingerprinting Guide</title>
      <dc:creator>ai maya</dc:creator>
      <pubDate>Sun, 09 Aug 2026 07:23:58 +0000</pubDate>
      <link>https://dev.to/ai_maya_063fc568e157562fd/how-to-verify-a-trained-from-scratch-llm-in-2026-a-provenance-and-fingerprinting-guide-3ie9</link>
      <guid>https://dev.to/ai_maya_063fc568e157562fd/how-to-verify-a-trained-from-scratch-llm-in-2026-a-provenance-and-fingerprinting-guide-3ie9</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR — Can an outsider verify that an LLM was "trained from scratch"? In 2026, largely yes.&lt;/strong&gt; Using only public Hugging Face artifacts — &lt;code&gt;config.json&lt;/code&gt;, &lt;code&gt;tokenizer.json&lt;/code&gt;, and embedding weights — you can fingerprint a model's &lt;em&gt;lineage&lt;/em&gt; and place it on a spectrum from fully original to a straight port of a foreign base. This guide explains the method, what it can and cannot prove, and the open-weight debate that made it a 2026 talking point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Three public signals&lt;/strong&gt; — architecture config, tokenizer overlap, and embedding-space similarity (Linear CKA) — are enough to estimate whether a model was built from scratch or derived from an open-weight base.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One matching field is noise; five at once is a fingerprint.&lt;/strong&gt; Provenance is a preponderance-of-evidence judgment, not a single test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fingerprinting reveals &lt;em&gt;lineage&lt;/em&gt;, not &lt;em&gt;intent&lt;/em&gt;.&lt;/strong&gt; Building on an open-weight base is a legitimate, industry-standard practice — the interesting output is the &lt;em&gt;label&lt;/em&gt;, not an accusation.&lt;/li&gt;
&lt;li&gt;The topic went mainstream in 2026 because several "self-developed, DeepSeek-class" claims from non-US/China labs were publicly stress-tested and, in places, found more derivative than advertised.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this matters in 2026
&lt;/h2&gt;

&lt;p&gt;Every few weeks a lab announces a "from-scratch, self-developed" foundation model. In mid-2026 that claim stopped being taken on faith. A &lt;a href="https://www.zhihu.com/roundtable/llmrun2026" rel="noopener noreferrer"&gt;Zhihu roundtable on the summer model wave&lt;/a&gt; and a widely-cited &lt;a href="https://www.zhihu.com/question/2067512422555029717" rel="noopener noreferrer"&gt;Zhihu thread with millions of views&lt;/a&gt; became the venue where the Chinese-language community tore into "self-developed" claims from Korean and Indian labs — concluding, in several cases, that the models leaned harder on Chinese open-weight bases than the marketing implied (&lt;a href="https://www.gamersky.com/news/202608/2181600.shtml" rel="noopener noreferrer"&gt;coverage&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The useful development is that the argument moved from vibes to a reproducible procedure. Public tools now let anyone run the check. This is a refreshed 2026 walkthrough of that procedure — updating the &lt;a href="https://dev.to/ai_maya_063fc568e157562fd/how-to-tell-if-an-llm-was-really-trained-from-scratch-a-reproducible-fingerprinting-method-l4e"&gt;original method write-up&lt;/a&gt; with the debate context and the links you need.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three fingerprint signals
&lt;/h2&gt;

&lt;p&gt;Model provenance rests on three axes you can read straight from a model's public files. No leaked internals required.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Architecture fingerprint (&lt;code&gt;config.json&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Compare the structural fields a lab chooses when it designs a model: &lt;code&gt;model_type&lt;/code&gt;, &lt;code&gt;vocab_size&lt;/code&gt;, &lt;code&gt;hidden_size&lt;/code&gt;, &lt;code&gt;intermediate_size&lt;/code&gt;, &lt;code&gt;num_hidden_layers&lt;/code&gt;, and the attention head counts. Independently designed models rarely line up on all of these. &lt;strong&gt;A single coincidental field means nothing; five simultaneously is a fingerprint&lt;/strong&gt; of a shared skeleton.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tokenizer overlap (&lt;code&gt;tokenizer.json&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Two models trained truly independently almost never converge on the same vocabulary. Measure the ratio of shared tokens against the &lt;em&gt;smaller&lt;/em&gt; vocabulary. High overlap is a strong hint of shared ancestry — but, as the traps below explain, not a verdict on its own.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Embedding similarity via Linear CKA
&lt;/h3&gt;

&lt;p&gt;Centered Kernel Alignment (CKA) compares representation geometry in a way that is robust to rotations and rescalings — the superficial transformations that fool cruder weight comparisons. Run on embedding layers, it reliably flags from-scratch training. Its honest limitation: it struggles to cleanly separate &lt;em&gt;continued-pretraining&lt;/em&gt; derivatives, where a model keeps a base's weights but trains heavily on top.&lt;/p&gt;

&lt;h2&gt;
  
  
  The genotype framework
&lt;/h2&gt;

&lt;p&gt;One public framework, &lt;a href="https://huggingface.co/spaces/mayafree/Model-Genome-Korea" rel="noopener noreferrer"&gt;Model Genome Korea&lt;/a&gt;, collapses the three signals into four labels — a clean mental model for reading any provenance result:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Genotype&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🟢 &lt;strong&gt;Native&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Self-designed architecture &lt;strong&gt;and&lt;/strong&gt; from-scratch weights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔵 &lt;strong&gt;Adapted&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Mostly original, with &lt;strong&gt;one&lt;/strong&gt; borrowed axis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟡 &lt;strong&gt;Mixed&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Partial inheritance on &lt;strong&gt;both&lt;/strong&gt; axes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔴 &lt;strong&gt;Ported&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Exact foreign architecture match &lt;strong&gt;and&lt;/strong&gt; inherited weights&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Two traps that produce confident wrong answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Trap 1 — Row-wise cosine similarity looks rigorous but isn't.&lt;/strong&gt; Comparing weight matrices row by row with cosine similarity feels quantitative, yet it is fooled by rotation invariance: a genuinely derived model can be rotated to look "different," and a naive check clears it. This is exactly why the method leans on rotation-robust CKA and on structural config signals rather than raw weight-row comparisons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trap 2 — A shared tokenizer proves nothing by itself.&lt;/strong&gt; Reusing a tokenizer is frequently a licensing or convenience decision, not evidence of weight-level derivation. Treat tokenizer overlap as a &lt;em&gt;supporting&lt;/em&gt; signal, never a conclusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  What fingerprinting cannot tell you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lineage, not intent.&lt;/strong&gt; It can show that model B shares structure with model A. It cannot tell you whether that was disclosed, licensed, or hidden — that is a question of ethics and paperwork, not linear algebra.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"From scratch" is a spectrum, not a boolean.&lt;/strong&gt; Data, initialization, architecture, and post-training sit on a continuum of originality; a single label flattens a gradient.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building on open weights is legitimate.&lt;/strong&gt; The point of a provenance tool is transparency and accurate labeling, not accusation. Most of the industry stands on open-weight shoulders — the honest move is to say so.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can you tell if an LLM was really trained from scratch?&lt;/strong&gt;&lt;br&gt;
In most cases, yes — to a strong probability. Cross-check architecture config, tokenizer overlap, and embedding CKA against candidate base models; agreement across all three indicates derivation, while divergence supports a from-scratch claim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is LLM fingerprinting / model provenance?&lt;/strong&gt;&lt;br&gt;
It is the practice of estimating a model's origin — original vs. derived from an existing open-weight base — using only its public artifacts (config, tokenizer, weights), without access to training data or internal logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is building a model on Llama, Qwen, or DeepSeek legitimate?&lt;/strong&gt;&lt;br&gt;
Yes. Fine-tuning or continued-pretraining an open-weight base is standard, licensed (subject to each license), industry practice. Provenance tools report &lt;em&gt;lineage&lt;/em&gt;; they do not allege wrongdoing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you distinguish a fine-tuned model from a from-scratch one?&lt;/strong&gt;&lt;br&gt;
From-scratch models diverge on architecture and tokenizer and show low embedding CKA to any base. Fine-tuned or continued-pretraining derivatives keep the base's skeleton and tokenizer and retain high embedding similarity — the hardest case, where CKA alone is weakest and config/tokenizer evidence matters most.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does a shared tokenizer mean a model is derived?&lt;/strong&gt;&lt;br&gt;
No. It is a supporting signal only. Confirm with architecture and weight evidence before drawing a conclusion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Linear CKA instead of cosine similarity?&lt;/strong&gt;&lt;br&gt;
Because CKA is robust to rotation and scaling, the transformations that let a derived model masquerade as "different" under naive cosine comparisons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources &amp;amp; related links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Reproducible method write-up: &lt;a href="https://dev.to/ai_maya_063fc568e157562fd/how-to-tell-if-an-llm-was-really-trained-from-scratch-a-reproducible-fingerprinting-method-l4e"&gt;How to Tell If an LLM Was Really Trained From Scratch&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Deep-dive article: &lt;a href="https://huggingface.co/blog/mayafree/model-dna" rel="noopener noreferrer"&gt;Model DNA — architecture &amp;amp; weight lineage&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live tool: &lt;a href="https://huggingface.co/spaces/mayafree/Model-Genome-Korea" rel="noopener noreferrer"&gt;Model Genome Korea&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Announcement post: &lt;a href="https://huggingface.co/posts/mayafree/340116886441122" rel="noopener noreferrer"&gt;Architecture lineage of Korea's sovereign-AI models&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The debate: &lt;a href="https://www.zhihu.com/roundtable/llmrun2026" rel="noopener noreferrer"&gt;Zhihu roundtable "大模型卷一夏"&lt;/a&gt; · &lt;a href="https://www.zhihu.com/question/2067512422555029717" rel="noopener noreferrer"&gt;Zhihu thread&lt;/a&gt; · &lt;a href="https://www.gamersky.com/news/202608/2181600.shtml" rel="noopener noreferrer"&gt;media coverage&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Provenance is becoming a norm, not a gotcha. The healthiest version of this trend is one where "we trained it from scratch" is expected to arrive with — or at least survive — the fingerprint. If you build models, publish the check yourself.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The KV Cache Is the Bottleneck: A 2026 Field Guide to Attention Variants</title>
      <dc:creator>ai maya</dc:creator>
      <pubDate>Sun, 09 Aug 2026 07:15:29 +0000</pubDate>
      <link>https://dev.to/ai_maya_063fc568e157562fd/the-kv-cache-is-the-bottleneck-a-2026-field-guide-to-attention-variants-33p2</link>
      <guid>https://dev.to/ai_maya_063fc568e157562fd/the-kv-cache-is-the-bottleneck-a-2026-field-guide-to-attention-variants-33p2</guid>
      <description>&lt;p&gt;If you want to understand why 2026's frontier LLMs look the way they do — why one ships Multi-head Latent Attention, another interleaves linear and full attention, a third leans on sliding windows — stop looking at benchmark scores and look at the KV cache. Almost every architectural decision at the frontier this year is, at heart, a fight with the memory that autoregressive decoding leaves behind.&lt;/p&gt;

&lt;p&gt;This is a practitioner's map of that fight: what the KV cache actually costs, the lineage of techniques built to shrink it, and how to choose among them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the KV cache dominates
&lt;/h2&gt;

&lt;p&gt;During generation, a decoder-only transformer caches the key and value vectors of every past token so it doesn't recompute them each step. That cache is the price of fast decoding, and it is not small.&lt;/p&gt;

&lt;p&gt;The size is brutally simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;KV bytes = 2 (K and V) × layers × kv_heads × head_dim × seq_len × batch × dtype_bytes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two consequences fall out immediately:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;It grows linearly with context and batch.&lt;/strong&gt; Double the context, double the cache. Serve more concurrent users, multiply again. At long context and healthy batch sizes, the KV cache — not the weights — becomes the dominant consumer of accelerator memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decoding is memory-bandwidth bound, not compute bound.&lt;/strong&gt; Generating one token touches the entire cache. You are not FLOP-limited; you are limited by how fast you can stream that cache off HBM. Shrinking the cache is therefore the most direct lever on both memory footprint &lt;em&gt;and&lt;/em&gt; tokens/sec.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every technique below is a different answer to "how do we make that formula smaller without breaking the model."&lt;/p&gt;

&lt;h2&gt;
  
  
  The lineage of fixes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Fewer KV heads: MQA → GQA
&lt;/h3&gt;

&lt;p&gt;The first target is &lt;code&gt;kv_heads&lt;/code&gt;. &lt;strong&gt;Multi-Query Attention (MQA)&lt;/strong&gt; collapses all query heads onto a &lt;em&gt;single&lt;/em&gt; shared KV head — a large cut, but it can cost quality and training stability. &lt;strong&gt;Grouped-Query Attention (GQA)&lt;/strong&gt; is the pragmatic compromise that won: query heads are split into groups, each sharing one KV head. With, say, 8 KV heads for 64 query heads you get most of MQA's savings with far less quality loss. GQA is the default in the majority of open-weight models today for exactly this reason.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Compress the cache: Multi-head Latent Attention (MLA)
&lt;/h3&gt;

&lt;p&gt;Instead of storing fewer heads, &lt;strong&gt;MLA&lt;/strong&gt; stores a &lt;em&gt;low-rank latent&lt;/em&gt;. Keys and values are projected down to a small shared latent vector that is cached; the per-head K and V are reconstructed on the fly during attention. The cached object is dramatically smaller than full K/V, yet the model still attends with many effective heads. MLA is the headline reason some 2026 models sustain very long context at serving-friendly memory — it attacks &lt;code&gt;head_dim × kv_heads&lt;/code&gt; directly rather than just cutting head count.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Kill the growing cache entirely: linear attention &amp;amp; SSMs
&lt;/h3&gt;

&lt;p&gt;Softmax attention is O(n²) in compute and O(n) in cache. &lt;strong&gt;Linear attention&lt;/strong&gt; and &lt;strong&gt;state-space models (SSMs, Mamba-style)&lt;/strong&gt; rewrite the operation as a recurrence with a &lt;em&gt;fixed-size&lt;/em&gt; state. There is no cache that grows with sequence length — memory is O(1) in context. The catch is real: a fixed state is a lossy summary, so pure linear models are weaker at precise long-range recall and associative lookup ("what was the exact token 40k ago"). They are fast and cheap; they forget details.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The 2026 consensus: hybrid, layer-interleaved attention
&lt;/h3&gt;

&lt;p&gt;The dominant pattern this year is not to pick one. Models &lt;strong&gt;interleave&lt;/strong&gt; a minority of full (softmax) attention layers with a majority of linear/SSM layers. The full layers preserve the sharp recall that pure linear loses; the linear layers carry the long-context load cheaply. The result is near-linear memory scaling with most of the quality of full attention. When you read that a 2026 release is "hybrid attention," this layer-wise interleaving is almost always what is meant.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Bound the window: sliding-window attention + sinks
&lt;/h3&gt;

&lt;p&gt;Orthogonal to the above, &lt;strong&gt;sliding-window attention&lt;/strong&gt; simply caps how far back each token attends (e.g., the last few thousand tokens), making the cache constant-size past the window. Naively this destroys long-context behavior, so it is paired with tricks like &lt;strong&gt;attention sinks&lt;/strong&gt; — keeping the first few tokens always in view — which stabilize very long generations. Cheap, effective for many workloads, and easy to combine with GQA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two more multipliers worth knowing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quantized KV cache.&lt;/strong&gt; The &lt;code&gt;dtype_bytes&lt;/code&gt; term is a free-ish win: storing the cache in FP8 or INT8 instead of FP16 halves or quarters it with modest quality impact. In 2026 this is close to standard for long-context serving.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paged KV memory.&lt;/strong&gt; PagedAttention (the idea behind vLLM's throughput) doesn't shrink the cache — it stops you from &lt;em&gt;wasting&lt;/em&gt; it. By allocating the cache in fixed pages instead of one contiguous per-request block, it removes fragmentation and lets you pack far more concurrent sequences into the same HBM. Architecture shrinks the cache; paging spends what's left efficiently.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to choose
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Building a general open-weight model?&lt;/strong&gt; GQA is the safe, proven baseline. You will not be criticized for it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chasing long context at serving-friendly memory?&lt;/strong&gt; MLA-style latent compression is the strongest single lever, at the cost of implementation complexity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Throughput on shorter contexts, or edge deployment?&lt;/strong&gt; Sliding window + GQA + quantized cache is a cheap, robust stack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Very long context where some recall loss is acceptable?&lt;/strong&gt; A hybrid linear/full interleave gives you near-linear scaling — validate recall on &lt;em&gt;your&lt;/em&gt; long-context tasks before committing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serving any of the above?&lt;/strong&gt; Quantize the cache and use a paged runtime. These compose with every architecture and are the lowest-effort wins on the list.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The real takeaway
&lt;/h2&gt;

&lt;p&gt;The lesson of 2026 is that model architecture and the serving stack are now &lt;strong&gt;co-designed&lt;/strong&gt;. You cannot reason about an attention variant without reasoning about its KV cache, its memory bandwidth, and how a runtime will page it. The models that feel fast and cheap in production didn't get there by accident — they were shaped, layer by layer, by the cost of remembering.&lt;/p&gt;

&lt;p&gt;When you evaluate the next "new architecture," skip the leaderboard for a minute and ask the only question that predicts its serving cost: &lt;em&gt;what happens to the KV cache?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What's your KV strategy in production — GQA, latent compression, hybrid, or just quantize-and-page? Curious what's holding up under real load.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>transformers</category>
    </item>
    <item>
      <title>Local LLMs in 2026: What Actually Runs Well on a Laptop Now</title>
      <dc:creator>ai maya</dc:creator>
      <pubDate>Sun, 09 Aug 2026 00:23:28 +0000</pubDate>
      <link>https://dev.to/ai_maya_063fc568e157562fd/local-llms-in-2026-what-actually-runs-well-on-a-laptop-now-hk1</link>
      <guid>https://dev.to/ai_maya_063fc568e157562fd/local-llms-in-2026-what-actually-runs-well-on-a-laptop-now-hk1</guid>
      <description>&lt;p&gt;Two years ago, "run a language model locally" meant a weekend of compiling, a graveyard of CUDA errors, and a model that answered like it had a concussion. In 2026, you can install one tool, type one command, and have a genuinely useful assistant running on a laptop with no internet connection. Here's an honest map of what works, what doesn't, and where the sharp edges still are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why bother running locally at all
&lt;/h2&gt;

&lt;p&gt;Three reasons keep pulling developers back to local inference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy.&lt;/strong&gt; The prompt never leaves your machine. For code you can't paste into a cloud box, or personal data, that's non-negotiable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost and offline.&lt;/strong&gt; No per-token bill, no rate limits, and it works on a plane.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency and control.&lt;/strong&gt; No network round-trip, and you pin the exact model version forever — no silent upgrades changing your outputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The catch has always been quality-per-watt. That's the number that moved.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hardware tiers, honestly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;8 GB RAM / integrated GPU:&lt;/strong&gt; You can run 3–4B parameter models at 4-bit quantization. Good for autocomplete, summarizing, simple Q&amp;amp;A. Don't expect deep reasoning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;16 GB RAM:&lt;/strong&gt; The sweet spot for most developers. 7–9B models run comfortably and are genuinely helpful for coding assistance and drafting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;32 GB+ or a discrete GPU with 16–24 GB VRAM:&lt;/strong&gt; Now you're running 20–30B models, or bigger models at aggressive quantization, with real reasoning ability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple Silicon (unified memory):&lt;/strong&gt; Punches above its weight. A machine with 32–64 GB of unified memory runs models that would need an expensive discrete GPU on other platforms, because the CPU and GPU share the same memory pool.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quantization: the trick that makes it possible
&lt;/h2&gt;

&lt;p&gt;The reason a 7B model fits in 16 GB is &lt;strong&gt;quantization&lt;/strong&gt; — storing weights at 4 bits instead of 16. The common format you'll see is GGUF, and the common recipe is 4-bit (often labeled Q4). The quality loss from full precision to 4-bit is surprisingly small for most tasks, while the memory savings are 4x. Below 4-bit (2–3 bit) the model starts to degrade noticeably; above it (5–8 bit) you pay memory for diminishing returns. For most people, &lt;strong&gt;4-bit is the default that just works.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The tools
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; — the "one command" experience. &lt;code&gt;ollama run &amp;lt;model&amp;gt;&lt;/code&gt; and you're talking to it. Best starting point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;llama.cpp&lt;/strong&gt; — the engine most of the ecosystem is built on. Reach for it when you want control, custom quantization, or to embed inference in your own app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LM Studio&lt;/strong&gt; — a GUI if you'd rather click than type, with easy model browsing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Which small models are actually good
&lt;/h2&gt;

&lt;p&gt;Without naming a single "winner" — because it changes monthly — the strong open-weight families in the small tier this year are the usual suspects: the Qwen line, Google's Gemma line, Meta's Llama small variants, and Microsoft's Phi series. The practical advice: &lt;strong&gt;don't marry a model.&lt;/strong&gt; Download two or three in the same size class, run &lt;em&gt;your&lt;/em&gt; real prompts through them, and keep the one that wins on your work. A leaderboard can't tell you which model is best at your codebase; your codebase can.&lt;/p&gt;

&lt;h2&gt;
  
  
  The sharp edges nobody warns you about
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context length costs RAM.&lt;/strong&gt; A model's advertised context window is not free — filling it with a long document can blow past your memory budget and crawl. Start with modest context and grow it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;First-token lag on cold start.&lt;/strong&gt; The model has to load into memory. Keep it warm if you're calling it repeatedly, or the first request after idle feels broken.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small models confabulate more.&lt;/strong&gt; They're excellent at transformation (summarize, rewrite, extract) and shakier at open-ended factual recall. Use them for shape, not for ground truth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed is "fine," not "instant."&lt;/strong&gt; On a mid laptop expect readable-speed streaming, not cloud-flagship snappiness. For interactive use it's perfectly usable; for batch jobs, plan for it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;Local LLMs in 2026 crossed the line from "impressive demo" to "daily driver" for a lot of everyday tasks — summarizing, drafting, coding assistance, private Q&amp;amp;A. You won't replace a frontier model for the hardest reasoning, but you'll be surprised how rarely you need to. Install Ollama, pull a 7B model at 4-bit, throw your real work at it, and see how far the free, private, offline tier gets you.&lt;/p&gt;

&lt;p&gt;For most developers in 2026, the answer is: further than you'd think.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What's your local setup — hardware, tool, and go-to model? And what task finally made local inference "good enough" for you?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>MCP in 2026: How the Model Context Protocol Became the USB-C of AI Tooling</title>
      <dc:creator>ai maya</dc:creator>
      <pubDate>Sun, 09 Aug 2026 00:17:47 +0000</pubDate>
      <link>https://dev.to/ai_maya_063fc568e157562fd/mcp-in-2026-how-the-model-context-protocol-became-the-usb-c-of-ai-tooling-3bfi</link>
      <guid>https://dev.to/ai_maya_063fc568e157562fd/mcp-in-2026-how-the-model-context-protocol-became-the-usb-c-of-ai-tooling-3bfi</guid>
      <description>&lt;p&gt;A year ago, connecting a model to your tools meant writing glue for &lt;em&gt;that model&lt;/em&gt;, in &lt;em&gt;that framework&lt;/em&gt;, with &lt;em&gt;that vendor's&lt;/em&gt; function-calling format. Swap the model and you rewrote the glue. In 2026, that pain is mostly gone, and the reason has a boring name: the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;MCP is worth understanding not because it's clever, but because it's winning — and the reason it's winning tells you where the industry's center of gravity is moving.&lt;/p&gt;

&lt;h2&gt;
  
  
  What MCP actually is
&lt;/h2&gt;

&lt;p&gt;Strip away the branding and MCP is a small client–server contract for connecting language models to the outside world. A &lt;strong&gt;server&lt;/strong&gt; exposes three kinds of things: &lt;strong&gt;tools&lt;/strong&gt; (functions the model can call), &lt;strong&gt;resources&lt;/strong&gt; (data the model can read), and &lt;strong&gt;prompts&lt;/strong&gt; (reusable templates). A &lt;strong&gt;client&lt;/strong&gt; — your IDE, your agent, your chat app — speaks the same protocol and can talk to any compliant server.&lt;/p&gt;

&lt;p&gt;The analogy people keep reaching for is USB-C, and it's accurate. Before USB-C you had a drawer full of proprietary chargers. MCP is the drawer-emptying moment for AI integrations: write the connector once, and any MCP-aware client can use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "model-agnostic" is the whole point
&lt;/h2&gt;

&lt;p&gt;Here's the shift that matters. For most of the LLM era, your tooling was &lt;em&gt;coupled to a model&lt;/em&gt;. If you built your agent stack around one vendor's function-calling quirks, you were locked in — a new, better model meant a migration project.&lt;/p&gt;

&lt;p&gt;MCP decouples the tooling layer from the model layer. Your filesystem server, your database server, your ticketing-system server don't know or care which model is on the other end. When a new flagship drops — and in 2026 they drop every few weeks — you point your client at it and keep your entire tool ecosystem intact.&lt;/p&gt;

&lt;p&gt;That's a strategic hedge, not just a convenience. In a market where the "best model" changes monthly, the durable asset is your &lt;em&gt;integration layer&lt;/em&gt;, and MCP is how you stop rebuilding it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to build with it
&lt;/h2&gt;

&lt;p&gt;Practical entry points, cheapest first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wrap an internal system as a server.&lt;/strong&gt; Your team's deploy tooling, your logs, your knowledge base. Now every agent and IDE in the org can reach it through one contract.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compose existing servers.&lt;/strong&gt; The ecosystem already has servers for filesystems, databases, browsers, and dozens of SaaS tools. Most useful agents in 2026 are less "write everything" and more "wire the right servers together."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship a client capability, not a bespoke integration.&lt;/strong&gt; If you're building an agent product, being MCP-aware means your users bring their &lt;em&gt;own&lt;/em&gt; tool servers instead of waiting for you to build each one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The pitfalls nobody puts in the README
&lt;/h2&gt;

&lt;p&gt;MCP solves plumbing, not judgment. Watch for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool sprawl.&lt;/strong&gt; Expose 60 tools and the model spends its context deciding which to use — and picks wrong. Curate. A focused server beats a kitchen-sink one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection through tool output.&lt;/strong&gt; The text a server returns is &lt;em&gt;data&lt;/em&gt;, not instructions — but a naive agent will happily follow "ignore previous instructions" if it arrives inside a fetched web page. Treat every server response as untrusted input. This is the single most under-appreciated risk in the whole stack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth and blast radius.&lt;/strong&gt; A server that can delete production data is a server that &lt;em&gt;will&lt;/em&gt; delete production data the first time a model hallucinates an argument. Scope permissions tightly and gate irreversible actions behind confirmation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versioning drift.&lt;/strong&gt; Servers evolve; clients cache assumptions. Pin and test like you would any API dependency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;MCP isn't exciting, and that's exactly why it's important. Standards win by being boring and everywhere. The teams that come out ahead in 2026 are the ones treating their tool integrations as a durable, model-agnostic layer — and letting the models underneath churn as fast as the market wants them to.&lt;/p&gt;

&lt;p&gt;Build the connector once. Let the models come and go.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Are you exposing internal systems over MCP yet, or still writing per-model glue? What server would you build first?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>opensource</category>
      <category>agents</category>
    </item>
    <item>
      <title>Default-to-Flagship Is Now a Cost Bug: Tiered Model Routing for Agentic Workloads</title>
      <dc:creator>ai maya</dc:creator>
      <pubDate>Sun, 09 Aug 2026 00:17:41 +0000</pubDate>
      <link>https://dev.to/ai_maya_063fc568e157562fd/default-to-flagship-is-now-a-cost-bug-tiered-model-routing-for-agentic-workloads-2gk4</link>
      <guid>https://dev.to/ai_maya_063fc568e157562fd/default-to-flagship-is-now-a-cost-bug-tiered-model-routing-for-agentic-workloads-2gk4</guid>
      <description>&lt;p&gt;For two years the reflex was simple: reach for the biggest model you can afford and call it a day. In 2026 that reflex quietly became a bug in your cost model.&lt;/p&gt;

&lt;p&gt;The clearest signal came this summer, when a smaller, cheaper "flash"-tier model started edging out its own flagship sibling on the workload developers care about most — multi-step agentic coding — at a fraction of the price. When the fast tier wins the hard benchmark, "always use the flagship" stops being a safe default and starts being waste.&lt;/p&gt;

&lt;p&gt;Here's how to fix it without turning your stack into a science project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the reflex is expensive
&lt;/h2&gt;

&lt;p&gt;Agent workloads are not one big call. A single task fans out into dozens of small ones: planning, tool selection, argument formatting, summarizing a file, deciding whether to continue. Most of those steps are &lt;em&gt;easy&lt;/em&gt;. Routing every one of them through a frontier model is like taking a helicopter to the corner store — it works, but you are paying helicopter prices for a walk.&lt;/p&gt;

&lt;p&gt;The trap is that the cost is invisible per call and enormous in aggregate. You never see the moment you overpaid; you just see the invoice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three-tier ladder
&lt;/h2&gt;

&lt;p&gt;Think in tiers, not models:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cheap/fast tier&lt;/strong&gt; — classification, extraction, short rewrites, routing decisions, "is this done?" checks. Most steps live here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mid tier&lt;/strong&gt; — normal reasoning, code edits, tool use with moderate context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flagship tier&lt;/strong&gt; — genuinely hard reasoning, long-context synthesis, the step where a wrong answer poisons everything downstream.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The goal is to keep the flagship tier for the 5–15% of steps that actually need it, and let the cheap tier carry the volume.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to decide the tier per request
&lt;/h2&gt;

&lt;p&gt;Two mechanisms, used together:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static heuristics&lt;/strong&gt; for the obvious cases. Short prompt + structured output + low stakes → cheap tier. Anything touching a large context window or a irreversible action → escalate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eval-gated escalation&lt;/strong&gt; for everything else. Start at the cheap tier, and only promote to a bigger model when your evals prove the cheap tier fails on that class of input. This is the key discipline: &lt;em&gt;escalation is earned by evidence, not assumed.&lt;/em&gt; If you can't point to an eval where the small model loses, you don't get to pay for the big one.&lt;/p&gt;

&lt;p&gt;A simple confidence signal helps too — if the cheap model hedges, returns malformed output, or low log-probs, retry one tier up. One retry at a higher tier is still cheaper than sending everything to the flagship.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure it or you're guessing
&lt;/h2&gt;

&lt;p&gt;You cannot route what you don't measure. Log, per step: which tier ran, token counts, latency, and a success signal. Then compute the boring but decisive number — &lt;strong&gt;cost per completed task&lt;/strong&gt;, not cost per token. Teams that optimize per-token often make per-task cost worse by adding retries; the task-level metric keeps you honest.&lt;/p&gt;

&lt;p&gt;Re-run this monthly. Model prices and capabilities move fast enough that last quarter's optimal routing table is this quarter's mistake.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cheap-tier false economy.&lt;/strong&gt; If a weak model fails a planning step, every downstream step inherits the error. Put your best model at the &lt;em&gt;top of the plan&lt;/em&gt;, cheap models on the leaves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silent capability drift.&lt;/strong&gt; A model point-release can flip your routing assumptions overnight. Pin versions in evals and re-test before upgrading.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Over-engineering the router.&lt;/strong&gt; A 50-line heuristic plus one escalation rule beats a fancy learned router for most teams. Add complexity only when the data demands it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;The winning move in 2026 is not "use the best model" or "use the cheapest model." It's building a thin routing layer and an eval harness that lets you place each step on the right tier — and swap the underlying models in an afternoon when the market moves again.&lt;/p&gt;

&lt;p&gt;Default-to-flagship felt safe because it was simple. It's still simple. It's just no longer cheap.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How are you routing model tiers in production right now — heuristics, a learned router, or still one model for everything? Curious what's working.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AI This Week (Aug 2026): Qwen3.8 Max, DeepSeek V4-Flash, and Models Shipping Like Patches</title>
      <dc:creator>ai maya</dc:creator>
      <pubDate>Sat, 08 Aug 2026 16:19:17 +0000</pubDate>
      <link>https://dev.to/ai_maya_063fc568e157562fd/ai-this-week-aug-2026-qwen38-max-deepseek-v4-flash-and-models-shipping-like-patches-17fc</link>
      <guid>https://dev.to/ai_maya_063fc568e157562fd/ai-this-week-aug-2026-qwen38-max-deepseek-v4-flash-and-models-shipping-like-patches-17fc</guid>
      <description>&lt;p&gt;If you blinked this week, you missed three frontier model releases. August 2026 is making one thing very clear: large language models now ship like software patches, not like moon landings.&lt;/p&gt;

&lt;p&gt;Here's the AI news that actually matters for builders right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qwen3.8 Max lands
&lt;/h2&gt;

&lt;p&gt;Alibaba pushed &lt;strong&gt;Qwen3.8 Max&lt;/strong&gt; at the start of the month — the newest flagship in a line that has become the default open-weight baseline for a lot of teams. The interesting part isn't a single headline number; it's the cadence. Qwen has gone from "the model you try" to "the model you benchmark against" in about a year, and each point release keeps tightening the gap with closed frontier models on reasoning and coding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev takeaway:&lt;/strong&gt; if your eval harness still pins an old open baseline, it's already stale. Re-run against the current Qwen point release before you claim a win over "open source."&lt;/p&gt;

&lt;h2&gt;
  
  
  DeepSeek V4-Flash quietly beats its big sibling
&lt;/h2&gt;

&lt;p&gt;The story engineers keep repeating: the &lt;strong&gt;DeepSeek-V4-Flash&lt;/strong&gt; retrain reportedly edges out V4-Pro on agentic coding benchmarks — at &lt;em&gt;flash&lt;/em&gt; pricing. Read that twice. A smaller, cheaper, faster model beating the flagship on the workload developers care most about (multi-step tool use and code) is the clearest signal yet that the "bigger is always better" era is over for a lot of tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dev takeaway:&lt;/strong&gt; for agent workloads, start with the small/fast tier and only escalate to the flagship when your evals prove you need it. Default-to-flagship is now a cost bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenAI's GPT-5.6 "Luna"
&lt;/h2&gt;

&lt;p&gt;OpenAI's active lineup now includes &lt;strong&gt;GPT-5.6 Luna&lt;/strong&gt; as a fresh flagship name. Details are thin, but the pattern is familiar: incremental version bumps, multimodal by default, and reasoning modes that trade latency for accuracy on demand. The headline isn't any one capability — it's that "reasoning vs. speed" is now a &lt;em&gt;dial you set per request&lt;/em&gt;, not a model you pick once.&lt;/p&gt;

&lt;h2&gt;
  
  
  NVIDIA open-sources NOOA
&lt;/h2&gt;

&lt;p&gt;Less flashy but arguably more useful for practitioners: &lt;strong&gt;NVIDIA open-sourced NOOA&lt;/strong&gt; (Object-Oriented Agents), a model-agnostic Python framework for building agents. Model-agnostic is the key word — the tooling layer is decoupling from any single provider, which is exactly what you want if you're tired of rewriting your agent stack every time a new model drops.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real trend: models as patches
&lt;/h2&gt;

&lt;p&gt;Release trackers are now counting &lt;strong&gt;300+ model releases&lt;/strong&gt; across major labs. When frontier capability ships every few weeks, three things follow for teams:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Your benchmarks decay fast.&lt;/strong&gt; Treat evals as living infrastructure, not a one-time report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small + fast is the new default.&lt;/strong&gt; Efficiency gains keep delivering last-year's flagship quality at a fraction of the cost. Reach for the big model deliberately, not reflexively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bet on the tooling layer, not the model.&lt;/strong&gt; Model-agnostic agent frameworks (like NOOA) protect you from churn.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The models will keep coming. The winning move isn't chasing every release — it's building an eval + tooling layer that lets you swap the engine in an afternoon.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What shipped this week that you're actually putting into production? Drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>llm</category>
      <category>news</category>
    </item>
  </channel>
</rss>
