evalstate HF Staff commited on
Commit
fe0df2c
·
verified ·
1 Parent(s): 00853bc

Trace completeness: share of output tokens in the trace; why not (withheld by provider, not kept by harness, lost in conversion, summary only); counted/inferred basis; undercounted

Browse files
Files changed (6) hide show
  1. common.js +15 -12
  2. data/leaderboard.js +0 -0
  3. home.js +17 -15
  4. index.html +10 -8
  5. row.js +7 -7
  6. style.css +2 -2
common.js CHANGED
@@ -36,19 +36,22 @@
36
  });
37
 
38
  /* Reasoning and visibility. */
39
- const RZ = { full: "full text", summary: "summary", hidden: "hidden", unrecorded: "unrecorded", dropped: "dropped", none: "none" };
 
 
40
  const RZ_HELP = {
41
- full: "reasoning text is recorded and covers the output tokens",
42
- summary: "reasoning text is recorded, but far less of it than output tokens: a summary",
43
- hidden: "reasoning tokens are reported, but no reasoning text (encrypted)",
44
- unrecorded: "no reasoning text or reasoning tokens, yet most output has no text in the trace",
45
- dropped: "the harness's own session files hold reasoning that the trajectories lost in conversion",
46
- none: "no reasoning recorded, and the recorded text accounts for the output",
 
47
  };
48
  const visibleShare = h => (h.text.unseen === null ? null : 1 - h.text.unseen);
49
  const reasoningChip = h => {
50
- const chip = el("span", "rz rz--" + h.text.form, RZ[h.text.form]);
51
- chip.title = RZ_HELP[h.text.form];
52
  return chip;
53
  };
54
 
@@ -131,17 +134,17 @@
131
 
132
  /* What the output tokens went on: tool-call arguments, messages, reasoning the trace shows,
133
  reasoning it doesn't. Full width: shares, not sizes. */
134
- const MIX = [["tool", "tool calls"], ["message", "messages"], ["reasoning", "reasoning shown"], ["hidden", "reasoning hidden"]];
135
  function mixBar(t, large) {
136
  const wrap = el("span", "mix" + (large ? " mix--lg" : ""));
137
  if (!t.mix) { wrap.append(el("span", "z", "no token counts")); return wrap; }
138
  const bar = el("span", "mix-bar");
139
  MIX.forEach(([k]) => { const i = el("i", "mx mx--" + k); i.style.width = (100 * t.mix[k]) + "%"; bar.append(i); });
140
  const lab = el("span", "mix-lab");
141
- lab.append(el("b", null, pct0(t.mix.hidden)), document.createTextNode(" hidden"));
142
  wrap.append(bar, lab);
143
  wrap.title = MIX.map(([k, name]) => name + " " + pct0(t.mix[k])).join(" · ") + " of output tokens" +
144
- (t.mix.hidden ? " (hidden " + (t.measured ? "measured from reported reasoning tokens" : "estimated from the recorded text") + ")" : "");
145
  return wrap;
146
  }
147
  const mixKey = () => {
 
36
  });
37
 
38
  /* Reasoning and visibility. */
39
+ /* Why output tokens have no text in the trace. */
40
+ const RZ = { withheld: "withheld by provider", notKept: "not kept by harness", lost: "lost in conversion",
41
+ summary: "summary only", complete: "reasoning recorded", noReasoning: "no reasoning recorded", unknown: "no token counts" };
42
  const RZ_HELP = {
43
+ withheld: "the model's API returns no reasoning text (encrypted, or thinking blocks with empty text): generated and billed, never readable",
44
+ notKept: "the provider returns reasoning text, but the harness didn't record it",
45
+ lost: "the harness's own session files hold the reasoning; converting them to the trajectory dropped it",
46
+ summary: "the provider returns a summary of the reasoning, far shorter than its tokens",
47
+ complete: "reasoning text is in the trace; for most trials the recorded text accounts for the output tokens",
48
+ noReasoning: "no reasoning text or reasoning tokens in the trace; for most trials the recorded text accounts for the output tokens",
49
+ unknown: "the trials report no output tokens to account for",
50
  };
51
  const visibleShare = h => (h.text.unseen === null ? null : 1 - h.text.unseen);
52
  const reasoningChip = h => {
53
+ const chip = el("span", "rz rz--" + h.text.why, RZ[h.text.why]);
54
+ chip.title = RZ_HELP[h.text.why];
55
  return chip;
56
  };
57
 
 
134
 
135
  /* What the output tokens went on: tool-call arguments, messages, reasoning the trace shows,
136
  reasoning it doesn't. Full width: shares, not sizes. */
137
+ const MIX = [["tool", "tool calls"], ["message", "messages"], ["reasoning", "reasoning"], ["hidden", "no text in trace"]];
138
  function mixBar(t, large) {
139
  const wrap = el("span", "mix" + (large ? " mix--lg" : ""));
140
  if (!t.mix) { wrap.append(el("span", "z", "no token counts")); return wrap; }
141
  const bar = el("span", "mix-bar");
142
  MIX.forEach(([k]) => { const i = el("i", "mx mx--" + k); i.style.width = (100 * t.mix[k]) + "%"; bar.append(i); });
143
  const lab = el("span", "mix-lab");
144
+ lab.append(el("b", null, pct0(1 - t.mix.hidden)), document.createTextNode(" in trace"));
145
  wrap.append(bar, lab);
146
  wrap.title = MIX.map(([k, name]) => name + " " + pct0(t.mix[k])).join(" · ") + " of output tokens" +
147
+ (t.mix.hidden ? " (no text: " + (t.measured ? "counted from reported reasoning tokens" : "inferred from the recorded text") + ")" : "");
148
  return wrap;
149
  }
150
  const mixKey = () => {
data/leaderboard.js CHANGED
The diff for this file is too large to render. See raw diff
 
home.js CHANGED
@@ -48,7 +48,7 @@
48
  const c = h.cost;
49
  if (c.imputedTrials) out.push(["warn", c.imputedTrials + " trials priced from tokens"]);
50
  if (c.unpriced / r.scan.trials > 0.02) out.push(["note", c.unpriced + " trials unpriced"]);
51
- if (c.unbilled) out.push(["bad", "reasoning unbilled"]);
52
  if (r.lb.disqualified) out.push(["bad", r.lb.disqualified + " disqualified by the PR pipeline"]);
53
  return out;
54
  }
@@ -71,8 +71,8 @@
71
  { name: hasLb ? "Leader­board" : "Score", sort: "score", help: hasLb ? "published accuracy ± 95% half-width" : "rewarded trials ± 95% half-width over the five attempt rounds" },
72
  { name: "Our estimate", sort: "adj", help: ESTIMATE_HELP },
73
  { name: "Leads", sort: "leads", help: "rewarded trials with an unexcused high or critical finding" },
74
- { name: "Output tokens went on", sort: "hidden", cls: "l", help: "share of the row's output tokens: tool calls, messages, reasoning the trace shows, and (orange) reasoning it doesn't" },
75
- { name: "Reasoning", help: "why the reasoning isn't in the trace" },
76
  { name: "Cost", sort: "cost", help: "our estimate: recorded trial costs, uncosted trials priced from their tokens at the row's own fitted rates, and any reasoning left out of the output tokens" },
77
  { name: "Notes", cls: "l" },
78
  ];
@@ -96,7 +96,7 @@
96
  else ld.append(el("span", "z", "0"));
97
  tr.append(ld);
98
  const oc = el("td", "l"); oc.append(mixBar(h.tokens)); tr.append(oc);
99
- const rz = el("td", "rz rz--" + h.text.form, RZ[h.text.form]); rz.title = RZ_HELP[h.text.form]; tr.append(rz);
100
  const c = h.cost, cc = el("td");
101
  cc.append(num(c.estimate === null ? "–" : (c.lowerBound ? "≥" : "") + money(c.estimate), "n"));
102
  const rec = hasLb && r.lb.cost !== null ? "LB " + money(r.lb.cost) : c.imputed || c.unbilled ? "rec. " + money(c.recorded) : "";
@@ -122,11 +122,13 @@
122
  function gaps() {
123
  const groups = [
124
  ["Models", [["Served, by share of steps", "l", "per-step model names; red: another model than the configured one"]]],
125
- ["Output tokens per trial", [
126
- ["Median", "", "reported output tokens of the median trial"],
127
- ["Hidden", "", "share of the row's output tokens with no text in the trace: reasoning the trace doesn't show"],
128
- ["How known", "l", "measured: the harness reports reasoning tokens; estimated: from recorded characters at ≈3.2 per token"],
129
- ["Unbilled", "", "recorded reasoning missing from the output tokens (and so the cost), as a share of reported output"]]],
 
 
130
  ["Web", [
131
  ["Trials using it", "", "trials that searched or opened web pages"],
132
  ["Results not in trace", "", "of those, trials where the search or fetch results aren't in the trace (only the query or URL is)"]]],
@@ -135,7 +137,7 @@
135
  ["No trajectory", "", "listed trials without a trajectory"]]],
136
  ["Cost", [
137
  ["Recorded", "", "sum of the trials' recorded costs"],
138
- ["Our estimate", "", "recorded + uncosted trials priced from their tokens + unbilled reasoning, at the row's fitted rates"],
139
  ["Fitted $/M in · cached · out", "", "rates fitted to the row's own trial costs and tokens (R² shown on hover)"]]],
140
  ["Evidence", [["Undecided", "", "trials with a behavioural check atif-scan couldn't decide"]]],
141
  ];
@@ -163,15 +165,15 @@
163
  tr.append(start(md));
164
 
165
  tr.append(start(el("td", "n", tk.outputMedian ? compactN(tk.outputMedian) : "–")));
 
166
  const hid = el("td", "n");
167
- if (tk.outputMedian) {
168
  heat(hid, tk.mix.hidden, 1, "warm");
169
  hid.append(link(holeHref(r, "unseen"), pct0(tk.mix.hidden)));
170
  } else hid.append(el("span", "z", "–"));
171
  tr.append(hid);
172
- const how = el("td", "l small");
173
- how.append(el("span", "rz rz--" + h.text.form, RZ[h.text.form]), document.createTextNode(tk.outputMedian ? (tk.measured ? " · measured" : " · estimated") : ""));
174
- tr.append(how);
175
  const ub = el("td", "c");
176
  if (h.text.uncounted) ub.append(link(holeHref(r, "uncounted"), "≥" + pct0(h.text.uncounted), "bad"));
177
  else ub.append(el("span", "z", "·"));
@@ -189,7 +191,7 @@
189
  if (c.imputedTrials || c.unbilled || c.unpriced) {
190
  const parts = [];
191
  if (c.imputedTrials) parts.push("+" + money(c.imputed) + " " + c.imputedTrials + " priced");
192
- if (c.unbilled) parts.push("+" + money(c.unbilled) + " unbilled");
193
  if (c.unpriced) parts.push(c.unpriced + " unpriced");
194
  est.append(el("small", null, parts.join(" · ")));
195
  }
 
48
  const c = h.cost;
49
  if (c.imputedTrials) out.push(["warn", c.imputedTrials + " trials priced from tokens"]);
50
  if (c.unpriced / r.scan.trials > 0.02) out.push(["note", c.unpriced + " trials unpriced"]);
51
+ if (c.unbilled) out.push(["bad", "output undercounted"]);
52
  if (r.lb.disqualified) out.push(["bad", r.lb.disqualified + " disqualified by the PR pipeline"]);
53
  return out;
54
  }
 
71
  { name: hasLb ? "Leader­board" : "Score", sort: "score", help: hasLb ? "published accuracy ± 95% half-width" : "rewarded trials ± 95% half-width over the five attempt rounds" },
72
  { name: "Our estimate", sort: "adj", help: ESTIMATE_HELP },
73
  { name: "Leads", sort: "leads", help: "rewarded trials with an unexcused high or critical finding" },
74
+ { name: "Output tokens · trace completeness", sort: "hidden", cls: "l", help: "the row's output tokens: tool calls, messages and reasoning with text in the trace, and (orange) output with no text in it. The figure is the share the trace holds." },
75
+ { name: "Why not in trace", help: "why some output tokens have no text in the trace" },
76
  { name: "Cost", sort: "cost", help: "our estimate: recorded trial costs, uncosted trials priced from their tokens at the row's own fitted rates, and any reasoning left out of the output tokens" },
77
  { name: "Notes", cls: "l" },
78
  ];
 
96
  else ld.append(el("span", "z", "0"));
97
  tr.append(ld);
98
  const oc = el("td", "l"); oc.append(mixBar(h.tokens)); tr.append(oc);
99
+ const rz = el("td", "rz rz--" + h.text.why, RZ[h.text.why]); rz.title = RZ_HELP[h.text.why]; tr.append(rz);
100
  const c = h.cost, cc = el("td");
101
  cc.append(num(c.estimate === null ? "–" : (c.lowerBound ? "≥" : "") + money(c.estimate), "n"));
102
  const rec = hasLb && r.lb.cost !== null ? "LB " + money(r.lb.cost) : c.imputed || c.unbilled ? "rec. " + money(c.recorded) : "";
 
122
  function gaps() {
123
  const groups = [
124
  ["Models", [["Served, by share of steps", "l", "per-step model names; red: another model than the configured one"]]],
125
+ ["Output tokens · trace completeness", [
126
+ ["Median trial", "", "reported output tokens of the median trial"],
127
+ ["In trace", "", "share of the row's output tokens whose text the trace holds"],
128
+ ["No text", "", "share with no text in the trace: generated and billed, not readable"],
129
+ ["Why", "l", "why that output has no text in the trace"],
130
+ ["Basis", "l", "counted: the harness reports reasoning tokens; inferred: from the recorded text at ≈3.2 characters per token"],
131
+ ["Under­counted", "", "the reverse: recorded reasoning text the reported output tokens leave out (and so the cost), as a share of reported output"]]],
132
  ["Web", [
133
  ["Trials using it", "", "trials that searched or opened web pages"],
134
  ["Results not in trace", "", "of those, trials where the search or fetch results aren't in the trace (only the query or URL is)"]]],
 
137
  ["No trajectory", "", "listed trials without a trajectory"]]],
138
  ["Cost", [
139
  ["Recorded", "", "sum of the trials' recorded costs"],
140
+ ["Our estimate", "", "recorded + uncosted trials priced from their tokens + undercounted reasoning, at the row's fitted rates"],
141
  ["Fitted $/M in · cached · out", "", "rates fitted to the row's own trial costs and tokens (R² shown on hover)"]]],
142
  ["Evidence", [["Undecided", "", "trials with a behavioural check atif-scan couldn't decide"]]],
143
  ];
 
165
  tr.append(start(md));
166
 
167
  tr.append(start(el("td", "n", tk.outputMedian ? compactN(tk.outputMedian) : "–")));
168
+ tr.append(el("td", "n", tk.mix ? pct0(1 - tk.mix.hidden) : "–"));
169
  const hid = el("td", "n");
170
+ if (tk.mix) {
171
  heat(hid, tk.mix.hidden, 1, "warm");
172
  hid.append(link(holeHref(r, "unseen"), pct0(tk.mix.hidden)));
173
  } else hid.append(el("span", "z", "–"));
174
  tr.append(hid);
175
+ const why = el("td", "l rz rz--" + h.text.why, RZ[h.text.why]); why.title = RZ_HELP[h.text.why]; tr.append(why);
176
+ tr.append(el("td", "l small", tk.mix ? (tk.measured ? "counted" : "inferred") : "–"));
 
177
  const ub = el("td", "c");
178
  if (h.text.uncounted) ub.append(link(holeHref(r, "uncounted"), "≥" + pct0(h.text.uncounted), "bad"));
179
  else ub.append(el("span", "z", "·"));
 
191
  if (c.imputedTrials || c.unbilled || c.unpriced) {
192
  const parts = [];
193
  if (c.imputedTrials) parts.push("+" + money(c.imputed) + " " + c.imputedTrials + " priced");
194
+ if (c.unbilled) parts.push("+" + money(c.unbilled) + " undercounted");
195
  if (c.unpriced) parts.push(c.unpriced + " unpriced");
196
  est.append(el("small", null, parts.join(" · ")));
197
  }
index.html CHANGED
@@ -53,18 +53,20 @@
53
  corner: highest finding <i class="sq sq--1 sq--c"></i>critical <i class="sq sq--1 sq--h"></i>high <i class="sq sq--1 sq--m"></i>medium<br>
54
  <b>Our estimate</b> leaves out rewarded trials with an unexcused high or critical finding (review leads) and trials partly run by a
55
  fallback model (a Gemini preview name served as another Gemini preview is an alias, not a fallback).
56
- <b>Output tokens went on</b>: <i class="mx mx--tool"></i>tool calls <i class="mx mx--message"></i>messages
57
- <i class="mx mx--reasoning"></i>reasoning the trace shows <i class="mx mx--hidden"></i>reasoning it doesn't (generated and
58
- billed, but no text in the trace). <b>Cost</b>: recorded trial costs, uncosted trials priced from their tokens at the row's own
59
  rates, and reasoning left out of the output tokens; ≥ where some trials can't be priced (no usage, or no rates that fit the recorded costs).</p>
60
  </section>
61
 
62
  <section id="gaps" class="block">
63
  <header class="block-head"><h2>Gaps &amp; accounting</h2>
64
  <span class="muted small">trials per row unless marked · shading is the share · click a figure for its trials</span></header>
65
- <p class="explain-line"><b>Hidden</b> is output the model generated whose text isn't in the trace: reasoning, never web
66
- results (those are input). <b>Measured</b> where the harness reports reasoning tokens; otherwise estimated from the recorded
67
- characters (≈3.2 per token when the trace holds everything). <b>Web</b>: of the trials that searched or fetched, how many
 
 
68
  hold only the query or URL, not what came back. Tool-result pairing, call records missing from the steps, unanswered final
69
  calls and timestamps are on each row's page: recording-format quirks that limit some checks (counted under Undecided) but
70
  don't hide what the agent did.</p>
@@ -100,8 +102,8 @@
100
  <p>Recorded agent text (reasoning, messages, tool arguments) over reported output tokens. ≈3.2 when the trace holds all
101
  output (measured on visible text over visible tokens where reasoning tokens are reported). <b>In trace</b> = that
102
  ratio over 3.2. With the visible text alone filling the reported tokens, recorded reasoning is missing from the token
103
- count and the cost (<b>output under</b>). Tokenizers differ: small deviations mean nothing.</p>
104
- <h3>Reasoning</h3>
105
  <dl class="defs" id="rz-defs"></dl>
106
  </div>
107
  <div>
 
53
  corner: highest finding <i class="sq sq--1 sq--c"></i>critical <i class="sq sq--1 sq--h"></i>high <i class="sq sq--1 sq--m"></i>medium<br>
54
  <b>Our estimate</b> leaves out rewarded trials with an unexcused high or critical finding (review leads) and trials partly run by a
55
  fallback model (a Gemini preview name served as another Gemini preview is an alias, not a fallback).
56
+ <b>Trace completeness</b>: the row's output tokens as <i class="mx mx--tool"></i>tool calls <i class="mx mx--message"></i>messages
57
+ <i class="mx mx--reasoning"></i>reasoning, all with text in the trace, and <i class="mx mx--hidden"></i>no text in the trace
58
+ (generated and billed, not readable); the figure is the share the trace holds. <b>Cost</b>: recorded trial costs, uncosted trials priced from their tokens at the row's own
59
  rates, and reasoning left out of the output tokens; ≥ where some trials can't be priced (no usage, or no rates that fit the recorded costs).</p>
60
  </section>
61
 
62
  <section id="gaps" class="block">
63
  <header class="block-head"><h2>Gaps &amp; accounting</h2>
64
  <span class="muted small">trials per row unless marked · shading is the share · click a figure for its trials</span></header>
65
+ <p class="explain-line">Every output token is accounted for: text in the trace (<b>In trace</b>) or not (<b>No text</b>: in
66
+ practice reasoning, never web results, which are input). <b>Why</b>: withheld by the model's provider, not kept by the
67
+ harness, lost converting its session files, or only a summary returned. <b>Basis</b>: counted where the harness reports
68
+ reasoning tokens, otherwise inferred from the recorded characters (≈3.2 per token when the trace holds everything).
69
+ <b>Undercounted</b> is the reverse: reasoning text the reported output tokens, and so the cost, leave out. <b>Web</b>: of the trials that searched or fetched, how many
70
  hold only the query or URL, not what came back. Tool-result pairing, call records missing from the steps, unanswered final
71
  calls and timestamps are on each row's page: recording-format quirks that limit some checks (counted under Undecided) but
72
  don't hide what the agent did.</p>
 
102
  <p>Recorded agent text (reasoning, messages, tool arguments) over reported output tokens. ≈3.2 when the trace holds all
103
  output (measured on visible text over visible tokens where reasoning tokens are reported). <b>In trace</b> = that
104
  ratio over 3.2. With the visible text alone filling the reported tokens, recorded reasoning is missing from the token
105
+ count and the cost (<b>undercounted</b>). Tokenizers differ: small deviations mean nothing.</p>
106
+ <h3>Why output has no text in the trace</h3>
107
  <dl class="defs" id="rz-defs"></dl>
108
  </div>
109
  <div>
row.js CHANGED
@@ -3,7 +3,7 @@
3
  "use strict";
4
  const T = window.TB;
5
  const { D, el, link, pct0, fmt1, money, shortModel, rowPath, title, byId, OUTCOME, trialInfo, viewerHref, fullHref,
6
- reasoningChip, RZ_HELP, visibleShare, problems, problemChip, strip } = T;
7
  const DETAILS = window.TB21_DETAILS || {};
8
  const compactN = n => (n >= 1e6 ? (n / 1e6).toFixed(1) + "M" : n >= 1e3 ? Math.round(n / 1e3) + "k" : String(n));
9
  const main = document.getElementById("row");
@@ -79,7 +79,7 @@
79
  stats.append(
80
  stat(recount ? "Score" : "Leaderboard score", fmt1(r.lb.accuracy) + "%", "± " + fmt1(r.lb.ci95) + " · " + r.scan.rewarded + " of " + n + " trials rewarded"),
81
  stat("Our estimate", fmt1(adj.accuracy) + "%", adj.rewarded + " of " + n + (adj.leads ? " · less " + adj.leads + (adj.leads === 1 ? " review lead" : " review leads") : "") + (adj.fallback ? " · less " + adj.fallback + (adj.fallback === 1 ? " fallback trial" : " fallback trials") : ""), adj.accuracy < r.lb.accuracy - 1 ? "stat--hot" : ""),
82
- stat("Hidden reasoning", tk.mix ? pct0(tk.mix.hidden) : "–", tk.mix ? "of output tokens · " + (tk.measured ? "measured" : "estimated") + " · median trial " + compactN(tk.outputMedian) : "no token counts"),
83
  stat("Cost, our estimate", ce.estimate === null ? "–" : (ce.lowerBound ? "≥" : "") + money(ce.estimate), (!recount && r.lb.cost !== null ? "leaderboard " + money(r.lb.cost) + " · " : "") + "recorded " + money(ce.recorded)));
84
  const actions = el("div", "actions");
85
  actions.append(link(rowPath(r) + "highlights/index.html", "Highlights", "btn btn--primary"),
@@ -128,13 +128,13 @@
128
  /* What the trace holds. */
129
  const trace = panel("trace", "What the trace holds");
130
  const rz = el("p", "rz-line");
131
- rz.append(reasoningChip(h), document.createTextNode(" " + RZ_HELP[h.text.form] + "."));
132
  trace.append(rz);
133
  const tstats = el("div", "stats stats--sm");
134
  tstats.append(
135
  stat("Output tokens, median trial", tk.outputMedian ? compactN(tk.outputMedian) : "–", tk.outputTotal ? compactN(tk.outputTotal) + " over the row" : ""),
136
- stat("Hidden reasoning", tk.mix ? pct0(tk.mix.hidden) : "–",
137
- tk.measured ? "measured: reasoning tokens reported, no text" : "estimated: recorded text at ≈3.2 chars/token"),
138
  stat("Text per output token", h.text.allCpt === null ? "–" : String(h.text.allCpt), "reasoning text in " + pct0(h.text.withText) + " of trials"));
139
  trace.append(tstats);
140
  if (tk.mix) { const mx = el("div", "mix-row"); mx.append(T.mixBar(tk, true), T.mixKey()); trace.append(mx); }
@@ -158,13 +158,13 @@
158
  cstats.append(stat("Recorded, sum of trials", money(ce.recorded), h.uncosted ? h.uncosted + " trials uncosted" : "every trial costed"),
159
  stat("Our estimate", ce.estimate === null ? "–" : (ce.lowerBound ? "≥" : "") + money(ce.estimate),
160
  [ce.imputedTrials ? "+" + money(ce.imputed) + " for " + ce.imputedTrials + " uncosted trials, from their tokens" : "",
161
- ce.unbilled ? "+" + money(ce.unbilled) + " unbilled reasoning" : "",
162
  ce.unpriced ? ce.unpriced + " trials unpriced: no token usage" + (ce.rates ? "" : ", or no rates fit the recorded costs") : ""].filter(Boolean).join(" · ") || "nothing to add"));
163
  cost.append(cstats);
164
  if (ce.rates) cost.append(el("p", "muted small", "Rates fitted to this row's own trial costs and tokens: $" + ce.rates.uncached + " / $" + ce.rates.cached +
165
  " / $" + ce.rates.output + " per million uncached input / cached input / output tokens (R² " + ce.rates.r2 + ")."));
166
  if (h.text.uncounted) cost.append(trials("uncounted", "Reasoning left out of output tokens",
167
- "The visible text alone fills the reported output tokens, so the recorded reasoning is on top: at ≈3.2 characters per token, at least " + pct0(h.text.uncounted) + " more output than reported, and so unbilled."));
168
  if (h.uncosted) cost.append(trials("uncosted", "Trials without a recorded cost"));
169
 
170
  // Two columns that fill independently: findings on the left; what ran, the trace and the cost on the right.
 
3
  "use strict";
4
  const T = window.TB;
5
  const { D, el, link, pct0, fmt1, money, shortModel, rowPath, title, byId, OUTCOME, trialInfo, viewerHref, fullHref,
6
+ reasoningChip, RZ, RZ_HELP, visibleShare, problems, problemChip, strip } = T;
7
  const DETAILS = window.TB21_DETAILS || {};
8
  const compactN = n => (n >= 1e6 ? (n / 1e6).toFixed(1) + "M" : n >= 1e3 ? Math.round(n / 1e3) + "k" : String(n));
9
  const main = document.getElementById("row");
 
79
  stats.append(
80
  stat(recount ? "Score" : "Leaderboard score", fmt1(r.lb.accuracy) + "%", "± " + fmt1(r.lb.ci95) + " · " + r.scan.rewarded + " of " + n + " trials rewarded"),
81
  stat("Our estimate", fmt1(adj.accuracy) + "%", adj.rewarded + " of " + n + (adj.leads ? " · less " + adj.leads + (adj.leads === 1 ? " review lead" : " review leads") : "") + (adj.fallback ? " · less " + adj.fallback + (adj.fallback === 1 ? " fallback trial" : " fallback trials") : ""), adj.accuracy < r.lb.accuracy - 1 ? "stat--hot" : ""),
82
+ stat("Trace completeness", tk.mix ? pct0(1 - tk.mix.hidden) : "–", tk.mix ? "of output tokens have text in the trace · " + RZ[h.text.why] : "no token counts"),
83
  stat("Cost, our estimate", ce.estimate === null ? "–" : (ce.lowerBound ? "≥" : "") + money(ce.estimate), (!recount && r.lb.cost !== null ? "leaderboard " + money(r.lb.cost) + " · " : "") + "recorded " + money(ce.recorded)));
84
  const actions = el("div", "actions");
85
  actions.append(link(rowPath(r) + "highlights/index.html", "Highlights", "btn btn--primary"),
 
128
  /* What the trace holds. */
129
  const trace = panel("trace", "What the trace holds");
130
  const rz = el("p", "rz-line");
131
+ rz.append(reasoningChip(h), document.createTextNode(": " + RZ_HELP[h.text.why] + "."));
132
  trace.append(rz);
133
  const tstats = el("div", "stats stats--sm");
134
  tstats.append(
135
  stat("Output tokens, median trial", tk.outputMedian ? compactN(tk.outputMedian) : "–", tk.outputTotal ? compactN(tk.outputTotal) + " over the row" : ""),
136
+ stat("No text in trace", tk.mix ? pct0(tk.mix.hidden) : "–",
137
+ tk.measured ? "counted: reasoning tokens reported, no text" : "inferred: recorded text at ≈3.2 chars/token"),
138
  stat("Text per output token", h.text.allCpt === null ? "–" : String(h.text.allCpt), "reasoning text in " + pct0(h.text.withText) + " of trials"));
139
  trace.append(tstats);
140
  if (tk.mix) { const mx = el("div", "mix-row"); mx.append(T.mixBar(tk, true), T.mixKey()); trace.append(mx); }
 
158
  cstats.append(stat("Recorded, sum of trials", money(ce.recorded), h.uncosted ? h.uncosted + " trials uncosted" : "every trial costed"),
159
  stat("Our estimate", ce.estimate === null ? "–" : (ce.lowerBound ? "≥" : "") + money(ce.estimate),
160
  [ce.imputedTrials ? "+" + money(ce.imputed) + " for " + ce.imputedTrials + " uncosted trials, from their tokens" : "",
161
+ ce.unbilled ? "+" + money(ce.unbilled) + " undercounted reasoning" : "",
162
  ce.unpriced ? ce.unpriced + " trials unpriced: no token usage" + (ce.rates ? "" : ", or no rates fit the recorded costs") : ""].filter(Boolean).join(" · ") || "nothing to add"));
163
  cost.append(cstats);
164
  if (ce.rates) cost.append(el("p", "muted small", "Rates fitted to this row's own trial costs and tokens: $" + ce.rates.uncached + " / $" + ce.rates.cached +
165
  " / $" + ce.rates.output + " per million uncached input / cached input / output tokens (R² " + ce.rates.r2 + ")."));
166
  if (h.text.uncounted) cost.append(trials("uncounted", "Reasoning left out of output tokens",
167
+ "The visible text alone fills the reported output tokens, so the recorded reasoning is on top: at ≈3.2 characters per token, at least " + pct0(h.text.uncounted) + " more output than reported, and so left out of the cost."));
168
  if (h.uncosted) cost.append(trials("uncosted", "Trials without a recorded cost"));
169
 
170
  // Two columns that fill independently: findings on the left; what ran, the trace and the cost on the right.
style.css CHANGED
@@ -155,9 +155,9 @@ details.trials summary .label { font-weight: 650; }
155
  .flags { margin: 6px 0 0; font-size: 13px; }
156
  /* Reasoning form: a word, coloured by how much of the reasoning the trace lacks. */
157
  .rz { font-size: 12px; font-weight: 650; text-align: left !important; }
158
- .rz--full { color: var(--ok); } .rz--none { color: var(--muted); }
159
  .rz--summary { color: var(--accent-ink); }
160
- .rz--hidden, .rz--unrecorded, .rz--dropped { color: var(--danger); }
161
  /* Heat: one translucent hue per meaning; numbers stay ink. */
162
  .heat { background: color-mix(in srgb, var(--hue) calc(var(--a, 0) * 42%), transparent); }
163
  .heat--warm { --hue: var(--hl-h); } .heat--cool { --hue: var(--hl-m); } .heat--amber { --hue: var(--accent); }
 
155
  .flags { margin: 6px 0 0; font-size: 13px; }
156
  /* Reasoning form: a word, coloured by how much of the reasoning the trace lacks. */
157
  .rz { font-size: 12px; font-weight: 650; text-align: left !important; }
158
+ .rz--complete { color: var(--ok); } .rz--unknown, .rz--noReasoning { color: var(--muted); }
159
  .rz--summary { color: var(--accent-ink); }
160
+ .rz--withheld, .rz--notKept, .rz--lost { color: var(--danger); }
161
  /* Heat: one translucent hue per meaning; numbers stay ink. */
162
  .heat { background: color-mix(in srgb, var(--hue) calc(var(--a, 0) * 42%), transparent); }
163
  .heat--warm { --hue: var(--hl-h); } .heat--cool { --hue: var(--hl-m); } .heat--amber { --hue: var(--accent); }