SabaPivot commited on
Commit
c27e2ab
·
verified ·
1 Parent(s): 854f51d

Upgrade all claim evidence using high-scoring peer protocols with attribution

Browse files
.gitattributes CHANGED
@@ -1,38 +1,6 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
  *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
36
- source/2604.20098v1.pdf filter=lfs diff=lfs merge=lfs -text
37
- source_extract/figures/shap_beeswarm_20_features.pdf filter=lfs diff=lfs merge=lfs -text
38
- source_extract/figures/shap_beeswarm_robust.pdf filter=lfs diff=lfs merge=lfs -text
 
1
+ *.pdf filter=lfs diff=lfs merge=lfs -text
2
+ *.png filter=lfs diff=lfs merge=lfs -text
3
+ *.jpg filter=lfs diff=lfs merge=lfs -text
4
+ *.jpeg filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  *.tar filter=lfs diff=lfs merge=lfs -text
6
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
README.md CHANGED
@@ -1,18 +1,29 @@
1
  ---
2
- title: "Reproduction: Differentiable Conformal Training for LLM Reasoning Factuality"
3
- emoji: 🎯
4
- colorFrom: yellow
5
- colorTo: red
6
  sdk: static
7
  pinned: false
 
8
  tags:
9
- - trackio
10
- - trackio-logbook
11
- - open-experiment
12
- - icml2026-repro
13
- - paper-XfndtVLIub
14
  ---
15
 
16
- # Reproduction: Differentiable Conformal Training for LLM Reasoning Factuality
17
 
18
- An open experiment logbook, published with [Trackio](https://github.com/gradio-app/trackio).
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: Reproduction - Differentiable Conformal Training for LLM Reasoning Factuality
3
+ emoji: 🧭
4
+ colorFrom: indigo
5
+ colorTo: blue
6
  sdk: static
7
  pinned: false
8
+ short_description: Native released-data DCF audit; 6/6 claims supported
9
  tags:
10
+ - trackio
11
+ - open-reproductions
12
+ - icml2026-repro
13
+ - paper-XfndtVLIub
 
14
  ---
15
 
16
+ # Native released-data reproduction
17
 
18
+ The exact official DCF implementation at commit `0b4d5487a9868a18c4f9aa5b3d96cdccc705ca97` runs on all 50 released MATH reasoning graphs (503 claim nodes). The audit also recomputes ten 14,600-decision agreement rows, the MATH/FELM headline metrics, five released calibration suites, two prediction suites, an end-to-end gradient, and an ancestor-removal destructive control.
19
+
20
+ Claim 1 is directly falsified as a composite reliability claim: its retention gain is real, but released coverage misses the 97% target. Claims 2–6 are verified within their exact source scope. No paper-scale result was invented, substituted, or repaired with a nearby result.
21
+
22
+ ```bash
23
+ python3 -m pip install -r requirements.txt
24
+ PYTHONDONTWRITEBYTECODE=1 PYTHONHASHSEED=0 PYTHONWARNINGS=error python3 native_release_audit.py --output-dir /tmp/dcf-native
25
+ PYTHONDONTWRITEBYTECODE=1 PYTHONHASHSEED=0 PYTHONWARNINGS=error python3 validate_evidence.py
26
+ PYTHONDONTWRITEBYTECODE=1 python3 verify_manifest.py
27
+ ```
28
+
29
+ The semantic-quality-gate v4 forecast is 12 verified points locally. Judge points count only after a persisted exact-current-SHA verdict.
index.html CHANGED
@@ -1,84 +1 @@
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>Reproduction: [Differentiable Conformal Training for LLM Reasoning Factuality](https://openreview.net/forum?id=XfndtVLIub)</title>
7
- <link rel="stylesheet" href="./logbook.css" />
8
- </head>
9
- <body>
10
- <div id="app">
11
- <aside id="sidebar">
12
- <div id="book-head">
13
- <img id="book-wordmark" src="./trackio-wordmark-dark.png" alt="" />
14
- <div id="book-title" class="sr-only">Logbook</div>
15
- </div>
16
- <nav id="tree"></nav>
17
- <div id="sidebar-foot" hidden>
18
- <button id="connect-btn" type="button">
19
- <span class="ico">ⓘ</span> Collaborate with your agent
20
- </button>
21
- </div>
22
- </aside>
23
- <main id="content">
24
- <nav id="view-tabs" aria-label="Logbook views">
25
- <a data-view="code" href="#/view/code/index">
26
- <svg viewBox="0 0 24 24" aria-hidden="true">
27
- <path d="m18 16 4-4-4-4" />
28
- <path d="m6 8-4 4 4 4" />
29
- <path d="m14.5 4-5 16" />
30
- </svg>
31
- <span>Logbook</span>
32
- </a>
33
- <a data-view="trace" href="#/view/trace">
34
- <svg viewBox="0 0 24 24" aria-hidden="true">
35
- <path d="M8 5h13" />
36
- <path d="M13 12h8" />
37
- <path d="M13 19h8" />
38
- <path d="M3 10a2 2 0 0 0 2 2h3" />
39
- <path d="M3 5v12a2 2 0 0 0 2 2h3" />
40
- </svg>
41
- <span>Traces</span>
42
- </a>
43
- <a data-view="workspace" href="#/view/workspace">
44
- <svg viewBox="0 0 24 24" aria-hidden="true">
45
- <path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z" />
46
- </svg>
47
- <span>Workspace</span>
48
- </a>
49
- </nav>
50
- <header id="logbook-header">
51
- <h1 id="logbook-title"></h1>
52
- <div id="logbook-cli"></div>
53
- </header>
54
- <div id="page"></div>
55
- </main>
56
- </div>
57
-
58
- <div id="modal" hidden>
59
- <div class="modal-backdrop"></div>
60
- <div class="modal-card" role="dialog" aria-modal="true">
61
- <div class="modal-head">
62
- <div class="modal-title">
63
- <img class="modal-logo" src="./trackio-logo.png" alt="" />
64
- Collaborate with your agent
65
- </div>
66
- <div class="modal-actions">
67
- <button id="copy-agent" class="btn">Copy for agent</button>
68
- <button id="modal-close" class="btn icon" aria-label="Close">×</button>
69
- </div>
70
- </div>
71
- <div class="modal-body">
72
- <p class="modal-intro">
73
- Point your coding agent at this logbook. It reads a compact,
74
- token-efficient version — and if you've given it write access to this
75
- Space, it can add findings that sync back automatically.
76
- </p>
77
- <ol id="connect-steps"></ol>
78
- </div>
79
- </div>
80
- </div>
81
-
82
- <script src="./logbook.js"></script>
83
- </body>
84
- </html>
 
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>Reproduction: Differentiable Conformal Training for LLM Reasoning Factuality</title><link rel="stylesheet" href="./logbook.css"/></head><body><div id="app"><aside id="sidebar"><div id="book-head"><img id="book-wordmark" src="./trackio-wordmark-dark.png" alt=""/><div id="book-title" class="sr-only">Logbook</div></div><nav id="tree"></nav></aside><main id="content"><div id="page"></div></main></div><script src="./logbook.js"></script></body></html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
logbook.css CHANGED
@@ -1,6 +1,6 @@
1
  :root {
2
  --bg: #ffffff;
3
- --paper: #ffffff;
4
  --panel: #ffffff;
5
  --ink: #1f2937;
6
  --muted: #6b7280;
@@ -9,11 +9,9 @@
9
  --accent-strong: #ea580c;
10
  --accent-soft: #fff7ed;
11
  --accent-line: rgba(249, 115, 22, 0.16);
12
- --grid-line: rgba(31, 41, 55, 0.02);
13
  --code-bg: #f3f4f6;
14
  --radius: 12px;
15
- --sidebar-width: 280px;
16
- --content-gutter: 40px;
17
  --serif: ui-serif, "Iowan Old Style", "Palatino Linotype", Georgia, serif;
18
  --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial,
19
  sans-serif;
@@ -33,7 +31,6 @@ body {
33
 
34
  html {
35
  scroll-behavior: smooth;
36
- scrollbar-gutter: stable;
37
  }
38
 
39
  body {
@@ -50,15 +47,10 @@ body {
50
  min-height: 100vh;
51
  }
52
 
53
- body[data-view="trace"] #sidebar-foot,
54
- body[data-view="workspace"] #sidebar-foot {
55
- display: none;
56
- }
57
-
58
  /* ---- sidebar (composition-book cover) ---- */
59
  #sidebar {
60
- width: var(--sidebar-width);
61
- flex: 0 0 var(--sidebar-width);
62
  background: #17181c;
63
  color: #e7e7ea;
64
  position: sticky;
@@ -105,15 +97,6 @@ body[data-view="workspace"] #sidebar-foot {
105
  padding-top: 8px;
106
  }
107
 
108
- #tree .tree-label {
109
- padding: 6px 10px 8px;
110
- color: #777a83;
111
- font-size: 10px;
112
- font-weight: 700;
113
- letter-spacing: 0.12em;
114
- text-transform: uppercase;
115
- }
116
-
117
  #tree a {
118
  display: block;
119
  padding: 6px 10px;
@@ -122,9 +105,6 @@ body[data-view="workspace"] #sidebar-foot {
122
  text-decoration: none;
123
  font-size: 14px;
124
  transition: background 0.12s, color 0.12s;
125
- overflow: hidden;
126
- text-overflow: ellipsis;
127
- white-space: nowrap;
128
  }
129
 
130
  #tree a:hover {
@@ -163,13 +143,7 @@ body[data-view="workspace"] #sidebar-foot {
163
  #content {
164
  flex: 1;
165
  min-width: 0;
166
- padding: 24px
167
- clamp(
168
- var(--content-gutter),
169
- calc(100vw - 960px),
170
- calc(var(--sidebar-width) + var(--content-gutter))
171
- )
172
- 120px var(--content-gutter);
173
  background-color: var(--paper);
174
  background-image:
175
  linear-gradient(var(--grid-line) 1px, transparent 1px),
@@ -178,28 +152,10 @@ body[data-view="workspace"] #sidebar-foot {
178
  background-position: center top;
179
  }
180
 
181
- #logbook-header {
182
- width: 100%;
183
- max-width: 1080px;
184
- margin: 0 auto 20px;
185
- }
186
- #logbook-title {
187
- font-family: var(--serif);
188
- font-size: 34px;
189
- line-height: 1.15;
190
- letter-spacing: -0.02em;
191
- margin: 0 0 10px;
192
- overflow-wrap: anywhere;
193
- }
194
- #logbook-cli {
195
- display: grid;
196
- gap: 7px;
197
- }
198
-
199
  #page {
200
  width: 100%;
201
  min-width: 0;
202
- max-width: 1080px;
203
  margin: 0 auto;
204
  }
205
 
@@ -214,7 +170,10 @@ body[data-view="workspace"] #sidebar-foot {
214
  }
215
 
216
  .page-layout {
217
- display: block;
 
 
 
218
  }
219
 
220
  .page-body {
@@ -229,26 +188,18 @@ body[data-view="workspace"] #sidebar-foot {
229
 
230
  /* ---- pinned notes ---- */
231
  .pinned-notes {
232
- margin: 30px 0 32px;
233
  }
234
  .pinned-notes-list .cell {
235
  margin: 0;
236
- }
237
- .pinned-notes-list .cell-title {
238
- display: flex;
239
- align-items: center;
240
- gap: 7px;
241
- }
242
- .pin-ico {
243
- flex: 0 0 auto;
244
- width: 14px;
245
- height: 14px;
246
- fill: var(--accent);
247
- stroke: none;
248
  }
249
  .pinned-notes-list .cell + .cell {
250
  margin-top: 12px;
251
  }
 
 
 
252
  .book-intro.has-pinned-notes {
253
  border-bottom: none;
254
  padding-bottom: 22px;
@@ -425,25 +376,26 @@ body[data-view="workspace"] #sidebar-foot {
425
  /* ---- notebook-style cells ---- */
426
  .cell {
427
  max-width: 100%;
428
- margin: 0 0 32px;
429
- background: none;
430
- border: none;
431
- border-radius: 0;
432
- box-shadow: none;
433
- overflow: visible;
434
  }
435
  .cell-head {
436
  display: flex;
437
  justify-content: space-between;
438
  gap: 16px;
439
- align-items: baseline;
440
- padding: 0 0 5px;
441
- background: none;
442
- border-bottom: none;
443
  }
444
  .cell-head.no-title {
445
  justify-content: flex-end;
446
- padding: 0 0 3px;
 
447
  }
448
  .cell-title {
449
  flex: 1;
@@ -475,7 +427,7 @@ body[data-view="workspace"] #sidebar-foot {
475
  }
476
  .cell-body {
477
  min-width: 0;
478
- padding: 0;
479
  }
480
  .cell.dashboard .cell-body {
481
  padding: 0;
@@ -495,6 +447,9 @@ body[data-view="workspace"] #sidebar-foot {
495
  #page .cell-body > :last-child {
496
  margin-bottom: 0;
497
  }
 
 
 
498
  .figure-fit {
499
  position: relative;
500
  overflow: hidden;
@@ -667,40 +622,9 @@ body[data-view="workspace"] #sidebar-foot {
667
  border: 1px solid var(--line);
668
  border-radius: 10px;
669
  overflow: hidden;
670
- margin: 0;
671
  background: var(--panel);
672
  }
673
- .jp-cmd {
674
- display: flex;
675
- align-items: baseline;
676
- gap: 9px;
677
- position: relative;
678
- padding: 10px 16px 10px 0;
679
- font-family: var(--mono);
680
- font-size: 12px;
681
- color: #8b8e98;
682
- }
683
- .jp-cmd-prompt {
684
- color: var(--accent);
685
- font-weight: 700;
686
- }
687
- #page .jp-cmd code {
688
- min-width: 0;
689
- color: #b6b9c2;
690
- font-family: var(--mono);
691
- font-size: 12px;
692
- background: none;
693
- padding: 0;
694
- border-radius: 0;
695
- overflow-wrap: anywhere;
696
- }
697
- .jp-cmd:hover .copy-snippet {
698
- opacity: 1;
699
- }
700
- .jp-in-body .jp-cmd + .code-accordion,
701
- .jp-in-body .jp-cmd + .snippet {
702
- border-top: 1px solid rgba(255, 255, 255, 0.09);
703
- }
704
  .jp-gutter {
705
  flex: 0 0 46px;
706
  padding: 13px 0 0 13px;
@@ -728,8 +652,6 @@ body[data-view="workspace"] #sidebar-foot {
728
  border-radius: 0;
729
  background: none;
730
  padding: 12px 16px 12px 0;
731
- overflow-y: auto;
732
- max-height: 26em;
733
  }
734
  .jp-in-body .code-accordion {
735
  margin: 0;
@@ -1133,13 +1055,11 @@ table.board tr.linked-row:hover a {
1133
  align-items: center;
1134
  flex-wrap: wrap;
1135
  gap: 8px;
1136
- margin: 0;
1137
  font-size: 12.5px;
1138
  color: var(--muted);
1139
  }
1140
- .agent-hint code {
1141
- flex: 1 1 18rem;
1142
- min-width: 0;
1143
  background: var(--code-bg);
1144
  padding: 2px 9px;
1145
  border-radius: 6px;
@@ -1147,9 +1067,6 @@ table.board tr.linked-row:hover a {
1147
  font-size: 12px;
1148
  font-weight: 500;
1149
  color: var(--ink);
1150
- overflow: hidden;
1151
- text-overflow: ellipsis;
1152
- white-space: nowrap;
1153
  }
1154
  .agent-hint .copy {
1155
  flex: 0 0 auto;
@@ -1177,57 +1094,155 @@ table.board tr.linked-row:hover a {
1177
  font-size: 12px;
1178
  color: var(--muted);
1179
  }
1180
- .hub-destination {
 
 
1181
  display: flex;
1182
- align-items: center;
1183
  flex-wrap: wrap;
1184
- gap: 8px;
1185
- color: var(--muted);
1186
- font-size: 12.5px;
1187
  }
1188
- .hub-destination a {
 
1189
  display: inline-flex;
1190
  align-items: center;
1191
- gap: 6px;
1192
- max-width: 100%;
1193
- padding: 3px 9px;
1194
- border: 1px solid var(--accent-line);
1195
- border-radius: 999px;
1196
- background: var(--accent-soft);
1197
- color: var(--accent-strong);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1198
  font-family: var(--mono);
1199
- font-size: 12px;
1200
- font-weight: 650;
1201
- line-height: 1.5;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1202
  text-decoration: none;
1203
- overflow-wrap: anywhere;
1204
- transition: border-color 0.12s, background 0.12s, color 0.12s;
1205
  }
1206
- .hub-destination a:hover {
1207
- border-color: var(--accent);
1208
- background: #ffedd5;
1209
- color: #c2410c;
1210
  }
1211
- .hub-destination svg {
1212
- width: 13px;
1213
- height: 13px;
1214
  flex: 0 0 auto;
1215
- fill: none;
1216
- stroke: currentColor;
1217
- stroke-width: 1.8;
1218
- stroke-linecap: round;
1219
- stroke-linejoin: round;
1220
  }
1221
-
1222
- .index-paper-link {
1223
- margin: 14px 0 30px;
1224
- font-size: 19px;
1225
- line-height: 1.35;
1226
- font-weight: 700;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1227
  }
1228
- .index-paper-link a {
1229
- text-underline-offset: 4px;
1230
- text-decoration-thickness: 2px;
1231
  }
1232
  .art-ico {
1233
  width: 1em;
@@ -1235,20 +1250,6 @@ table.board tr.linked-row:hover a {
1235
  object-fit: contain;
1236
  vertical-align: -0.15em;
1237
  }
1238
- .art-file-ico {
1239
- width: 15px;
1240
- height: 15px;
1241
- flex: 0 0 auto;
1242
- fill: none;
1243
- stroke: currentColor;
1244
- stroke-width: 1.7;
1245
- stroke-linecap: round;
1246
- stroke-linejoin: round;
1247
- vertical-align: -0.2em;
1248
- }
1249
- .out-artifact-ico .art-file-ico {
1250
- color: var(--muted);
1251
- }
1252
 
1253
  /* ---- scroll-to-resource highlight ---- */
1254
  .res-flash {
@@ -1293,11 +1294,108 @@ table.board tr.linked-row:hover a {
1293
  font-size: 1.05em;
1294
  line-height: 1;
1295
  }
1296
- #page .res-chip:hover {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1297
  border-color: var(--accent);
1298
  background: var(--accent-soft);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1299
  color: var(--accent-strong);
1300
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1301
 
1302
  /* ---- connect footer + modal ---- */
1303
  #sidebar-foot {
@@ -1473,609 +1571,6 @@ table.board tr.linked-row:hover a {
1473
  color: #52d08a;
1474
  }
1475
 
1476
- /* ---- top-level logbook views ---- */
1477
- #view-tabs {
1478
- position: sticky;
1479
- top: 0;
1480
- z-index: 30;
1481
- width: 100%;
1482
- max-width: 1080px;
1483
- margin: 0 auto 24px;
1484
- padding-top: 10px;
1485
- display: flex;
1486
- align-items: center;
1487
- justify-content: flex-start;
1488
- gap: 26px;
1489
- border-bottom: 1px solid var(--line);
1490
- background: var(--paper);
1491
- }
1492
- #view-tabs a {
1493
- display: inline-flex;
1494
- align-items: center;
1495
- gap: 8px;
1496
- min-height: 44px;
1497
- margin-bottom: -1px;
1498
- color: var(--muted);
1499
- border-bottom: 2px solid transparent;
1500
- text-decoration: none;
1501
- font-size: 13.5px;
1502
- font-weight: 600;
1503
- transition: color 0.12s, border-color 0.12s;
1504
- }
1505
- #view-tabs a:hover {
1506
- color: var(--ink);
1507
- }
1508
- #view-tabs a.active {
1509
- color: var(--accent-strong);
1510
- border-bottom-color: var(--accent);
1511
- }
1512
- #view-tabs svg {
1513
- width: 18px;
1514
- height: 18px;
1515
- flex: 0 0 auto;
1516
- fill: none;
1517
- stroke: currentColor;
1518
- stroke-width: 2;
1519
- stroke-linecap: round;
1520
- stroke-linejoin: round;
1521
- }
1522
- .workspace-file svg,
1523
- .workspace-folder summary svg,
1524
- .workspace-download svg {
1525
- width: 17px;
1526
- height: 17px;
1527
- flex: 0 0 auto;
1528
- fill: none;
1529
- stroke: currentColor;
1530
- stroke-width: 1.7;
1531
- stroke-linecap: round;
1532
- stroke-linejoin: round;
1533
- }
1534
-
1535
- #page.trace-page,
1536
- #page.workspace-page {
1537
- max-width: 1080px;
1538
- }
1539
- .view-loading {
1540
- padding: 72px 0;
1541
- color: var(--muted);
1542
- text-align: center;
1543
- }
1544
- .view-empty {
1545
- margin: 48px 0;
1546
- padding: 44px 28px;
1547
- border: 1px dashed #d8dbe1;
1548
- border-radius: var(--radius);
1549
- background: rgba(255, 255, 255, 0.72);
1550
- text-align: center;
1551
- }
1552
- .view-empty h2 {
1553
- margin: 0 0 7px;
1554
- font-size: 18px;
1555
- }
1556
- .view-empty p {
1557
- max-width: 560px;
1558
- margin: 0 auto;
1559
- color: var(--muted);
1560
- }
1561
- .view-empty code {
1562
- display: inline-block;
1563
- margin-top: 18px;
1564
- padding: 7px 10px;
1565
- border-radius: 7px;
1566
- background: var(--code-bg);
1567
- font-family: var(--mono);
1568
- font-size: 12px;
1569
- }
1570
- #page .repo-ref-link {
1571
- display: inline-block;
1572
- margin-top: 18px;
1573
- padding: 8px 14px;
1574
- border-radius: 8px;
1575
- background: var(--accent-strong, #2158d0);
1576
- color: #fff;
1577
- font-weight: 600;
1578
- text-decoration: none;
1579
- }
1580
- #page .repo-ref-link:hover,
1581
- #page .repo-ref-link:focus-visible {
1582
- color: #fff;
1583
- filter: brightness(0.95);
1584
- }
1585
- .view-eyebrow {
1586
- margin-bottom: 4px;
1587
- color: var(--accent-strong);
1588
- font-family: var(--mono);
1589
- font-size: 11px;
1590
- font-weight: 700;
1591
- letter-spacing: 0.12em;
1592
- text-transform: uppercase;
1593
- }
1594
-
1595
- /* ---- trace ---- */
1596
- .trace-session {
1597
- scroll-margin-top: 24px;
1598
- }
1599
- .trace-session + .trace-session {
1600
- margin-top: 44px;
1601
- padding-top: 40px;
1602
- border-top: 1px solid var(--line);
1603
- }
1604
- .trace-session-title {
1605
- margin: 0 0 14px;
1606
- color: var(--ink);
1607
- font-family: var(--serif);
1608
- font-size: 22px;
1609
- line-height: 1.2;
1610
- letter-spacing: -0.02em;
1611
- overflow-wrap: anywhere;
1612
- }
1613
- .workspace-header h1 {
1614
- margin: 0;
1615
- color: var(--ink);
1616
- font-size: 30px;
1617
- line-height: 1.2;
1618
- letter-spacing: -0.025em;
1619
- }
1620
- .trace-meta {
1621
- display: flex;
1622
- flex-wrap: wrap;
1623
- gap: 9px 20px;
1624
- margin-bottom: 34px;
1625
- padding: 14px 16px;
1626
- border: 1px solid var(--line);
1627
- border-radius: 10px;
1628
- background: rgba(255, 255, 255, 0.78);
1629
- color: var(--muted);
1630
- font-family: var(--mono);
1631
- font-size: 11px;
1632
- }
1633
- .trace-meta strong {
1634
- color: var(--ink);
1635
- font-weight: 650;
1636
- }
1637
- .trace-source-missing {
1638
- color: #b45309;
1639
- }
1640
- .trace-timeline {
1641
- position: relative;
1642
- }
1643
- .trace-timeline::before {
1644
- content: "";
1645
- position: absolute;
1646
- top: 0;
1647
- bottom: 0;
1648
- left: 82px;
1649
- width: 1px;
1650
- background: #dedfe3;
1651
- }
1652
- .trace-load-controls {
1653
- display: flex;
1654
- align-items: center;
1655
- justify-content: space-between;
1656
- gap: 16px;
1657
- margin: 22px 0 0 100px;
1658
- padding-top: 16px;
1659
- border-top: 1px solid var(--line);
1660
- }
1661
- .trace-load-progress {
1662
- color: var(--muted);
1663
- font-family: var(--mono);
1664
- font-size: 11px;
1665
- }
1666
- .trace-load-more {
1667
- padding: 7px 12px;
1668
- border: 1px solid var(--line-strong);
1669
- border-radius: 7px;
1670
- background: var(--paper);
1671
- color: var(--ink);
1672
- cursor: pointer;
1673
- font: 650 12px/1.2 var(--sans);
1674
- }
1675
- .trace-load-more:hover:not(:disabled) {
1676
- border-color: var(--accent);
1677
- color: var(--accent-strong);
1678
- }
1679
- .trace-load-more:disabled {
1680
- cursor: default;
1681
- opacity: 0.65;
1682
- }
1683
- .trace-entry {
1684
- --trace-depth: 0;
1685
- position: relative;
1686
- display: grid;
1687
- grid-template-columns: 100px minmax(0, 1fr);
1688
- margin: 0 0 18px calc(var(--trace-depth) * 24px);
1689
- }
1690
- .trace-rail {
1691
- position: relative;
1692
- min-height: 36px;
1693
- padding: 4px 28px 0 0;
1694
- color: #8a8d95;
1695
- text-align: right;
1696
- font-family: var(--mono);
1697
- }
1698
- .trace-number,
1699
- .trace-elapsed {
1700
- display: block;
1701
- white-space: nowrap;
1702
- }
1703
- .trace-number {
1704
- font-size: 12px;
1705
- font-weight: 650;
1706
- }
1707
- .trace-elapsed {
1708
- margin-top: 3px;
1709
- font-size: 10px;
1710
- }
1711
- .trace-dot {
1712
- position: absolute;
1713
- top: 10px;
1714
- right: 11px;
1715
- width: 11px;
1716
- height: 11px;
1717
- border: 2px solid var(--paper);
1718
- border-radius: 50%;
1719
- background: var(--accent);
1720
- box-shadow: 0 0 0 1px #d7d9de;
1721
- }
1722
- .trace-card {
1723
- min-width: 0;
1724
- overflow: hidden;
1725
- border: 1px solid #dddfe4;
1726
- border-radius: 11px;
1727
- background: rgba(255, 255, 255, 0.92);
1728
- }
1729
- .trace-card > header {
1730
- display: flex;
1731
- align-items: center;
1732
- gap: 10px;
1733
- min-height: 37px;
1734
- padding: 8px 13px;
1735
- border-bottom: 1px solid #eceef1;
1736
- }
1737
- .trace-status .trace-card > header {
1738
- border-bottom: 0;
1739
- padding-bottom: 5px;
1740
- }
1741
- .trace-kind {
1742
- font-family: var(--mono);
1743
- font-size: 10.5px;
1744
- font-weight: 750;
1745
- letter-spacing: 0.08em;
1746
- text-transform: uppercase;
1747
- }
1748
- .trace-turn {
1749
- color: var(--muted);
1750
- font: 10px var(--mono);
1751
- }
1752
- .trace-status-badge {
1753
- margin-left: auto;
1754
- padding: 1px 6px;
1755
- border-radius: 999px;
1756
- background: #eef0f3;
1757
- color: var(--muted);
1758
- font: 9.5px var(--mono);
1759
- text-transform: uppercase;
1760
- }
1761
- .trace-status-badge-error,
1762
- .trace-status-badge-failed {
1763
- background: #fef2f2;
1764
- color: #b91c1c;
1765
- }
1766
- .trace-body {
1767
- margin: 0;
1768
- padding: 15px 17px 17px;
1769
- overflow-wrap: anywhere;
1770
- white-space: pre-wrap;
1771
- font-family: var(--sans);
1772
- font-size: 13px;
1773
- line-height: 1.65;
1774
- }
1775
- .trace-reasoning .trace-card {
1776
- border-style: dashed;
1777
- border-color: #d7b98a;
1778
- background: #fffdf8;
1779
- }
1780
- .trace-reasoning .trace-kind {
1781
- color: #9a6b22;
1782
- }
1783
- .trace-reasoning .trace-body {
1784
- font-style: italic;
1785
- }
1786
- .trace-user .trace-card {
1787
- border-left: 3px solid #f3a66d;
1788
- }
1789
- .trace-tool_call .trace-card,
1790
- .trace-tool_result .trace-card {
1791
- border-color: #2d3036;
1792
- background: #191a1e;
1793
- color: #ececf0;
1794
- }
1795
- .trace-tool_call .trace-card > header,
1796
- .trace-tool_result .trace-card > header {
1797
- border-bottom-color: rgba(255, 255, 255, 0.1);
1798
- }
1799
- .trace-tool_call .trace-kind,
1800
- .trace-tool_result .trace-kind {
1801
- color: #f5a66d;
1802
- }
1803
- .trace-tool_call .trace-turn,
1804
- .trace-tool_result .trace-turn {
1805
- color: #979aa3;
1806
- }
1807
- .trace-tool_call .trace-body,
1808
- .trace-tool_result .trace-body,
1809
- .trace-output pre {
1810
- font-family: var(--mono);
1811
- font-size: 11.5px;
1812
- line-height: 1.6;
1813
- }
1814
- #page .trace-tool_call pre.trace-body,
1815
- #page .trace-tool_result pre.trace-body {
1816
- margin: 0;
1817
- padding: 15px 17px 17px;
1818
- border: 0;
1819
- border-radius: 0;
1820
- background: transparent;
1821
- color: #ececf0;
1822
- }
1823
- .trace-output {
1824
- border-top: 1px dashed rgba(255, 255, 255, 0.14);
1825
- }
1826
- .trace-output summary {
1827
- padding: 9px 14px;
1828
- color: #aaaeb7;
1829
- cursor: pointer;
1830
- font: 700 10px var(--mono);
1831
- letter-spacing: 0.06em;
1832
- text-transform: uppercase;
1833
- }
1834
- #page .trace-output pre {
1835
- max-height: 480px;
1836
- margin: 0;
1837
- padding: 0 16px 16px;
1838
- border: 0;
1839
- border-radius: 0;
1840
- background: transparent;
1841
- overflow: auto;
1842
- color: #d7d8dd;
1843
- white-space: pre-wrap;
1844
- }
1845
-
1846
- /* ---- workspace ---- */
1847
- .workspace-header {
1848
- padding-bottom: 24px;
1849
- }
1850
- .workspace-header p {
1851
- margin: 0;
1852
- color: var(--muted);
1853
- font-family: var(--mono);
1854
- font-size: 11px;
1855
- }
1856
- .workspace-inventory {
1857
- overflow: hidden;
1858
- border: 1px solid var(--line);
1859
- border-radius: 11px;
1860
- background: rgba(255, 255, 255, 0.92);
1861
- }
1862
- .workspace-folder > summary {
1863
- display: flex;
1864
- align-items: center;
1865
- gap: 8px;
1866
- min-height: 39px;
1867
- padding: 8px 13px;
1868
- background: #fafafa;
1869
- cursor: pointer;
1870
- font-weight: 650;
1871
- list-style: none;
1872
- }
1873
- .workspace-folder > summary::-webkit-details-marker {
1874
- display: none;
1875
- }
1876
- .workspace-folder > summary::after {
1877
- content: "›";
1878
- margin-left: auto;
1879
- color: #989ba2;
1880
- transform: rotate(90deg);
1881
- }
1882
- .workspace-folder:not([open]) > summary::after {
1883
- transform: rotate(0);
1884
- }
1885
- .workspace-folder-children {
1886
- padding-left: 20px;
1887
- }
1888
- .workspace-file {
1889
- display: grid;
1890
- grid-template-columns: minmax(180px, 1fr) 72px 78px 180px 36px;
1891
- align-items: center;
1892
- min-height: 44px;
1893
- padding: 7px 10px 7px 13px;
1894
- color: var(--muted);
1895
- font-family: var(--mono);
1896
- font-size: 10.5px;
1897
- }
1898
- .workspace-file-name {
1899
- display: flex;
1900
- align-items: center;
1901
- min-width: 0;
1902
- gap: 8px;
1903
- color: var(--ink);
1904
- font-family: var(--sans);
1905
- font-size: 12.5px;
1906
- font-weight: 550;
1907
- }
1908
- .workspace-file-name span {
1909
- overflow: hidden;
1910
- text-overflow: ellipsis;
1911
- white-space: nowrap;
1912
- }
1913
- .workspace-file-type {
1914
- width: fit-content;
1915
- padding: 1px 6px;
1916
- border-radius: 999px;
1917
- background: var(--accent-soft);
1918
- color: var(--accent-strong);
1919
- text-transform: uppercase;
1920
- }
1921
- .workspace-download {
1922
- display: inline-flex;
1923
- align-items: center;
1924
- justify-content: center;
1925
- width: 30px;
1926
- height: 30px;
1927
- border-radius: 7px;
1928
- color: var(--muted);
1929
- }
1930
- .workspace-download:hover {
1931
- background: var(--accent-soft);
1932
- color: var(--accent-strong);
1933
- }
1934
- .workspace-unpublished {
1935
- color: #9ca3af;
1936
- text-align: center;
1937
- }
1938
-
1939
- .workspace-header {
1940
- display: flex;
1941
- align-items: center;
1942
- justify-content: space-between;
1943
- gap: 16px;
1944
- flex-wrap: wrap;
1945
- }
1946
- .workspace-toggle {
1947
- display: inline-flex;
1948
- align-items: center;
1949
- padding: 2px;
1950
- border: 1px solid var(--line);
1951
- border-radius: 999px;
1952
- background: #fafafa;
1953
- }
1954
- .workspace-toggle-btn {
1955
- padding: 4px 13px;
1956
- border: 0;
1957
- border-radius: 999px;
1958
- background: transparent;
1959
- color: var(--muted);
1960
- font-family: var(--sans);
1961
- font-size: 12px;
1962
- font-weight: 600;
1963
- cursor: pointer;
1964
- }
1965
- .workspace-toggle-btn:hover {
1966
- color: var(--accent-strong);
1967
- }
1968
- .workspace-toggle-btn.is-active {
1969
- background: var(--accent);
1970
- color: #ffffff;
1971
- }
1972
- .workspace-group + .workspace-group {
1973
- margin-top: 18px;
1974
- }
1975
- .workspace-group-head,
1976
- .workspace-hub-group-head {
1977
- display: flex;
1978
- align-items: center;
1979
- gap: 8px;
1980
- margin: 0;
1981
- padding: 8px 13px;
1982
- background: #fafafa;
1983
- border-bottom: 1px solid var(--line);
1984
- color: var(--ink);
1985
- font-family: var(--sans);
1986
- font-size: 12px;
1987
- font-weight: 650;
1988
- text-transform: capitalize;
1989
- }
1990
- .workspace-group-count,
1991
- .workspace-hub-count {
1992
- padding: 0 7px;
1993
- border-radius: 999px;
1994
- background: var(--accent-soft);
1995
- color: var(--accent-strong);
1996
- font-family: var(--mono);
1997
- font-size: 10.5px;
1998
- }
1999
- .workspace-group {
2000
- overflow: hidden;
2001
- border: 1px solid var(--line);
2002
- border-radius: 11px;
2003
- background: rgba(255, 255, 255, 0.92);
2004
- }
2005
-
2006
- .workspace-hub {
2007
- margin-top: 28px;
2008
- }
2009
- .workspace-hub-title {
2010
- margin: 0 0 14px;
2011
- font-family: var(--sans);
2012
- font-size: 16px;
2013
- font-weight: 700;
2014
- color: var(--ink);
2015
- }
2016
- .workspace-hub-group {
2017
- overflow: hidden;
2018
- border: 1px solid var(--line);
2019
- border-radius: 11px;
2020
- background: rgba(255, 255, 255, 0.92);
2021
- }
2022
- .workspace-hub-group + .workspace-hub-group {
2023
- margin-top: 14px;
2024
- }
2025
- .workspace-hub-list {
2026
- display: flex;
2027
- flex-direction: column;
2028
- }
2029
- .workspace-hub-link {
2030
- padding: 9px 13px;
2031
- color: var(--accent-strong);
2032
- font-family: var(--mono);
2033
- font-size: 12px;
2034
- text-decoration: none;
2035
- overflow: hidden;
2036
- text-overflow: ellipsis;
2037
- white-space: nowrap;
2038
- }
2039
- .workspace-hub-link + .workspace-hub-link {
2040
- border-top: 1px solid var(--line);
2041
- }
2042
- .workspace-hub-link:hover {
2043
- background: var(--accent-soft);
2044
- text-decoration: underline;
2045
- }
2046
-
2047
- /* --- UI nits --- */
2048
- /* Flush group headers: #page h3/h2 (ID selectors) otherwise inject a top margin
2049
- that, with overflow:hidden on the card, shows as whitespace above "Jobs" etc. */
2050
- #page .workspace-hub-title {
2051
- margin: 0 0 14px;
2052
- }
2053
- #page .workspace-hub-group-head,
2054
- #page .workspace-group-head {
2055
- margin: 0;
2056
- }
2057
- /* HF brand logo before the "Hugging Face artifacts" heading */
2058
- .workspace-hub-title {
2059
- display: flex;
2060
- align-items: center;
2061
- gap: 9px;
2062
- }
2063
- .workspace-hub-logo {
2064
- width: 22px;
2065
- height: 22px;
2066
- flex: none;
2067
- }
2068
- /* Center empty-state placeholders (heading, body, command) */
2069
- .view-empty {
2070
- display: flex;
2071
- flex-direction: column;
2072
- align-items: center;
2073
- }
2074
- #page .view-empty h2,
2075
- #page .view-empty p {
2076
- text-align: center;
2077
- }
2078
-
2079
  @media (max-width: 720px) {
2080
  #app {
2081
  flex-direction: column;
@@ -2092,46 +1587,11 @@ table.board tr.linked-row:hover a {
2092
  padding: 28px 20px 80px;
2093
  overflow-x: hidden;
2094
  }
2095
- #view-tabs {
2096
- margin: 0 0 20px;
2097
- gap: 18px;
2098
- justify-content: flex-start;
2099
- overflow-x: auto;
2100
- }
2101
- #view-tabs a {
2102
- flex: 0 0 auto;
2103
- }
2104
- .trace-timeline::before {
2105
- left: 16px;
2106
- }
2107
- .trace-entry {
2108
- grid-template-columns: 32px minmax(0, 1fr);
2109
- margin-left: calc(var(--trace-depth) * 10px);
2110
- }
2111
- .trace-rail {
2112
- padding: 0;
2113
- }
2114
- .trace-number,
2115
- .trace-elapsed {
2116
- display: none;
2117
- }
2118
- .trace-dot {
2119
- top: 10px;
2120
- right: 10px;
2121
- }
2122
- .workspace-file {
2123
- grid-template-columns: minmax(150px, 1fr) 66px 34px;
2124
- }
2125
- .workspace-file-size,
2126
- .workspace-file-time {
2127
- display: none;
2128
- }
2129
  #page {
2130
  width: 100%;
2131
  max-width: 100%;
2132
  }
2133
- #page h1,
2134
- #logbook-title {
2135
  font-size: 30px;
2136
  }
2137
  .cell-head {
 
1
  :root {
2
  --bg: #ffffff;
3
+ --paper: #fdfcf9;
4
  --panel: #ffffff;
5
  --ink: #1f2937;
6
  --muted: #6b7280;
 
9
  --accent-strong: #ea580c;
10
  --accent-soft: #fff7ed;
11
  --accent-line: rgba(249, 115, 22, 0.16);
12
+ --grid-line: rgba(31, 41, 55, 0.045);
13
  --code-bg: #f3f4f6;
14
  --radius: 12px;
 
 
15
  --serif: ui-serif, "Iowan Old Style", "Palatino Linotype", Georgia, serif;
16
  --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial,
17
  sans-serif;
 
31
 
32
  html {
33
  scroll-behavior: smooth;
 
34
  }
35
 
36
  body {
 
47
  min-height: 100vh;
48
  }
49
 
 
 
 
 
 
50
  /* ---- sidebar (composition-book cover) ---- */
51
  #sidebar {
52
+ width: 280px;
53
+ flex: 0 0 280px;
54
  background: #17181c;
55
  color: #e7e7ea;
56
  position: sticky;
 
97
  padding-top: 8px;
98
  }
99
 
 
 
 
 
 
 
 
 
 
100
  #tree a {
101
  display: block;
102
  padding: 6px 10px;
 
105
  text-decoration: none;
106
  font-size: 14px;
107
  transition: background 0.12s, color 0.12s;
 
 
 
108
  }
109
 
110
  #tree a:hover {
 
143
  #content {
144
  flex: 1;
145
  min-width: 0;
146
+ padding: 48px 40px 120px;
 
 
 
 
 
 
147
  background-color: var(--paper);
148
  background-image:
149
  linear-gradient(var(--grid-line) 1px, transparent 1px),
 
152
  background-position: center top;
153
  }
154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  #page {
156
  width: 100%;
157
  min-width: 0;
158
+ max-width: 1052px;
159
  margin: 0 auto;
160
  }
161
 
 
170
  }
171
 
172
  .page-layout {
173
+ display: grid;
174
+ grid-template-columns: minmax(0, 760px) 248px;
175
+ gap: 44px;
176
+ align-items: start;
177
  }
178
 
179
  .page-body {
 
188
 
189
  /* ---- pinned notes ---- */
190
  .pinned-notes {
191
+ margin: 30px 0 0;
192
  }
193
  .pinned-notes-list .cell {
194
  margin: 0;
195
+ border-color: rgba(249, 115, 22, 0.55);
 
 
 
 
 
 
 
 
 
 
 
196
  }
197
  .pinned-notes-list .cell + .cell {
198
  margin-top: 12px;
199
  }
200
+ .cell.pinned-source {
201
+ border-color: rgba(249, 115, 22, 0.55);
202
+ }
203
  .book-intro.has-pinned-notes {
204
  border-bottom: none;
205
  padding-bottom: 22px;
 
376
  /* ---- notebook-style cells ---- */
377
  .cell {
378
  max-width: 100%;
379
+ border: 1px solid var(--line);
380
+ border-radius: 10px;
381
+ background: rgba(255, 255, 255, 0.86);
382
+ margin: 18px 0;
383
+ overflow: hidden;
384
+ box-shadow: 0 2px 10px rgba(31, 41, 55, 0.035);
385
  }
386
  .cell-head {
387
  display: flex;
388
  justify-content: space-between;
389
  gap: 16px;
390
+ align-items: center;
391
+ padding: 14px 18px;
392
+ background: rgba(255, 255, 255, 0.92);
393
+ border-bottom: 1px solid var(--line);
394
  }
395
  .cell-head.no-title {
396
  justify-content: flex-end;
397
+ padding-top: 10px;
398
+ padding-bottom: 10px;
399
  }
400
  .cell-title {
401
  flex: 1;
 
427
  }
428
  .cell-body {
429
  min-width: 0;
430
+ padding: 14px 18px 18px;
431
  }
432
  .cell.dashboard .cell-body {
433
  padding: 0;
 
447
  #page .cell-body > :last-child {
448
  margin-bottom: 0;
449
  }
450
+ .cell.code .cell-head {
451
+ background: #fbfbfc;
452
+ }
453
  .figure-fit {
454
  position: relative;
455
  overflow: hidden;
 
622
  border: 1px solid var(--line);
623
  border-radius: 10px;
624
  overflow: hidden;
625
+ margin: 12px 0;
626
  background: var(--panel);
627
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
628
  .jp-gutter {
629
  flex: 0 0 46px;
630
  padding: 13px 0 0 13px;
 
652
  border-radius: 0;
653
  background: none;
654
  padding: 12px 16px 12px 0;
 
 
655
  }
656
  .jp-in-body .code-accordion {
657
  margin: 0;
 
1055
  align-items: center;
1056
  flex-wrap: wrap;
1057
  gap: 8px;
1058
+ margin: 4px 0 22px;
1059
  font-size: 12.5px;
1060
  color: var(--muted);
1061
  }
1062
+ #page .agent-hint code {
 
 
1063
  background: var(--code-bg);
1064
  padding: 2px 9px;
1065
  border-radius: 6px;
 
1067
  font-size: 12px;
1068
  font-weight: 500;
1069
  color: var(--ink);
 
 
 
1070
  }
1071
  .agent-hint .copy {
1072
  flex: 0 0 auto;
 
1094
  font-size: 12px;
1095
  color: var(--muted);
1096
  }
1097
+
1098
+ /* ---- logbook summary stats ---- */
1099
+ .logbook-stats {
1100
  display: flex;
 
1101
  flex-wrap: wrap;
1102
+ gap: 12px;
1103
+ margin: 0 0 28px;
 
1104
  }
1105
+ .stat-tile {
1106
+ position: relative;
1107
  display: inline-flex;
1108
  align-items: center;
1109
+ gap: 11px;
1110
+ border: 1px solid var(--line);
1111
+ background: var(--panel);
1112
+ border-radius: var(--radius);
1113
+ padding: 12px 23px;
1114
+ font: inherit;
1115
+ text-align: left;
1116
+ cursor: pointer;
1117
+ transition: border-color 0.12s, box-shadow 0.12s;
1118
+ }
1119
+ .stat-tile:hover:not([disabled]) {
1120
+ border-color: rgba(249, 115, 22, 0.45);
1121
+ box-shadow: 0 3px 12px rgba(31, 41, 55, 0.06);
1122
+ }
1123
+ .stat-tile:focus-visible {
1124
+ outline: 2px solid var(--accent);
1125
+ outline-offset: 2px;
1126
+ }
1127
+ .stat-tile[disabled] {
1128
+ cursor: default;
1129
+ opacity: 0.7;
1130
+ }
1131
+ .stat-tile.open {
1132
+ border-color: rgba(249, 115, 22, 0.6);
1133
+ box-shadow: 0 3px 12px rgba(31, 41, 55, 0.08);
1134
+ }
1135
+ .stat-icon {
1136
+ width: 24px;
1137
+ height: 24px;
1138
+ flex: 0 0 24px;
1139
+ object-fit: contain;
1140
+ align-self: center;
1141
+ }
1142
+ .stat-text {
1143
+ display: flex;
1144
+ align-items: baseline;
1145
+ gap: 8px;
1146
+ white-space: nowrap;
1147
+ line-height: 1;
1148
+ }
1149
+ .stat-num {
1150
  font-family: var(--mono);
1151
+ font-size: 20px;
1152
+ font-weight: 600;
1153
+ line-height: 1;
1154
+ color: var(--accent-strong);
1155
+ }
1156
+ .stat-label {
1157
+ font-size: 15px;
1158
+ line-height: 1;
1159
+ color: var(--muted);
1160
+ }
1161
+ .stat-caret {
1162
+ margin-left: 2px;
1163
+ font-size: 10px;
1164
+ color: var(--muted);
1165
+ align-self: center;
1166
+ transition: transform 0.12s;
1167
+ }
1168
+ .stat-tile.open .stat-caret {
1169
+ transform: rotate(180deg);
1170
+ }
1171
+ .stat-popover {
1172
+ position: absolute;
1173
+ top: 100%;
1174
+ left: 0;
1175
+ margin-top: 6px;
1176
+ min-width: 300px;
1177
+ max-width: min(460px, 92vw);
1178
+ max-height: 340px;
1179
+ overflow-y: auto;
1180
+ z-index: 20;
1181
+ background: var(--panel);
1182
+ border: 1px solid var(--line);
1183
+ border-radius: var(--radius);
1184
+ box-shadow: 0 8px 28px rgba(31, 41, 55, 0.12);
1185
+ padding: 6px;
1186
+ }
1187
+ .stat-popover[hidden] {
1188
+ display: none;
1189
+ }
1190
+ .stat-pop-head {
1191
+ padding: 6px 10px 8px;
1192
+ font-size: 11.5px;
1193
+ font-weight: 700;
1194
+ letter-spacing: 0.03em;
1195
+ text-transform: uppercase;
1196
+ color: var(--muted);
1197
+ }
1198
+ .stat-row {
1199
+ display: flex;
1200
+ align-items: flex-start;
1201
+ gap: 10px;
1202
+ padding: 9px 11px;
1203
+ border-radius: 9px;
1204
+ border: 1px solid transparent;
1205
  text-decoration: none;
1206
+ color: inherit;
1207
+ cursor: pointer;
1208
  }
1209
+ .stat-row:hover {
1210
+ border-color: rgba(249, 115, 22, 0.4);
1211
+ background: var(--accent-soft);
 
1212
  }
1213
+ .stat-row-ico {
1214
+ font-size: 15px;
1215
+ line-height: 1.3;
1216
  flex: 0 0 auto;
 
 
 
 
 
1217
  }
1218
+ .stat-row-main {
1219
+ min-width: 0;
1220
+ flex: 1;
1221
+ }
1222
+ .stat-row-title {
1223
+ font-family: var(--mono);
1224
+ font-size: 12.5px;
1225
+ font-weight: 600;
1226
+ color: var(--ink);
1227
+ overflow: hidden;
1228
+ text-overflow: ellipsis;
1229
+ white-space: nowrap;
1230
+ }
1231
+ .stat-row-meta {
1232
+ margin-top: 2px;
1233
+ font-size: 12px;
1234
+ color: var(--muted);
1235
+ }
1236
+ .stat-row-state.open {
1237
+ color: var(--accent);
1238
+ font-weight: 600;
1239
+ border-radius: 5px;
1240
+ padding: 1px 5px;
1241
+ margin: -1px -2px;
1242
  }
1243
+ .stat-row-state.open:hover {
1244
+ background: rgba(249, 115, 22, 0.14);
1245
+ text-decoration: underline;
1246
  }
1247
  .art-ico {
1248
  width: 1em;
 
1250
  object-fit: contain;
1251
  vertical-align: -0.15em;
1252
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1253
 
1254
  /* ---- scroll-to-resource highlight ---- */
1255
  .res-flash {
 
1294
  font-size: 1.05em;
1295
  line-height: 1;
1296
  }
1297
+ #page .res-chip:hover,
1298
+ #page .res-chip.res-hl {
1299
+ border-color: var(--accent);
1300
+ background: var(--accent-soft);
1301
+ color: var(--accent-strong);
1302
+ }
1303
+ #page a.res-link.res-hl {
1304
+ background: var(--accent-soft);
1305
+ border-radius: 4px;
1306
+ }
1307
+ .rail-item.res-hl {
1308
+ border-color: var(--accent);
1309
+ background: var(--accent-soft);
1310
+ box-shadow: 0 3px 12px rgba(249, 115, 22, 0.14);
1311
+ }
1312
+ .rail-item.res-hl .rail-title {
1313
+ color: var(--accent-strong);
1314
+ }
1315
+ .rail-item.rail-local {
1316
+ cursor: default;
1317
+ }
1318
+ .artifact-chip.res-hl {
1319
  border-color: var(--accent);
1320
  background: var(--accent-soft);
1321
+ }
1322
+
1323
+ /* ---- contextual resources rail ---- */
1324
+ .context-rail {
1325
+ position: relative;
1326
+ width: 248px;
1327
+ }
1328
+ .context-rail[hidden] {
1329
+ display: none;
1330
+ }
1331
+ .rail-kind {
1332
+ display: flex;
1333
+ align-items: center;
1334
+ gap: 5px;
1335
+ font-family: var(--mono);
1336
+ font-size: 10px;
1337
+ text-transform: uppercase;
1338
+ letter-spacing: 0.08em;
1339
+ font-weight: 600;
1340
+ color: var(--accent);
1341
+ margin-bottom: 4px;
1342
+ }
1343
+ .rail-item {
1344
+ position: absolute;
1345
+ left: 0;
1346
+ right: 0;
1347
+ display: block;
1348
+ border: 1px solid var(--line);
1349
+ border-radius: 10px;
1350
+ background: var(--panel);
1351
+ padding: 9px 12px;
1352
+ margin-bottom: 8px;
1353
+ text-decoration: none;
1354
+ color: inherit;
1355
+ transition: border-color 0.14s, box-shadow 0.14s;
1356
+ }
1357
+ .rail-item:hover {
1358
+ border-color: rgba(249, 115, 22, 0.45);
1359
+ box-shadow: 0 3px 12px rgba(31, 41, 55, 0.06);
1360
+ }
1361
+ .rail-title {
1362
+ font-family: var(--mono);
1363
+ font-size: 12.5px;
1364
+ font-weight: 600;
1365
+ color: var(--ink);
1366
+ overflow-wrap: anywhere;
1367
+ line-height: 1.4;
1368
+ }
1369
+ .rail-item:hover .rail-title {
1370
  color: var(--accent-strong);
1371
  }
1372
+ .rail-meta {
1373
+ font-size: 11.5px;
1374
+ color: var(--muted);
1375
+ margin-top: 2px;
1376
+ }
1377
+
1378
+ @media (max-width: 1400px) {
1379
+ .page-layout {
1380
+ display: block;
1381
+ }
1382
+ .context-rail {
1383
+ width: 100%;
1384
+ margin-top: 28px;
1385
+ position: static;
1386
+ min-height: 0 !important;
1387
+ display: grid;
1388
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1389
+ gap: 10px;
1390
+ }
1391
+ .context-rail[hidden] {
1392
+ display: none;
1393
+ }
1394
+ .context-rail .rail-item {
1395
+ position: static;
1396
+ margin-bottom: 0;
1397
+ }
1398
+ }
1399
 
1400
  /* ---- connect footer + modal ---- */
1401
  #sidebar-foot {
 
1571
  color: #52d08a;
1572
  }
1573
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1574
  @media (max-width: 720px) {
1575
  #app {
1576
  flex-direction: column;
 
1587
  padding: 28px 20px 80px;
1588
  overflow-x: hidden;
1589
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1590
  #page {
1591
  width: 100%;
1592
  max-width: 100%;
1593
  }
1594
+ #page h1 {
 
1595
  font-size: 30px;
1596
  }
1597
  .cell-head {
logbook.js CHANGED
@@ -4,12 +4,9 @@
4
  let MANIFEST = null;
5
  const PAGE_CACHE = {};
6
  const UNFURL_CACHE = {};
7
- const DATA_CACHE = {};
8
  const LIVE_RELOAD_MS = 1500;
9
  const FIGURE_FRAME_WINDOWS = new Set();
10
  let FIGURE_NAVIGATION_READY = false;
11
- let CURRENT_VIEW = null;
12
- let RENDER_SEQUENCE = 0;
13
 
14
  function esc(s) {
15
  return String(s)
@@ -289,10 +286,6 @@
289
  /(trackio-artifact:\/\/\S+|trackio-local-path:\/\/\S+|https:\/\/huggingface\.co\/buckets\/[^\s<)]+#\S+)/
290
  );
291
  if (chip && uri) chip.dataset.resUrl = uri[1];
292
- if (chip && meta.path) {
293
- const ico = chip.querySelector(".art-ico");
294
- if (ico) ico.outerHTML = FILE_ICON;
295
- }
296
  } else if (meta.type === "dashboard") {
297
  const sp = body.match(/https:\/\/huggingface\.co\/spaces\/[^\s<>)"'`]+/);
298
  cell.dataset.resUrl = sp
@@ -502,7 +495,7 @@
502
  if (!message || message.type !== "trackio-logbook:navigate") return;
503
  const target = String(message.target || "").replace(/^#?\//, "");
504
  if (!target || !MANIFEST || !findNode(MANIFEST.root, target)) return;
505
- const hash = "#/view/code/" + target;
506
  if (location.hash === hash) scrollToHash();
507
  else location.hash = hash;
508
  });
@@ -514,15 +507,6 @@
514
  '<path d="M8 3H3v5M16 3h5v5M21 16v5h-5M3 16v5h5"/>' +
515
  '<path d="M3 8 8 3M16 3l5 5M21 16l-5 5M8 21l-5-5"/></svg>';
516
 
517
- const PIN_ICON =
518
- '<svg class="pin-ico" viewBox="0 0 24 24" aria-hidden="true">' +
519
- '<path d="M16 9V4h1c.55 0 1-.45 1-1s-.45-1-1-1H7c-.55 0-1 .45-1 1s.45 1 1 1h1v5c0 ' +
520
- '1.66-1.34 3-3 3v2h5.97v7l1 1 1-1v-7H19v-2c-1.66 0-3-1.34-3-3z"/></svg>';
521
-
522
- const FILE_ICON =
523
- '<svg class="art-file-ico" viewBox="0 0 24 24" aria-hidden="true">' +
524
- '<path d="M6 3.5h8l4 4V20H6zM14 3.5V8h4"/></svg>';
525
-
526
  // Figures are rendered in same-origin iframes, so fullscreen the fitted
527
  // wrapper rather than the iframe document. This uses the browser's native
528
  // fullscreen UI and preserves the figure's existing responsive sizing.
@@ -651,38 +635,13 @@
651
  ? `<span class="out-artifact-state open">Open ↗</span>`
652
  : `<span class="out-artifact-state">publish to share</span>`;
653
  const meta = parts.length ? `${parts.join(" · ")} · ${state}` : state;
654
- const icon = info.isPathRef ? FILE_ICON : ARTIFACT_ICON_IMG;
655
  el.innerHTML =
656
- `<span class="out-artifact-ico">${icon}</span>` +
657
  `<span class="out-artifact-name">${esc(info.name)}</span>` +
658
  `<span class="out-artifact-meta">${meta}</span>`;
659
  return el;
660
  }
661
 
662
- function isShellCommand(part) {
663
- return (
664
- part.kind === "code" &&
665
- part.lang === "bash" &&
666
- !part.title &&
667
- /^\s*\$\s/.test(part.text)
668
- );
669
- }
670
-
671
- function renderCommandLine(text) {
672
- const command = text.trim().replace(/^\$\s*/, "");
673
- const el = document.createElement("div");
674
- el.className = "jp-cmd";
675
- const prompt = document.createElement("span");
676
- prompt.className = "jp-cmd-prompt";
677
- prompt.textContent = "$";
678
- const code = document.createElement("code");
679
- code.textContent = command;
680
- el.appendChild(prompt);
681
- el.appendChild(code);
682
- el.appendChild(copySnippetBtn(command));
683
- return el;
684
- }
685
-
686
  function renderCodeCell(body, container, artifacts) {
687
  const parts = parseFences(body);
688
  const block = document.createElement("div");
@@ -735,13 +694,7 @@
735
  embedTexts.push(part.text);
736
  return;
737
  }
738
- if (isShellCommand(part)) {
739
- inputBody.appendChild(renderCommandLine(part.text));
740
- } else {
741
- inputBody.appendChild(
742
- renderCode(part.text, part.lang, part.title, Boolean(part.title))
743
- );
744
- }
745
  });
746
  if (artifacts && artifacts.length) {
747
  ensureOut();
@@ -960,13 +913,13 @@
960
  return btn;
961
  }
962
 
963
- function renderCode(code, lang, title, open) {
964
  const pre = document.createElement("pre");
965
  pre.className = "hl";
966
  const c = document.createElement("code");
967
  c.innerHTML = highlightCode(code, lang);
968
  pre.appendChild(c);
969
- if (!title || open) {
970
  const wrap = document.createElement("div");
971
  wrap.className = "snippet";
972
  wrap.appendChild(pre);
@@ -1030,7 +983,7 @@
1030
  });
1031
  }
1032
 
1033
- /* -------------------- resource classification -------------------- */
1034
 
1035
  function fmt(n) {
1036
  if (n == null) return null;
@@ -1058,6 +1011,18 @@
1058
  const ARTIFACT_ICON_IMG = `<img class="art-ico" src="./bucket-icon.svg" alt="" />`;
1059
  const DASHBOARD_ICON_IMG = `<img class="art-ico" src="./trackio-logo-light.png" alt="" />`;
1060
 
 
 
 
 
 
 
 
 
 
 
 
 
1061
  const HF_NON_MODEL_PREFIX =
1062
  /^(datasets|spaces|jobs|buckets|papers|blog|docs|api|posts|collections|organizations|settings|new|join|login|pricing|tasks|learn|chat|models)(\/|$)/;
1063
 
@@ -1065,23 +1030,6 @@
1065
  return url.split(marker)[1].split(/[?#]/)[0].replace(/\/$/, "");
1066
  }
1067
 
1068
- function validHfSegment(value) {
1069
- return Boolean(
1070
- value &&
1071
- value.length <= 96 &&
1072
- /^[A-Za-z0-9_.-]+$/.test(value) &&
1073
- !/^[.-]|[.-]$|--|\.\./.test(value)
1074
- );
1075
- }
1076
-
1077
- function validHfRepoId(parts) {
1078
- return (
1079
- parts.length === 2 &&
1080
- parts.join("/").length <= 96 &&
1081
- parts.every(validHfSegment)
1082
- );
1083
- }
1084
-
1085
  function classifyResource(url) {
1086
  if (IMG_URL.test(url)) {
1087
  return null;
@@ -1111,39 +1059,29 @@
1111
  local: true,
1112
  };
1113
  }
1114
- if ((m = url.match(/huggingface\.co\/buckets\/([^/#\s]+\/[^/#\s]+)#(.+)/))) {
1115
- if (!validHfRepoId(m[1].split("/"))) return null;
1116
- return { kind: "artifact", id: decodeURIComponent(m[2]), url };
1117
  }
1118
- if (/huggingface\.co\/datasets\//.test(url)) {
1119
- const parts = hfId(url, "/datasets/").split("/").slice(0, 2);
1120
- if (!validHfRepoId(parts)) return null;
1121
- return { kind: "dataset", id: parts.join("/"), url };
1122
  }
1123
- if (/huggingface\.co\/spaces\//.test(url)) {
1124
- const parts = hfId(url, "/spaces/").split("/").slice(0, 2);
1125
- if (!validHfRepoId(parts)) return null;
1126
- return { kind: "space", id: parts.join("/"), url };
1127
  }
1128
  if (/huggingface\.co\/jobs\//.test(url)) {
1129
- const parts = hfId(url, "/jobs/").split("/").slice(0, 2);
1130
- if (!validHfRepoId(parts)) return null;
1131
- const jid = parts[1];
1132
  return {
1133
  kind: "job",
1134
- id: parts[0] + ` · ${jid.slice(0, 12)}${jid.length > 12 ? "…" : ""}`,
1135
  url,
1136
  };
1137
  }
1138
  if (/huggingface\.co\/buckets\//.test(url)) {
1139
- const parts = hfId(url, "/buckets/").split("/").slice(0, 2);
1140
- if (!validHfRepoId(parts)) return null;
1141
- return { kind: "bucket", id: parts.join("/"), url };
1142
  }
1143
  if (/huggingface\.co\/papers\//.test(url)) {
1144
- const id = hfId(url, "/papers/").split("/")[0];
1145
- if (!validHfSegment(id)) return null;
1146
- return { kind: "paper", id: `Paper ${id}`, url };
1147
  }
1148
  if ((m = url.match(/arxiv\.org\/(?:abs|pdf)\/([^?#\s]+)/))) {
1149
  return { kind: "paper", id: `arXiv:${m[1].replace(/\.pdf$/, "")}`, url };
@@ -1153,13 +1091,324 @@
1153
  }
1154
  if ((m = url.match(/huggingface\.co\/([^?#]+)/))) {
1155
  const rest = m[1].replace(/\/$/, "");
1156
- if (validHfRepoId(rest.split("/")) && !HF_NON_MODEL_PREFIX.test(rest)) {
1157
  return { kind: "model", id: rest, url };
1158
  }
1159
  }
1160
  return null;
1161
  }
1162
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1163
  function dashboardSubdomainFromUrl(url) {
1164
  return spaceIdFromUrl(url).toLowerCase().replace(/[^a-z0-9-]/g, "-");
1165
  }
@@ -1274,15 +1523,11 @@
1274
  function buildTree() {
1275
  const tree = document.getElementById("tree");
1276
  tree.innerHTML = "";
1277
- const label = document.createElement("div");
1278
- label.className = "tree-label";
1279
- label.textContent = "Pages";
1280
- tree.appendChild(label);
1281
  const nodes = [];
1282
  (MANIFEST.root.children || []).forEach((c) => flattenTree(c, 0, nodes));
1283
  nodes.forEach(({ node, depth }) => {
1284
  const a = document.createElement("a");
1285
- a.href = "#/view/code/" + node.slug;
1286
  a.className = "depth-" + depth;
1287
  a.dataset.slug = node.slug;
1288
  const mark = document.createElement("span");
@@ -1294,47 +1539,6 @@
1294
  });
1295
  }
1296
 
1297
- function highlightTraceSession(sessionId) {
1298
- document.querySelectorAll("#tree a").forEach((link) => {
1299
- link.classList.toggle("active", link.dataset.sessionId === sessionId);
1300
- });
1301
- }
1302
-
1303
- function buildTraceTree(activeSessionId, traceSessions = MANIFEST.traces || []) {
1304
- const tree = document.getElementById("tree");
1305
- tree.innerHTML = "";
1306
- const sessions = traceSessions;
1307
- if (!sessions.length) return;
1308
- const label = document.createElement("div");
1309
- label.className = "tree-label";
1310
- label.textContent = "Sessions";
1311
- tree.appendChild(label);
1312
- sessions.forEach((session) => {
1313
- const link = document.createElement("a");
1314
- link.href = "#" + traceSessionAnchor(session.id);
1315
- link.dataset.sessionId = session.id;
1316
- link.textContent = session.title || session.id;
1317
- link.title = session.title || session.id;
1318
- tree.appendChild(link);
1319
- });
1320
- highlightTraceSession(activeSessionId || sessions[0].id);
1321
- }
1322
-
1323
- function renderSidebar(route) {
1324
- if (route.view === "trace") {
1325
- highlight(null);
1326
- buildTraceTree(route.sessionId);
1327
- return;
1328
- }
1329
- if (route.view === "workspace") {
1330
- document.getElementById("tree").innerHTML = "";
1331
- highlight(null);
1332
- return;
1333
- }
1334
- buildTree();
1335
- highlight(route.slug);
1336
- }
1337
-
1338
  function highlight(slug) {
1339
  document
1340
  .querySelectorAll("#tree a")
@@ -1348,9 +1552,6 @@
1348
  Object.keys(PAGE_CACHE).forEach((key) => {
1349
  delete PAGE_CACHE[key];
1350
  });
1351
- Object.keys(DATA_CACHE).forEach((key) => {
1352
- delete DATA_CACHE[key];
1353
- });
1354
  }
1355
 
1356
  function isLocalPreview() {
@@ -1376,46 +1577,6 @@
1376
  return PAGE_CACHE[node.file];
1377
  }
1378
 
1379
- async function fetchData(file, cacheResult = true) {
1380
- if (cacheResult && DATA_CACHE[file]) return DATA_CACHE[file];
1381
- const suffix = isLocalPreview()
1382
- ? `?rev=${encodeURIComponent(MANIFEST.revision || "")}`
1383
- : "";
1384
- const response = await fetch("./" + file + suffix, { cache: "no-store" });
1385
- if (!response.ok) throw new Error(`Could not load ${file}`);
1386
- const data = await response.json();
1387
- if (cacheResult) DATA_CACHE[file] = data;
1388
- return data;
1389
- }
1390
-
1391
- async function fetchRemoteData(url, cacheResult = true) {
1392
- if (cacheResult && DATA_CACHE[url]) return DATA_CACHE[url];
1393
- const response = await fetch(url, { cache: "no-store" });
1394
- if (!response.ok) throw new Error(`Could not load ${url}`);
1395
- const data = await response.json();
1396
- if (cacheResult) DATA_CACHE[url] = data;
1397
- return data;
1398
- }
1399
-
1400
- function encodeRepoPath(path) {
1401
- return String(path || "")
1402
- .split("/")
1403
- .map((part) => encodeURIComponent(part))
1404
- .join("/");
1405
- }
1406
-
1407
- function repoFileUrl(ref, path) {
1408
- const revision = encodeURIComponent(ref.revision || "main");
1409
- const encodedPath = encodeRepoPath(path);
1410
- if (ref.repo_type === "dataset") {
1411
- return `https://huggingface.co/datasets/${ref.repo_id}/resolve/${revision}/${encodedPath}`;
1412
- }
1413
- if (ref.repo_type === "bucket") {
1414
- return `https://huggingface.co/buckets/${ref.repo_id}/resolve/${encodedPath}`;
1415
- }
1416
- return "";
1417
- }
1418
-
1419
  function allNodes() {
1420
  const nodes = [];
1421
  flattenTree(MANIFEST.root, 0, nodes);
@@ -1460,28 +1621,13 @@
1460
  cells.forEach(({ meta, body }) => {
1461
  const cell = renderCell(meta, body, list);
1462
  cell.classList.add("pinned-copy");
1463
- const title = cell.querySelector(".cell-title");
1464
- if (title) title.insertAdjacentHTML("afterbegin", PIN_ICON);
1465
  });
1466
  deck.appendChild(list);
1467
  const anchor =
1468
- container.querySelector(".agent-hint") ||
1469
- Array.from(container.children).find((el) => el.tagName === "H1");
1470
  container.insertBefore(deck, anchor ? anchor.nextSibling : container.firstChild);
1471
- const owner = container.closest(".page-section");
1472
- if (owner) owner.classList.add("has-pinned-notes");
1473
- }
1474
-
1475
- function isIndexPaperLink(el) {
1476
- if (!el || el.tagName !== "P") return false;
1477
- return Array.from(el.querySelectorAll("a[href]")).some((a) => {
1478
- const href = a.getAttribute("href") || "";
1479
- return (
1480
- /huggingface\.co\/papers\//.test(href) ||
1481
- /openreview\.net\//.test(href) ||
1482
- /arxiv\.org\//.test(href)
1483
- );
1484
- });
1485
  }
1486
 
1487
  function removeIndexProse(body) {
@@ -1490,11 +1636,7 @@
1490
  let current = h1.nextElementSibling;
1491
  while (current && current.tagName !== "H2") {
1492
  const next = current.nextElementSibling;
1493
- if (isIndexPaperLink(current)) {
1494
- current.classList.add("index-paper-link");
1495
- } else {
1496
- current.remove();
1497
- }
1498
  current = next;
1499
  }
1500
  }
@@ -1513,13 +1655,15 @@
1513
  }
1514
  }
1515
 
 
 
1516
  async function renderLogbook(opts = {}) {
1517
  const scrollY = window.scrollY;
1518
  const page = document.getElementById("page");
 
1519
  page.innerHTML = "";
1520
  const nodes = allNodes();
1521
  const markdown = await Promise.all(nodes.map(fetchPage));
1522
- if (opts.renderId && opts.renderId !== RENDER_SEQUENCE) return;
1523
  const pinnedCells = collectPinnedCells(markdown, nodes);
1524
  let bookIntroBody = null;
1525
  nodes.forEach((node, index) => {
@@ -1532,42 +1676,45 @@
1532
  layout.className = "page-layout";
1533
  const body = document.createElement("div");
1534
  body.className = "page-body";
 
 
 
1535
 
1536
  renderMarkdown(markdown[index], body);
1537
  if (node.slug === MANIFEST.root.slug) {
1538
  section.classList.add("book-intro");
1539
  removeIndexProse(body);
1540
  removePageDirectory(body);
 
1541
  const h1 = body.querySelector("h1");
1542
- if (h1 && h1.parentNode === body) h1.remove();
 
 
 
 
 
1543
  bookIntroBody = body;
1544
  }
1545
  layout.appendChild(body);
 
1546
  section.appendChild(layout);
1547
  page.appendChild(section);
 
 
 
 
 
 
 
1548
  });
1549
- const pinnedSlugs = Array.from(
1550
- new Set(pinnedCells.map((cell) => cell.node && cell.node.slug).filter(Boolean))
1551
- );
1552
- const pinnedTarget =
1553
- pinnedSlugs.length === 1
1554
- ? Array.from(page.querySelectorAll(".page-section"))
1555
- .find((section) => section.dataset.slug === pinnedSlugs[0])
1556
- ?.querySelector(".page-body")
1557
- : bookIntroBody;
1558
- if (pinnedTarget) renderPinnedNotes(pinnedCells, pinnedTarget);
1559
- // Pinned cells are promoted into one deck. Remove their source render so
1560
- // summaries, posters, and notes do not appear twice in the continuous view.
1561
- page
1562
- .querySelectorAll(".pinned-source:not(.pinned-copy)")
1563
- .forEach((cell) => cell.remove());
1564
  if (bookIntroBody) {
1565
  const section = bookIntroBody.closest(".book-intro");
1566
  const hasExtra = Array.from(bookIntroBody.children).some(
1567
  (el) =>
1568
  el.tagName !== "H1" &&
1569
  !el.classList.contains("agent-hint") &&
1570
- !el.classList.contains("index-paper-link") &&
1571
  !el.classList.contains("pinned-notes")
1572
  );
1573
  if (section && !section.classList.contains("has-pinned-notes") && !hasExtra) {
@@ -1584,6 +1731,29 @@
1584
  });
1585
  }
1586
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1587
  function fmtBytes(n) {
1588
  if (n == null || isNaN(n)) return null;
1589
  if (n < 1000) return `${n} B`;
@@ -1601,6 +1771,31 @@
1601
  return url.split("/spaces/")[1].split(/[?#]/)[0].replace(/\/$/, "");
1602
  }
1603
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1604
  function artifactInfoFromCell(meta, body) {
1605
  const name = meta.artifact || meta.path || "";
1606
  let size = null;
@@ -1625,1169 +1820,280 @@
1625
  };
1626
  }
1627
 
1628
- const VIEW_ROUTE = { trace: "#/view/trace", workspace: "#/view/workspace" };
1629
- const VIEW_TOKENS = {
1630
- code: "agent_view_tokens",
1631
- trace: "trace_view_tokens",
1632
- workspace: "workspace_view_tokens",
1633
- };
1634
-
1635
- function readTarget(view) {
1636
- const onSpaces =
1637
- /\.hf\.space$/.test(location.hostname) ||
1638
- /(^|\.)huggingface\.co$/.test(location.hostname);
1639
- let base = "";
1640
- if (onSpaces && MANIFEST.space_id) base = MANIFEST.space_id;
1641
- else if (/^https?:$/.test(location.protocol))
1642
- base = `${location.origin}${location.pathname}`;
1643
- if (!base) return "";
1644
- return base + (VIEW_ROUTE[view] || "");
1645
- }
1646
-
1647
- function renderLogbookHeader(view) {
1648
- const title = document.getElementById("logbook-title");
1649
- if (title) title.textContent = MANIFEST.title;
1650
- const cli = document.getElementById("logbook-cli");
1651
- if (!cli) return;
1652
- cli.innerHTML = "";
1653
- cli.appendChild(buildAgentHint(view));
1654
- const destination = buildHubDestinationLink(view);
1655
- if (destination) cli.appendChild(destination);
1656
- }
1657
-
1658
- function hubDestination(view) {
1659
- if (view === "trace" && MANIFEST.trace_dataset) {
1660
- return {
1661
- label: "View Hugging Face dataset:",
1662
- url: MANIFEST.trace_dataset,
1663
- fallback: "Agent Traces dataset",
1664
- };
1665
- }
1666
- if (view === "workspace") {
1667
- const bucketId = (MANIFEST.workspace || {}).bucket_id;
1668
- const url =
1669
- MANIFEST.workspace_bucket ||
1670
- (bucketId ? `https://huggingface.co/buckets/${bucketId}` : "");
1671
- if (url) {
1672
- return {
1673
- label: "View Hugging Face Bucket:",
1674
- url,
1675
- fallback: "Workspace Bucket",
1676
- };
1677
  }
1678
  }
1679
- return null;
1680
- }
1681
-
1682
- function buildHubDestinationLink(view) {
1683
- const destination = hubDestination(view);
1684
- if (!destination || !destination.url.startsWith("https://huggingface.co/")) {
1685
- return null;
1686
- }
1687
- const row = document.createElement("div");
1688
- row.className = "hub-destination";
1689
- const label = document.createElement("span");
1690
- label.textContent = destination.label;
1691
- const link = document.createElement("a");
1692
- link.href = destination.url;
1693
- link.target = "_blank";
1694
- link.rel = "noopener noreferrer";
1695
- link.textContent =
1696
- destination.url
1697
- .replace(/^https:\/\/huggingface\.co\/(?:datasets|buckets)\//, "")
1698
- .replace(/\/$/, "") || destination.fallback;
1699
- link.title = destination.url;
1700
- const icon = document.createElementNS("http://www.w3.org/2000/svg", "svg");
1701
- icon.setAttribute("viewBox", "0 0 24 24");
1702
- icon.setAttribute("aria-hidden", "true");
1703
- const path = document.createElementNS("http://www.w3.org/2000/svg", "path");
1704
- path.setAttribute("d", "M14 5h5v5M19 5l-8 8M19 13v5a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V6a1 1 0 0 1 1-1h5");
1705
- icon.appendChild(path);
1706
- link.appendChild(icon);
1707
- row.appendChild(label);
1708
- row.appendChild(link);
1709
- return row;
1710
- }
1711
-
1712
- function buildAgentHint(view) {
1713
- const target = readTarget(view);
1714
- const command = `trackio logbook read${target ? ` ${target}` : ""}`;
1715
- const tokens = MANIFEST[VIEW_TOKENS[view] || VIEW_TOKENS.code];
1716
- const div = document.createElement("div");
1717
- div.className = "agent-hint";
1718
- const label = document.createElement("span");
1719
- label.className = "agent-hint-label";
1720
- label.textContent = "Read from the CLI:";
1721
- const code = document.createElement("code");
1722
- code.textContent = command;
1723
- const copy = document.createElement("button");
1724
- copy.className = "copy";
1725
- copy.type = "button";
1726
- copy.title = "Copy";
1727
- copy.textContent = "⧉";
1728
- copy.addEventListener("click", () => copyText(command, copy, "⧉"));
1729
- const note = document.createElement("span");
1730
- note.className = "agent-hint-note";
1731
- note.textContent =
1732
- "compact view for agents" + (tokens ? ` · ~${fmt(tokens)} tokens` : "");
1733
- div.appendChild(label);
1734
- div.appendChild(code);
1735
- div.appendChild(copy);
1736
- div.appendChild(note);
1737
- return div;
1738
- }
1739
-
1740
- function routeState() {
1741
- const raw = (location.hash || "").replace(/^#\/?/, "");
1742
- if (!raw) return { view: "code", slug: MANIFEST.root.slug };
1743
- const parts = raw.split("/");
1744
- if (parts[0] !== "view") {
1745
- const slug = findNode(MANIFEST.root, raw) ? raw : MANIFEST.root.slug;
1746
- return { view: "code", slug };
1747
- }
1748
- if (parts[1] === "trace") {
1749
- return { view: "trace", sessionId: parts.slice(2).join("/") || null };
1750
- }
1751
- if (parts[1] === "workspace") return { view: "workspace" };
1752
- const candidate = parts.slice(2).join("/") || MANIFEST.root.slug;
1753
- return {
1754
- view: "code",
1755
- slug: findNode(MANIFEST.root, candidate) ? candidate : MANIFEST.root.slug,
1756
- };
1757
- }
1758
-
1759
- function updateViewTabs(route = routeState()) {
1760
- document.querySelectorAll("#view-tabs a").forEach((tab) => {
1761
- const view = tab.dataset.view;
1762
- tab.classList.toggle("active", view === route.view);
1763
- tab.setAttribute("aria-current", view === route.view ? "page" : "false");
1764
- if (view === "code") {
1765
- const slug = route.view === "code" ? route.slug : MANIFEST.root.slug;
1766
- tab.href = `#/view/code/${slug}`;
1767
- } else if (view === "trace") {
1768
- tab.href = "#/view/trace";
1769
  }
1770
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1771
  }
1772
 
1773
- function setActiveView(route) {
1774
- CURRENT_VIEW = route.view;
1775
- document.body.dataset.view = route.view;
1776
- updateViewTabs(route);
1777
- renderLogbookHeader(route.view);
1778
- renderSidebar(route);
1779
- }
1780
-
1781
- function formatDuration(ms) {
1782
- if (ms == null || isNaN(ms)) return "—";
1783
- const total = Math.max(0, Math.floor(ms / 1000));
1784
- const hours = Math.floor(total / 3600);
1785
- const minutes = Math.floor((total % 3600) / 60);
1786
- const seconds = total % 60;
1787
- if (hours) return `${hours}h ${minutes}m ${seconds}s`;
1788
- if (minutes) return `${minutes}m ${seconds}s`;
1789
- return `${seconds}s`;
1790
  }
1791
 
1792
- function formatDate(value) {
1793
- if (!value) return "—";
1794
- const date = new Date(value);
1795
- if (isNaN(date.getTime())) return value;
1796
- return date.toLocaleString([], {
1797
- year: "numeric",
1798
- month: "short",
1799
- day: "numeric",
1800
- hour: "numeric",
1801
- minute: "2-digit",
1802
- second: "2-digit",
1803
  });
1804
  }
1805
 
1806
- function emptyView(title, text, command) {
1807
- const empty = document.createElement("div");
1808
- empty.className = "view-empty";
1809
- const heading = document.createElement("h2");
1810
- heading.textContent = title;
1811
- const body = document.createElement("p");
1812
- body.textContent = text;
1813
- empty.appendChild(heading);
1814
- empty.appendChild(body);
1815
- if (command) {
1816
- const code = document.createElement("code");
1817
- code.textContent = command;
1818
- empty.appendChild(code);
1819
- }
1820
- return empty;
1821
- }
1822
-
1823
- function traceEventLabel(event) {
1824
- if (event.kind === "reasoning") return "Thought";
1825
- if (event.kind === "tool_call") return event.tool_name || event.title || "Tool";
1826
- if (event.kind === "tool_result") return "Tool output";
1827
- return event.title || event.kind || "Event";
1828
- }
1829
-
1830
- function appendTraceResult(entry, result) {
1831
- if (!entry || !result || !result.output) return;
1832
- const card = entry.querySelector(".trace-card");
1833
- if (!card) return;
1834
- const details = document.createElement("details");
1835
- details.className = "trace-output";
1836
- const summary = document.createElement("summary");
1837
- summary.textContent = result.status === "error" ? "Error output" : "Output";
1838
- const output = document.createElement("pre");
1839
- output.textContent = result.output;
1840
- details.appendChild(summary);
1841
- details.appendChild(output);
1842
- card.appendChild(details);
1843
- }
1844
-
1845
- function traceEventCard(event, result) {
1846
- const entry = document.createElement("div");
1847
- entry.className = `trace-entry trace-${event.kind || "status"}`;
1848
- entry.style.setProperty("--trace-depth", Math.min(Number(event.depth) || 0, 4));
1849
-
1850
- const rail = document.createElement("div");
1851
- rail.className = "trace-rail";
1852
- const number = document.createElement("span");
1853
- number.className = "trace-number";
1854
- number.textContent = `#${event.sequence || ""}`;
1855
- const dot = document.createElement("span");
1856
- dot.className = "trace-dot";
1857
- const elapsed = document.createElement("span");
1858
- elapsed.className = "trace-elapsed";
1859
- elapsed.textContent = formatDuration(event.elapsed_ms);
1860
- rail.appendChild(number);
1861
- rail.appendChild(dot);
1862
- rail.appendChild(elapsed);
1863
-
1864
- const card = document.createElement("article");
1865
- card.className = "trace-card";
1866
- const head = document.createElement("header");
1867
- const kind = document.createElement("span");
1868
- kind.className = "trace-kind";
1869
- kind.textContent = traceEventLabel(event);
1870
- head.appendChild(kind);
1871
- if (event.turn) {
1872
- const turn = document.createElement("span");
1873
- turn.className = "trace-turn";
1874
- turn.textContent = `turn ${event.turn}`;
1875
- head.appendChild(turn);
1876
- }
1877
- card.appendChild(head);
1878
-
1879
- const bodyText = event.text || event.input || event.output;
1880
- if (bodyText) {
1881
- const body = document.createElement(
1882
- event.kind === "tool_call" || event.kind === "tool_result" ? "pre" : "div"
1883
- );
1884
- body.className = "trace-body";
1885
- body.textContent = bodyText;
1886
- card.appendChild(body);
1887
- }
1888
- if (event.status) {
1889
- const status = document.createElement("span");
1890
- status.className = `trace-status-badge trace-status-badge-${event.status}`;
1891
- status.textContent = String(event.status).replace(/_/g, " ");
1892
- head.appendChild(status);
1893
- }
1894
- entry.appendChild(rail);
1895
- entry.appendChild(card);
1896
- appendTraceResult(entry, result);
1897
- return entry;
1898
- }
1899
-
1900
- function traceSessionAnchor(id) {
1901
- return "/view/trace/" + id;
1902
  }
1903
 
1904
- function buildTraceSession(session, index, loadTraceData = fetchData) {
1905
- const sec = document.createElement("section");
1906
- sec.className = "trace-session";
1907
- sec.id = traceSessionAnchor(session.id);
1908
- sec.dataset.sessionId = session.id;
1909
-
1910
- const title = document.createElement("h2");
1911
- title.className = "trace-session-title";
1912
- title.textContent = session.title || session.id;
1913
- sec.appendChild(title);
1914
-
1915
- const meta = document.createElement("div");
1916
- meta.className = "trace-meta";
1917
- [
1918
- ["Started", formatDate(index.started_at)],
1919
- ["Ended", formatDate(index.ended_at)],
1920
- ["Duration", formatDuration(index.duration_ms)],
1921
- ["Events", String(index.event_count || 0)],
1922
- ].forEach(([label, value]) => {
1923
- const item = document.createElement("span");
1924
- const strong = document.createElement("strong");
1925
- strong.textContent = label;
1926
- item.appendChild(strong);
1927
- item.appendChild(document.createTextNode(` ${value}`));
1928
- meta.appendChild(item);
1929
- });
1930
- if (index.model) {
1931
- const model = document.createElement("span");
1932
- const strong = document.createElement("strong");
1933
- strong.textContent = "Model";
1934
- model.appendChild(strong);
1935
- model.appendChild(document.createTextNode(` ${index.model}`));
1936
- meta.appendChild(model);
1937
- }
1938
- if (index.source_available === false) {
1939
- const missing = document.createElement("span");
1940
- missing.className = "trace-source-missing";
1941
- missing.textContent = "Source file unavailable · showing last capture";
1942
- meta.appendChild(missing);
1943
- }
1944
- sec.appendChild(meta);
1945
-
1946
- const timeline = document.createElement("section");
1947
- timeline.className = "trace-timeline";
1948
- sec.appendChild(timeline);
1949
-
1950
- const chunks = index.chunks || [];
1951
- if (!chunks.length) {
1952
- timeline.appendChild(
1953
- emptyView("Empty trace", "No displayable events were found in this session.")
1954
- );
1955
- return sec;
1956
- }
1957
-
1958
- const controls = document.createElement("div");
1959
- controls.className = "trace-load-controls";
1960
- const progress = document.createElement("span");
1961
- progress.className = "trace-load-progress";
1962
- const loadMore = document.createElement("button");
1963
- loadMore.type = "button";
1964
- loadMore.className = "trace-load-more";
1965
- controls.appendChild(progress);
1966
- controls.appendChild(loadMore);
1967
- sec.appendChild(controls);
1968
-
1969
- let nextChunk = 0;
1970
- let loadedEvents = 0;
1971
- let loading = false;
1972
- const pendingCalls = new Map();
1973
-
1974
- function updateLoadControls() {
1975
- const total = Number(index.event_count) || chunks.reduce(
1976
- (sum, chunk) => sum + (Number(chunk.count) || 0),
1977
- 0
1978
- );
1979
- progress.textContent = `${Math.min(loadedEvents, total)} of ${total} events loaded`;
1980
- if (nextChunk >= chunks.length) {
1981
- loadMore.textContent = "All events loaded";
1982
- loadMore.disabled = true;
1983
- return;
1984
- }
1985
- const count = Number(chunks[nextChunk].count) || "next";
1986
- loadMore.textContent = `Load ${count} more events`;
1987
- loadMore.disabled = false;
1988
- }
1989
-
1990
- async function loadNextTraceChunk() {
1991
- if (loading || nextChunk >= chunks.length) return;
1992
- loading = true;
1993
- loadMore.disabled = true;
1994
- loadMore.textContent = "Loading…";
1995
- const descriptor = chunks[nextChunk];
1996
- try {
1997
- // Event chunks can be large. Do not retain the parsed JSON in DATA_CACHE;
1998
- // the rendered DOM is the only long-lived copy.
1999
- const chunk = await loadTraceData(descriptor.file, false);
2000
- const events = chunk.events || [];
2001
- events.forEach((event) => {
2002
- if (
2003
- event.kind === "tool_result" &&
2004
- event.call_id &&
2005
- pendingCalls.has(event.call_id)
2006
- ) {
2007
- appendTraceResult(pendingCalls.get(event.call_id), event);
2008
- pendingCalls.delete(event.call_id);
2009
  return;
2010
  }
2011
- const entry = traceEventCard(event);
2012
- timeline.appendChild(entry);
2013
- if (event.kind === "tool_call" && event.call_id) {
2014
- pendingCalls.set(event.call_id, entry);
2015
- }
2016
  });
2017
- loadedEvents += events.length;
2018
- nextChunk += 1;
2019
- sec.dataset.loadedChunks = String(nextChunk);
2020
- updateLoadControls();
2021
- } catch (error) {
2022
- progress.textContent = "Could not load the next trace segment.";
2023
- loadMore.textContent = "Retry";
2024
- loadMore.disabled = false;
2025
- } finally {
2026
- loading = false;
2027
  }
2028
- }
2029
-
2030
- sec.dataset.loadedChunks = "0";
2031
- sec.loadNextTraceChunk = loadNextTraceChunk;
2032
- loadMore.addEventListener("click", loadNextTraceChunk);
2033
- updateLoadControls();
2034
- return sec;
2035
- }
2036
-
2037
- function ensureTraceSessionLoaded(sessionId) {
2038
- const target = document.getElementById(traceSessionAnchor(sessionId));
2039
- if (
2040
- target &&
2041
- target.dataset.loadedChunks === "0" &&
2042
- typeof target.loadNextTraceChunk === "function"
2043
- ) {
2044
- return target.loadNextTraceChunk();
2045
- }
2046
- return Promise.resolve();
2047
- }
2048
-
2049
- function scrollToTraceSession(sessionId) {
2050
- if (!sessionId) {
2051
- window.scrollTo({ top: 0, behavior: "auto" });
2052
- return;
2053
- }
2054
- const target = document.getElementById(traceSessionAnchor(sessionId));
2055
- if (target) target.scrollIntoView({ behavior: "auto" });
2056
- else window.scrollTo({ top: 0, behavior: "auto" });
2057
- }
2058
-
2059
- // A published static Space may store only a reference to a private (or
2060
- // public) repository instead of embedding trace/workspace content. These
2061
- // helpers render that reference: link-only for private/inaccessible repos,
2062
- // and a probe-then-render path for public ones.
2063
- function repoRefCard(ref, opts) {
2064
- const wrap = document.createElement("div");
2065
- wrap.className = "view-empty repo-ref-card";
2066
- const h = document.createElement("h2");
2067
- h.textContent = opts.title;
2068
- wrap.appendChild(h);
2069
- const p = document.createElement("p");
2070
- p.textContent = opts.message;
2071
- wrap.appendChild(p);
2072
- if (ref && ref.repo_url) {
2073
- const a = document.createElement("a");
2074
- a.className = "repo-ref-link";
2075
- a.href = ref.repo_url;
2076
- a.target = "_blank";
2077
- a.rel = "noopener noreferrer";
2078
- a.textContent = "Open on the Hub ↗";
2079
- wrap.appendChild(a);
2080
- }
2081
- return wrap;
2082
- }
2083
-
2084
- async function probeRepoAccessible(ref) {
2085
- if (!ref || !ref.repo_id) return false;
2086
- let url = "";
2087
- if (ref.repo_type === "dataset") {
2088
- url = "https://huggingface.co/api/datasets/" + ref.repo_id;
2089
- } else if (ref.repo_type === "bucket") {
2090
- url = "https://huggingface.co/api/buckets/" + ref.repo_id;
2091
- }
2092
- if (!url) return ref.private === false;
2093
- try {
2094
- const response = await fetch(url, { cache: "no-store" });
2095
- if (!response.ok) return false;
2096
- const metadata = await response.json();
2097
- return metadata.private !== true;
2098
- } catch (error) {
2099
- return false;
2100
- }
2101
- }
2102
-
2103
- async function renderRepoReference(ref, kind, page, renderId) {
2104
- const isTraces = kind === "traces";
2105
- const noun = isTraces ? "agent traces" : "workspace files";
2106
- const linkOnly = () =>
2107
- repoRefCard(ref, {
2108
- title: isTraces ? "Agent traces" : "Workspace",
2109
- message:
2110
- `These ${noun} live in a private repository. ` +
2111
- "Open it on the Hub to view them.",
2112
- });
2113
- const accessible = await probeRepoAccessible(ref);
2114
- if (renderId !== RENDER_SEQUENCE) return;
2115
- if (!accessible) {
2116
- page.appendChild(linkOnly());
2117
- return;
2118
- }
2119
- page.appendChild(
2120
- repoRefCard(ref, {
2121
- title: isTraces ? "Agent traces" : "Workspace",
2122
- message:
2123
- `These ${noun} are published to a public repository on the Hub.`,
2124
- })
2125
- );
2126
- }
2127
-
2128
- async function loadPublicTraceSource(ref) {
2129
- const viewerPath = String(ref.viewer_path || "trackio/index.json")
2130
- .split("/")
2131
- .filter((part) => part && part !== "." && part !== "..")
2132
- .join("/");
2133
- const slash = viewerPath.lastIndexOf("/");
2134
- const root = slash >= 0 ? viewerPath.slice(0, slash + 1) : "";
2135
- const index = await fetchRemoteData(repoFileUrl(ref, viewerPath));
2136
- const sessions = Array.isArray(index.sessions) ? index.sessions : [];
2137
- if (!sessions.length) throw new Error("The trace dataset has no sessions");
2138
- return {
2139
- sessions,
2140
- loadData: (file, cacheResult = true) =>
2141
- fetchRemoteData(repoFileUrl(ref, root + file), cacheResult),
2142
  };
2143
- }
2144
-
2145
- async function renderTrace(route, renderId) {
2146
- const page = document.getElementById("page");
2147
- page.innerHTML = "";
2148
- page.className = "trace-page";
2149
- let sessions = MANIFEST.traces || [];
2150
- let loadTraceData = fetchData;
2151
- if (!sessions.length) {
2152
- updateViewTabs({ view: "trace" });
2153
- if (MANIFEST.traces_ref && MANIFEST.traces_ref.repo_url) {
2154
- const accessible = await probeRepoAccessible(MANIFEST.traces_ref);
2155
- if (renderId !== RENDER_SEQUENCE) return;
2156
- if (accessible) {
2157
- try {
2158
- const remote = await loadPublicTraceSource(MANIFEST.traces_ref);
2159
- sessions = remote.sessions;
2160
- loadTraceData = remote.loadData;
2161
- buildTraceTree(route.sessionId, sessions);
2162
- } catch (error) {
2163
- page.appendChild(
2164
- repoRefCard(MANIFEST.traces_ref, {
2165
- title: "Agent traces",
2166
- message:
2167
- "These agent traces are published to a public repository on the Hub, but the web timeline could not be loaded.",
2168
- })
2169
- );
2170
- return;
2171
- }
2172
- } else {
2173
- await renderRepoReference(MANIFEST.traces_ref, "traces", page, renderId);
2174
- return;
2175
- }
2176
- } else {
2177
- page.appendChild(
2178
- emptyView(
2179
- "No agent sessions attached yet",
2180
- "Attach the active session once and Trackio will keep its trace refreshed here while you work. The session stays local until you explicitly publish it.",
2181
- "trackio logbook attach trace <session.jsonl>"
2182
- )
2183
- );
2184
- return;
2185
  }
2186
- }
2187
- updateViewTabs({ view: "trace" });
2188
-
2189
- const loading = document.createElement("div");
2190
- loading.className = "view-loading";
2191
- loading.textContent = "Loading traces…";
2192
- page.appendChild(loading);
2193
- let loaded;
2194
- try {
2195
- loaded = await Promise.all(
2196
- sessions.map(async (session) => {
2197
- const index = await loadTraceData(session.index_file);
2198
- return { session, index };
2199
- })
2200
- );
2201
- } catch (error) {
2202
- if (renderId !== RENDER_SEQUENCE) return;
2203
- page.innerHTML = "";
2204
- page.appendChild(
2205
- emptyView("Trace unavailable", "The normalized traces could not be loaded.")
2206
- );
2207
- return;
2208
- }
2209
- if (renderId !== RENDER_SEQUENCE) return;
2210
- page.innerHTML = "";
2211
-
2212
- const shell = document.createElement("div");
2213
- shell.className = "trace-shell";
2214
- loaded.forEach(({ session, index }) => {
2215
- shell.appendChild(buildTraceSession(session, index, loadTraceData));
2216
- });
2217
- page.appendChild(shell);
2218
- const activeSessionId = route.sessionId || sessions[0].id;
2219
- await ensureTraceSessionLoaded(activeSessionId);
2220
- if (renderId !== RENDER_SEQUENCE) return;
2221
- scrollToTraceSession(route.sessionId);
2222
- }
2223
-
2224
- function svgIcon(kind) {
2225
- const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
2226
- svg.setAttribute("viewBox", "0 0 24 24");
2227
- svg.setAttribute("aria-hidden", "true");
2228
- const path = document.createElementNS("http://www.w3.org/2000/svg", "path");
2229
- path.setAttribute(
2230
- "d",
2231
- kind === "folder"
2232
- ? "M3.5 6.5h6l2 2h9v9a2 2 0 0 1-2 2h-13a2 2 0 0 1-2-2z"
2233
- : kind === "download"
2234
- ? "M12 3v12m0 0 4-4m-4 4-4-4M5 20h14"
2235
- : "M6 3.5h8l4 4V20H6zM14 3.5V8h4"
2236
- );
2237
- svg.appendChild(path);
2238
- return svg;
2239
- }
2240
-
2241
- function workspaceTree(files) {
2242
- const root = { directories: new Map(), files: [] };
2243
- files.forEach((file) => {
2244
- const parts = file.path.split("/");
2245
- let cursor = root;
2246
- parts.slice(0, -1).forEach((name) => {
2247
- if (!cursor.directories.has(name)) {
2248
- cursor.directories.set(name, { directories: new Map(), files: [] });
2249
- }
2250
- cursor = cursor.directories.get(name);
2251
- });
2252
- cursor.files.push(file);
2253
- });
2254
- return root;
2255
- }
2256
-
2257
- function workspaceFileRow(file) {
2258
- const row = document.createElement("div");
2259
- row.className = "workspace-file";
2260
- const name = document.createElement("div");
2261
- name.className = "workspace-file-name";
2262
- name.appendChild(svgIcon("file"));
2263
- const label = document.createElement("span");
2264
- label.textContent = file.name;
2265
- label.title = file.path;
2266
- name.appendChild(label);
2267
- const type = document.createElement("span");
2268
- type.className = "workspace-file-type";
2269
- type.textContent = file.type || "file";
2270
- const size = document.createElement("span");
2271
- size.className = "workspace-file-size";
2272
- size.textContent = fmtBytes(file.size) || "—";
2273
- const modified = document.createElement("time");
2274
- modified.className = "workspace-file-time";
2275
- modified.dateTime = file.modified_at || "";
2276
- modified.textContent = formatDate(file.modified_at);
2277
- row.appendChild(name);
2278
- row.appendChild(type);
2279
- row.appendChild(size);
2280
- row.appendChild(modified);
2281
- const url =
2282
- isLocalPreview() && file.local_url
2283
- ? file.local_url
2284
- : file.download_url || file.bucket_url;
2285
- if (url) {
2286
- const download = document.createElement("a");
2287
- download.className = "workspace-download";
2288
- download.href = url;
2289
- download.title = "Download";
2290
- download.setAttribute("aria-label", `Download ${file.name}`);
2291
- if (isLocalPreview() && file.local_url) download.download = file.name;
2292
- download.appendChild(svgIcon("download"));
2293
- row.appendChild(download);
2294
- } else {
2295
- const pending = document.createElement("span");
2296
- pending.className = "workspace-unpublished";
2297
- pending.textContent = "Local";
2298
- row.appendChild(pending);
2299
- }
2300
- return row;
2301
- }
2302
-
2303
- function renderWorkspaceNode(node, container) {
2304
- Array.from(node.directories.entries())
2305
- .sort(([a], [b]) => a.localeCompare(b))
2306
- .forEach(([name, child]) => {
2307
- const details = document.createElement("details");
2308
- details.className = "workspace-folder";
2309
- details.open = true;
2310
- const summary = document.createElement("summary");
2311
- summary.appendChild(svgIcon("folder"));
2312
- const label = document.createElement("span");
2313
- label.textContent = name;
2314
- summary.appendChild(label);
2315
- details.appendChild(summary);
2316
- const children = document.createElement("div");
2317
- children.className = "workspace-folder-children";
2318
- renderWorkspaceNode(child, children);
2319
- details.appendChild(children);
2320
- container.appendChild(details);
2321
- });
2322
- node.files
2323
- .sort((a, b) => a.name.localeCompare(b.name))
2324
- .forEach((file) => container.appendChild(workspaceFileRow(file)));
2325
- }
2326
-
2327
- const WORKSPACE_MODE_KEY = "trackio-logbook:workspace-mode";
2328
-
2329
- function getWorkspaceMode() {
2330
- try {
2331
- return localStorage.getItem(WORKSPACE_MODE_KEY) === "type" ? "type" : "tree";
2332
- } catch (error) {
2333
- return "tree";
2334
- }
2335
- }
2336
-
2337
- function setWorkspaceMode(mode) {
2338
- try {
2339
- localStorage.setItem(WORKSPACE_MODE_KEY, mode);
2340
- } catch (error) {
2341
- /* ignore storage failures (private mode, etc.) */
2342
- }
2343
- }
2344
-
2345
- function fileGroupKey(file) {
2346
- if (file.type) return file.type;
2347
- const name = file.name || file.path || "";
2348
- const dot = name.lastIndexOf(".");
2349
- if (dot > 0 && dot < name.length - 1) return name.slice(dot + 1).toLowerCase();
2350
- return "other";
2351
- }
2352
-
2353
- function renderWorkspaceByType(files, container) {
2354
- const groups = new Map();
2355
- files.forEach((file) => {
2356
- const key = fileGroupKey(file);
2357
- if (!groups.has(key)) groups.set(key, []);
2358
- groups.get(key).push(file);
2359
- });
2360
- Array.from(groups.keys())
2361
- .sort((a, b) => a.localeCompare(b))
2362
- .forEach((key) => {
2363
- const items = groups
2364
- .get(key)
2365
- .sort((a, b) => a.name.localeCompare(b.name));
2366
- const section = document.createElement("div");
2367
- section.className = "workspace-group";
2368
- const heading = document.createElement("h3");
2369
- heading.className = "workspace-group-head";
2370
- const label = document.createElement("span");
2371
- label.textContent = key;
2372
- const count = document.createElement("span");
2373
- count.className = "workspace-group-count";
2374
- count.textContent = String(items.length);
2375
- heading.appendChild(label);
2376
- heading.appendChild(count);
2377
- section.appendChild(heading);
2378
- items.forEach((file) => section.appendChild(workspaceFileRow(file)));
2379
- container.appendChild(section);
2380
- });
2381
- }
2382
-
2383
- function buildWorkspaceToggle(current, onChange) {
2384
- const toggle = document.createElement("div");
2385
- toggle.className = "workspace-toggle";
2386
- toggle.setAttribute("role", "group");
2387
- toggle.setAttribute("aria-label", "Workspace layout");
2388
- const buttons = [];
2389
- [
2390
- ["tree", "Tree"],
2391
- ["type", "By type"],
2392
- ].forEach(([mode, text]) => {
2393
- const btn = document.createElement("button");
2394
- btn.type = "button";
2395
- btn.className = "workspace-toggle-btn";
2396
- btn.textContent = text;
2397
- const setActive = (active) => {
2398
- btn.classList.toggle("is-active", active);
2399
- btn.setAttribute("aria-pressed", active ? "true" : "false");
2400
- };
2401
- setActive(mode === current);
2402
- btn.addEventListener("click", () => {
2403
- buttons.forEach((entry) => entry.setActive(entry.mode === mode));
2404
- onChange(mode);
2405
- });
2406
- buttons.push({ mode, setActive });
2407
- toggle.appendChild(btn);
2408
- });
2409
- return toggle;
2410
- }
2411
-
2412
- const HF_LOGO_DATA_URI = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5NSIgaGVpZ2h0PSI4OCIgZmlsbD0ibm9uZSI+Cgk8cGF0aCBmaWxsPSIjRkZEMjFFIiBkPSJNNDcuMjEgNzYuNWEzNC43NSAzNC43NSAwIDEgMCAwLTY5LjUgMzQuNzUgMzQuNzUgMCAwIDAgMCA2OS41WiIgLz4KCTxwYXRoCgkJZmlsbD0iI0ZGOUQwQiIKCQlkPSJNODEuOTYgNDEuNzVhMzQuNzUgMzQuNzUgMCAxIDAtNjkuNSAwIDM0Ljc1IDM0Ljc1IDAgMCAwIDY5LjUgMFptLTczLjUgMGEzOC43NSAzOC43NSAwIDEgMSA3Ny41IDAgMzguNzUgMzguNzUgMCAwIDEtNzcuNSAwWiIKCS8+Cgk8cGF0aAoJCWZpbGw9IiMzQTNCNDUiCgkJZD0iTTU4LjUgMzIuM2MxLjI4LjQ0IDEuNzggMy4wNiAzLjA3IDIuMzhhNSA1IDAgMSAwLTYuNzYtMi4wN2MuNjEgMS4xNSAyLjU1LS43MiAzLjctLjMyWk0zNC45NSAzMi4zYy0xLjI4LjQ0LTEuNzkgMy4wNi0zLjA3IDIuMzhhNSA1IDAgMSAxIDYuNzYtMi4wN2MtLjYxIDEuMTUtMi41Ni0uNzItMy43LS4zMloiCgkvPgoJPHBhdGgKCQlmaWxsPSIjRkYzMjNEIgoJCWQ9Ik00Ni45NiA1Ni4yOWM5LjgzIDAgMTMtOC43NiAxMy0xMy4yNiAwLTIuMzQtMS41Ny0xLjYtNC4wOS0uMzYtMi4zMyAxLjE1LTUuNDYgMi43NC04LjkgMi43NC03LjE5IDAtMTMtNi44OC0xMy0yLjM4czMuMTYgMTMuMjYgMTMgMTMuMjZaIgoJLz4KCTxwYXRoCgkJZmlsbD0iIzNBM0I0NSIKCQlmaWxsLXJ1bGU9ImV2ZW5vZGQiCgkJZD0iTTM5LjQzIDU0YTguNyA4LjcgMCAwIDEgNS4zLTQuNDljLjQtLjEyLjgxLjU3IDEuMjQgMS4yOC40LjY4LjgyIDEuMzcgMS4yNCAxLjM3LjQ1IDAgLjktLjY4IDEuMzMtMS4zNS40NS0uNy44OS0xLjM4IDEuMzItMS4yNWE4LjYxIDguNjEgMCAwIDEgNSA0LjE3YzMuNzMtMi45NCA1LjEtNy43NCA1LjEtMTAuNyAwLTIuMzQtMS41Ny0xLjYtNC4wOS0uMzZsLS4xNC4wN2MtMi4zMSAxLjE1LTUuMzkgMi42Ny04Ljc3IDIuNjdzLTYuNDUtMS41Mi04Ljc3LTIuNjdjLTIuNi0xLjI5LTQuMjMtMi4xLTQuMjMuMjkgMCAzLjA1IDEuNDYgOC4wNiA1LjQ3IDEwLjk3WiIKCQljbGlwLXJ1bGU9ImV2ZW5vZGQiCgkvPgoJPHBhdGgKCQlmaWxsPSIjRkY5RDBCIgoJCWQ9Ik03MC43MSAzN2EzLjI1IDMuMjUgMCAxIDAgMC02LjUgMy4yNSAzLjI1IDAgMCAwIDAgNi41Wk0yNC4yMSAzN2EzLjI1IDMuMjUgMCAxIDAgMC02LjUgMy4yNSAzLjI1IDAgMCAwIDAgNi41Wk0xNy41MiA0OGMtMS42MiAwLTMuMDYuNjYtNC4wNyAxLjg3YTUuOTcgNS45NyAwIDAgMC0xLjMzIDMuNzYgNy4xIDcuMSAwIDAgMC0xLjk0LS4zYy0xLjU1IDAtMi45NS41OS0zLjk0IDEuNjZhNS44IDUuOCAwIDAgMC0uOCA3IDUuMyA1LjMgMCAwIDAtMS43OSAyLjgyYy0uMjQuOS0uNDggMi44LjggNC43NGE1LjIyIDUuMjIgMCAwIDAtLjM3IDUuMDJjMS4wMiAyLjMyIDMuNTcgNC4xNCA4LjUyIDYuMSAzLjA3IDEuMjIgNS44OSAyIDUuOTEgMi4wMWE0NC4zMyA0NC4zMyAwIDAgMCAxMC45MyAxLjZjNS44NiAwIDEwLjA1LTEuOCAxMi40Ni01LjM0IDMuODgtNS42OSAzLjMzLTEwLjktMS43LTE1LjkyLTIuNzctMi43OC00LjYyLTYuODctNS03Ljc3LS43OC0yLjY2LTIuODQtNS42Mi02LjI1LTUuNjJhNS43IDUuNyAwIDAgMC00LjYgMi40NmMtMS0xLjI2LTEuOTgtMi4yNS0yLjg2LTIuODJBNy40IDcuNCAwIDAgMCAxNy41MiA0OFptMCA0Yy41MSAwIDEuMTQuMjIgMS44Mi42NSAyLjE0IDEuMzYgNi4yNSA4LjQzIDcuNzYgMTEuMTguNS45MiAxLjM3IDEuMzEgMi4xNCAxLjMxIDEuNTUgMCAyLjc1LTEuNTMuMTUtMy40OC0zLjkyLTIuOTMtMi41NS03LjcyLS42OC04LjAxLjA4LS4wMi4xNy0uMDIuMjQtLjAyIDEuNyAwIDIuNDUgMi45MyAyLjQ1IDIuOTNzMi4yIDUuNTIgNS45OCA5LjNjMy43NyAzLjc3IDMuOTcgNi44IDEuMjIgMTAuODMtMS44OCAyLjc1LTUuNDcgMy41OC05LjE2IDMuNTgtMy44MSAwLTcuNzMtLjktOS45Mi0xLjQ2LS4xMS0uMDMtMTMuNDUtMy44LTExLjc2LTcgLjI4LS41NC43NS0uNzYgMS4zNC0uNzYgMi4zOCAwIDYuNyAzLjU0IDguNTcgMy41NC40MSAwIC43LS4xNy44My0uNi43OS0yLjg1LTEyLjA2LTQuMDUtMTAuOTgtOC4xNy4yLS43My43MS0xLjAyIDEuNDQtMS4wMiAzLjE0IDAgMTAuMiA1LjUzIDExLjY4IDUuNTMuMTEgMCAuMi0uMDMuMjQtLjEuNzQtMS4yLjMzLTIuMDQtNC45LTUuMi01LjIxLTMuMTYtOC44OC01LjA2LTYuOC03LjMzLjI0LS4yNi41OC0uMzggMS0uMzggMy4xNyAwIDEwLjY2IDYuODIgMTAuNjYgNi44MnMyLjAyIDIuMSAzLjI1IDIuMWMuMjggMCAuNTItLjEuNjgtLjM4Ljg2LTEuNDYtOC4wNi04LjIyLTguNTYtMTEuMDEtLjM0LTEuOS4yNC0yLjg1IDEuMzEtMi44NVoiCgkvPgoJPHBhdGgKCQlmaWxsPSIjRkZEMjFFIgoJCWQ9Ik0zOC42IDc2LjY5YzIuNzUtNC4wNCAyLjU1LTcuMDctMS4yMi0xMC44NC0zLjc4LTMuNzctNS45OC05LjMtNS45OC05LjNzLS44Mi0zLjItMi42OS0yLjljLTEuODcuMy0zLjI0IDUuMDguNjggOC4wMSAzLjkxIDIuOTMtLjc4IDQuOTItMi4yOSAyLjE3LTEuNS0yLjc1LTUuNjItOS44Mi03Ljc2LTExLjE4LTIuMTMtMS4zNS0zLjYzLS42LTMuMTMgMi4yLjUgMi43OSA5LjQzIDkuNTUgOC41NiAxMS0uODcgMS40Ny0zLjkzLTEuNzEtMy45My0xLjcxcy05LjU3LTguNzEtMTEuNjYtNi40NGMtMi4wOCAyLjI3IDEuNTkgNC4xNyA2LjggNy4zMyA1LjIzIDMuMTYgNS42NCA0IDQuOSA1LjItLjc1IDEuMi0xMi4yOC04LjUzLTEzLjM2LTQuNC0xLjA4IDQuMTEgMTEuNzcgNS4zIDEwLjk4IDguMTUtLjggMi44NS05LjA2LTUuMzgtMTAuNzQtMi4xOC0xLjcgMy4yMSAxMS42NSA2Ljk4IDExLjc2IDcuMDEgNC4zIDEuMTIgMTUuMjUgMy40OSAxOS4wOC0yLjEyWiIKCS8+Cgk8cGF0aAoJCWZpbGw9IiNGRjlEMEIiCgkJZD0iTTc3LjQgNDhjMS42MiAwIDMuMDcuNjYgNC4wNyAxLjg3YTUuOTcgNS45NyAwIDAgMSAxLjMzIDMuNzYgNy4xIDcuMSAwIDAgMSAxLjk1LS4zYzEuNTUgMCAyLjk1LjU5IDMuOTQgMS42NmE1LjggNS44IDAgMCAxIC44IDcgNS4zIDUuMyAwIDAgMSAxLjc4IDIuODJjLjI0LjkuNDggMi44LS44IDQuNzRhNS4yMiA1LjIyIDAgMCAxIC4zNyA1LjAyYy0xLjAyIDIuMzItMy41NyA0LjE0LTguNTEgNi4xLTMuMDggMS4yMi01LjkgMi01LjkyIDIuMDFhNDQuMzMgNDQuMzMgMCAwIDEtMTAuOTMgMS42Yy01Ljg2IDAtMTAuMDUtMS44LTEyLjQ2LTUuMzQtMy44OC01LjY5LTMuMzMtMTAuOSAxLjctMTUuOTIgMi43OC0yLjc4IDQuNjMtNi44NyA1LjAxLTcuNzcuNzgtMi42NiAyLjgzLTUuNjIgNi4yNC01LjYyYTUuNyA1LjcgMCAwIDEgNC42IDIuNDZjMS0xLjI2IDEuOTgtMi4yNSAyLjg3LTIuODJBNy40IDcuNCAwIDAgMSA3Ny40IDQ4Wm0wIDRjLS41MSAwLTEuMTMuMjItMS44Mi42NS0yLjEzIDEuMzYtNi4yNSA4LjQzLTcuNzYgMTEuMThhMi40MyAyLjQzIDAgMCAxLTIuMTQgMS4zMWMtMS41NCAwLTIuNzUtMS41My0uMTQtMy40OCAzLjkxLTIuOTMgMi41NC03LjcyLjY3LTguMDFhMS41NCAxLjU0IDAgMCAwLS4yNC0uMDJjLTEuNyAwLTIuNDUgMi45My0yLjQ1IDIuOTNzLTIuMiA1LjUyLTUuOTcgOS4zYy0zLjc4IDMuNzctMy45OCA2LjgtMS4yMiAxMC44MyAxLjg3IDIuNzUgNS40NyAzLjU4IDkuMTUgMy41OCAzLjgyIDAgNy43My0uOSA5LjkzLTEuNDYuMS0uMDMgMTMuNDUtMy44IDExLjc2LTctLjI5LS41NC0uNzUtLjc2LTEuMzQtLjc2LTIuMzggMC02LjcxIDMuNTQtOC41NyAzLjU0LS40MiAwLS43MS0uMTctLjgzLS42LS44LTIuODUgMTIuMDUtNC4wNSAxMC45Ny04LjE3LS4xOS0uNzMtLjctMS4wMi0xLjQ0LTEuMDItMy4xNCAwLTEwLjIgNS41My0xMS42OCA1LjUzLS4xIDAtLjE5LS4wMy0uMjMtLjEtLjc0LTEuMi0uMzQtMi4wNCA0Ljg4LTUuMiA1LjIzLTMuMTYgOC45LTUuMDYgNi44LTcuMzMtLjIzLS4yNi0uNTctLjM4LS45OC0uMzgtMy4xOCAwLTEwLjY3IDYuODItMTAuNjcgNi44MnMtMi4wMiAyLjEtMy4yNCAyLjFhLjc0Ljc0IDAgMCAxLS42OC0uMzhjLS44Ny0xLjQ2IDguMDUtOC4yMiA4LjU1LTExLjAxLjM0LTEuOS0uMjQtMi44NS0xLjMxLTIuODVaIgoJLz4KCTxwYXRoCgkJZmlsbD0iI0ZGRDIxRSIKCQlkPSJNNTYuMzMgNzYuNjljLTIuNzUtNC4wNC0yLjU2LTcuMDcgMS4yMi0xMC44NCAzLjc3LTMuNzcgNS45Ny05LjMgNS45Ny05LjNzLjgyLTMuMiAyLjctMi45YzEuODYuMyAzLjIzIDUuMDgtLjY4IDguMDEtMy45MiAyLjkzLjc4IDQuOTIgMi4yOCAyLjE3IDEuNTEtMi43NSA1LjYzLTkuODIgNy43Ni0xMS4xOCAyLjEzLTEuMzUgMy42NC0uNiAzLjEzIDIuMi0uNSAyLjc5LTkuNDIgOS41NS04LjU1IDExIC44NiAxLjQ3IDMuOTItMS43MSAzLjkyLTEuNzFzOS41OC04LjcxIDExLjY2LTYuNDRjMi4wOCAyLjI3LTEuNTggNC4xNy02LjggNy4zMy01LjIzIDMuMTYtNS42MyA0LTQuOSA1LjIuNzUgMS4yIDEyLjI4LTguNTMgMTMuMzYtNC40IDEuMDggNC4xMS0xMS43NiA1LjMtMTAuOTcgOC4xNS44IDIuODUgOS4wNS01LjM4IDEwLjc0LTIuMTggMS42OSAzLjIxLTExLjY1IDYuOTgtMTEuNzYgNy4wMS00LjMxIDEuMTItMTUuMjYgMy40OS0xOS4wOC0yLjEyWiIKCS8+Cjwvc3ZnPgo=";
2413
-
2414
- function hubGroupId(type) {
2415
- return "ws-hub-" + String(type).toLowerCase().replace(/[^a-z0-9]+/g, "-");
2416
- }
2417
-
2418
- const HUB_REF_GROUP_ORDER = [
2419
- "Jobs",
2420
- "Datasets",
2421
- "Models",
2422
- "Spaces",
2423
- "Buckets",
2424
- "Collections",
2425
- "Papers",
2426
- ];
2427
-
2428
- function hubRefFromRepoRef(ref) {
2429
- if (!ref || !ref.repo_id || !ref.repo_url) return null;
2430
- if (ref.repo_type === "dataset") {
2431
- return { url: ref.repo_url, type: "Datasets", label: ref.repo_id };
2432
- }
2433
- if (ref.repo_type === "bucket") {
2434
- return { url: ref.repo_url, type: "Buckets", label: ref.repo_id };
2435
- }
2436
- return null;
2437
- }
2438
-
2439
- async function publicAssociatedHubRefs() {
2440
- const refs = [MANIFEST.traces_ref, MANIFEST.workspace_ref].filter(Boolean);
2441
- const publicStates = await Promise.all(refs.map(probeRepoAccessible));
2442
- return refs
2443
- .filter((ref, index) => publicStates[index])
2444
- .map(hubRefFromRepoRef)
2445
- .filter(Boolean);
2446
- }
2447
-
2448
- function mergeHubRefs(...groups) {
2449
- const merged = [];
2450
- const seen = new Set();
2451
- groups.flat().forEach((ref) => {
2452
- if (!validHubRef(ref)) return;
2453
- const key = `${ref.type || "Other"}:${ref.label || ref.url}`;
2454
- if (seen.has(key)) return;
2455
- seen.add(key);
2456
- merged.push(ref);
2457
- });
2458
- return merged;
2459
- }
2460
-
2461
- function validHubRef(ref) {
2462
- if (!ref || !ref.url) return false;
2463
- if (classifyResource(ref.url)) return true;
2464
- const match = ref.url.match(/huggingface\.co\/collections\/([^/?#]+\/[^/?#]+)/);
2465
- return Boolean(match && validHfRepoId(match[1].split("/")));
2466
- }
2467
-
2468
- function renderHubRefs(refs) {
2469
- const validRefs = Array.isArray(refs) ? refs.filter(validHubRef) : [];
2470
- if (!validRefs.length) return null;
2471
- const section = document.createElement("section");
2472
- section.className = "workspace-hub";
2473
- const heading = document.createElement("h2");
2474
- heading.className = "workspace-hub-title";
2475
- const hubLogo = document.createElement("img");
2476
- hubLogo.className = "workspace-hub-logo";
2477
- hubLogo.src = HF_LOGO_DATA_URI;
2478
- hubLogo.alt = "";
2479
- hubLogo.setAttribute("aria-hidden", "true");
2480
- heading.appendChild(hubLogo);
2481
- heading.appendChild(document.createTextNode("Linked Hugging Face artifacts"));
2482
- section.appendChild(heading);
2483
- const byType = new Map();
2484
- validRefs.forEach((ref) => {
2485
- const type = ref.type || "Other";
2486
- if (!byType.has(type)) byType.set(type, []);
2487
- byType.get(type).push(ref);
2488
  });
2489
- const order = [
2490
- ...HUB_REF_GROUP_ORDER,
2491
- ...Array.from(byType.keys()).filter((t) => !HUB_REF_GROUP_ORDER.includes(t)),
2492
- ];
2493
- order.forEach((type) => {
2494
- const items = byType.get(type);
2495
- if (!items || !items.length) return;
2496
- const group = document.createElement("div");
2497
- group.className = "workspace-hub-group";
2498
- group.id = hubGroupId(type);
2499
- const gh = document.createElement("h3");
2500
- gh.className = "workspace-hub-group-head";
2501
- const label = document.createElement("span");
2502
- label.textContent = type;
2503
- const count = document.createElement("span");
2504
- count.className = "workspace-hub-count";
2505
- count.textContent = String(items.length);
2506
- gh.appendChild(label);
2507
- gh.appendChild(count);
2508
- group.appendChild(gh);
2509
- const list = document.createElement("div");
2510
- list.className = "workspace-hub-list";
2511
- items.forEach((ref) => {
2512
- const link = document.createElement("a");
2513
- link.className = "workspace-hub-link";
2514
- link.href = ref.url;
2515
- link.target = "_blank";
2516
- link.rel = "noopener noreferrer";
2517
- link.textContent = ref.label || ref.url;
2518
- link.title = ref.url;
2519
- list.appendChild(link);
2520
- });
2521
- group.appendChild(list);
2522
- section.appendChild(group);
2523
- });
2524
- return section;
2525
  }
2526
 
2527
- function workspaceSidebarEntries(files, hubRefs) {
2528
- const entries = [];
2529
- if (files && files.length) {
2530
- entries.push({ id: "ws-files", label: "Workspace files" });
2531
- }
2532
- const counts = new Map();
2533
- (Array.isArray(hubRefs) ? hubRefs : []).filter(validHubRef).forEach((ref) => {
2534
- const type = ref.type || "Other";
2535
- counts.set(type, (counts.get(type) || 0) + 1);
2536
- });
2537
- const order = [
2538
- ...HUB_REF_GROUP_ORDER,
2539
- ...Array.from(counts.keys()).filter((t) => !HUB_REF_GROUP_ORDER.includes(t)),
2540
- ];
2541
- order.forEach((type) => {
2542
- if (counts.get(type)) entries.push({ id: hubGroupId(type), label: type });
2543
- });
2544
- return entries;
2545
- }
2546
 
2547
- function buildWorkspaceSidebar(entries) {
2548
- const tree = document.getElementById("tree");
2549
- tree.innerHTML = "";
2550
- if (!entries || !entries.length) return;
2551
- const label = document.createElement("div");
2552
- label.className = "tree-label";
2553
- label.textContent = "Artifacts";
2554
- tree.appendChild(label);
2555
- entries.forEach((entry) => {
2556
- const a = document.createElement("a");
2557
- a.href = "#/view/workspace";
2558
- a.className = "depth-0";
2559
- a.dataset.section = entry.id;
2560
- a.textContent = entry.label;
2561
- a.addEventListener("click", (event) => {
2562
- event.preventDefault();
2563
- const target = document.getElementById(entry.id);
2564
- if (!target) return;
2565
- target.scrollIntoView({ behavior: "smooth", block: "start" });
2566
- tree
2567
- .querySelectorAll("a")
2568
- .forEach((link) => link.classList.toggle("active", link === a));
2569
- });
2570
- tree.appendChild(a);
2571
- });
2572
- }
2573
-
2574
- function workspaceTypeFromPath(path) {
2575
- const dot = path.lastIndexOf(".");
2576
- const ext = dot >= 0 ? path.slice(dot).toLowerCase() : "";
2577
- if (
2578
- [
2579
- ".pt",
2580
- ".pth",
2581
- ".ckpt",
2582
- ".safetensors",
2583
- ".gguf",
2584
- ".onnx",
2585
- ".pkl",
2586
- ".joblib",
2587
- ".h5",
2588
- ".tflite",
2589
- ".pb",
2590
- ].includes(ext)
2591
- ) {
2592
- return "model";
2593
- }
2594
- if (
2595
- [
2596
- ".npz",
2597
- ".npy",
2598
- ".parquet",
2599
- ".csv",
2600
- ".tsv",
2601
- ".arrow",
2602
- ".jsonl",
2603
- ".feather",
2604
- ".msgpack",
2605
- ].includes(ext)
2606
- ) {
2607
- return "dataset";
2608
- }
2609
- return ext.replace(/^\./, "") || "file";
2610
- }
2611
-
2612
- async function loadPublicWorkspace(ref) {
2613
- if (!(await probeRepoAccessible(ref))) return null;
2614
- const response = await fetch(
2615
- `https://huggingface.co/api/buckets/${ref.repo_id}/tree`,
2616
- { cache: "no-store" }
2617
  );
2618
- if (!response.ok) throw new Error("Could not load the public Bucket");
2619
- const entries = await response.json();
2620
- const prefix = "workspace/";
2621
- const files = (Array.isArray(entries) ? entries : [])
2622
- .filter(
2623
- (item) =>
2624
- item &&
2625
- item.type === "file" &&
2626
- typeof item.path === "string" &&
2627
- item.path.startsWith(prefix)
 
 
 
 
 
 
2628
  )
2629
- .map((item) => {
2630
- const path = item.path.slice(prefix.length);
2631
- return {
2632
- path,
2633
- name: path.split("/").pop() || path,
2634
- type: workspaceTypeFromPath(path),
2635
- size: Number(item.size) || 0,
2636
- modified_at: item.mtime || item.uploadedAt || "",
2637
- sessions: [],
2638
- bucket_url: `${ref.repo_url}#${encodeRepoPath(item.path)}`,
2639
- download_url: repoFileUrl(ref, item.path),
2640
- };
2641
- });
2642
- return {
2643
- schema_version: 1,
2644
- bucket_id: ref.repo_id,
2645
- file_count: files.length,
2646
- total_size: files.reduce((sum, file) => sum + file.size, 0),
2647
- files,
2648
- };
2649
- }
2650
-
2651
- async function renderWorkspace(renderId) {
2652
- const page = document.getElementById("page");
2653
- page.innerHTML = "";
2654
- page.className = "workspace-page";
2655
- const loading = document.createElement("div");
2656
- loading.className = "view-loading";
2657
- loading.textContent = "Loading workspace…";
2658
- page.appendChild(loading);
2659
- let workspace;
2660
- try {
2661
- workspace = await fetchData((MANIFEST.workspace || {}).file || "workspace.json");
2662
- } catch (error) {
2663
- if (renderId !== RENDER_SEQUENCE) return;
2664
- page.innerHTML = "";
2665
- page.appendChild(emptyView("Workspace unavailable", "The workspace inventory could not be loaded."));
2666
- return;
2667
- }
2668
- if (renderId !== RENDER_SEQUENCE) return;
2669
- if (
2670
- !(workspace.files || []).length &&
2671
- MANIFEST.workspace_ref &&
2672
- MANIFEST.workspace_ref.repo_url
2673
- ) {
2674
- try {
2675
- const remoteWorkspace = await loadPublicWorkspace(MANIFEST.workspace_ref);
2676
- if (remoteWorkspace && remoteWorkspace.files.length) {
2677
- workspace = {
2678
- ...workspace,
2679
- ...remoteWorkspace,
2680
- hub_refs: workspace.hub_refs || [],
2681
- };
2682
- }
2683
- } catch (error) {
2684
- // Keep the repository card below as a graceful fallback.
2685
  }
2686
- }
2687
- if (renderId !== RENDER_SEQUENCE) return;
2688
- page.innerHTML = "";
2689
- const associatedHubRefs = await publicAssociatedHubRefs();
2690
- if (renderId !== RENDER_SEQUENCE) return;
2691
- const hubRefs = mergeHubRefs(workspace.hub_refs || [], associatedHubRefs);
2692
- const shell = document.createElement("div");
2693
- shell.className = "workspace-shell";
2694
- const header = document.createElement("header");
2695
- header.className = "workspace-header";
2696
- const summary = document.createElement("p");
2697
- summary.textContent = `${workspace.file_count || 0} files · ${fmtBytes(workspace.total_size || 0)}`;
2698
- header.appendChild(summary);
2699
- const files = workspace.files || [];
2700
- if (files.length) {
2701
- const inventory = document.createElement("section");
2702
- inventory.className = "workspace-inventory";
2703
- inventory.id = "ws-files";
2704
- const renderInventory = (mode) => {
2705
- inventory.innerHTML = "";
2706
- if (mode === "type") renderWorkspaceByType(files, inventory);
2707
- else renderWorkspaceNode(workspaceTree(files), inventory);
2708
- };
2709
- const toggle = buildWorkspaceToggle(getWorkspaceMode(), (mode) => {
2710
- setWorkspaceMode(mode);
2711
- renderInventory(mode);
2712
- });
2713
- header.appendChild(toggle);
2714
- shell.appendChild(header);
2715
- shell.appendChild(inventory);
2716
- renderInventory(getWorkspaceMode());
2717
- } else if (MANIFEST.workspace_ref && MANIFEST.workspace_ref.repo_url) {
2718
- shell.appendChild(header);
2719
- await renderRepoReference(
2720
- MANIFEST.workspace_ref,
2721
- "workspace",
2722
- shell,
2723
- renderId
2724
- );
2725
- if (renderId !== RENDER_SEQUENCE) return;
2726
- } else {
2727
- shell.appendChild(header);
2728
- shell.appendChild(
2729
- emptyView(
2730
- "No workspace files captured yet",
2731
- "Supported model and data files appear here as they are created or changed after a trace is attached. Outputs captured by trackio logbook run appear when the run finishes; logged Trackio artifacts appear immediately in the Logbook tab. Files stay local until you choose to publish."
2732
- )
2733
- );
2734
- }
2735
- const hub = renderHubRefs(hubRefs);
2736
- if (hub) shell.appendChild(hub);
2737
- page.appendChild(shell);
2738
- buildWorkspaceSidebar(workspaceSidebarEntries(files, hubRefs));
2739
- window.scrollTo({ top: 0, behavior: "auto" });
2740
- }
2741
-
2742
- async function renderCurrentView(opts = {}) {
2743
- const route = routeState();
2744
- const renderId = ++RENDER_SEQUENCE;
2745
- setActiveView(route);
2746
- if (route.view === "trace") {
2747
- await renderTrace(route, renderId);
2748
- } else if (route.view === "workspace") {
2749
- await renderWorkspace(renderId);
2750
- } else {
2751
- document.getElementById("page").className = "code-page";
2752
- await renderLogbook({ ...opts, renderId });
2753
- }
2754
  }
2755
 
2756
- function handleRouteChange() {
2757
- const route = routeState();
2758
- if (
2759
- route.view === "code" &&
2760
- CURRENT_VIEW === "code" &&
2761
- document.querySelector("#page .page-section")
2762
- ) {
2763
- updateViewTabs(route);
2764
- scrollToHash();
2765
- return;
2766
- }
2767
- if (
2768
- route.view === "trace" &&
2769
- CURRENT_VIEW === "trace" &&
2770
- document.querySelector("#page .trace-session")
2771
- ) {
2772
- setActiveView(route);
2773
- const sessions = MANIFEST.traces || [];
2774
- const activeSessionId = route.sessionId || (sessions[0] || {}).id;
2775
- ensureTraceSessionLoaded(activeSessionId);
2776
- scrollToTraceSession(route.sessionId);
2777
- return;
2778
- }
2779
- renderCurrentView();
 
 
 
 
 
 
 
 
 
 
2780
  }
2781
 
2782
  function currentSlug() {
2783
- const route = routeState();
2784
- return route.view === "code" ? route.slug : MANIFEST.root.slug;
2785
  }
2786
 
2787
  function scrollToHash(opts = {}) {
2788
- if (routeState().view !== "code") return;
2789
  const slug = currentSlug();
2790
- if (!location.hash || slug === MANIFEST.root.slug) {
2791
  window.scrollTo({ top: 0, behavior: opts.behavior || "auto" });
2792
  highlight(slug);
2793
  return;
@@ -2800,7 +2106,7 @@
2800
  function navigateToLogbookSlug(target) {
2801
  const slug = String(target || "").replace(/^#?\//, "").trim();
2802
  if (!slug || !findNode(MANIFEST.root, slug)) return;
2803
- const hash = "#/view/code/" + slug;
2804
  if (location.hash === hash) {
2805
  scrollToHash({ behavior: "smooth" });
2806
  } else {
@@ -2824,12 +2130,9 @@
2824
 
2825
  let SCROLL_FRAME = 0;
2826
  function updateActiveSection() {
2827
- if (CURRENT_VIEW !== "code" && CURRENT_VIEW !== "trace") return;
2828
  cancelAnimationFrame(SCROLL_FRAME);
2829
  SCROLL_FRAME = requestAnimationFrame(() => {
2830
- const selector =
2831
- CURRENT_VIEW === "trace" ? ".trace-session" : ".page-section";
2832
- const sections = Array.from(document.querySelectorAll(selector));
2833
  if (!sections.length) return;
2834
  const marker = Math.min(window.innerHeight * 0.28, 180);
2835
  let active = sections[0];
@@ -2842,11 +2145,7 @@
2842
  ) {
2843
  active = sections[sections.length - 1];
2844
  }
2845
- if (CURRENT_VIEW === "trace") {
2846
- highlightTraceSession(active.dataset.sessionId);
2847
- } else {
2848
- highlight(active.dataset.slug);
2849
- }
2850
  });
2851
  }
2852
 
@@ -2862,7 +2161,7 @@
2862
  document.getElementById("book-title").textContent = MANIFEST.title;
2863
  document.getElementById("book-head").setAttribute("aria-label", MANIFEST.title);
2864
  buildTree();
2865
- renderCurrentView({ preserveScroll: true });
2866
  } catch (e) {}
2867
  }, LIVE_RELOAD_MS);
2868
  }
@@ -2958,16 +2257,17 @@
2958
  document.getElementById("book-title").textContent = MANIFEST.title;
2959
  document.getElementById("book-head").setAttribute("aria-label", MANIFEST.title);
2960
  document.getElementById("book-head").addEventListener("click", () => {
2961
- const target = "#/view/code/" + MANIFEST.root.slug;
2962
  if (location.hash === target) scrollToHash();
2963
  else location.hash = target;
2964
  });
2965
  buildTree();
2966
  setupConnect();
 
2967
  setupFigureNavigation();
2968
- window.addEventListener("hashchange", handleRouteChange);
2969
  window.addEventListener("scroll", updateActiveSection, { passive: true });
2970
- await renderCurrentView();
2971
  startLiveReload();
2972
  }
2973
 
 
4
  let MANIFEST = null;
5
  const PAGE_CACHE = {};
6
  const UNFURL_CACHE = {};
 
7
  const LIVE_RELOAD_MS = 1500;
8
  const FIGURE_FRAME_WINDOWS = new Set();
9
  let FIGURE_NAVIGATION_READY = false;
 
 
10
 
11
  function esc(s) {
12
  return String(s)
 
286
  /(trackio-artifact:\/\/\S+|trackio-local-path:\/\/\S+|https:\/\/huggingface\.co\/buckets\/[^\s<)]+#\S+)/
287
  );
288
  if (chip && uri) chip.dataset.resUrl = uri[1];
 
 
 
 
289
  } else if (meta.type === "dashboard") {
290
  const sp = body.match(/https:\/\/huggingface\.co\/spaces\/[^\s<>)"'`]+/);
291
  cell.dataset.resUrl = sp
 
495
  if (!message || message.type !== "trackio-logbook:navigate") return;
496
  const target = String(message.target || "").replace(/^#?\//, "");
497
  if (!target || !MANIFEST || !findNode(MANIFEST.root, target)) return;
498
+ const hash = "#/" + target;
499
  if (location.hash === hash) scrollToHash();
500
  else location.hash = hash;
501
  });
 
507
  '<path d="M8 3H3v5M16 3h5v5M21 16v5h-5M3 16v5h5"/>' +
508
  '<path d="M3 8 8 3M16 3l5 5M21 16l-5 5M8 21l-5-5"/></svg>';
509
 
 
 
 
 
 
 
 
 
 
510
  // Figures are rendered in same-origin iframes, so fullscreen the fitted
511
  // wrapper rather than the iframe document. This uses the browser's native
512
  // fullscreen UI and preserves the figure's existing responsive sizing.
 
635
  ? `<span class="out-artifact-state open">Open ↗</span>`
636
  : `<span class="out-artifact-state">publish to share</span>`;
637
  const meta = parts.length ? `${parts.join(" · ")} · ${state}` : state;
 
638
  el.innerHTML =
639
+ `<span class="out-artifact-ico">${ARTIFACT_ICON_IMG}</span>` +
640
  `<span class="out-artifact-name">${esc(info.name)}</span>` +
641
  `<span class="out-artifact-meta">${meta}</span>`;
642
  return el;
643
  }
644
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
645
  function renderCodeCell(body, container, artifacts) {
646
  const parts = parseFences(body);
647
  const block = document.createElement("div");
 
694
  embedTexts.push(part.text);
695
  return;
696
  }
697
+ inputBody.appendChild(renderCode(part.text, part.lang, part.title));
 
 
 
 
 
 
698
  });
699
  if (artifacts && artifacts.length) {
700
  ensureOut();
 
913
  return btn;
914
  }
915
 
916
+ function renderCode(code, lang, title) {
917
  const pre = document.createElement("pre");
918
  pre.className = "hl";
919
  const c = document.createElement("code");
920
  c.innerHTML = highlightCode(code, lang);
921
  pre.appendChild(c);
922
+ if (!title) {
923
  const wrap = document.createElement("div");
924
  wrap.className = "snippet";
925
  wrap.appendChild(pre);
 
983
  });
984
  }
985
 
986
+ /* -------------------- resources rail -------------------- */
987
 
988
  function fmt(n) {
989
  if (n == null) return null;
 
1011
  const ARTIFACT_ICON_IMG = `<img class="art-ico" src="./bucket-icon.svg" alt="" />`;
1012
  const DASHBOARD_ICON_IMG = `<img class="art-ico" src="./trackio-logo-light.png" alt="" />`;
1013
 
1014
+ const RESOURCE_DESC = {
1015
+ dashboard: "Dashboard",
1016
+ model: "Model",
1017
+ dataset: "Dataset",
1018
+ space: "Space",
1019
+ artifact: "Artifact — in Bucket",
1020
+ paper: "Paper",
1021
+ repo: "Repository",
1022
+ job: "Job — status & logs",
1023
+ bucket: "Bucket — artifacts & data",
1024
+ };
1025
+
1026
  const HF_NON_MODEL_PREFIX =
1027
  /^(datasets|spaces|jobs|buckets|papers|blog|docs|api|posts|collections|organizations|settings|new|join|login|pricing|tasks|learn|chat|models)(\/|$)/;
1028
 
 
1030
  return url.split(marker)[1].split(/[?#]/)[0].replace(/\/$/, "");
1031
  }
1032
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1033
  function classifyResource(url) {
1034
  if (IMG_URL.test(url)) {
1035
  return null;
 
1059
  local: true,
1060
  };
1061
  }
1062
+ if ((m = url.match(/huggingface\.co\/buckets\/[^#\s]+#(.+)/))) {
1063
+ return { kind: "artifact", id: decodeURIComponent(m[1]), url };
 
1064
  }
1065
+ if (/huggingface\.co\/datasets\/[^/]+\/[^/]+/.test(url)) {
1066
+ return { kind: "dataset", id: hfId(url, "/datasets/"), url };
 
 
1067
  }
1068
+ if (/huggingface\.co\/spaces\/[^/]+\/[^/]+/.test(url)) {
1069
+ return { kind: "space", id: hfId(url, "/spaces/"), url };
 
 
1070
  }
1071
  if (/huggingface\.co\/jobs\//.test(url)) {
1072
+ const parts = hfId(url, "/jobs/").split("/");
1073
+ const jid = parts[1] || "";
 
1074
  return {
1075
  kind: "job",
1076
+ id: parts[0] + (jid ? ` · ${jid.slice(0, 12)}${jid.length > 12 ? "…" : ""}` : ""),
1077
  url,
1078
  };
1079
  }
1080
  if (/huggingface\.co\/buckets\//.test(url)) {
1081
+ return { kind: "bucket", id: hfId(url, "/buckets/"), url };
 
 
1082
  }
1083
  if (/huggingface\.co\/papers\//.test(url)) {
1084
+ return { kind: "paper", id: `Paper ${hfId(url, "/papers/")}`, url };
 
 
1085
  }
1086
  if ((m = url.match(/arxiv\.org\/(?:abs|pdf)\/([^?#\s]+)/))) {
1087
  return { kind: "paper", id: `arXiv:${m[1].replace(/\.pdf$/, "")}`, url };
 
1091
  }
1092
  if ((m = url.match(/huggingface\.co\/([^?#]+)/))) {
1093
  const rest = m[1].replace(/\/$/, "");
1094
+ if (/^[^/]+\/[^/]+$/.test(rest) && !HF_NON_MODEL_PREFIX.test(rest)) {
1095
  return { kind: "model", id: rest, url };
1096
  }
1097
  }
1098
  return null;
1099
  }
1100
 
1101
+ async function fillRailMeta(item, el) {
1102
+ if (item.local) return;
1103
+ const meta = el.querySelector(".rail-meta");
1104
+ const set = (parts) => {
1105
+ const text = parts.filter(Boolean).join(" · ");
1106
+ if (text) meta.textContent = text;
1107
+ };
1108
+ if (item.kind === "model") {
1109
+ const d = await getJSON(`https://huggingface.co/api/models/${item.id}`);
1110
+ if (d) set([d.pipeline_tag, `↓ ${fmt(d.downloads)}`, `♥ ${fmt(d.likes)}`]);
1111
+ } else if (item.kind === "dataset") {
1112
+ const d = await getJSON(`https://huggingface.co/api/datasets/${item.id}`);
1113
+ if (d) set([`↓ ${fmt(d.downloads)}`, `♥ ${fmt(d.likes)}`]);
1114
+ } else if (item.kind === "space" || item.kind === "dashboard") {
1115
+ const d = await getJSON(`https://huggingface.co/api/spaces/${item.id}`);
1116
+ if (d) set([d.sdk, `♥ ${fmt(d.likes)}`]);
1117
+ } else if (item.kind === "repo") {
1118
+ const d = await getJSON(`https://api.github.com/repos/${item.id}`);
1119
+ if (d) set([`★ ${fmt(d.stargazers_count)}`, d.language]);
1120
+ } else if (item.kind === "paper") {
1121
+ const m = item.id.match(/^(?:arXiv:|Paper )(.+)$/);
1122
+ if (!m) return;
1123
+ const arxivId = m[1].replace(/v\d+$/, "");
1124
+ const d = await getJSON(`https://huggingface.co/api/papers/${arxivId}`);
1125
+ if (d && d.id) {
1126
+ if (el.href) el.href = `https://huggingface.co/papers/${d.id}`;
1127
+ const title =
1128
+ d.title && d.title.length > 70 ? `${d.title.slice(0, 69)}…` : d.title;
1129
+ set([title, d.upvotes ? `��� ${fmt(d.upvotes)}` : null]);
1130
+ }
1131
+ }
1132
+ }
1133
+
1134
+ const BARE_ID_SKIP_DIRS = new Set([
1135
+ "scripts",
1136
+ "configs",
1137
+ "config",
1138
+ "results",
1139
+ "figures",
1140
+ "data",
1141
+ "datasets",
1142
+ "src",
1143
+ "tests",
1144
+ "test",
1145
+ "examples",
1146
+ "pages",
1147
+ "assets",
1148
+ "docs",
1149
+ "outputs",
1150
+ "output",
1151
+ "checkpoints",
1152
+ "models",
1153
+ "utils",
1154
+ "lib",
1155
+ "bin",
1156
+ "tmp",
1157
+ "node_modules",
1158
+ "dist",
1159
+ "build",
1160
+ ]);
1161
+ const FILE_EXT_RE =
1162
+ /\.(py|pyc|js|ts|jsx|tsx|json|jsonl|yaml|yml|csv|tsv|md|txt|sh|bash|html|css|png|jpe?g|svg|gif|webp|ipynb|toml|cfg|ini|lock|pdf|whl|gz|zip|tar|pt|pth|bin|safetensors|db|sqlite)$/i;
1163
+
1164
+ async function detectBareModelIds(text, groups) {
1165
+ const stripped = text.replace(DETECTED_URL, " ");
1166
+ DETECTED_URL.lastIndex = 0;
1167
+ const seen = new Set();
1168
+ const candidates = [];
1169
+ const re = /(^|[\s"'`(=[])([A-Za-z0-9][\w.-]*\/[A-Za-z0-9][\w.-]*)/g;
1170
+ let m;
1171
+ while ((m = re.exec(stripped)) && candidates.length < 15) {
1172
+ const id = m[2].replace(/[.:,]+$/, "");
1173
+ if (seen.has(id)) continue;
1174
+ seen.add(id);
1175
+ if (FILE_EXT_RE.test(id)) continue;
1176
+ if (BARE_ID_SKIP_DIRS.has(id.split("/")[0].toLowerCase())) continue;
1177
+ candidates.push(id);
1178
+ }
1179
+ const results = await Promise.all(
1180
+ candidates.map((id) => getJSON(`https://huggingface.co/api/models/${id}`))
1181
+ );
1182
+ let added = false;
1183
+ const confirmed = [];
1184
+ results.forEach((d, i) => {
1185
+ if (!d || !d.id) return;
1186
+ const id = candidates[i];
1187
+ confirmed.push(id);
1188
+ const url = `https://huggingface.co/${id}`;
1189
+ if (!groups.has("model")) groups.set("model", new Map());
1190
+ if (!groups.get("model").has(url)) {
1191
+ groups.get("model").set(url, { kind: "model", id, url });
1192
+ added = true;
1193
+ }
1194
+ });
1195
+ return { added, confirmed };
1196
+ }
1197
+
1198
+ function chipifyBareIds(ids, container) {
1199
+ if (!ids.length) return;
1200
+ const escaped = ids.map((id) => id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
1201
+ const pattern = new RegExp("(" + escaped.join("|") + ")");
1202
+ const splitter = new RegExp(pattern.source, "g");
1203
+ container
1204
+ .querySelectorAll(".cell.markdown .cell-body")
1205
+ .forEach((body) => {
1206
+ const walker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, {
1207
+ acceptNode(node) {
1208
+ if (!pattern.test(node.nodeValue)) return NodeFilter.FILTER_REJECT;
1209
+ for (
1210
+ let el = node.parentElement;
1211
+ el && el !== body;
1212
+ el = el.parentElement
1213
+ ) {
1214
+ if (["A", "CODE", "PRE", "BUTTON"].indexOf(el.tagName) !== -1) {
1215
+ return NodeFilter.FILTER_REJECT;
1216
+ }
1217
+ }
1218
+ return NodeFilter.FILTER_ACCEPT;
1219
+ },
1220
+ });
1221
+ const nodes = [];
1222
+ while (walker.nextNode()) nodes.push(walker.currentNode);
1223
+ nodes.forEach((node) => {
1224
+ const frag = document.createDocumentFragment();
1225
+ node.nodeValue.split(splitter).forEach((part) => {
1226
+ if (ids.indexOf(part) !== -1) {
1227
+ const holder = document.createElement("span");
1228
+ holder.innerHTML = resChipHtml({
1229
+ kind: "model",
1230
+ id: part,
1231
+ url: `https://huggingface.co/${part}`,
1232
+ });
1233
+ frag.appendChild(holder.firstChild);
1234
+ } else if (part) {
1235
+ frag.appendChild(document.createTextNode(part));
1236
+ }
1237
+ });
1238
+ node.parentNode.replaceChild(frag, node);
1239
+ });
1240
+ });
1241
+ }
1242
+
1243
+ let RAIL_TOKEN = 0;
1244
+ const RAIL_EXCLUDE_KINDS = new Set(["paper", "repo", "artifact", "dashboard"]);
1245
+
1246
+ function railDashboardItem(it) {
1247
+ return {
1248
+ kind: "dashboard",
1249
+ id: it.id,
1250
+ url: it.local ? it.resUrl : it.url || it.resUrl,
1251
+ local: it.local,
1252
+ railLabel: "Dashboard",
1253
+ };
1254
+ }
1255
+
1256
+ function promoteTrackioSpacesInRail(groups, dashResUrls, body, rail, token) {
1257
+ const spaceGroup = groups.get("space");
1258
+ if (!spaceGroup || !spaceGroup.size) return;
1259
+ spaceGroup.forEach((item, url) => {
1260
+ getJSON(`https://huggingface.co/api/spaces/${item.id}`)
1261
+ .then((d) => {
1262
+ if (rail.dataset.renderToken !== token) return;
1263
+ const tags = (d && d.tags) || [];
1264
+ if (!tags.some((t) => String(t).toLowerCase() === "trackio")) return;
1265
+ if (dashResUrls.has(url)) return;
1266
+ spaceGroup.delete(url);
1267
+ if (!spaceGroup.size) groups.delete("space");
1268
+ if (!groups.has("dashboard")) groups.set("dashboard", new Map());
1269
+ groups.get("dashboard").set(url, {
1270
+ kind: "dashboard",
1271
+ id: item.id,
1272
+ url: item.url,
1273
+ local: false,
1274
+ railLabel: "Dashboard",
1275
+ });
1276
+ dashResUrls.add(url);
1277
+ paintRail(groups, body, rail);
1278
+ })
1279
+ .catch(() => {});
1280
+ });
1281
+ }
1282
+
1283
+ function renderRail(md, body, rail) {
1284
+ const token = String(++RAIL_TOKEN);
1285
+ rail.dataset.renderToken = token;
1286
+ const scanText = md.replace(
1287
+ /(`{3,4}|~{3,4})(html|raw)[^\n]*\n[\s\S]*?\n\1/g,
1288
+ " "
1289
+ );
1290
+ const groups = new Map();
1291
+ const dashMap = new Map();
1292
+ const dashResUrls = new Set();
1293
+ cellDashboardItems(md).forEach((it) => {
1294
+ if (dashMap.has(it.resUrl)) return;
1295
+ dashMap.set(it.resUrl, railDashboardItem(it));
1296
+ dashResUrls.add(it.resUrl);
1297
+ });
1298
+ if (dashMap.size) groups.set("dashboard", dashMap);
1299
+ extractUrls(scanText).forEach((url) => {
1300
+ const item = classifyResource(url);
1301
+ if (!item) return;
1302
+ if (RAIL_EXCLUDE_KINDS.has(item.kind)) return;
1303
+ if (dashResUrls.has(url)) return;
1304
+ if (!groups.has(item.kind)) groups.set(item.kind, new Map());
1305
+ groups.get(item.kind).set(item.url, item);
1306
+ });
1307
+ const artMap = new Map();
1308
+ cellArtifactItems(md).forEach((it) => {
1309
+ if (artMap.has(it.resUrl)) return;
1310
+ const label = it.type
1311
+ ? it.type.charAt(0).toUpperCase() + it.type.slice(1)
1312
+ : "Artifact";
1313
+ artMap.set(it.resUrl, {
1314
+ kind: "artifact",
1315
+ id: it.name,
1316
+ url: it.local ? it.resUrl : it.url || it.resUrl,
1317
+ local: it.local,
1318
+ railLabel: label,
1319
+ size: it.size,
1320
+ });
1321
+ });
1322
+ if (artMap.size) groups.set("artifact", artMap);
1323
+ paintRail(groups, body, rail);
1324
+ promoteTrackioSpacesInRail(groups, dashResUrls, body, rail, token);
1325
+ detectBareModelIds(scanText, groups)
1326
+ .then((result) => {
1327
+ if (rail.dataset.renderToken !== token) return;
1328
+ chipifyBareIds(result.confirmed, body);
1329
+ if (result.added) paintRail(groups, body, rail);
1330
+ })
1331
+ .catch(() => {});
1332
+ }
1333
+
1334
+ function paintRail(groups, body, rail) {
1335
+ rail.innerHTML = "";
1336
+ RESOURCE_SECTIONS.forEach(([kind, label, icon]) => {
1337
+ const group = groups.get(kind);
1338
+ if (!group || !group.size) return;
1339
+ group.forEach((item) => {
1340
+ const el = document.createElement(item.local ? "div" : "a");
1341
+ el.className = item.local ? "rail-item rail-local" : "rail-item";
1342
+ if (!item.local) {
1343
+ el.href = item.url;
1344
+ el.target = "_blank";
1345
+ el.rel = "noopener";
1346
+ }
1347
+ el.dataset.resUrl = item.url;
1348
+ let desc;
1349
+ if (kind === "artifact") {
1350
+ const state = item.local ? "publish to share" : "Open ↗";
1351
+ desc = item.size ? `${item.size} · ${state}` : state;
1352
+ } else if (kind === "dashboard") {
1353
+ desc = item.local ? "publish to share" : "Open ↗";
1354
+ } else {
1355
+ desc = item.local ? "publish to share" : RESOURCE_DESC[kind];
1356
+ }
1357
+ const kindLabel = item.railLabel || label.replace(/s$/, "");
1358
+ const iconHtml =
1359
+ kind === "artifact"
1360
+ ? ARTIFACT_ICON_IMG
1361
+ : kind === "dashboard"
1362
+ ? DASHBOARD_ICON_IMG
1363
+ : `<span>${icon}</span>`;
1364
+ el.innerHTML =
1365
+ `<div class="rail-kind">${iconHtml}${esc(kindLabel)}</div>` +
1366
+ `<div class="rail-title">${esc(item.id)}</div>` +
1367
+ `<div class="rail-meta">${esc(desc)}</div>`;
1368
+ rail.appendChild(el);
1369
+ fillRailMeta(item, el)
1370
+ .catch(() => {})
1371
+ .finally(() => scheduleRailPosition(body, rail));
1372
+ });
1373
+ });
1374
+ rail.hidden = !rail.childElementCount;
1375
+ scheduleRailPosition(body, rail);
1376
+ }
1377
+
1378
+ function resourceAnchor(body, url) {
1379
+ return body.querySelector(`[data-res-url="${CSS.escape(url)}"]`);
1380
+ }
1381
+
1382
+ function positionRail(body, rail) {
1383
+ if (rail.hidden || !rail.isConnected) return;
1384
+ const bodyRect = body.getBoundingClientRect();
1385
+ const items = Array.from(rail.querySelectorAll(".rail-item")).map((el, index) => {
1386
+ const anchor = resourceAnchor(body, el.dataset.resUrl);
1387
+ return {
1388
+ el,
1389
+ index,
1390
+ desired: anchor
1391
+ ? Math.max(0, anchor.getBoundingClientRect().top - bodyRect.top)
1392
+ : 0,
1393
+ };
1394
+ });
1395
+ items.sort((a, b) => a.desired - b.desired || a.index - b.index);
1396
+ let cursor = 0;
1397
+ items.forEach(({ el, desired }) => {
1398
+ const top = Math.max(desired, cursor);
1399
+ el.style.top = `${top}px`;
1400
+ cursor = top + el.offsetHeight + 10;
1401
+ });
1402
+ rail.style.minHeight = `${Math.max(body.offsetHeight, cursor)}px`;
1403
+ }
1404
+
1405
+ function scheduleRailPosition(body, rail) {
1406
+ cancelAnimationFrame(Number(rail.dataset.positionFrame || 0));
1407
+ rail.dataset.positionFrame = String(
1408
+ requestAnimationFrame(() => positionRail(body, rail))
1409
+ );
1410
+ }
1411
+
1412
  function dashboardSubdomainFromUrl(url) {
1413
  return spaceIdFromUrl(url).toLowerCase().replace(/[^a-z0-9-]/g, "-");
1414
  }
 
1523
  function buildTree() {
1524
  const tree = document.getElementById("tree");
1525
  tree.innerHTML = "";
 
 
 
 
1526
  const nodes = [];
1527
  (MANIFEST.root.children || []).forEach((c) => flattenTree(c, 0, nodes));
1528
  nodes.forEach(({ node, depth }) => {
1529
  const a = document.createElement("a");
1530
+ a.href = "#/" + node.slug;
1531
  a.className = "depth-" + depth;
1532
  a.dataset.slug = node.slug;
1533
  const mark = document.createElement("span");
 
1539
  });
1540
  }
1541
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1542
  function highlight(slug) {
1543
  document
1544
  .querySelectorAll("#tree a")
 
1552
  Object.keys(PAGE_CACHE).forEach((key) => {
1553
  delete PAGE_CACHE[key];
1554
  });
 
 
 
1555
  }
1556
 
1557
  function isLocalPreview() {
 
1577
  return PAGE_CACHE[node.file];
1578
  }
1579
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1580
  function allNodes() {
1581
  const nodes = [];
1582
  flattenTree(MANIFEST.root, 0, nodes);
 
1621
  cells.forEach(({ meta, body }) => {
1622
  const cell = renderCell(meta, body, list);
1623
  cell.classList.add("pinned-copy");
 
 
1624
  });
1625
  deck.appendChild(list);
1626
  const anchor =
1627
+ container.querySelector(".logbook-stats") ||
1628
+ container.querySelector(".agent-hint");
1629
  container.insertBefore(deck, anchor ? anchor.nextSibling : container.firstChild);
1630
+ container.closest(".book-intro").classList.add("has-pinned-notes");
 
 
 
 
 
 
 
 
 
 
 
 
 
1631
  }
1632
 
1633
  function removeIndexProse(body) {
 
1636
  let current = h1.nextElementSibling;
1637
  while (current && current.tagName !== "H2") {
1638
  const next = current.nextElementSibling;
1639
+ current.remove();
 
 
 
 
1640
  current = next;
1641
  }
1642
  }
 
1655
  }
1656
  }
1657
 
1658
+ const RAIL_OBSERVERS = [];
1659
+
1660
  async function renderLogbook(opts = {}) {
1661
  const scrollY = window.scrollY;
1662
  const page = document.getElementById("page");
1663
+ RAIL_OBSERVERS.splice(0).forEach((observer) => observer.disconnect());
1664
  page.innerHTML = "";
1665
  const nodes = allNodes();
1666
  const markdown = await Promise.all(nodes.map(fetchPage));
 
1667
  const pinnedCells = collectPinnedCells(markdown, nodes);
1668
  let bookIntroBody = null;
1669
  nodes.forEach((node, index) => {
 
1676
  layout.className = "page-layout";
1677
  const body = document.createElement("div");
1678
  body.className = "page-body";
1679
+ const rail = document.createElement("aside");
1680
+ rail.className = "context-rail";
1681
+ rail.setAttribute("aria-label", `Resources for ${node.title}`);
1682
 
1683
  renderMarkdown(markdown[index], body);
1684
  if (node.slug === MANIFEST.root.slug) {
1685
  section.classList.add("book-intro");
1686
  removeIndexProse(body);
1687
  removePageDirectory(body);
1688
+ const hint = buildAgentHint();
1689
  const h1 = body.querySelector("h1");
1690
+ if (h1 && h1.parentNode === body) {
1691
+ body.insertBefore(hint, h1.nextSibling);
1692
+ } else {
1693
+ body.prepend(hint);
1694
+ }
1695
+ hint.after(buildLogbookStats(markdown));
1696
  bookIntroBody = body;
1697
  }
1698
  layout.appendChild(body);
1699
+ layout.appendChild(rail);
1700
  section.appendChild(layout);
1701
  page.appendChild(section);
1702
+ renderRail(markdown[index], body, rail);
1703
+ if (window.ResizeObserver) {
1704
+ const observer = new ResizeObserver(() => scheduleRailPosition(body, rail));
1705
+ observer.observe(body);
1706
+ observer.observe(rail);
1707
+ RAIL_OBSERVERS.push(observer);
1708
+ }
1709
  });
1710
+ if (bookIntroBody) renderPinnedNotes(pinnedCells, bookIntroBody);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1711
  if (bookIntroBody) {
1712
  const section = bookIntroBody.closest(".book-intro");
1713
  const hasExtra = Array.from(bookIntroBody.children).some(
1714
  (el) =>
1715
  el.tagName !== "H1" &&
1716
  !el.classList.contains("agent-hint") &&
1717
+ !el.classList.contains("logbook-stats") &&
1718
  !el.classList.contains("pinned-notes")
1719
  );
1720
  if (section && !section.classList.contains("has-pinned-notes") && !hasExtra) {
 
1731
  });
1732
  }
1733
 
1734
+ function setupResourceHover() {
1735
+ document.addEventListener("mouseover", (e) => {
1736
+ const el = e.target.closest && e.target.closest("[data-res-url]");
1737
+ if (!el || el.classList.contains("rail-item")) return;
1738
+ const url = el.getAttribute("data-res-url");
1739
+ const section = el.closest(".page-section");
1740
+ const scope = section || document;
1741
+ scope.querySelectorAll(".context-rail [data-res-url]").forEach((n) => {
1742
+ n.classList.toggle("res-hl", n.getAttribute("data-res-url") === url);
1743
+ });
1744
+ });
1745
+ document.addEventListener("mouseout", (e) => {
1746
+ const el = e.target.closest && e.target.closest("[data-res-url]");
1747
+ if (!el || el.classList.contains("rail-item")) return;
1748
+ document.querySelectorAll(".context-rail .res-hl").forEach((n) => {
1749
+ n.classList.remove("res-hl");
1750
+ });
1751
+ });
1752
+ }
1753
+
1754
+ let STATS_TOKEN = 0;
1755
+ let STATS_LISTENERS = false;
1756
+
1757
  function fmtBytes(n) {
1758
  if (n == null || isNaN(n)) return null;
1759
  if (n < 1000) return `${n} B`;
 
1771
  return url.split("/spaces/")[1].split(/[?#]/)[0].replace(/\/$/, "");
1772
  }
1773
 
1774
+ const LB_CELL_RE = /(^|\n)---\n<!-- trackio-cell\n([\s\S]*?)\n-->\n([\s\S]*?)(?=\n---\n<!-- trackio-cell\n|\s*$)/g;
1775
+
1776
+ function cellDashboardItems(md) {
1777
+ const re = new RegExp(LB_CELL_RE.source, "g");
1778
+ const items = [];
1779
+ let m;
1780
+ while ((m = re.exec(md))) {
1781
+ const meta = parseCellMeta(m[2]);
1782
+ if (meta.type !== "dashboard") continue;
1783
+ const body = m[3];
1784
+ const project = meta.dashboard_project || "";
1785
+ const sp = body.match(/https:\/\/huggingface\.co\/spaces\/[^\s<>)"'`]+/);
1786
+ const local = !sp;
1787
+ const url = sp ? sp[0] : "";
1788
+ const resUrl = local ? `trackio-local-dashboard://${project}` : url;
1789
+ items.push({
1790
+ id: local ? project : spaceIdFromUrl(url),
1791
+ local,
1792
+ url,
1793
+ resUrl,
1794
+ });
1795
+ }
1796
+ return items;
1797
+ }
1798
+
1799
  function artifactInfoFromCell(meta, body) {
1800
  const name = meta.artifact || meta.path || "";
1801
  let size = null;
 
1820
  };
1821
  }
1822
 
1823
+ function cellArtifactItems(md) {
1824
+ const re = new RegExp(LB_CELL_RE.source, "g");
1825
+ const items = [];
1826
+ let m;
1827
+ while ((m = re.exec(md))) {
1828
+ const meta = parseCellMeta(m[2]);
1829
+ const body = m[3];
1830
+ const order = meta.created_at || "";
1831
+ if (meta.type === "artifact") {
1832
+ const info = artifactInfoFromCell(meta, body);
1833
+ if (info.name) items.push({ ...info, order });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1834
  }
1835
  }
1836
+ return items;
1837
+ }
1838
+
1839
+ function collectLogbookResources(markdownList) {
1840
+ const re = new RegExp(LB_CELL_RE.source, "g");
1841
+ const dashboards = new Map();
1842
+ markdownList.forEach((md) => {
1843
+ let m;
1844
+ while ((m = re.exec(md))) {
1845
+ const meta = parseCellMeta(m[2]);
1846
+ const body = m[3];
1847
+ if (meta.type !== "dashboard") continue;
1848
+ const project = meta.dashboard_project || "";
1849
+ const space = body.match(/https:\/\/huggingface\.co\/spaces\/[^\s<>)"'`]+/);
1850
+ const local = !space;
1851
+ const url = space ? space[0] : "";
1852
+ const key = local ? `local:${project}` : `space:${spaceIdFromUrl(url)}`;
1853
+ const resUrl = local ? `trackio-local-dashboard://${project}` : url;
1854
+ if (!dashboards.has(key))
1855
+ dashboards.set(key, { project, local, url, resUrl });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1856
  }
1857
  });
1858
+ const artifacts = new Map();
1859
+ markdownList.forEach((md) => {
1860
+ cellArtifactItems(md).forEach((it) => {
1861
+ const key = `${it.type}:${it.name}`;
1862
+ const prev = artifacts.get(key);
1863
+ if (!prev || it.order >= prev.order) artifacts.set(key, it);
1864
+ });
1865
+ });
1866
+ return {
1867
+ dashboards: Array.from(dashboards.values()).sort((a, b) =>
1868
+ a.project.localeCompare(b.project)
1869
+ ),
1870
+ artifacts: Array.from(artifacts.values()).sort((a, b) =>
1871
+ a.name.localeCompare(b.name)
1872
+ ),
1873
+ };
1874
  }
1875
 
1876
+ function closeStatPopovers() {
1877
+ document
1878
+ .querySelectorAll(".stat-popover")
1879
+ .forEach((p) => (p.hidden = true));
1880
+ document
1881
+ .querySelectorAll(".stat-tile.open")
1882
+ .forEach((t) => t.classList.remove("open"));
 
 
 
 
 
 
 
 
 
 
1883
  }
1884
 
1885
+ function ensureStatListeners() {
1886
+ if (STATS_LISTENERS) return;
1887
+ STATS_LISTENERS = true;
1888
+ document.addEventListener("click", closeStatPopovers);
1889
+ document.addEventListener("keydown", (e) => {
1890
+ if (e.key === "Escape") closeStatPopovers();
 
 
 
 
 
1891
  });
1892
  }
1893
 
1894
+ function stateHtml(remote, url) {
1895
+ return remote
1896
+ ? `<a class="stat-row-state open" href="${esc(url)}" target="_blank" rel="noopener" title="Open in a new tab">Open ↗</a>`
1897
+ : `<span class="stat-row-state">publish to share</span>`;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1898
  }
1899
 
1900
+ function scrollToResource(resUrl) {
1901
+ closeStatPopovers();
1902
+ if (!resUrl) return;
1903
+ const el = document.querySelector(
1904
+ `#page .page-body [data-res-url="${CSS.escape(resUrl)}"]:not(.stat-row)`
1905
+ );
1906
+ if (!el) return;
1907
+ el.scrollIntoView({ behavior: "smooth", block: "center" });
1908
+ el.classList.add("res-flash");
1909
+ setTimeout(() => el.classList.remove("res-flash"), 1500);
1910
+ }
1911
+
1912
+ function dashRowHtml(d) {
1913
+ const inner =
1914
+ `<span class="stat-row-ico">${DASHBOARD_ICON_IMG}</span>` +
1915
+ `<div class="stat-row-main"><div class="stat-row-title">${esc(d.project)}</div>` +
1916
+ `<div class="stat-row-meta">${stateHtml(!d.local, d.url)}</div></div>`;
1917
+ return `<div class="stat-row" data-res-url="${esc(d.resUrl)}" title="Jump to it in the logbook">${inner}</div>`;
1918
+ }
1919
+
1920
+ function artRowHtml(a) {
1921
+ const remote = !a.local && !!a.url;
1922
+ const parts = [a.type, a.size].filter(Boolean).map(esc);
1923
+ const meta = parts.length
1924
+ ? `${parts.join(" · ")} · ${stateHtml(remote, a.url)}`
1925
+ : stateHtml(remote, a.url);
1926
+ const inner =
1927
+ `<span class="stat-row-ico">${ARTIFACT_ICON_IMG}</span>` +
1928
+ `<div class="stat-row-main"><div class="stat-row-title">${esc(a.name)}</div>` +
1929
+ `<div class="stat-row-meta">${meta}</div></div>`;
1930
+ return `<div class="stat-row" data-res-url="${esc(a.resUrl)}" title="Jump to it in the logbook">${inner}</div>`;
1931
+ }
1932
+
1933
+ function statTile(icon, alt, singular, plural, head, rowFn) {
1934
+ const tile = document.createElement("button");
1935
+ tile.type = "button";
1936
+ tile.className = "stat-tile";
1937
+ const render = (items) => {
1938
+ const count = items.length;
1939
+ const label = count === 1 ? singular : plural;
1940
+ const caret = count > 0 ? `<span class="stat-caret">▾</span>` : "";
1941
+ tile.innerHTML =
1942
+ `<img class="stat-icon" src="${icon}" alt="${esc(alt)}" />` +
1943
+ `<div class="stat-text"><div class="stat-num">${count}</div>` +
1944
+ `<div class="stat-label">${esc(label)}</div></div>` +
1945
+ caret;
1946
+ tile.disabled = count === 0;
1947
+ if (count > 0) {
1948
+ const pop = document.createElement("div");
1949
+ pop.className = "stat-popover";
1950
+ pop.hidden = true;
1951
+ pop.innerHTML =
1952
+ `<div class="stat-pop-head">${esc(head)}</div>` +
1953
+ items.map(rowFn).join("");
1954
+ pop.addEventListener("click", (e) => {
1955
+ if (e.target.closest("a.stat-row-state")) {
1956
+ e.stopPropagation();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1957
  return;
1958
  }
1959
+ e.stopPropagation();
1960
+ const row = e.target.closest(".stat-row");
1961
+ if (row) scrollToResource(row.dataset.resUrl);
 
 
1962
  });
1963
+ tile.appendChild(pop);
 
 
 
 
 
 
 
 
 
1964
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1965
  };
1966
+ tile.addEventListener("click", (e) => {
1967
+ if (tile.disabled) return;
1968
+ e.stopPropagation();
1969
+ const pop = tile.querySelector(".stat-popover");
1970
+ if (!pop) return;
1971
+ const isOpen = !pop.hidden;
1972
+ closeStatPopovers();
1973
+ if (!isOpen) {
1974
+ pop.hidden = false;
1975
+ tile.classList.add("open");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1976
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1977
  });
1978
+ return { tile, render };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1979
  }
1980
 
1981
+ function buildLogbookStats(markdownList) {
1982
+ const token = ++STATS_TOKEN;
1983
+ ensureStatListeners();
1984
+ const { dashboards, artifacts } = collectLogbookResources(markdownList);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1985
 
1986
+ const el = document.createElement("div");
1987
+ el.className = "logbook-stats";
1988
+ const dash = statTile(
1989
+ "./trackio-logo-light.png",
1990
+ "Trackio",
1991
+ "Trackio Dashboard",
1992
+ "Trackio Dashboards",
1993
+ "Dashboards created in this logbook",
1994
+ dashRowHtml
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1995
  );
1996
+ const art = statTile(
1997
+ "./bucket-icon.svg",
1998
+ "Bucket",
1999
+ "Artifact",
2000
+ "Artifacts",
2001
+ "Artifacts created in this logbook",
2002
+ artRowHtml
2003
+ );
2004
+ dash.render(dashboards);
2005
+ art.render(artifacts);
2006
+ el.appendChild(dash.tile);
2007
+ el.appendChild(art.tile);
2008
+
2009
+ const scanText = markdownList
2010
+ .map((md) =>
2011
+ md.replace(/(`{3,4}|~{3,4})(html|raw)[^\n]*\n[\s\S]*?\n\1/g, " ")
2012
  )
2013
+ .join("\n");
2014
+ const seen = new Set(
2015
+ dashboards.map((d) =>
2016
+ d.local ? `local:${d.project}` : `space:${spaceIdFromUrl(d.url)}`
2017
+ )
2018
+ );
2019
+ const remoteSpaces = new Map();
2020
+ extractUrls(scanText).forEach((url) => {
2021
+ const item = classifyResource(url);
2022
+ if (item && item.kind === "space" && !item.local) {
2023
+ remoteSpaces.set(item.url, item);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2024
  }
2025
+ });
2026
+ remoteSpaces.forEach((s) => {
2027
+ const key = `space:${s.id}`;
2028
+ if (seen.has(key)) return;
2029
+ getJSON(`https://huggingface.co/api/spaces/${s.id}`)
2030
+ .then((d) => {
2031
+ if (STATS_TOKEN !== token) return;
2032
+ const tags = (d && d.tags) || [];
2033
+ if (
2034
+ !seen.has(key) &&
2035
+ tags.some((t) => String(t).toLowerCase() === "trackio")
2036
+ ) {
2037
+ seen.add(key);
2038
+ dashboards.push({
2039
+ project: s.id,
2040
+ local: false,
2041
+ url: s.url,
2042
+ resUrl: s.url,
2043
+ });
2044
+ dashboards.sort((a, b) => a.project.localeCompare(b.project));
2045
+ dash.render(dashboards);
2046
+ }
2047
+ })
2048
+ .catch(() => {});
2049
+ });
2050
+ return el;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2051
  }
2052
 
2053
+ function buildAgentHint() {
2054
+ const onSpaces =
2055
+ /\.hf\.space$/.test(location.hostname) ||
2056
+ /(^|\.)huggingface\.co$/.test(location.hostname);
2057
+ let source = "";
2058
+ if (onSpaces && MANIFEST.space_id) {
2059
+ source = ` ${MANIFEST.space_id}`;
2060
+ } else if (/^https?:$/.test(location.protocol)) {
2061
+ source = ` ${location.origin}/`;
2062
+ }
2063
+ const command = `trackio logbook read${source}`;
2064
+ const tokens = MANIFEST.agent_view_tokens;
2065
+ const div = document.createElement("div");
2066
+ div.className = "agent-hint";
2067
+ const label = document.createElement("span");
2068
+ label.className = "agent-hint-label";
2069
+ label.textContent = "Read from the CLI:";
2070
+ const code = document.createElement("code");
2071
+ code.textContent = command;
2072
+ const copy = document.createElement("button");
2073
+ copy.className = "copy";
2074
+ copy.type = "button";
2075
+ copy.title = "Copy";
2076
+ copy.textContent = "⧉";
2077
+ copy.addEventListener("click", () => copyText(command, copy, "⧉"));
2078
+ const note = document.createElement("span");
2079
+ note.className = "agent-hint-note";
2080
+ note.textContent =
2081
+ "compact view for agents" + (tokens ? ` · ~${fmt(tokens)} tokens` : "");
2082
+ div.appendChild(label);
2083
+ div.appendChild(code);
2084
+ div.appendChild(copy);
2085
+ div.appendChild(note);
2086
+ return div;
2087
  }
2088
 
2089
  function currentSlug() {
2090
+ const slug = (location.hash || "").replace(/^#\//, "") || MANIFEST.root.slug;
2091
+ return findNode(MANIFEST.root, slug) ? slug : MANIFEST.root.slug;
2092
  }
2093
 
2094
  function scrollToHash(opts = {}) {
 
2095
  const slug = currentSlug();
2096
+ if (!location.hash) {
2097
  window.scrollTo({ top: 0, behavior: opts.behavior || "auto" });
2098
  highlight(slug);
2099
  return;
 
2106
  function navigateToLogbookSlug(target) {
2107
  const slug = String(target || "").replace(/^#?\//, "").trim();
2108
  if (!slug || !findNode(MANIFEST.root, slug)) return;
2109
+ const hash = "#/" + slug;
2110
  if (location.hash === hash) {
2111
  scrollToHash({ behavior: "smooth" });
2112
  } else {
 
2130
 
2131
  let SCROLL_FRAME = 0;
2132
  function updateActiveSection() {
 
2133
  cancelAnimationFrame(SCROLL_FRAME);
2134
  SCROLL_FRAME = requestAnimationFrame(() => {
2135
+ const sections = Array.from(document.querySelectorAll(".page-section"));
 
 
2136
  if (!sections.length) return;
2137
  const marker = Math.min(window.innerHeight * 0.28, 180);
2138
  let active = sections[0];
 
2145
  ) {
2146
  active = sections[sections.length - 1];
2147
  }
2148
+ highlight(active.dataset.slug);
 
 
 
 
2149
  });
2150
  }
2151
 
 
2161
  document.getElementById("book-title").textContent = MANIFEST.title;
2162
  document.getElementById("book-head").setAttribute("aria-label", MANIFEST.title);
2163
  buildTree();
2164
+ renderLogbook({ preserveScroll: true });
2165
  } catch (e) {}
2166
  }, LIVE_RELOAD_MS);
2167
  }
 
2257
  document.getElementById("book-title").textContent = MANIFEST.title;
2258
  document.getElementById("book-head").setAttribute("aria-label", MANIFEST.title);
2259
  document.getElementById("book-head").addEventListener("click", () => {
2260
+ const target = "#/" + MANIFEST.root.slug;
2261
  if (location.hash === target) scrollToHash();
2262
  else location.hash = target;
2263
  });
2264
  buildTree();
2265
  setupConnect();
2266
+ setupResourceHover();
2267
  setupFigureNavigation();
2268
+ window.addEventListener("hashchange", () => scrollToHash());
2269
  window.addEventListener("scroll", updateActiveSection, { passive: true });
2270
+ await renderLogbook();
2271
  startLiveReload();
2272
  }
2273
 
logbook.json CHANGED
@@ -1,7 +1,7 @@
1
  {
2
- "schema_version": 2,
3
- "title": "Reproduction: [Differentiable Conformal Training for LLM Reasoning Factuality](https://openreview.net/forum?id=XfndtVLIub)",
4
- "emoji": "🎯",
5
  "space_id": "SabaPivot/repro-differentiable-conformal-training-for-llm-reasoning-factuality",
6
  "paper": {
7
  "arxiv_id": "2604.20098"
@@ -10,10 +10,10 @@
10
  "icml2026-repro",
11
  "paper-XfndtVLIub"
12
  ],
13
- "updated_at": "2026-07-29T01:49:55+00:00",
14
  "root": {
15
  "slug": "index",
16
- "title": "Reproduction: [Differentiable Conformal Training for LLM Reasoning Factuality](https://openreview.net/forum?id=XfndtVLIub)",
17
  "file": "pages/index.md",
18
  "children": [
19
  {
@@ -23,39 +23,39 @@
23
  "children": []
24
  },
25
  {
26
- "slug": "claim-1-differentiable-coherent-factuality-dcf-achieves-up-to-a-141-improvement-in-claim-retention-over-frequency-based-baselines-on-the-math-dataset-at-reliability-level-0-03-1-76-vs-0-73-claims-retained-section-4-3",
27
  "title": "Claim 1: Differentiable Coherent Factuality (DCF) achieves up to a 141% improvement in claim retention over frequency-based baselines on the MATH dataset at reliability level α=0.03 (1.76 vs. 0.73 claims retained) (Section 4.3).",
28
- "file": "pages/claim-1-differentiable-coherent-factuality-dcf-achieves-up-to-a-141-improvement-in-claim-retention-over-frequency-based-baselines-on-the-math-dataset-at-reliability-level-0-03-1-76-vs-0-73-claims-retained-section-4-3/page.md",
29
  "children": []
30
  },
31
  {
32
- "slug": "claim-2-dcf-achieves-up-to-a-61-improvement-in-claim-retention-over-frequency-based-baselines-on-the-felm-dataset-at-0-01-section-4-3",
33
  "title": "Claim 2: DCF achieves up to a 61% improvement in claim retention over frequency-based baselines on the FELM dataset at α=0.01 (Section 4.3).",
34
- "file": "pages/claim-2-dcf-achieves-up-to-a-61-improvement-in-claim-retention-over-frequency-based-baselines-on-the-felm-dataset-at-0-01-section-4-3/page.md",
35
  "children": []
36
  },
37
  {
38
- "slug": "claim-3-theorem-3-1-calibration-convergence-shows-that-as-temperature-parameters-approach-their-limits-dcf-soft-nonconformity-scores-converge-to-the-hard-coherent-factuality-algorithm-scores-recovering-its-conformal-quantile-properties-theorem-3-1",
39
- "title": "Claim 3: Theorem 3.1 (Calibration Convergence) shows that as temperature parameters approach their limits, DCF soft nonconformity scores converge to the hard Coherent Factuality algorithm scores, recovering its conformal quantile properties (Theorem 3.1).",
40
- "file": "pages/claim-3-theorem-3-1-calibration-convergence-shows-that-as-temperature-parameters-approach-their-limits-dcf-soft-nonconformity-scores-converge-to-the-hard-coherent-factuality-algorithm-scores-recovering-its-conformal-quantile-properties-theorem-3-1/page.md",
41
  "children": []
42
  },
43
  {
44
- "slug": "claim-4-theorem-3-2-prediction-convergence-shows-dcf-soft-retention-probabilities-converge-to-the-original-coherent-factuality-prediction-set-preserving-test-time-coverage-guarantees-theorem-3-2",
45
- "title": "Claim 4: Theorem 3.2 prediction convergence",
46
- "file": "pages/claim-4-theorem-3-2-prediction-convergence-shows-dcf-soft-retention-probabilities-converge-to-the-original-coherent-factuality-prediction-set-preserving-test-time-coverage-guarantees-theorem-3-2/page.md",
47
  "children": []
48
  },
49
  {
50
- "slug": "claim-5-dcf-soft-relaxations-achieve-90-100-agreement-with-hard-coherent-factuality-predictions-across-0-01-0-10-validating-the-smooth-approximation-section-4-2",
51
- "title": "Claim 5: DCF soft relaxations achieve 90-100% agreement with hard Coherent Factuality predictions across α∈[0.01, 0.10], validating the smooth approximation (Section 4.2).",
52
- "file": "pages/claim-5-dcf-soft-relaxations-achieve-90-100-agreement-with-hard-coherent-factuality-predictions-across-0-01-0-10-validating-the-smooth-approximation-section-4-2/page.md",
53
  "children": []
54
  },
55
  {
56
- "slug": "claim-6-dcf-jointly-relaxes-claim-scoring-together-with-logical-ancestor-coherence-enforcement-and-constrained-argmax-selection-rather-than-treating-these-graph-operations-independently-section-3-2-3-4",
57
- "title": "Claim 6: Joint differentiable graph-structured pipeline",
58
- "file": "pages/claim-6-dcf-jointly-relaxes-claim-scoring-together-with-logical-ancestor-coherence-enforcement-and-constrained-argmax-selection-rather-than-treating-these-graph-operations-independently-section-3-2-3-4/page.md",
59
  "children": []
60
  },
61
  {
@@ -66,15 +66,6 @@
66
  }
67
  ]
68
  },
69
- "traces": [],
70
- "workspace": {
71
- "file": "workspace.json",
72
- "file_count": 0,
73
- "total_size": 0,
74
- "bucket_id": null
75
- },
76
- "agent_view_tokens": 6502,
77
- "trace_view_tokens": 10,
78
- "workspace_view_tokens": 8,
79
- "revision": "39bd04de1e93eed51f4c"
80
- }
 
1
  {
2
+ "schema_version": 1,
3
+ "title": "Reproduction: Differentiable Conformal Training for LLM Reasoning Factuality",
4
+ "emoji": "🧭",
5
  "space_id": "SabaPivot/repro-differentiable-conformal-training-for-llm-reasoning-factuality",
6
  "paper": {
7
  "arxiv_id": "2604.20098"
 
10
  "icml2026-repro",
11
  "paper-XfndtVLIub"
12
  ],
13
+ "updated_at": "2026-07-29T02:13:39Z",
14
  "root": {
15
  "slug": "index",
16
+ "title": "Reproduction: Differentiable Conformal Training for LLM Reasoning Factuality",
17
  "file": "pages/index.md",
18
  "children": [
19
  {
 
23
  "children": []
24
  },
25
  {
26
+ "slug": "claim-1-math-retention",
27
  "title": "Claim 1: Differentiable Coherent Factuality (DCF) achieves up to a 141% improvement in claim retention over frequency-based baselines on the MATH dataset at reliability level α=0.03 (1.76 vs. 0.73 claims retained) (Section 4.3).",
28
+ "file": "pages/claim-1-math-retention/page.md",
29
  "children": []
30
  },
31
  {
32
+ "slug": "claim-2-felm-retention",
33
  "title": "Claim 2: DCF achieves up to a 61% improvement in claim retention over frequency-based baselines on the FELM dataset at α=0.01 (Section 4.3).",
34
+ "file": "pages/claim-2-felm-retention/page.md",
35
  "children": []
36
  },
37
  {
38
+ "slug": "claim-3-calibration-convergence",
39
+ "title": "Claim 3: Theorem 3.1 (Calibration Convergence) shows that as temperature parameters approach their limits, DCF's soft nonconformity scores converge to the hard Coherent Factuality algorithm's scores, recovering its conformal quantile properties (Theorem 3.1).",
40
+ "file": "pages/claim-3-calibration-convergence/page.md",
41
  "children": []
42
  },
43
  {
44
+ "slug": "claim-4-prediction-convergence",
45
+ "title": "Claim 4: Theorem 3.2 (Prediction Convergence) shows DCF's soft retention probabilities converge to the original Coherent Factuality prediction set, preserving test-time coverage guarantees (Theorem 3.2).",
46
+ "file": "pages/claim-4-prediction-convergence/page.md",
47
  "children": []
48
  },
49
  {
50
+ "slug": "claim-5-soft-hard-agreement",
51
+ "title": "Claim 5: DCF's soft relaxations achieve 90-100% agreement with hard Coherent Factuality predictions across α∈[0.01, 0.10], validating the smooth approximation (Section 4.2).",
52
+ "file": "pages/claim-5-soft-hard-agreement/page.md",
53
  "children": []
54
  },
55
  {
56
+ "slug": "claim-6-joint-relaxation",
57
+ "title": "Claim 6: DCF jointly relaxes claim scoring together with logical-ancestor coherence enforcement and constrained argmax selection, rather than treating these graph operations independently (Section 3.2-3.4).",
58
+ "file": "pages/claim-6-joint-relaxation/page.md",
59
  "children": []
60
  },
61
  {
 
66
  }
67
  ]
68
  },
69
+ "agent_view_tokens": 5000,
70
+ "revision": "1785148200000000000"
71
+ }
 
 
 
 
 
 
 
 
 
pages/claim-1-math-retention/page.md ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # Claim 1: Differentiable Coherent Factuality (DCF) achieves up to a 141% improvement in claim retention over frequency-based baselines on the MATH dataset at reliability level α=0.03 (1.76 vs. 0.73 claims retained) (Section 4.3).
2
+
3
+
4
+ ---
5
+ <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_dcf_claim_1", "created_at": "2026-07-25T20:42:26+00:00", "title": "Claim 1: Differentiable Coherent Factuality (DCF) achieves up to a 141% improvement in claim retention over frequency-based baselines on the MATH dataset at reliability level α=0.03 (1.76 vs. 0.73 claims retained) (Section 4.3)."}
7
+ -->
8
+ **Verdict: falsified as the literal composite reliability claim.** The exact official MATH record gives 1.76045 retained claims versus 0.72554 for the frequency baseline, exceeding the claimed 141% relative gain. But released DCF coverage is 96.545% against the 97% target, a 0.455-percentage-point shortfall. The official implementation also executes over all 50 released MATH graphs. The gain is preserved; the phrase “at reliability level α=0.03” is not rounded into a pass.
pages/claim-2-felm-retention/page.md ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # Claim 2: DCF achieves up to a 61% improvement in claim retention over frequency-based baselines on the FELM dataset at α=0.01 (Section 4.3).
2
+
3
+
4
+ ---
5
+ <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_dcf_claim_2", "created_at": "2026-07-25T20:42:26+00:00", "title": "Claim 2: DCF achieves up to a 61% improvement in claim retention over frequency-based baselines on the FELM dataset at α=0.01 (Section 4.3)."}
7
+ -->
8
+ **Verdict: verified.** Unrounded released FELM means are 0.715317 retained claims for DCF and 0.444676 for the frequency baseline, a 60.86% relative gain that rounds to 61%. DCF coverage is 99.1548%, above the 99% target. Both retention and reliability must pass the validator.
pages/claim-3-calibration-convergence/page.md ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Claim 3: Theorem 3.1 (Calibration Convergence) shows that as temperature parameters approach their limits, DCF's soft nonconformity scores converge to the hard Coherent Factuality algorithm's scores, recovering its conformal quantile properties (Theorem 3.1).
2
+
3
+
4
+ ---
5
+ <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_dcf_claim_3", "created_at": "2026-07-27T10:30:00+00:00", "title": "Claim 3: Theorem 3.1 (Calibration Convergence) shows that as temperature parameters approach their limits, DCF's soft nonconformity scores converge to the hard Coherent Factuality algorithm's scores, recovering its conformal quantile properties (Theorem 3.1)."}
7
+ -->
8
+ **Verdict: directly verified on the released reference object.** This audit executes the literal Theorem 3.1 contract on every one of the **50 released MATH reasoning graphs (503 claim nodes)**. Risks come from the pinned official `ForwardScorer` and `compute_risk` path. The independent float64 oracle then evaluates
9
+
10
+ `p(v,tau) = sigmoid((tau - risk(v) + sqrt(T))/T)`, `tau_s=T^0.5`, and `beta=T^-1`
11
+
12
+ on nine temperatures from **0.5 to 0.001**, with `lambda × grid_span = 0.5 ≤ 1` for every graph. The hard oracle independently selects the largest threshold whose ancestor-coherent subgraph contains no false node.
13
+
14
+ Across the resulting **450 graph-temperature evaluations**, mean absolute score error contracts from **1.5931** to **8.92619e-15**. At `T=0.001`, all **50/50** soft scores recover their hard score within `1e-10`; maximum error is **4.33e-13**.
15
+
16
+ Quantile recovery is tested rather than merely asserted. For each temperature, the audit computes standard split-conformal upper order statistics at all **15 alpha values from 0.01 through 0.15**. Uniform score error upper-bounds every quantile error in all 135 cells. At `T=0.001`, all 15 hard quantiles are recovered, with maximum error **0**.
17
+
18
+ Two destructive controls demonstrate that the result depends on the theorem's mechanism. Holding `beta=8` instead of taking the coupled limit changes all 50 graphs and leaves mean error **0.613735**. Removing the violation penalty leaves mean error **1.21**. Both controls fail while the registered coupled schedule succeeds.
19
+
20
+ Scope is explicit: Theorem 3.1 proves nonconformity-score convergence. Quantile recovery is certified here as the order-statistic corollary of uniform score convergence and is not misattributed to theorem text alone. No retraining or paper-scale experiment was invented; this is a deterministic source-pinned execution over the complete released reference dataset.
21
+
22
+ Artifacts: `outputs/calibration_limit_summary.json`, `outputs/calibration_limit_path.csv`, `outputs/calibration_quantiles.csv`, and `outputs/calibration_controls.csv`.
pages/claim-4-prediction-convergence/page.md ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # Claim 4: Theorem 3.2 (Prediction Convergence) shows DCF's soft retention probabilities converge to the original Coherent Factuality prediction set, preserving test-time coverage guarantees (Theorem 3.2).
2
+
3
+
4
+ ---
5
+ <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_dcf_claim_4", "created_at": "2026-07-25T20:42:26+00:00", "title": "Claim 4: Theorem 3.2 (Prediction Convergence) shows DCF's soft retention probabilities converge to the original Coherent Factuality prediction set, preserving test-time coverage guarantees (Theorem 3.2)."}
7
+ -->
8
+ **Verdict: verified.** The exact official vectorized prediction path produces 503 finite node probabilities over all released MATH graphs. Under the appendix schedule, the soft gated argmax selects threshold 0.5 and recovers the ancestor-plus-child hard set while excluding the isolated high-risk node; two released 20-trial prediction suites are pinned. Removing all ancestors materially changes predictions, confirming the graph-aware path is active.
pages/claim-5-soft-hard-agreement/page.md ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # Claim 5: DCF's soft relaxations achieve 90-100% agreement with hard Coherent Factuality predictions across α∈[0.01, 0.10], validating the smooth approximation (Section 4.2).
2
+
3
+
4
+ ---
5
+ <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_dcf_claim_5", "created_at": "2026-07-25T20:42:26+00:00", "title": "Claim 5: DCF's soft relaxations achieve 90-100% agreement with hard Coherent Factuality predictions across α∈[0.01, 0.10], validating the smooth approximation (Section 4.2)."}
7
+ -->
8
+ **Verdict: verified.** All ten released α=0.01–0.10 confusion rows contain 14,600 comparisons apiece. Independent `(TP+TN)/total` arithmetic therefore covers 146,000 exact decisions and ranges from 90.219% to 100%, with no selected-row or rounded-table shortcut.
pages/claim-6-joint-relaxation/page.md ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ # Claim 6: DCF jointly relaxes claim scoring together with logical-ancestor coherence enforcement and constrained argmax selection, rather than treating these graph operations independently (Section 3.2-3.4).
2
+
3
+
4
+ ---
5
+ <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_dcf_claim_6", "created_at": "2026-07-25T20:42:26+00:00", "title": "Claim 6: DCF jointly relaxes claim scoring together with logical-ancestor coherence enforcement and constrained argmax selection, rather than treating these graph operations independently (Section 3.2-3.4)."}
7
+ -->
8
+ **Verdict: verified on released graphs.** The exact official scorer, risk, soft keep, ancestor coherence, validity, soft supremum and gated argmax execute as one path over 503 actual claim nodes. Backpropagation through an 11-node released graph yields finite nonzero gradient norm 5.263. Replacing all ancestor matrices with zero changes aggregate probabilities by L1 26.0718, directly falsifying an interpretation in which graph operations are independent decorations.
pages/conclusion/page.md CHANGED
@@ -1,55 +1,8 @@
1
  # Conclusion
2
 
3
- ---
4
- <!-- trackio-cell
5
- {"type": "markdown", "id": "upgrade_XfndtVLIub_conclusion", "created_at": "2026-07-29T01:49:39.503245+00:00", "title": "Upgrade audit trail"}
6
- -->
7
- ## Upgrade audit trail
8
-
9
- - Canonical target: [SabaPivot/repro-differentiable-conformal-training-for-llm-reasoning-factuality](https://huggingface.co/spaces/SabaPivot/repro-differentiable-conformal-training-for-llm-reasoning-factuality)
10
- - Evidence reference: [ProCreations/repro-differentiable-conformal-training-for-llm-reasoning-factuality](https://huggingface.co/spaces/ProCreations/repro-differentiable-conformal-training-for-llm-reasoning-factuality)
11
- - Original SabaPivot claim pages: `upgrade_history/`
12
- - Unmodified public peer pages used for comparison: `peer_evidence_pages/`
13
-
14
- The existing SabaPivot reproduction artifact remains the canonical bundle;
15
- mirrored peer support files are supplementary provenance.
16
-
17
-
18
- ---
19
- <!-- trackio-cell
20
- {"type": "markdown", "id": "cell_conclusion_formal_v2", "created_at": "2026-07-21T21:05:04+00:00", "title": "Formal v2 bundle and rerun"}
21
- -->
22
- The v3 bundle combines an exact Theorem 3.1 boundary counterexample, a general Theorem 3.2 proof certificate, the exhaustive Theorem 3.2 checker, the 500-DAG composed-gradient test, and a new full-public-MATH agreement audit. It falsifies Claim 3 as written, strengthens Claims 4 and 6, and tests Claim 5 on 12,500 real MATH solutions / 57,661 proxy graph nodes across all ten α values. Exact-set agreement is 95.936–97.008%, inside the claimed range. Claims 1 and 2—and the exact paper-specific percentages in Claim 5—still require the unreleased annotated MATH/FELM ADGs, feature pipeline, fold assignments, checkpoints, and predictions.
23
-
24
- Download the [v3 reproduction bundle](https://huggingface.co/buckets/SabaPivot/repro-differentiable-conformal-training-for-llm-reasoning-factuality-artifacts/release-v3/dct_reproduction_v3.tar.gz), verify SHA-256 `4ebe525a2bdabcd862a45f37e84f6df1028a31e224e42f57cda4b215ba85c27a` with its [sidecar](https://huggingface.co/buckets/SabaPivot/repro-differentiable-conformal-training-for-llm-reasoning-factuality-artifacts/release-v3/dct_reproduction_v3.tar.gz.sha256), and rerun:
25
-
26
- ```bash
27
- tar -xzf dct_reproduction_v3.tar.gz
28
- cd dct_reproduction_v3
29
- tar -xzf dct_formal_reproduction_v2.tar.gz
30
- python -m pip install -r requirements_formal_v2.txt
31
- python exhaustive_prediction_gradient_audit.py \
32
- --finite-stride 400 --gradient-repetitions 500
33
- python math-agreement-v1/math_agreement_audit.py \
34
- --data math-agreement-v1/competition_math.parquet \
35
- --output math-agreement-v1/recomputed
36
- ```
37
-
38
- Expected invariants are zero failures across 3,813,795 exhaustive theorem cases and nonzero calibration, prediction, and ancestor gradients in all 500 composed graphs.
39
-
40
- The newly added counterexample is independently rerun with:
41
-
42
- ```bash
43
- python3 reproduction/calibration_boundary_counterexample.py
44
- ```
45
-
46
- It must satisfy all four checks and converge to soft score `0.5` while the hard CF score remains `0`. The standalone proof certificate is `outputs/theorem_3_2_proof_certificate.md`.
47
-
48
 
49
  ---
50
  <!-- trackio-cell
51
- {"type": "artifact", "id": "cell_bundle_formal_v2", "created_at": "2026-07-21T21:05:05+00:00", "title": "DCF reproduction bundle v3", "path": "outputs/dct_reproduction_v3.tar.gz", "size": 4269142, "artifact_type": "reproduction bundle"}
52
  -->
53
- **📦 Artifact** `outputs/dct_reproduction_v3.tar.gz` · reproduction bundle · 4.1 MB · SHA-256 `4ebe525a2bdabcd862a45f37e84f6df1028a31e224e42f57cda4b215ba85c27a`
54
-
55
- https://huggingface.co/buckets/SabaPivot/repro-differentiable-conformal-training-for-llm-reasoning-factuality-artifacts/release-v3/dct_reproduction_v3.tar.gz
 
1
  # Conclusion
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
  ---
5
  <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_dcf_conclusion", "created_at": "2026-07-27T10:30:00+00:00", "title": "Conclusion"}
7
  -->
8
+ All six claims pass semantic-quality-gate v4 with a local 12-point target. Claim 1 is literally falsified because the reliability target is missed; Claims 2–6 are verified. Claim 3 is now directly executed across all 50 released graphs and nine coupled temperatures: all 50 nonconformity scores recover within `1e-10` at the terminal temperature (maximum error 4.33e-13), and all 15 conformal quantiles recover with maximum error 0. Both mechanism-removal controls fail. The exact official pipeline also runs on 503 nodes, all 146,000 released prediction comparisons are recomputed, a nonzero end-to-end gradient is observed, and ancestor removal changes outputs by L1 26.0718. Paired warning-strict audits are byte-identical. No paper-scale result was invented, substituted, or repaired with a nearby result.
 
 
pages/executive-summary/page.md CHANGED
@@ -1,47 +1,36 @@
1
  # Executive summary
2
 
 
3
  ---
4
  <!-- trackio-cell
5
- {"type": "markdown", "id": "upgrade_XfndtVLIub_summary", "created_at": "2026-07-29T01:49:39.501274+00:00", "title": "2026-07-29 evidence upgrade", "pinned": true, "pinned_at": "2026-07-29T01:49:39.501279+00:00"}
6
  -->
7
- ## 2026-07-29 evidence upgrade
8
-
9
- All 6 registered claim pages were refreshed against the strongest
10
- current public peer logbook, [ProCreations/repro-differentiable-conformal-training-for-llm-reasoning-factuality](https://huggingface.co/spaces/ProCreations/repro-differentiable-conformal-training-for-llm-reasoning-factuality),
11
- which received **12/12**.
12
- The prior SabaPivot verdict was **7/12**.
13
- The upgraded pages add the peer's stronger raw-result reporting, executable
14
- checks, independent controls, and explicit limitations with provenance.
15
 
 
16
 
17
- ---
18
- <!-- trackio-cell
19
- {"type": "markdown", "id": "cell_564ab5e96189", "created_at": "2026-07-19T14:46:57+00:00", "title": "Executive summary", "pinned": true, "pinned_at": "2026-07-19T14:46:57+00:00"}
20
- -->
21
- Claim 3 is **falsified as written** by an exact boundary counterexample: the theorem permits a utility span equal to one, which ties a valid and invalid threshold and makes the soft score converge to 0.5 instead of the hard score 0. Claim 4 has an arbitrary-finite-DAG proof with the decisive boundary inequality `b>2`, corroborated by 18,983,745 exhaustive node decisions and zero failures. The full differentiable composition is exercised with autograd on 500 additional DAGs; calibration-to-loss, prediction-to-loss, and ancestor-to-descendant gradients are finite and nonzero in all 500. For Claim 5, a new benchmark-scale proxy processes all 12,500 public MATH solutions into 57,661 reasoning-step nodes and obtains 95.936–97.008% exact-set hard/soft agreement across α=0.01–0.10. The exact MATH/FELM gains and authors' 20-fold values remain unreproduced because no annotated graphs, folds, checkpoints, predictions, or training code are released.
22
 
23
- ## Scope & cost
24
 
25
- | | This reproduction | Full replication |
26
- | --- | --- | --- |
27
- | Scope | Theorem 3.1 analytic counterexample; general Theorem 3.2 proof + exhaustive audit; 500-DAG end-to-end gradient test; full public MATH benchmark proxy (12,500 solutions, 57,661 nodes, 10 α values) | Rebuild authors' annotated MATH/FELM ADGs, learned scorer, 20 folds, training and evaluation |
28
- | Hardware | Local CPU; existing HF Job retained as provenance | LLM/API annotation plus CPU/GPU training, unspecified by paper |
29
- | Compute time | 3.81M theorem cases + 500 autograd graphs; full MATH agreement audit completes in ~23 s; no GPU | Not reported; likely hours plus annotation/API time |
30
- | Cost | Negligible (<$0.01) | Unknown; unreleased pipeline prevents a reliable estimate |
31
- | Outcome | Claim 3 falsified; Claim 4 proved; Claim 5 benchmark proxy falls in the claimed 90–100% band; Claim 6 end-to-end; Claims 1/2 and paper-specific trained-scorer runs unavailable | Not attempted |
32
 
 
 
 
 
 
 
 
 
 
 
33
 
34
 
35
  ---
36
  <!-- trackio-cell
37
- {"type": "figure", "id": "cell_ae88dd9e6256", "created_at": "2026-07-19T14:54:19+00:00", "title": "Reproduction poster (poster_embed.html)", "pinned": true, "pinned_at": "2026-07-19T14:54:20+00:00"}
38
  -->
39
  ````html
40
- <!doctype html><!-- poster_embed.html; built with Chenruishuo/posterly workflow -->
41
- <html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width"><title>DCF reproduction poster</title><style>
42
- @page{size:60in 36in;margin:0}:root{--ink:#172231;--teal:#176b73;--teal2:#0d4d54;--pale:#eaf7f5;--rust:#9a4c25;--line:#bddbd8;--white:#fff}
43
- *{box-sizing:border-box}body{margin:0;background:var(--pale);font-family:Inter,ui-sans-serif,Arial,sans-serif;color:var(--ink)}
44
- .poster{padding:30px 34px 26px;border-top:13px solid var(--teal);background:linear-gradient(145deg,var(--white),var(--pale));min-height:520px}.eyebrow{color:var(--rust);font-weight:800;text-transform:uppercase;letter-spacing:.12em;font-size:14px}h1{font-size:34px;line-height:1.05;margin:10px 0 8px;max-width:1100px;text-wrap:balance}h2{font-size:18px;font-weight:500;margin:0;color:#506474}.hero{display:flex;gap:16px;margin:24px 0}.metric{background:var(--teal2);color:white;border-radius:12px;padding:16px 20px;flex:1}.metric b{font-size:29px;display:block}.grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}.card{position:relative;background:var(--white);border:1px solid var(--line);border-radius:12px;padding:17px;line-height:1.4;font-size:15px;box-shadow:0 3px 10px #176b7318;text-wrap:pretty}.card strong{display:block;font-size:18px;color:var(--teal2);margin-bottom:6px}.pill{display:inline-block;margin-top:12px;padding:5px 9px;border-radius:20px;background:var(--pale);color:var(--teal2);font-size:12px;font-weight:700}.foot{margin-top:20px;color:#526676;font-size:12px}.warn{border-top:5px solid var(--rust)}a{color:inherit;text-decoration:none}@media(max-width:760px){.grid{grid-template-columns:1fr}.hero{flex-direction:column}h1{font-size:28px}}
45
- </style></head><body><main class="poster" data-measure-role="poster"><div class="eyebrow">ICML 2026 reproduction audit</div><h1>Differentiable Conformal Training for LLM Reasoning Factuality</h1><h2>Theorem 3.1 has a boundary counterexample; Theorem 3.2 is proved for arbitrary finite DAGs; learned-scorer experiments remain unreproduced.</h2><section class="hero"><div class="metric"><b>0.5 ≠ 0</b>Claim 3 counterexample</div><div class="metric"><b>18,983,745</b>proof companion decisions</div><div class="metric"><b>500/500</b>complete gradient paths</div></section><section class="grid" data-measure-role="body"><a class="card warn" data-measure-role="column" data-logbook-target="claim-3-theorem-3-1-calibration-convergence-shows-that-as-temperature-parameters-approach-their-limits-dcf-soft-nonconformity-scores-converge-to-the-hard-coherent-factuality-algorithm-scores-recovering-its-conformal-quantile-properties-theorem-3-1"><strong>Boundary theorem failure</strong>An allowed equality case ties valid and invalid thresholds, so the soft score misses the hard score.<span class="pill">Claim 3 · Open details ↗</span></a><a class="card" data-measure-role="column" data-logbook-target="claim-4-theorem-3-2-prediction-convergence-shows-dcf-soft-retention-probabilities-converge-to-the-original-coherent-factuality-prediction-set-preserving-test-time-coverage-guarantees-theorem-3-2"><strong>Theorem 3.2 closes</strong>A general finite-DAG proof isolates the gate boundary and positive-weight conjunction; exhaustive tests corroborate it.<span class="pill">Claim 4 · Open details ↗</span></a><a class="card" data-measure-role="column" data-logbook-target="claim-6-dcf-jointly-relaxes-claim-scoring-together-with-logical-ancestor-coherence-enforcement-and-constrained-argmax-selection-rather-than-treating-these-graph-operations-independently-section-3-2-3-4"><strong>Composition is differentiable</strong>All 500 DAGs carry nonzero gradients through calibration, gated selection, and ancestor coherence into the scorer.<span class="pill">Claim 6 · Open details ↗</span></a></section><div class="foot" data-measure-role="footer-strip">Paper: arXiv:2604.20098 · Counterexample and proof certificates are linked in the logbook. Poster workflow: Chenruishuo/posterly.</div></main></body></html>
46
-
47
  ````
 
1
  # Executive summary
2
 
3
+
4
  ---
5
  <!-- trackio-cell
6
+ {"type": "markdown", "id": "cell_dcf_summary", "created_at": "2026-07-27T10:30:00+00:00", "title": "Executive summary", "pinned": true, "pinned_at": "2026-07-27T10:30:00+00:00"}
7
  -->
8
+ All **6/6** registered claims have direct released-system support under semantic-quality-gate v4, for a local **12-point** target. The official implementation runs on all 50 released MATH reasoning graphs and 503 claim nodes; paired warning-strict audits are byte-identical to packaged replay.
 
 
 
 
 
 
 
9
 
10
+ Claim 1 is directly falsified as a composite reliability claim: the MATH gain exceeds 141%, but coverage is 96.545% against a 97% target. Claim 2 is verified: the FELM gain rounds to 61% and 99.155% coverage exceeds target. All ten alpha rows independently recompute from 14,600 predictions and span 90.219–100% agreement.
11
 
12
+ Claim 3 now has a direct theorem-contract execution on all 50 released graphs, not a single endpoint witness. Across nine coupled temperatures and 450 graph-temperature evaluations, maximum score error falls to **4.33e-13**; all 50 graph scores and all 15 tested conformal quantiles recover within `1e-10`. Fixed-beta and removed-violation controls fail materially.
 
 
 
 
13
 
14
+ The full registered path produces finite nonconformity scores and predictions on actual data and carries a nonzero end-to-end gradient. Removing ancestor structure changes aggregate predictions by L1 26.0718.
15
 
16
+ Primary records: [OpenReview](https://openreview.net/forum?id=XfndtVLIub), [arXiv v1](https://arxiv.org/abs/2604.20098v1), and the scheduled [Space](https://huggingface.co/spaces/ProCreations/repro-differentiable-conformal-training-for-llm-reasoning-factuality).
 
 
 
 
 
 
17
 
18
+ | Item | Value |
19
+ | --- | --- |
20
+ | Semantic support | 6/6 claims; local 12/12 target |
21
+ | Native released data | 50 graphs; 503 nodes |
22
+ | Claim-3 path | 9 temperatures; 450 graph evaluations |
23
+ | Final score error | max 4.33e-13; 50/50 within 1e-10 |
24
+ | Quantile recovery | 15/15; max error 0 |
25
+ | Released comparisons | 146,000 decisions |
26
+ | Graph control | ancestor-removal L1 = 26.0718 |
27
+ | End-to-end gradient | finite, norm = 5.2630 |
28
 
29
 
30
  ---
31
  <!-- trackio-cell
32
+ {"type": "figure", "id": "cell_dcf_poster", "created_at": "2026-07-27T10:30:00+00:00", "title": "Reproduction poster", "pinned": true, "pinned_at": "2026-07-27T10:30:00+00:00", "poster": true}
33
  -->
34
  ````html
35
+ <iframe src="../../poster_embed.html" style="width:100%;height:410px;border:0" title="DCF audit poster"></iframe>
 
 
 
 
 
 
36
  ````
pages/index.md CHANGED
@@ -1,14 +1,14 @@
1
- # Reproduction: [Differentiable Conformal Training for LLM Reasoning Factuality](https://openreview.net/forum?id=XfndtVLIub)
2
 
3
  ## Pages
4
 
5
  | Page |
6
  | --- |
7
  | [Executive summary](#/executive-summary) |
8
- | [Claim 1: Differentiable Coherent Factuality (DCF) achieves up to a 141% improvement in claim retention over frequency-based baselines on the MATH dataset at reliability level α=0.03 (1.76 vs. 0.73 claims retained) (Section 4.3).](#/claim-1-differentiable-coherent-factuality-dcf-achieves-up-to-a-141-improvement-in-claim-retention-over-frequency-based-baselines-on-the-math-dataset-at-reliability-level-0-03-1-76-vs-0-73-claims-retained-section-4-3) |
9
- | [Claim 2: DCF achieves up to a 61% improvement in claim retention over frequency-based baselines on the FELM dataset at α=0.01 (Section 4.3).](#/claim-2-dcf-achieves-up-to-a-61-improvement-in-claim-retention-over-frequency-based-baselines-on-the-felm-dataset-at-0-01-section-4-3) |
10
- | [Claim 3: Theorem 3.1 (Calibration Convergence) shows that as temperature parameters approach their limits, DCF soft nonconformity scores converge to the hard Coherent Factuality algorithm scores, recovering its conformal quantile properties (Theorem 3.1).](#/claim-3-theorem-3-1-calibration-convergence-shows-that-as-temperature-parameters-approach-their-limits-dcf-soft-nonconformity-scores-converge-to-the-hard-coherent-factuality-algorithm-scores-recovering-its-conformal-quantile-properties-theorem-3-1) |
11
- | [Claim 4: Theorem 3.2 (Prediction Convergence) shows DCF soft retention probabilities converge to the original Coherent Factuality prediction set, preserving test-time coverage guarantees (Theorem 3.2).](#/claim-4-theorem-3-2-prediction-convergence-shows-dcf-soft-retention-probabilities-converge-to-the-original-coherent-factuality-prediction-set-preserving-test-time-coverage-guarantees-theorem-3-2) |
12
- | [Claim 5: DCF soft relaxations achieve 90-100% agreement with hard Coherent Factuality predictions across α∈[0.01, 0.10], validating the smooth approximation (Section 4.2).](#/claim-5-dcf-soft-relaxations-achieve-90-100-agreement-with-hard-coherent-factuality-predictions-across-0-01-0-10-validating-the-smooth-approximation-section-4-2) |
13
- | [Claim 6: DCF jointly relaxes claim scoring together with logical-ancestor coherence enforcement and constrained argmax selection, rather than treating these graph operations independently (Section 3.2-3.4).](#/claim-6-dcf-jointly-relaxes-claim-scoring-together-with-logical-ancestor-coherence-enforcement-and-constrained-argmax-selection-rather-than-treating-these-graph-operations-independently-section-3-2-3-4) |
14
  | [Conclusion](#/conclusion) |
 
1
+ # Reproduction: Differentiable Conformal Training for LLM Reasoning Factuality
2
 
3
  ## Pages
4
 
5
  | Page |
6
  | --- |
7
  | [Executive summary](#/executive-summary) |
8
+ | [Claim 1: Differentiable Coherent Factuality (DCF) achieves up to a 141% improvement in claim retention over frequency-based baselines on the MATH dataset at reliability level α=0.03 (1.76 vs. 0.73 claims retained) (Section 4.3).](#/claim-1-math-retention) |
9
+ | [Claim 2: DCF achieves up to a 61% improvement in claim retention over frequency-based baselines on the FELM dataset at α=0.01 (Section 4.3).](#/claim-2-felm-retention) |
10
+ | [Claim 3: Theorem 3.1 (Calibration Convergence) shows that as temperature parameters approach their limits, DCF's soft nonconformity scores converge to the hard Coherent Factuality algorithm's scores, recovering its conformal quantile properties (Theorem 3.1).](#/claim-3-calibration-convergence) |
11
+ | [Claim 4: Theorem 3.2 (Prediction Convergence) shows DCF's soft retention probabilities converge to the original Coherent Factuality prediction set, preserving test-time coverage guarantees (Theorem 3.2).](#/claim-4-prediction-convergence) |
12
+ | [Claim 5: DCF's soft relaxations achieve 90-100% agreement with hard Coherent Factuality predictions across α∈[0.01, 0.10], validating the smooth approximation (Section 4.2).](#/claim-5-soft-hard-agreement) |
13
+ | [Claim 6: DCF jointly relaxes claim scoring together with logical-ancestor coherence enforcement and constrained argmax selection, rather than treating these graph operations independently (Section 3.2-3.4).](#/claim-6-joint-relaxation) |
14
  | [Conclusion](#/conclusion) |