<?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>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>
    <item>
      <title>"How to Tell If an LLM Was Really Trained From Scratch: A Reproducible Fingerprinting Method"</title>
      <dc:creator>ai maya</dc:creator>
      <pubDate>Sat, 08 Aug 2026 15:52:49 +0000</pubDate>
      <link>https://dev.to/ai_maya_063fc568e157562fd/how-to-tell-if-an-llm-was-really-trained-from-scratch-a-reproducible-fingerprinting-method-l4e</link>
      <guid>https://dev.to/ai_maya_063fc568e157562fd/how-to-tell-if-an-llm-was-really-trained-from-scratch-a-reproducible-fingerprinting-method-l4e</guid>
      <description>&lt;h1&gt;
  
  
  How to Tell If an LLM Was Really Trained From Scratch: A Reproducible Fingerprinting Method
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Detect whether an LLM was trained from scratch or derived from Qwen, Llama, or DeepSeek — by fingerprinting architecture, tokenizer, and weight provenance from public Hugging Face artifacts. Includes the two traps almost everyone hits.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keywords:&lt;/strong&gt; LLM provenance · model fingerprinting · from-scratch vs fine-tuned · architecture signature · tokenizer overlap · embedding CKA · model lineage · Korean sovereign AI · open-weight derivatives&lt;/p&gt;




&lt;p&gt;When a lab announces a "from-scratch, self-developed" foundation model, can an outsider verify that claim — using nothing but public files?&lt;/p&gt;

&lt;p&gt;In late July 2026, several Korean labs shipped DeepSeek-rivaling "self-developed" models (e.g. LG's 750B K-EXAONE 2.0). The claim triggered a debate that spilled well beyond Korea: a single &lt;a href="https://www.zhihu.com/question/2067512422555029717" rel="noopener noreferrer"&gt;Zhihu thread&lt;/a&gt; crossed &lt;strong&gt;2.7 million views&lt;/strong&gt;, asking whether these models were trained from scratch or quietly built on Qwen / Llama / DeepSeek.&lt;/p&gt;

&lt;p&gt;That question is answerable — quantitatively, reproducibly, from public artifacts. This post is the method. Everything below runs against any two repos on the Hugging Face Hub, and there's a live tool at the end.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Framing up front:&lt;/strong&gt; building on open-weight bases (Qwen, Llama, DeepSeek, Mistral) is a &lt;em&gt;legitimate, industry-standard&lt;/em&gt; practice. This is about &lt;strong&gt;provenance transparency&lt;/strong&gt;, not accusation. The same yardstick applies to every model.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The idea: three independent fingerprints
&lt;/h2&gt;

&lt;p&gt;A model leaves three separable fingerprints in its public files:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Architecture&lt;/strong&gt; — the shape declared in &lt;code&gt;config.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tokenizer&lt;/strong&gt; — the vocabulary in &lt;code&gt;tokenizer.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weights&lt;/strong&gt; — the learned representation in &lt;code&gt;model.safetensors&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each answers a different question, and — crucially — they can disagree. That disagreement is where the signal lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fingerprint 1 — Architecture (&lt;code&gt;config.json&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Every &lt;code&gt;transformers&lt;/code&gt; checkpoint ships a &lt;code&gt;config.json&lt;/code&gt;. Six fields form a surprisingly discriminative signature:&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;requests&lt;/span&gt;

&lt;span class="n"&gt;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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;arch_fingerprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo&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;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://huggingface.co/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/resolve/main/config.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&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;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&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;User-Agent&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;genome/1.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&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="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;c&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="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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The shape tuple &lt;code&gt;(hidden_size, intermediate_size, num_hidden_layers, heads, kv)&lt;/code&gt; is effectively a fingerprint of the &lt;em&gt;reference architecture&lt;/em&gt;. One matching field is a coincidence; five matching simultaneously is not. A few real matches I measured:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shape (hidden · inter · layers · heads · kv)&lt;/th&gt;
&lt;th&gt;Exact match&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3584 · 18944 · 28 · 28 · 4&lt;/td&gt;
&lt;td&gt;Qwen2.5-7B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8192 · 29568 · 80 · 64 · 8&lt;/td&gt;
&lt;td&gt;Qwen2.5-72B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5120 · 17408 · 40 · 40 · 8&lt;/td&gt;
&lt;td&gt;Qwen3-14B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4096 · 14336 · 32 · 32 · 8&lt;/td&gt;
&lt;td&gt;Llama-3.1-8B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7168 · 18432 · 61 · (moe 2048)&lt;/td&gt;
&lt;td&gt;DeepSeek-V3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An exact tuple match is strong evidence the architecture was &lt;strong&gt;adopted&lt;/strong&gt;, not independently designed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fingerprint 2 — Tokenizer (a paternity test)
&lt;/h2&gt;

&lt;p&gt;Architecture alone can mislead: a model can adopt a foreign architecture but train a genuinely new tokenizer (or vice-versa). Measure the tokenizer directly, comparing vocabularies with a &lt;strong&gt;min-overlap ratio&lt;/strong&gt;:&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;vocab_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo&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;set&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://huggingface.co/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/resolve/main/tokenizer.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&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;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vocab&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# BPE: {token: id}
&lt;/span&gt;    &lt;span class="k"&gt;return&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;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&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;tokenizer_overlap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&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="n"&gt;b&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;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;vocab_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;vocab_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;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;A&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;B&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;A&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;B&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 1.0 == one is a subset of the other
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This surfaces what &lt;code&gt;config&lt;/code&gt; hides. One model matched &lt;strong&gt;Qwen2.5-7B's architecture exactly&lt;/strong&gt;, yet its tokenizer overlapped Qwen by only ~0.38 — a &lt;strong&gt;"foreign brain, own language"&lt;/strong&gt; case: adopted architecture, freshly trained (Korean) tokenizer. Others reused a base tokenizer verbatim (overlap = 1.000), confirming a straight fine-tune.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why &lt;code&gt;min&lt;/code&gt;, not union?&lt;/strong&gt; Using &lt;code&gt;min(|A|, |B|)&lt;/code&gt; in the denominator makes a &lt;em&gt;reduced&lt;/em&gt; vocabulary that is a strict subset of a larger one score ~1.0 — the correct signal for "carved out of the base." A Jaccard (union) denominator would wrongly dilute that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Fingerprint 3 — Weights (here be dragons)
&lt;/h2&gt;

&lt;p&gt;The gold-standard question: were the weights trained &lt;strong&gt;from scratch&lt;/strong&gt;, or &lt;strong&gt;continued-pretrained&lt;/strong&gt; on a foreign base? Load the token embeddings and compare. Two traps await.&lt;/p&gt;

&lt;p&gt;First, a helper to pull only the embedding tensor (no need to download the whole model):&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="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;huggingface_hub&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hf_hub_download&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;safetensors&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;safe_open&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;load_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo&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="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="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;hf_hub_download&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo&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.safetensors.index.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;shard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;))[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weight_map&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;model.embed_tokens.weight&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;shard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model.safetensors&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;hf_hub_download&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;safe_open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pt&lt;/span&gt;&lt;span class="sh"&gt;"&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;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&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;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;embed_tokens.weight&lt;/span&gt;&lt;span class="sh"&gt;"&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;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Trap 1 — row-wise cosine is useless
&lt;/h3&gt;

&lt;p&gt;The naive approach: for shared tokens, average the row-wise cosine similarity of the two embedding matrices. Shared lineage → similar embeddings, right?&lt;/p&gt;

&lt;p&gt;Wrong — &lt;strong&gt;even when lineage is obvious.&lt;/strong&gt; I measured near-zero mean cosine for &lt;em&gt;both&lt;/em&gt; a known from-scratch model &lt;em&gt;and&lt;/em&gt; a known Llama-derivative. The culprit is &lt;strong&gt;rotational invariance&lt;/strong&gt;: a Transformer's hidden space has no privileged basis, so two models can encode identical information under an arbitrary orthogonal rotation. Row-wise cosine reads rotation as dissimilarity and tells you nothing about lineage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trap 2 — CKA helps, but is not conclusive
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Linear CKA (Centered Kernel Alignment)&lt;/strong&gt; is invariant to rotation and isotropic scaling — the right tool for comparing representations:&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;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) — SAME token order (shared vocabulary)
&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;X&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&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;norm&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="n"&gt;den&lt;/span&gt; &lt;span class="o"&gt;=&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;T&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;norm&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="n"&gt;T&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;norm&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;item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A from-scratch model scored &lt;strong&gt;near-zero CKA&lt;/strong&gt; against its candidate base — clean evidence of independent pretraining. But a continued-pretrained derivative scored only ~0.25 — barely above the ~0.21 baseline between two &lt;em&gt;unrelated&lt;/em&gt; models of the same family. Large-scale training reshapes embeddings enough that CKA loses discriminative power &lt;strong&gt;on the derivative side&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest conclusion:&lt;/strong&gt; the weights axis reliably confirms &lt;em&gt;from-scratch&lt;/em&gt; (near-zero CKA), but it is &lt;strong&gt;not&lt;/strong&gt; a strong detector of &lt;em&gt;derivation&lt;/em&gt;. For that, architecture + tokenizer fingerprints stay primary. Report the weights axis as &lt;strong&gt;supporting evidence&lt;/strong&gt;, never as a standalone verdict. (This is the single most important caveat in the whole method — and the one most write-ups omit.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus fingerprint — attention diversity as an originality proxy
&lt;/h2&gt;

&lt;p&gt;Most models declare one attention mechanism; a few mix several. The count of distinct mechanisms in &lt;code&gt;config.json&lt;/code&gt; is a cheap proxy for architectural originality:&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;KEYS&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;layer_types&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;linear_attn_config&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;sliding_window&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;mamba2_d_state&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;hyena_filter_order&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;mla_kv_lora_rank&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;attention_cls&lt;/span&gt;&lt;span class="sh"&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;attention_diversity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cfg&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;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# e.g. layer_types = [full_attention×16, sliding_attention×48] -&amp;gt; hybrid (2 kinds)
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&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;KEYS&lt;/span&gt; &lt;span class="k"&gt;if&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;cfg&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In my sweep, most models used a single grouped-query or multi-head-latent attention; some used a &lt;strong&gt;hybrid&lt;/strong&gt; (&lt;code&gt;layer_types=[full×16, sliding×48]&lt;/code&gt;); the most diverse combined mamba2, hyena, MLA, linear attention, gated-delta-net, native-sparse-attention, and sliding-window in one stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Combining axes → a single genotype
&lt;/h2&gt;

&lt;p&gt;Collapse the two primary axes (architecture × weights) into one label:&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;Architecture&lt;/th&gt;
&lt;th&gt;Weights&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&lt;/td&gt;
&lt;td&gt;from-scratch&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 self&lt;/td&gt;
&lt;td&gt;one axis borrowed&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&lt;/td&gt;
&lt;td&gt;partial inheritance&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;foreign (exact match)&lt;/td&gt;
&lt;td&gt;inherited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Keep tokenizer overlap and attention diversity &lt;strong&gt;beside&lt;/strong&gt; the verdict, not folded into it, so readers can audit the raw evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results: nine organizations, one yardstick
&lt;/h2&gt;

&lt;p&gt;Applying the identical pipeline to nine organizations' public foundation models (spanning large enterprises, telcos, mid-size firms, and startups), the picture is &lt;strong&gt;not uniform&lt;/strong&gt;: some models match a foreign architecture &lt;em&gt;and&lt;/em&gt; tokenizer exactly (Ported); others are self-built with no foreign match (Native); many sit in between. The per-model breakdown — 3D lineage graph, search, EN/中文/한국어, light + dark mode — is in the interactive tool below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce it yourself
&lt;/h2&gt;

&lt;p&gt;The functions above &lt;em&gt;are&lt;/em&gt; the method. Point them at any two Hub repos:&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;arch_fingerprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;some/model&lt;/span&gt;&lt;span class="sh"&gt;"&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="nf"&gt;tokenizer_overlap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;some/model&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;Qwen/Qwen3-14B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# weights (shared-vocab pair):
&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;candidate/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;Y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Qwen/Qwen3-1.7B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;n&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;X&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;Y&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;CKA:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&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;n&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;n&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;   &lt;span class="c1"&gt;# near-zero =&amp;gt; from-scratch
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Limitations &amp;amp; honesty
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not an accusation.&lt;/strong&gt; Open-weight reuse is legitimate and widespread. This reports lineage, not wrongdoing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weights axis is supporting, not conclusive&lt;/strong&gt; (Trap 2).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same yardstick for every model&lt;/strong&gt;, without exception.&lt;/li&gt;
&lt;li&gt;All inputs are public; corrections are welcome.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How can you tell if an LLM was trained from scratch or fine-tuned from another model?
&lt;/h3&gt;

&lt;p&gt;Compare its &lt;code&gt;config.json&lt;/code&gt; shape signature (hidden size, intermediate size, layer count) and its &lt;code&gt;tokenizer.json&lt;/code&gt; vocabulary against known open-weight bases. An exact architecture match plus high tokenizer overlap indicates a derivative; a self-designed architecture with near-zero embedding CKA against candidate bases indicates from-scratch training.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is CKA (Centered Kernel Alignment), and why use it instead of cosine similarity?
&lt;/h3&gt;

&lt;p&gt;CKA is a rotation- and isotropic-scale-invariant similarity measure for neural-network representations. A Transformer's hidden space has no privileged basis, so plain row-wise cosine similarity is fooled by arbitrary orthogonal rotations between two models. CKA is not — which makes it the correct tool for comparing embeddings across models.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it legal to build an LLM on top of Qwen, Llama, or DeepSeek?
&lt;/h3&gt;

&lt;p&gt;Yes. Using open-weight foundation models under their licenses (e.g. Apache-2.0 for many Qwen releases, the Llama Community License for Llama) is a legitimate, industry-standard practice. Provenance analysis reports lineage, not wrongdoing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are Korean sovereign-AI models built from scratch or based on Chinese/US models?
&lt;/h3&gt;

&lt;p&gt;It varies by model. Some match a foreign architecture (Qwen, Llama, DeepSeek) exactly and are best described as "Ported"; others use fully self-built architectures and weights with no foreign match ("Native"); many are in between. The genotype of each is shown in the interactive tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do you measure model provenance without downloading the full model?
&lt;/h3&gt;

&lt;p&gt;Architecture and tokenizer fingerprints need only &lt;code&gt;config.json&lt;/code&gt; and &lt;code&gt;tokenizer.json&lt;/code&gt; (kilobytes to a few megabytes). For the weight axis, download just the &lt;code&gt;embed_tokens.weight&lt;/code&gt; tensor via safetensors partial loading instead of the whole checkpoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does an exact architecture match prove a model is copied?
&lt;/h3&gt;

&lt;p&gt;No. Reusing an open-weight architecture is standard and legitimate. An exact &lt;code&gt;config.json&lt;/code&gt; match shows the architecture was &lt;em&gt;adopted&lt;/em&gt;; whether the weights were inherited or trained from scratch is a separate question, answered (with caveats) by the embedding-CKA axis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🧪 &lt;strong&gt;Interactive tool (full dataset, 3D graph, 3 languages):&lt;/strong&gt; &lt;a href="https://huggingface.co/spaces/mayafree/Model-Genome-Korea" rel="noopener noreferrer"&gt;https://huggingface.co/spaces/mayafree/Model-Genome-Korea&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;The debate that started it (Zhihu, 2.7M views):&lt;/strong&gt; &lt;a href="https://www.zhihu.com/question/2067512422555029717" rel="noopener noreferrer"&gt;https://www.zhihu.com/question/2067512422555029717&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Model names, companies, and licenses are the property of their respective owners.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tags: #machinelearning #llm #ai #opensource #huggingface #transformers&lt;/em&gt;&lt;/p&gt;

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