HeavensHackDev commited on
Commit
36d93d2
·
verified ·
1 Parent(s): 9ec74d7

ToolUse.1: leaderboard

Browse files
Files changed (6) hide show
  1. README.md +14 -5
  2. app.js +331 -0
  3. index.html +169 -17
  4. leaderboard.html +156 -0
  5. results.json +105 -0
  6. styles.css +298 -0
README.md CHANGED
@@ -1,10 +1,19 @@
1
  ---
2
  title: ToolUse.1
3
- emoji: 📊
4
- colorFrom: yellow
5
- colorTo: gray
6
  sdk: static
7
- pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
1
  ---
2
  title: ToolUse.1
3
+ emoji: 🧰
4
+ colorFrom: gray
5
+ colorTo: red
6
  sdk: static
7
+ pinned: true
8
+ license: apache-2.0
9
+ short_description: Tool-calling leaderboard that scores abstention
10
  ---
11
 
12
+ # ToolUse.1 — Leaderboard
13
+
14
+ Static leaderboard for the [ToolUse.1](https://huggingface.co/datasets/HardcoreAI/ToolUse.1)
15
+ tool-calling benchmark. It renders `results.json`, which is generated from harness result files
16
+ by `publish.py` in the benchmark repository.
17
+
18
+ Add a row by running the harness yourself and opening a discussion on the dataset repository
19
+ with the raw results file.
app.js ADDED
@@ -0,0 +1,331 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* ==========================================================================
2
+ ToolUse.1 — shared client
3
+ Loads results (live results.json, else embedded snapshot), renders the
4
+ leaderboard, and drives the motion layer: reveal-on-scroll, count-up,
5
+ score bars, sortable columns.
6
+ ========================================================================== */
7
+
8
+ "use strict";
9
+
10
+ /* Gate motion behind a class so the no-JS view stays fully visible. */
11
+ document.documentElement.classList.add("js");
12
+
13
+ /* Inlined snapshot so pages render when opened straight from disk
14
+ (file:// blocks fetch). A served results.json overrides it. */
15
+ const EMBEDDED_RESULTS = {
16
+ benchmark: "ToolUse.1",
17
+ version: "1.0.0",
18
+ updated: "2026-10-17",
19
+ corpus: { cases: 114, call_cases: 78, no_call_cases: 36, tools: 9, protocols: 3 },
20
+ rows: [
21
+ {
22
+ model: "oracle",
23
+ link: "",
24
+ protocol: "all",
25
+ score: 1.0,
26
+ score_ci95: [0.9889, 1.0],
27
+ correct_call: 1.0,
28
+ abstention: 1.0,
29
+ spurious_call_rate: 0.0,
30
+ n_cases: 342,
31
+ notes: "reads the expectations out of the corpus — grader reference",
32
+ self_check: true,
33
+ by_protocol: { json: 1.0, xml: 1.0, plain: 1.0 },
34
+ },
35
+ {
36
+ model: "HardcoreAI/Nova-1.1-0.8B",
37
+ link: "https://huggingface.co/HardcoreAI/Nova-1.1-0.8B",
38
+ protocol: "all",
39
+ score: 0.6404,
40
+ score_ci95: [0.5882, 0.6894],
41
+ correct_call: 0.5855,
42
+ abstention: 0.7593,
43
+ spurious_call_rate: 0.1667,
44
+ n_cases: 342,
45
+ notes: "greedy · thinking off · batch 8 · English-only · fine-tuned",
46
+ self_check: false,
47
+ by_protocol: { json: 0.6754, xml: 0.6316, plain: 0.614 },
48
+ },
49
+ {
50
+ model: "Qwen/Qwen3.5-0.8B",
51
+ link: "https://huggingface.co/Qwen/Qwen3.5-0.8B",
52
+ protocol: "all",
53
+ score: 0.5936,
54
+ score_ci95: [0.5408, 0.6443],
55
+ correct_call: 0.4829,
56
+ abstention: 0.8333,
57
+ spurious_call_rate: 0.0648,
58
+ n_cases: 342,
59
+ notes: "greedy · thinking off · batch 8 · English-only · base model",
60
+ self_check: false,
61
+ by_protocol: { json: 0.6754, xml: 0.6754, plain: 0.4298 },
62
+ },
63
+ ],
64
+ };
65
+
66
+ const pct = (v) => (typeof v === "number" ? (v * 100).toFixed(1) + "%" : "—");
67
+ const ci = (lo, hi) => (lo == null || hi == null ? "—" : `${(lo * 100).toFixed(1)}% – ${(hi * 100).toFixed(1)}%`);
68
+
69
+ const prefersReduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
70
+
71
+ /* ------------------------------------------------------------- motion */
72
+ function revealOnScroll(root = document) {
73
+ const nodes = root.querySelectorAll(".reveal");
74
+ if (prefersReduced || !("IntersectionObserver" in window)) {
75
+ nodes.forEach((n) => n.classList.add("in"));
76
+ return;
77
+ }
78
+ const io = new IntersectionObserver(
79
+ (entries) => {
80
+ entries.forEach((entry) => {
81
+ if (entry.isIntersecting) {
82
+ entry.target.classList.add("in");
83
+ io.unobserve(entry.target);
84
+ }
85
+ });
86
+ },
87
+ { rootMargin: "0px 0px -8% 0px", threshold: 0.08 },
88
+ );
89
+ nodes.forEach((n) => io.observe(n));
90
+ }
91
+
92
+ function countUp(el) {
93
+ const target = parseFloat(el.dataset.count);
94
+ const suffix = el.dataset.suffix || "";
95
+ if (prefersReduced || Number.isNaN(target)) { el.textContent = `${target}${suffix}`; return; }
96
+ const start = performance.now();
97
+ const dur = 900;
98
+ const step = (now) => {
99
+ const t = Math.min(1, (now - start) / dur);
100
+ const eased = 1 - Math.pow(1 - t, 3);
101
+ el.textContent = `${Math.round(target * eased)}${suffix}`;
102
+ if (t < 1) requestAnimationFrame(step);
103
+ else el.textContent = `${target}${suffix}`;
104
+ };
105
+ requestAnimationFrame(step);
106
+ }
107
+
108
+ /* ------------------------------------------------------------- rendering */
109
+ function scoreCell(value) {
110
+ const wrap = document.createElement("div");
111
+ wrap.className = "score-cell";
112
+ const bar = document.createElement("div");
113
+ bar.className = "bar";
114
+ const fill = document.createElement("i");
115
+ fill.dataset.w = Math.max(0, Math.min(1, value || 0));
116
+ bar.append(fill);
117
+ const val = document.createElement("span");
118
+ val.className = "score-value";
119
+ val.textContent = pct(value);
120
+ wrap.append(bar, val);
121
+ return wrap;
122
+ }
123
+
124
+ function spuriousCell(value) {
125
+ const cell = document.createElement("td");
126
+ cell.className = "num";
127
+ if (typeof value !== "number") { cell.textContent = "—"; return cell; }
128
+ cell.textContent = pct(value);
129
+ cell.classList.add(value >= 0.3 ? "spurious-high" : value >= 0.1 ? "spurious-mid" : "");
130
+ return cell;
131
+ }
132
+
133
+ function protoMini(byProtocol) {
134
+ const wrap = document.createElement("div");
135
+ wrap.className = "proto-mini";
136
+ ["json", "xml", "plain"].forEach((key) => {
137
+ const box = document.createElement("div");
138
+ const label = document.createElement("span");
139
+ label.className = "pl";
140
+ label.textContent = key;
141
+ const bar = document.createElement("div");
142
+ bar.className = "pb";
143
+ const fill = document.createElement("i");
144
+ fill.dataset.w = Math.max(0, Math.min(1, byProtocol?.[key] ?? 0));
145
+ bar.append(fill);
146
+ const val = document.createElement("span");
147
+ val.className = "pv";
148
+ val.textContent = pct(byProtocol?.[key]);
149
+ box.append(label, bar, val);
150
+ wrap.append(box);
151
+ });
152
+ return wrap;
153
+ }
154
+
155
+ function rowNode(row, index, opts = {}) {
156
+ const { withProtocol = false, withNotes = false } = opts;
157
+ const tr = document.createElement("tr");
158
+ tr.dataset.score = row.score ?? 0;
159
+ tr.dataset.correct_call = row.correct_call ?? 0;
160
+ tr.dataset.abstention = row.abstention ?? 0;
161
+ tr.dataset.spurious_call_rate = row.spurious_call_rate ?? 0;
162
+ tr.dataset.n_cases = row.n_cases ?? 0;
163
+
164
+ const rank = document.createElement("td");
165
+ rank.className = "col-rank";
166
+ const badge = document.createElement("span");
167
+ badge.className = `rank-badge${index < 3 ? ` rank-${index + 1}` : ""}`;
168
+ badge.textContent = index + 1;
169
+ rank.append(badge);
170
+ tr.append(rank);
171
+
172
+ const model = document.createElement("td");
173
+ model.className = "col-model";
174
+ if (row.link) {
175
+ const a = document.createElement("a");
176
+ a.className = "model-link model-name";
177
+ a.href = row.link;
178
+ a.target = "_blank";
179
+ a.rel = "noopener";
180
+ a.textContent = row.model;
181
+ model.append(a);
182
+ } else {
183
+ const s = document.createElement("span");
184
+ s.className = "model-name";
185
+ s.textContent = row.model;
186
+ model.append(s);
187
+ }
188
+ const sub = [row.protocol === "all" ? "all protocols" : `protocol: ${row.protocol}`, row.notes].filter(Boolean).join(" · ");
189
+ if (sub) {
190
+ const s = document.createElement("span");
191
+ s.className = "model-sub";
192
+ s.textContent = sub;
193
+ model.append(s);
194
+ }
195
+ tr.append(model);
196
+
197
+ const score = document.createElement("td");
198
+ score.className = "num";
199
+ score.append(scoreCell(row.score));
200
+ const c = document.createElement("span");
201
+ c.className = "ci";
202
+ c.textContent = Array.isArray(row.score_ci95) ? ci(row.score_ci95[0], row.score_ci95[1]) : "";
203
+ score.append(c);
204
+ tr.append(score);
205
+
206
+ tr.append(Object.assign(document.createElement("td"), { className: "num", textContent: pct(row.correct_call) }));
207
+ tr.append(Object.assign(document.createElement("td"), { className: "num", textContent: pct(row.abstention) }));
208
+ tr.append(spuriousCell(row.spurious_call_rate));
209
+ tr.append(Object.assign(document.createElement("td"), { className: "num", textContent: row.n_cases ?? "—" }));
210
+
211
+ if (withProtocol) {
212
+ const proto = document.createElement("td");
213
+ proto.append(protoMini(row.by_protocol));
214
+ tr.append(proto);
215
+ }
216
+
217
+ if (withNotes) {
218
+ const notes = document.createElement("td");
219
+ notes.className = "col-notes";
220
+ if (row.self_check) {
221
+ const tag = document.createElement("span");
222
+ tag.className = "tag";
223
+ tag.textContent = "grader self-check";
224
+ notes.append(tag);
225
+ } else if (row.notes) {
226
+ const span = document.createElement("span");
227
+ span.className = "ci";
228
+ span.textContent = row.notes;
229
+ notes.append(span);
230
+ }
231
+ tr.append(notes);
232
+ }
233
+
234
+ return tr;
235
+ }
236
+
237
+ function renderBoard(data, host) {
238
+ const tbody = host.querySelector("[data-board-body]");
239
+ const stamp = host.querySelector("[data-board-stamp]");
240
+ const emptyEl = host.querySelector("[data-board-empty]");
241
+ const rows = [...(data.rows || [])].sort(
242
+ (a, b) => (b.score ?? 0) - (a.score ?? 0) || (a.spurious_call_rate ?? 1) - (b.spurious_call_rate ?? 1),
243
+ );
244
+
245
+ const hasProtocolCol = !!host.querySelector("[data-col-protocol]");
246
+ const hasNotesCol = !!host.querySelector("[data-col-notes]");
247
+
248
+ tbody.replaceChildren(...rows.map((row, i) => rowNode(row, i, { withProtocol: hasProtocolCol, withNotes: hasNotesCol })));
249
+
250
+ if (stamp) {
251
+ stamp.textContent = [
252
+ `${rows.length} entr${rows.length === 1 ? "y" : "ies"}`,
253
+ data.version ? `v${data.version}` : "",
254
+ data.updated ? `updated ${data.updated}` : "",
255
+ ].filter(Boolean).join(" · ");
256
+ }
257
+ if (emptyEl) emptyEl.hidden = rows.length > 0;
258
+
259
+ requestAnimationFrame(() => {
260
+ tbody.querySelectorAll("tr").forEach((tr, i) => {
261
+ setTimeout(() => tr.classList.add("in"), prefersReduced ? 0 : 40 * i);
262
+ });
263
+ tbody.querySelectorAll(".bar > i, .pb > i").forEach((fill) => {
264
+ fill.style.width = `${Math.max(0, Math.min(1, parseFloat(fill.dataset.w) || 0)) * 100}%`;
265
+ });
266
+ });
267
+ }
268
+
269
+ /* ------------------------------------------------------------- sorting */
270
+ function wireSorting(host) {
271
+ const headers = host.querySelectorAll("th[data-sort]");
272
+ headers.forEach((th) => {
273
+ th.classList.add("sortable");
274
+ if (!th.querySelector(".arrow")) th.insertAdjacentHTML("beforeend", ' <span class="arrow">↑↓</span>');
275
+ th.addEventListener("click", () => {
276
+ const key = th.dataset.sort;
277
+ const dir = th.getAttribute("aria-sort") === "descending" ? "ascending" : "descending";
278
+ headers.forEach((h) => h.removeAttribute("aria-sort"));
279
+ th.setAttribute("aria-sort", dir);
280
+ const tbody = host.querySelector("[data-board-body]");
281
+ const glyph = th.querySelector(".arrow");
282
+ if (glyph) glyph.textContent = dir === "descending" ? " ↓" : " ↑";
283
+ const rows = [...tbody.querySelectorAll("tr")];
284
+ rows.sort((a, b) => {
285
+ const av = parseFloat(a.dataset[key]) || 0;
286
+ const bv = parseFloat(b.dataset[key]) || 0;
287
+ return dir === "descending" ? bv - av : av - bv;
288
+ });
289
+ tbody.replaceChildren(...rows);
290
+ });
291
+ });
292
+ }
293
+
294
+ /* ------------------------------------------------------------- bootstrap */
295
+ async function loadResults() {
296
+ try {
297
+ const res = await fetch("results.json", { cache: "no-store" });
298
+ if (!res.ok) throw new Error(`HTTP ${res.status}`);
299
+ return await res.json();
300
+ } catch {
301
+ return EMBEDDED_RESULTS;
302
+ }
303
+ }
304
+
305
+ function applyMetricCards(data) {
306
+ const best = [...(data.rows || [])].sort((a, b) => (b.score ?? 0) - (a.score ?? 0))[0];
307
+ if (!best) return;
308
+ const map = { overall: best.score, call: best.correct_call, abstain: best.abstention };
309
+ document.querySelectorAll("[data-metric]").forEach((el) => {
310
+ const v = map[el.dataset.metric];
311
+ if (typeof v === "number") el.textContent = pct(v);
312
+ });
313
+ }
314
+
315
+ document.addEventListener("DOMContentLoaded", async () => {
316
+ document.querySelectorAll("[data-count]").forEach(countUp);
317
+ revealOnScroll();
318
+
319
+ const boards = document.querySelectorAll("[data-board]");
320
+ if (!boards.length) return;
321
+
322
+ const data = await loadResults();
323
+ boards.forEach((host) => {
324
+ renderBoard(data, host);
325
+ wireSorting(host);
326
+ });
327
+ applyMetricCards(data);
328
+
329
+ const year = document.getElementById("year");
330
+ if (year) year.textContent = new Date().getFullYear();
331
+ });
index.html CHANGED
@@ -1,19 +1,171 @@
1
  <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </html>
 
1
  <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>ToolUse.1 — Tool-Calling Benchmark with Abstention</title>
7
+ <meta name="description" content="ToolUse.1 measures whether a model calls tools correctly — and only when it should. 114 English cases · JSON / XML / plain-text protocols · deterministic grading, no LLM judge." />
8
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='7' fill='%230a0b0d'/><path d='M8 22V10h3.4v9.2H21V22z' fill='%23e5484d'/></svg>" />
9
+ <link rel="stylesheet" href="styles.css" />
10
+ </head>
11
+ <body>
12
+
13
+ <nav class="nav">
14
+ <div class="wrap">
15
+ <a class="brand" href="index.html"><span class="dot"></span>ToolUse<span class="mark">.1</span></a>
16
+ <div class="nav-links">
17
+ <a href="index.html" aria-current="page">Overview</a>
18
+ <a href="leaderboard.html">Leaderboard</a>
19
+ <a href="https://huggingface.co/datasets/HardcoreAI/ToolUse.1" target="_blank" rel="noopener">Dataset</a>
20
+ <a class="nav-cta" href="https://huggingface.co/datasets/HardcoreAI/ToolUse.1/discussions" target="_blank" rel="noopener">Submit a model</a>
21
+ </div>
22
+ </div>
23
+ </nav>
24
+
25
+ <header class="hero">
26
+ <div class="wrap">
27
+ <p class="eyebrow anim" style="animation-delay:.05s">Hardcore AI · benchmark</p>
28
+ <h1 class="anim" style="animation-delay:.12s">ToolUse<span class="mark">.1</span></h1>
29
+ <p class="lede anim" style="animation-delay:.2s">
30
+ Can a model call a tool when it should — and stay quiet when it shouldn't?
31
+ ToolUse.1 scores correct invocation, correct abstention, and correct clarification
32
+ separately, on 114 authored cases in English.
33
+ </p>
34
+ <ul class="stats anim" style="animation-delay:.3s">
35
+ <li><b data-count="114">114</b><span>cases</span></li>
36
+ <li><b data-count="78">78</b><span>require a call</span></li>
37
+ <li><b data-count="36">36</b><span>abstain / clarify</span></li>
38
+ <li><b data-count="9">9</b><span>tool schemas</span></li>
39
+ <li><b data-count="3">3</b><span>protocols</span></li>
40
+ <li><b data-count="0">0</b><span>LLM judges</span></li>
41
+ </ul>
42
+ </div>
43
+ </header>
44
+
45
+ <main class="wrap">
46
+
47
+ <section class="metrics reveal">
48
+ <div class="metric">
49
+ <div class="label">Invocation</div>
50
+ <div class="value" data-metric="overall">—</div>
51
+ <div class="note">Right tool, semantically correct arguments. Expressions are evaluated — <code>45+12</code> equals <code>45 + 12</code>.</div>
52
+ </div>
53
+ <div class="metric">
54
+ <div class="label">Abstention</div>
55
+ <div class="value" data-metric="abstain">—</div>
56
+ <div class="note">No call when no tool applies: knowledge questions, absent capabilities, explicit no-tool instructions.</div>
57
+ </div>
58
+ <div class="metric">
59
+ <div class="label">Clarification</div>
60
+ <div class="value" data-metric="call">—</div>
61
+ <div class="note">A required argument is missing. Asking the user passes; guessing an argument fails.</div>
62
+ </div>
63
+ </section>
64
+
65
+ <section class="grid reveal">
66
+ <div class="card">
67
+ <div class="k">What it measures</div>
68
+ <h3>Right call, right time</h3>
69
+ <p>Nine tools across arithmetic, weather, search, translation, conversion, timers, notes and time. Every case is a realistic user turn — no trivia, no synthetic templates.</p>
70
+ </div>
71
+ <div class="card">
72
+ <div class="k">Three protocols</div>
73
+ <h3>JSON · XML · plain-text</h3>
74
+ <p>The output protocol is a run-time axis, not a data axis. Each case is rendered in all three; grading uses canonical call semantics, so a model is judged on intent, not formatting.</p>
75
+ </div>
76
+ <div class="card">
77
+ <div class="k">Deterministic grading</div>
78
+ <h3>No LLM judge</h3>
79
+ <p>Arguments are compared as values with alias tables for cities, currencies, units and timezones. Exactly one call is required for call cases. The oracle self-check scores 100%.</p>
80
+ </div>
81
+ </section>
82
+
83
+ <section class="reveal">
84
+ <h2 class="section">Leaderboard — top of the board</h2>
85
+ <div class="board" data-board>
86
+ <div class="board-head">
87
+ <h2>ToolUse.1 — Leaderboard</h2>
88
+ <p class="stamp" data-board-stamp>loading results…</p>
89
+ </div>
90
+ <table>
91
+ <thead>
92
+ <tr>
93
+ <th class="col-rank">#</th>
94
+ <th class="col-model">Model</th>
95
+ <th class="num" title="Passed cases / all cases. Wilson 95% interval shown underneath.">Score</th>
96
+ <th class="num" title="Correct call when a tool applies">Correct call</th>
97
+ <th class="num" title="Correct abstention when no tool applies">Abstention</th>
98
+ <th class="num" title="No-call cases where any call was emitted. Lower is better.">Spurious ↓</th>
99
+ <th class="num" title="Cases scored">n</th>
100
+ </tr>
101
+ </thead>
102
+ <tbody data-board-body>
103
+ <tr class="in" data-score="1" data-correct_call="1" data-abstention="1" data-spurious_call_rate="0" data-n_cases="342">
104
+ <td class="col-rank"><span class="rank-badge rank-1">1</span></td>
105
+ <td class="col-model"><span class="model-name">oracle</span><span class="model-sub">all protocols · grader reference</span></td>
106
+ <td class="num"><div class="score-cell"><div class="bar"><i style="width:100%"></i></div><span class="score-value">100.0%</span></div><span class="ci">98.9% – 100.0%</span></td>
107
+ <td class="num">100.0%</td>
108
+ <td class="num">100.0%</td>
109
+ <td class="num">0.0%</td>
110
+ <td class="num">342</td>
111
+ </tr>
112
+ <tr class="in" data-score="0.6404" data-correct_call="0.5855" data-abstention="0.7593" data-spurious_call_rate="0.1667" data-n_cases="342">
113
+ <td class="col-rank"><span class="rank-badge rank-2">2</span></td>
114
+ <td class="col-model"><a class="model-link model-name" href="https://huggingface.co/HardcoreAI/Nova-1.1-0.8B" target="_blank" rel="noopener">HardcoreAI/Nova-1.1-0.8B</a><span class="model-sub">all protocols · greedy · thinking off · fine-tuned</span></td>
115
+ <td class="num"><div class="score-cell"><div class="bar"><i style="width:64.0%"></i></div><span class="score-value">64.0%</span></div><span class="ci">58.8% – 68.9%</span></td>
116
+ <td class="num">58.6%</td>
117
+ <td class="num">75.9%</td>
118
+ <td class="num spurious-mid">16.7%</td>
119
+ <td class="num">342</td>
120
+ </tr>
121
+ <tr class="in" data-score="0.5936" data-correct_call="0.4829" data-abstention="0.8333" data-spurious_call_rate="0.0648" data-n_cases="342">
122
+ <td class="col-rank"><span class="rank-badge rank-3">3</span></td>
123
+ <td class="col-model"><a class="model-link model-name" href="https://huggingface.co/Qwen/Qwen3.5-0.8B" target="_blank" rel="noopener">Qwen/Qwen3.5-0.8B</a><span class="model-sub">all protocols · greedy · thinking off · base model</span></td>
124
+ <td class="num"><div class="score-cell"><div class="bar"><i style="width:59.4%"></i></div><span class="score-value">59.4%</span></div><span class="ci">54.1% – 64.4%</span></td>
125
+ <td class="num">48.3%</td>
126
+ <td class="num">83.3%</td>
127
+ <td class="num">6.5%</td>
128
+ <td class="num">342</td>
129
+ </tr>
130
+ </tbody>
131
+ </table>
132
+ <p class="empty" data-board-empty hidden>No model results yet. See <strong>Submit a model</strong> below.</p>
133
+ </div>
134
+ <p style="margin:1rem 0 0"><a href="leaderboard.html">Open the full leaderboard →</a></p>
135
+ </section>
136
+
137
+ <section class="submit reveal">
138
+ <h2 class="section">Submit a model</h2>
139
+ <p>Run the benchmark yourself, keep the raw results JSON the harness writes, and open a discussion on the dataset repository with the model id and configuration.</p>
140
+ <pre><code>git clone https://huggingface.co/datasets/HardcoreAI/ToolUse.1
141
+ pip install -r requirements.txt # transformers 5.x for Nova / Qwen3.5
142
+
143
+ python -m tooluse1 selftest # oracle must score exactly 100%
144
+ python -m tooluse1 run --model &lt;id&gt; \
145
+ --backend transformers --protocol all --batch-size 8 --out results/</code></pre>
146
+ <ol class="steps">
147
+ <li><b>Verify the harness</b> — run the self-check first; it validates the grader against the corpus.</li>
148
+ <li><b>Run all three protocols</b> and keep the results JSON the harness emits.</li>
149
+ <li><b>Open a discussion</b> on <a href="https://huggingface.co/datasets/HardcoreAI/ToolUse.1/discussions" target="_blank" rel="noopener">HardcoreAI/ToolUse.1</a> with the model id, protocols, case count, decoding config, and the raw JSON attachment.</li>
150
+ </ol>
151
+ <p style="margin-top:1rem;color:var(--dim);font-size:0.86rem;">
152
+ Recommended: greedy decoding (<code>do_sample=False</code>), <code>max_new_tokens=256</code>, unmodified system prompt,
153
+ no few-shot examples, reasoning mode disabled where supported. One dtype per row — bfloat16 on Ampere+, float16 on T4.
154
+ </p>
155
+ </section>
156
+
157
+ </main>
158
+
159
+ <footer>
160
+ <div class="wrap">
161
+ <a href="https://huggingface.co/datasets/HardcoreAI/ToolUse.1">Dataset</a>
162
+ <a href="https://huggingface.co/datasets/HardcoreAI/ToolUse.1/blob/main/SPEC.md">Specification</a>
163
+ <a href="https://huggingface.co/datasets/HardcoreAI/ToolUse.1/discussions">Discussions</a>
164
+ <a href="https://huggingface.co/HardcoreAI">Hardcore AI</a>
165
+ <span class="license">Apache-2.0 · v1.0.0 · <span id="year">2026</span></span>
166
+ </div>
167
+ </footer>
168
+
169
+ <script src="app.js"></script>
170
+ </body>
171
  </html>
leaderboard.html ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Leaderboard — ToolUse.1</title>
7
+ <meta name="description" content="Model leaderboard for ToolUse.1: overall score, correct invocation, correct abstention and spurious-call rate across JSON, XML and plain-text protocols." />
8
+ <link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><rect width='32' height='32' rx='7' fill='%230a0b0d'/><path d='M8 22V10h3.4v9.2H21V22z' fill='%23e5484d'/></svg>" />
9
+ <link rel="stylesheet" href="styles.css" />
10
+ </head>
11
+ <body>
12
+
13
+ <nav class="nav">
14
+ <div class="wrap">
15
+ <a class="brand" href="index.html"><span class="dot"></span>ToolUse<span class="mark">.1</span></a>
16
+ <div class="nav-links">
17
+ <a href="index.html">Overview</a>
18
+ <a href="leaderboard.html" aria-current="page">Leaderboard</a>
19
+ <a href="https://huggingface.co/datasets/HardcoreAI/ToolUse.1" target="_blank" rel="noopener">Dataset</a>
20
+ <a class="nav-cta" href="https://huggingface.co/datasets/HardcoreAI/ToolUse.1/discussions" target="_blank" rel="noopener">Submit a model</a>
21
+ </div>
22
+ </div>
23
+ </nav>
24
+
25
+ <header class="hero" style="padding:3.4rem 0 1.2rem">
26
+ <div class="wrap">
27
+ <p class="eyebrow anim" style="animation-delay:.05s">ToolUse.1 · results</p>
28
+ <h1 class="anim" style="animation-delay:.12s">Leader<span class="mark">board</span></h1>
29
+ <p class="lede anim" style="animation-delay:.2s">
30
+ One row per submitted run. Sorted by overall score; click any numeric header to re-rank.
31
+ Every entry reports invocation, abstention and calibration — a high score with a high
32
+ spurious-call rate is not the same model as a high score with a clean one.
33
+ </p>
34
+ </div>
35
+ </header>
36
+
37
+ <main class="wrap" style="padding-top:1.6rem">
38
+
39
+ <section class="reveal">
40
+ <div class="board" data-board>
41
+ <div class="board-head">
42
+ <h2>All submissions</h2>
43
+ <div class="board-tools">
44
+ <p class="stamp" data-board-stamp>loading results…</p>
45
+ </div>
46
+ </div>
47
+ <table>
48
+ <thead>
49
+ <tr>
50
+ <th class="col-rank">#</th>
51
+ <th class="col-model">Model</th>
52
+ <th class="num" data-sort="score" title="Passed cases / all cases. Wilson 95% interval underneath.">Score <span class="arrow">↑↓</span></th>
53
+ <th class="num" data-sort="correct_call" title="Correct call when a tool applies">Correct call <span class="arrow">↑↓</span></th>
54
+ <th class="num" data-sort="abstention" title="Correct abstention when no tool applies">Abstention <span class="arrow">↑↓</span></th>
55
+ <th class="num" data-sort="spurious_call_rate" title="No-call cases where any call was emitted. Lower is better.">Spurious ↓ <span class="arrow">↑↓</span></th>
56
+ <th class="num" data-sort="n_cases" title="Cases scored">n <span class="arrow">↑↓</span></th>
57
+ <th data-col-protocol>By protocol</th>
58
+ <th class="col-notes" data-col-notes>Notes</th>
59
+ </tr>
60
+ </thead>
61
+ <tbody data-board-body>
62
+ <tr class="in" data-score="1" data-correct_call="1" data-abstention="1" data-spurious_call_rate="0" data-n_cases="342">
63
+ <td class="col-rank"><span class="rank-badge rank-1">1</span></td>
64
+ <td class="col-model"><span class="model-name">oracle</span><span class="model-sub">all protocols · reads the expectations out of the corpus</span></td>
65
+ <td class="num"><div class="score-cell"><div class="bar"><i style="width:100%"></i></div><span class="score-value">100.0%</span></div><span class="ci">98.9% – 100.0%</span></td>
66
+ <td class="num">100.0%</td>
67
+ <td class="num">100.0%</td>
68
+ <td class="num">0.0%</td>
69
+ <td class="num">342</td>
70
+ <td><div class="proto-mini">
71
+ <div><span class="pl">json</span><div class="pb"><i style="width:100%"></i></div><span class="pv">100.0%</span></div>
72
+ <div><span class="pl">xml</span><div class="pb"><i style="width:100%"></i></div><span class="pv">100.0%</span></div>
73
+ <div><span class="pl">plain</span><div class="pb"><i style="width:100%"></i></div><span class="pv">100.0%</span></div>
74
+ </div></td>
75
+ <td class="col-notes"><span class="tag">grader self-check</span></td>
76
+ </tr>
77
+ <tr class="in" data-score="0.6404" data-correct_call="0.5855" data-abstention="0.7593" data-spurious_call_rate="0.1667" data-n_cases="342">
78
+ <td class="col-rank"><span class="rank-badge rank-2">2</span></td>
79
+ <td class="col-model"><a class="model-link model-name" href="https://huggingface.co/HardcoreAI/Nova-1.1-0.8B" target="_blank" rel="noopener">HardcoreAI/Nova-1.1-0.8B</a><span class="model-sub">all protocols · greedy · thinking off · fine-tuned</span></td>
80
+ <td class="num"><div class="score-cell"><div class="bar"><i style="width:64.0%"></i></div><span class="score-value">64.0%</span></div><span class="ci">58.8% – 68.9%</span></td>
81
+ <td class="num">58.6%</td>
82
+ <td class="num">75.9%</td>
83
+ <td class="num spurious-mid">16.7%</td>
84
+ <td class="num">342</td>
85
+ <td><div class="proto-mini">
86
+ <div><span class="pl">json</span><div class="pb"><i style="width:67.5%"></i></div><span class="pv">67.5%</span></div>
87
+ <div><span class="pl">xml</span><div class="pb"><i style="width:63.2%"></i></div><span class="pv">63.2%</span></div>
88
+ <div><span class="pl">plain</span><div class="pb"><i style="width:61.4%"></i></div><span class="pv">61.4%</span></div>
89
+ </div></td>
90
+ <td class="col-notes"><span class="ci">fine-tuned · bf16 · batch 8</span></td>
91
+ </tr>
92
+ <tr class="in" data-score="0.5936" data-correct_call="0.4829" data-abstention="0.8333" data-spurious_call_rate="0.0648" data-n_cases="342">
93
+ <td class="col-rank"><span class="rank-badge rank-3">3</span></td>
94
+ <td class="col-model"><a class="model-link model-name" href="https://huggingface.co/Qwen/Qwen3.5-0.8B" target="_blank" rel="noopener">Qwen/Qwen3.5-0.8B</a><span class="model-sub">all protocols · greedy · thinking off · base model</span></td>
95
+ <td class="num"><div class="score-cell"><div class="bar"><i style="width:59.4%"></i></div><span class="score-value">59.4%</span></div><span class="ci">54.1% – 64.4%</span></td>
96
+ <td class="num">48.3%</td>
97
+ <td class="num">83.3%</td>
98
+ <td class="num">6.5%</td>
99
+ <td class="num">342</td>
100
+ <td><div class="proto-mini">
101
+ <div><span class="pl">json</span><div class="pb"><i style="width:67.5%"></i></div><span class="pv">67.5%</span></div>
102
+ <div><span class="pl">xml</span><div class="pb"><i style="width:67.5%"></i></div><span class="pv">67.5%</span></div>
103
+ <div><span class="pl">plain</span><div class="pb"><i style="width:43.0%"></i></div><span class="pv">43.0%</span></div>
104
+ </div></td>
105
+ <td class="col-notes"><span class="ci">base model · bf16 · batch 8</span></td>
106
+ </tr>
107
+ </tbody>
108
+ </table>
109
+ <p class="empty" data-board-empty hidden>No model results yet. Open a discussion to submit the first one.</p>
110
+ </div>
111
+ </section>
112
+
113
+ <section class="grid reveal">
114
+ <div class="card">
115
+ <div class="k">Score</div>
116
+ <h3>What counts</h3>
117
+ <p>A case passes when the emitted call set matches the expectation: the right tool, semantically correct arguments, and — on no-call cases — nothing emitted at all. Wilson 95% interval in parentheses.</p>
118
+ </div>
119
+ <div class="card">
120
+ <div class="k">Correct call ↑</div>
121
+ <h3>Recall on tool cases</h3>
122
+ <p>Share of call-eligible cases where the model produced the expected invocation with correct arguments. High abstention at low correct-call means the model is too shy.</p>
123
+ </div>
124
+ <div class="card">
125
+ <div class="k">Spurious ↓</div>
126
+ <h3>Calibration</h3>
127
+ <p>Share of no-call cases where the model emitted *some* call anyway. High abstention at high spurious means it is noisy, not cautious — the two are not interchangeable.</p>
128
+ </div>
129
+ </section>
130
+
131
+ <section class="submit reveal">
132
+ <h2 class="section">Submit a model</h2>
133
+ <p>Run the harness, keep the raw results JSON, and open a discussion on the dataset repository. Rows are added by hand — include the model id, protocols, case count, decoding configuration and the JSON attachment.</p>
134
+ <pre><code>python -m tooluse1 selftest # oracle must score exactly 100%
135
+ python -m tooluse1 run --model &lt;id&gt; --backend transformers \
136
+ --protocol all --batch-size 8 --out results/</code></pre>
137
+ <p style="margin:1rem 0 0">
138
+ <a href="https://huggingface.co/datasets/HardcoreAI/ToolUse.1/discussions" target="_blank" rel="noopener">Open a submission discussion →</a>
139
+ </p>
140
+ </section>
141
+
142
+ </main>
143
+
144
+ <footer>
145
+ <div class="wrap">
146
+ <a href="https://huggingface.co/datasets/HardcoreAI/ToolUse.1">Dataset</a>
147
+ <a href="https://huggingface.co/datasets/HardcoreAI/ToolUse.1/blob/main/SPEC.md">Specification</a>
148
+ <a href="https://huggingface.co/datasets/HardcoreAI/ToolUse.1/discussions">Discussions</a>
149
+ <a href="https://huggingface.co/HardcoreAI">Hardcore AI</a>
150
+ <span class="license">Apache-2.0 · v1.0.0 · <span id="year">2026</span></span>
151
+ </div>
152
+ </footer>
153
+
154
+ <script src="app.js"></script>
155
+ </body>
156
+ </html>
results.json ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "benchmark": "ToolUse.1",
3
+ "version": "1.0.0",
4
+ "updated": "2026-10-17",
5
+ "corpus": {
6
+ "cases": 114,
7
+ "call_cases": 78,
8
+ "no_call_cases": 36,
9
+ "by_language": {
10
+ "en": 114
11
+ },
12
+ "by_category": {
13
+ "calculator": 15,
14
+ "get_weather": 8,
15
+ "web_search": 8,
16
+ "translate": 8,
17
+ "convert_currency": 8,
18
+ "convert_units": 8,
19
+ "set_timer": 6,
20
+ "save_note": 6,
21
+ "get_time": 6,
22
+ "negative": 30,
23
+ "clarification": 5,
24
+ "multi_step": 6
25
+ },
26
+ "sha256": "17a6ef84c22648d83add6f56a03b24f896420837f4e69039c22d61cf8ad2c3e1"
27
+ },
28
+ "rows": [
29
+ {
30
+ "model": "oracle",
31
+ "link": "",
32
+ "protocol": "all",
33
+ "score": 1.0,
34
+ "score_ci95": [
35
+ 0.9889,
36
+ 1.0
37
+ ],
38
+ "correct_call": 1.0,
39
+ "abstention": 1.0,
40
+ "spurious_call_rate": 0.0,
41
+ "n_cases": 342,
42
+ "notes": "reads the expectations out of the corpus — grader reference",
43
+ "self_check": true,
44
+ "by_protocol": {
45
+ "json": 1.0,
46
+ "plain": 1.0,
47
+ "xml": 1.0
48
+ },
49
+ "config": {
50
+ "backend": "harness self-check",
51
+ "results_file": "selftest__oracle__all.json"
52
+ }
53
+ },
54
+ {
55
+ "model": "HardcoreAI/Nova-1.1-0.8B",
56
+ "link": "",
57
+ "protocol": "all",
58
+ "score": 0.6404,
59
+ "score_ci95": [
60
+ 0.5882,
61
+ 0.6894
62
+ ],
63
+ "correct_call": 0.5855,
64
+ "abstention": 0.7593,
65
+ "spurious_call_rate": 0.1667,
66
+ "n_cases": 342,
67
+ "notes": "Nova-1.1-0.8B | greedy | thinking off | batch 8 | transformers 5.5.4 | English-only ToolUse.1",
68
+ "self_check": false,
69
+ "by_protocol": {
70
+ "json": 0.6754,
71
+ "plain": 0.614,
72
+ "xml": 0.6316
73
+ },
74
+ "config": {
75
+ "backend": "external",
76
+ "results_file": "HardcoreAI__Nova-1.1-0.8B__all.json"
77
+ }
78
+ },
79
+ {
80
+ "model": "Qwen/Qwen3.5-0.8B",
81
+ "link": "",
82
+ "protocol": "all",
83
+ "score": 0.5936,
84
+ "score_ci95": [
85
+ 0.5408,
86
+ 0.6443
87
+ ],
88
+ "correct_call": 0.4829,
89
+ "abstention": 0.8333,
90
+ "spurious_call_rate": 0.0648,
91
+ "n_cases": 342,
92
+ "notes": "Qwen/Qwen3.5-0.8B | greedy | thinking off | batch 8 | transformers 5.5.4 | English-only ToolUse.1 | base model",
93
+ "self_check": false,
94
+ "by_protocol": {
95
+ "json": 0.6754,
96
+ "plain": 0.4298,
97
+ "xml": 0.6754
98
+ },
99
+ "config": {
100
+ "backend": "external",
101
+ "results_file": "Qwen__Qwen3.5-0.8B__all.json"
102
+ }
103
+ }
104
+ ]
105
+ }
styles.css ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* ==========================================================================
2
+ ToolUse.1 — design system
3
+ Dark, editorial, one accent. Motion is intentional, not decorative:
4
+ entrance cascade, count-up, bars that grow, sections that reveal.
5
+ ========================================================================== */
6
+
7
+ :root {
8
+ --ink: #06070a;
9
+ --ink-2: #0a0c10;
10
+ --panel: #111419;
11
+ --panel-2: #14171d;
12
+ --line: #1f242e;
13
+ --line-soft: #171b22;
14
+ --text: #e9ebf0;
15
+ --muted: #8d95a6;
16
+ --dim: #626b7d;
17
+ --accent: #e5484d;
18
+ --accent-soft: #ff7a70;
19
+ --accent-glow: rgba(229, 72, 77, 0.35);
20
+ --good: #4ade80;
21
+ --warn: #ffb454;
22
+ --bronze: #c98a5b;
23
+ --mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;
24
+ --sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
25
+ --serif: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, ui-serif, serif;
26
+ --ease: cubic-bezier(0.22, 1, 0.36, 1);
27
+ --radius: 12px;
28
+ --shadow: 0 18px 50px -28px rgba(0, 0, 0, 0.9);
29
+ }
30
+
31
+ * { box-sizing: border-box; }
32
+ html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
33
+
34
+ body {
35
+ margin: 0;
36
+ min-height: 100vh;
37
+ background-color: var(--ink);
38
+ background-image:
39
+ radial-gradient(1200px 560px at 10% -14%, rgba(229, 72, 77, 0.16), transparent 60%),
40
+ radial-gradient(980px 500px at 98% 2%, rgba(96, 118, 214, 0.11), transparent 56%),
41
+ radial-gradient(760px 640px at 50% 120%, rgba(229, 72, 77, 0.08), transparent 60%);
42
+ background-attachment: fixed;
43
+ color: var(--text);
44
+ font-family: var(--sans);
45
+ font-size: 16px;
46
+ line-height: 1.55;
47
+ -webkit-font-smoothing: antialiased;
48
+ text-rendering: optimizeLegibility;
49
+ overflow-x: hidden;
50
+ }
51
+
52
+ /* fine grain overlay — keeps the large dark fields from banding */
53
+ body::after {
54
+ content: "";
55
+ position: fixed;
56
+ inset: 0;
57
+ pointer-events: none;
58
+ z-index: 1;
59
+ opacity: 0.035;
60
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
61
+ }
62
+
63
+ a { color: var(--text); border-bottom: 1px solid var(--line); text-decoration: none; transition: border-color 0.25s var(--ease), color 0.25s var(--ease); }
64
+ a:hover { border-bottom-color: var(--accent); color: #fff; }
65
+
66
+ .wrap { width: min(1120px, 100% - 2.5rem); margin-inline: auto; position: relative; z-index: 2; }
67
+
68
+ /* ------------------------------------------------------------------ nav */
69
+ .nav {
70
+ position: sticky;
71
+ top: 0;
72
+ z-index: 20;
73
+ backdrop-filter: blur(14px);
74
+ -webkit-backdrop-filter: blur(14px);
75
+ background: rgba(6, 7, 10, 0.72);
76
+ border-bottom: 1px solid var(--line-soft);
77
+ }
78
+ .nav .wrap { display: flex; align-items: center; gap: 1.4rem; height: 58px; }
79
+ .brand {
80
+ display: inline-flex; align-items: center; gap: 0.55rem;
81
+ font-family: var(--mono); font-weight: 600; font-size: 0.92rem; letter-spacing: 0.02em;
82
+ border: none;
83
+ }
84
+ .brand .dot {
85
+ width: 9px; height: 9px; border-radius: 3px; background: var(--accent);
86
+ box-shadow: 0 0 0 3px rgba(229, 72, 77, 0.15);
87
+ animation: pulse 2.6s var(--ease) infinite;
88
+ }
89
+ @keyframes pulse {
90
+ 0%, 100% { box-shadow: 0 0 0 3px rgba(229, 72, 77, 0.15); }
91
+ 50% { box-shadow: 0 0 0 7px rgba(229, 72, 77, 0.04); }
92
+ }
93
+ .brand span.mark { color: var(--accent); }
94
+ .nav-links { display: flex; gap: 1.25rem; margin-left: auto; align-items: center; }
95
+ .nav-links a {
96
+ border: none; font-size: 0.84rem; color: var(--muted); letter-spacing: 0.01em;
97
+ position: relative; padding: 0.2rem 0;
98
+ }
99
+ .nav-links a::after {
100
+ content: ""; position: absolute; left: 0; right: 100%; bottom: -2px; height: 1px;
101
+ background: var(--accent); transition: right 0.3s var(--ease);
102
+ }
103
+ .nav-links a:hover { color: var(--text); }
104
+ .nav-links a:hover::after, .nav-links a[aria-current="page"]::after { right: 0; }
105
+ .nav-links a[aria-current="page"] { color: var(--text); }
106
+ .nav-cta {
107
+ border: 1px solid var(--line) !important; border-radius: 999px; padding: 0.32rem 0.85rem !important;
108
+ color: var(--text) !important;
109
+ }
110
+ .nav-cta:hover { border-color: var(--accent) !important; }
111
+
112
+ /* ------------------------------------------------------------- headings */
113
+ .eyebrow {
114
+ margin: 0 0 0.9rem; font-family: var(--mono); font-size: 0.7rem;
115
+ letter-spacing: 0.22em; text-transform: uppercase; color: var(--dim);
116
+ }
117
+ h1 {
118
+ margin: 0 0 0.7rem; font-family: var(--serif); font-weight: 400;
119
+ font-size: clamp(2.8rem, 9vw, 5rem); line-height: 0.92; letter-spacing: -0.03em;
120
+ }
121
+ h1 .mark { color: var(--accent); }
122
+ .lede { max-width: 58ch; margin: 0 0 1.6rem; font-size: 1.1rem; color: var(--muted); }
123
+
124
+ h2.section {
125
+ margin: 0 0 1.1rem; font-size: 0.72rem; font-family: var(--mono);
126
+ letter-spacing: 0.2em; text-transform: uppercase; color: var(--muted); font-weight: 500;
127
+ }
128
+
129
+ /* ---------------------------------------------------------------- hero */
130
+ header.hero { padding: 4.2rem 0 1.4rem; border-bottom: 1px solid var(--line); position: relative; }
131
+
132
+ .stats { display: flex; flex-wrap: wrap; gap: 1.3rem 2.4rem; margin: 2rem 0 0.6rem; padding: 0; list-style: none; }
133
+ .stats li { display: flex; flex-direction: column; gap: 0.14rem; }
134
+ .stats b {
135
+ font-family: var(--mono); font-size: 1.55rem; font-weight: 500;
136
+ font-variant-numeric: tabular-nums; letter-spacing: -0.01em;
137
+ background: linear-gradient(180deg, #fff, #aab2c2);
138
+ -webkit-background-clip: text; background-clip: text; color: transparent;
139
+ }
140
+ .stats span { font-size: 0.64rem; letter-spacing: 0.16em; text-transform: uppercase; color: var(--dim); }
141
+
142
+ /* ---------------------------------------------------------------- layout */
143
+ main { padding: 2.8rem 0 4rem; display: grid; gap: 3.4rem; }
144
+ .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1rem; }
145
+ .split { display: grid; grid-template-columns: 1.35fr 1fr; gap: 1.2rem; align-items: start; }
146
+
147
+ .card {
148
+ padding: 1.4rem 1.5rem; border: 1px solid var(--line); border-radius: var(--radius);
149
+ background: linear-gradient(180deg, var(--panel-2), var(--panel));
150
+ transition: transform 0.35s var(--ease), border-color 0.35s var(--ease), box-shadow 0.35s var(--ease);
151
+ }
152
+ .card:hover { transform: translateY(-3px); border-color: #2b3240; box-shadow: var(--shadow); }
153
+ .card h3 { margin: 0 0 0.5rem; font-family: var(--serif); font-size: 1.2rem; font-weight: 400; }
154
+ .card p { margin: 0; color: var(--muted); font-size: 0.92rem; }
155
+ .card .k { font-family: var(--mono); font-size: 0.7rem; color: var(--accent-soft); letter-spacing: 0.1em; text-transform: uppercase; }
156
+
157
+ /* ---------------------------------------------------------- leaderboard */
158
+ .board { border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel); overflow: hidden; box-shadow: var(--shadow); }
159
+ .board-head {
160
+ padding: 1rem 1.25rem; border-bottom: 1px solid var(--line);
161
+ display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; flex-wrap: wrap;
162
+ }
163
+ .board-head h2 { margin: 0; font-size: 0.92rem; font-family: var(--mono); letter-spacing: 0.06em; }
164
+ .stamp { margin: 0; font-family: var(--mono); font-size: 0.7rem; color: var(--dim); }
165
+ .board-tools { display: flex; gap: 0.4rem; align-items: center; }
166
+ .chip {
167
+ font-family: var(--mono); font-size: 0.66rem; letter-spacing: 0.08em; text-transform: uppercase;
168
+ color: var(--muted); border: 1px solid var(--line); border-radius: 999px; padding: 0.24rem 0.7rem;
169
+ background: transparent; cursor: pointer; transition: all 0.25s var(--ease);
170
+ }
171
+ .chip:hover { color: var(--text); border-color: #2b3240; }
172
+ .chip[aria-pressed="true"] { color: #fff; border-color: var(--accent); background: rgba(229, 72, 77, 0.12); }
173
+
174
+ table { width: 100%; border-collapse: collapse; font-size: 0.9rem; }
175
+ th {
176
+ padding: 0.7rem 0.9rem; text-align: left; font-family: var(--mono); font-size: 0.64rem;
177
+ font-weight: 500; letter-spacing: 0.14em; text-transform: uppercase; color: var(--dim);
178
+ border-bottom: 1px solid var(--line); white-space: nowrap; user-select: none;
179
+ }
180
+ th.sortable { cursor: pointer; transition: color 0.2s var(--ease); }
181
+ th.sortable:hover { color: var(--text); }
182
+ th .arrow { opacity: 0.35; margin-left: 0.25rem; }
183
+ th[aria-sort] .arrow { opacity: 1; color: var(--accent); }
184
+ td { padding: 0.8rem 0.9rem; border-bottom: 1px solid var(--line-soft); vertical-align: middle; }
185
+ tr:last-child td { border-bottom: none; }
186
+ tbody tr { transition: background 0.25s var(--ease); }
187
+ .js tbody tr { opacity: 0; transform: translateY(8px); }
188
+ .js tbody tr.in { opacity: 1; transform: none; }
189
+ tbody tr:hover { background: var(--panel-2); }
190
+
191
+ .num { text-align: right; font-family: var(--mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
192
+ .col-rank { width: 2.6rem; color: var(--dim); font-family: var(--mono); }
193
+ .rank-badge {
194
+ display: inline-flex; align-items: center; justify-content: center; width: 1.55rem; height: 1.55rem;
195
+ border-radius: 999px; font-size: 0.72rem; border: 1px solid var(--line); color: var(--muted);
196
+ }
197
+ .rank-1 { border-color: #d8b25a; color: #f3d489; background: rgba(216, 178, 90, 0.1); box-shadow: 0 0 16px -4px rgba(216, 178, 90, 0.5); }
198
+ .rank-2 { border-color: #9aa3b2; color: #c8ced8; background: rgba(154, 163, 178, 0.1); }
199
+ .rank-3 { border-color: var(--bronze); color: #e0ad83; background: rgba(201, 138, 91, 0.1); }
200
+ .col-model { min-width: 15rem; }
201
+ .model-name { font-weight: 500; }
202
+ .model-sub { display: block; margin-top: 0.16rem; font-family: var(--mono); font-size: 0.67rem; color: var(--dim); }
203
+
204
+ .score-cell { display: flex; align-items: center; gap: 0.55rem; justify-content: flex-end; }
205
+ .bar { position: relative; width: 96px; height: 5px; border-radius: 3px; background: #1b1f27; overflow: hidden; flex: none; }
206
+ .bar > i {
207
+ position: absolute; inset: 0 auto 0 0; width: 0;
208
+ background: linear-gradient(90deg, var(--accent), var(--accent-soft));
209
+ border-radius: 3px; box-shadow: 0 0 14px -2px var(--accent-glow);
210
+ transition: width 1.1s var(--ease);
211
+ }
212
+ .score-value { font-family: var(--mono); font-variant-numeric: tabular-nums; font-weight: 600; min-width: 3.6rem; text-align: right; }
213
+ .ci { font-family: var(--mono); font-size: 0.66rem; color: var(--dim); }
214
+ .spurious-high { color: var(--accent); }
215
+ .spurious-mid { color: var(--warn); }
216
+
217
+ .tag {
218
+ display: inline-block; margin-right: 0.35rem; padding: 0.14rem 0.42rem; border: 1px solid var(--line);
219
+ border-radius: 999px; font-family: var(--mono); font-size: 0.58rem; letter-spacing: 0.1em;
220
+ text-transform: uppercase; color: var(--warn); white-space: nowrap;
221
+ }
222
+ .empty { margin: 0; padding: 1.2rem 1.25rem; color: var(--dim); font-style: italic; }
223
+ .col-notes { max-width: 22rem; font-size: 0.76rem; color: var(--muted); }
224
+
225
+ /* per-protocol mini bars in leaderboard */
226
+ .proto-mini { display: flex; gap: 0.55rem; }
227
+ .proto-mini > div { display: flex; flex-direction: column; gap: 0.22rem; min-width: 3.1rem; }
228
+ .proto-mini .pl { font-family: var(--mono); font-size: 0.55rem; letter-spacing: 0.1em; text-transform: uppercase; color: var(--dim); }
229
+ .proto-mini .pb { height: 3px; border-radius: 2px; background: #1b1f27; overflow: hidden; }
230
+ .proto-mini .pb > i { display: block; height: 100%; width: 0; background: linear-gradient(90deg, #5b6ee0, #8f7bff); transition: width 1.1s var(--ease); }
231
+ .proto-mini .pv { font-family: var(--mono); font-size: 0.64rem; color: var(--muted); }
232
+
233
+ /* ---------------------------------------------------------- submit block */
234
+ .submit {
235
+ border: 1px solid var(--line); border-radius: var(--radius); background: linear-gradient(180deg, var(--ink-2), #0b0d11);
236
+ padding: 1.7rem; position: relative; overflow: hidden;
237
+ }
238
+ .submit::before {
239
+ content: ""; position: absolute; inset: 0 auto 0 0; width: 3px;
240
+ background: linear-gradient(180deg, var(--accent), transparent);
241
+ }
242
+ .submit h2 { margin-top: 0; }
243
+ .steps { margin: 1rem 0 0; padding-left: 1.3rem; color: var(--muted); display: grid; gap: 0.7rem; max-width: 62ch; }
244
+ .steps b { color: var(--text); }
245
+ code {
246
+ font-family: var(--mono); font-size: 0.84em; background: #0a0c10; border: 1px solid var(--line);
247
+ border-radius: 5px; padding: 0.06em 0.36em; color: #cdd3de;
248
+ }
249
+ pre {
250
+ margin: 1.1rem 0; padding: 1.1rem 1.25rem; border: 1px solid var(--line); border-radius: 10px;
251
+ background: #08090c; overflow-x: auto; font-size: 0.82rem; line-height: 1.62;
252
+ }
253
+ pre code { background: none; border: none; padding: 0; }
254
+
255
+ /* -------------------------------------------------------------- metrics */
256
+ .metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 1rem; }
257
+ .metric {
258
+ padding: 1.3rem; border: 1px solid var(--line); border-radius: var(--radius);
259
+ background: linear-gradient(180deg, var(--panel-2), var(--panel));
260
+ position: relative; overflow: hidden;
261
+ }
262
+ .metric::after {
263
+ content: ""; position: absolute; left: 1.3rem; right: 1.3rem; bottom: 0; height: 2px;
264
+ background: linear-gradient(90deg, var(--accent), transparent); opacity: 0.5;
265
+ }
266
+ .metric .label { font-family: var(--mono); font-size: 0.64rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--dim); margin-bottom: 0.4rem; }
267
+ .metric .value { font-family: var(--mono); font-size: 1.7rem; font-variant-numeric: tabular-nums; font-weight: 600; }
268
+ .metric .note { margin-top: 0.35rem; font-size: 0.78rem; color: var(--dim); }
269
+ .metric .note code { font-size: 0.78em; }
270
+
271
+ /* ------------------------------------------------------------------ footer */
272
+ footer { border-top: 1px solid var(--line); padding: 2rem 0 3rem; color: var(--dim); font-size: 0.78rem; }
273
+ footer .wrap { display: flex; flex-wrap: wrap; gap: 1.4rem; align-items: center; }
274
+ footer .license { margin-left: auto; font-family: var(--mono); font-size: 0.7rem; }
275
+ footer a { color: var(--muted); }
276
+
277
+ /* ------------------------------------------------------------- reveal */
278
+ .reveal { opacity: 1; transform: none; }
279
+ .js .reveal { opacity: 0; transform: translateY(20px); transition: opacity 0.7s var(--ease), transform 0.7s var(--ease); will-change: opacity, transform; }
280
+ .js .reveal.in { opacity: 1; transform: none; }
281
+ .hero .anim { opacity: 0; transform: translateY(16px); animation: rise 0.8s var(--ease) forwards; }
282
+ @keyframes rise { to { opacity: 1; transform: none; } }
283
+
284
+ @media (max-width: 760px) {
285
+ .split { grid-template-columns: 1fr; }
286
+ .stats { gap: 0 1.3rem; }
287
+ .metrics { grid-template-columns: 1fr; }
288
+ .board th, .board td { padding: 0.6rem 0.55rem; font-size: 0.82rem; }
289
+ .bar { display: none; }
290
+ .nav-links a:not(.nav-cta):not([aria-current]) { display: none; }
291
+ }
292
+
293
+ @media (prefers-reduced-motion: reduce) {
294
+ * { animation: none !important; transition: none !important; }
295
+ .reveal { opacity: 1; transform: none; }
296
+ .hero .anim { opacity: 1; transform: none; }
297
+ tbody tr { opacity: 1; transform: none; }
298
+ }