Skip to content

Commit 23457e5

Browse files
committed
Simplify Proof and hide historical baselines by default
1 parent 49f7574 commit 23457e5

1 file changed

Lines changed: 49 additions & 22 deletions

File tree

src/ui/proof.ts

Lines changed: 49 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,40 +3,61 @@ import { compactNumber, currency, dateTime, escapeHtml } from "./format";
33
import "./proof.css";
44
import "./proof-storage.css";
55

6-
function evidenceBadge(kind: "verified" | "measured" | "estimated"): string {
7-
const label = kind === "verified" ? "Verified" : kind === "measured" ? "Measured locally" : "Estimated";
6+
function evidenceBadge(kind: "verified" | "measured" | "estimated" | "reference"): string {
7+
const label = kind === "verified"
8+
? "Verified"
9+
: kind === "measured"
10+
? "Measured locally"
11+
: kind === "reference"
12+
? "Reference only"
13+
: "Estimated";
814
return `<span class="evidence-badge ${kind}">${label}</span>`;
915
}
1016

17+
function agentLabel(agent: string | undefined): string {
18+
if (agent === "claude-code") return "Claude Code";
19+
if (agent === "codex") return "OpenAI Codex";
20+
if (agent === "openclaw") return "OpenClaw";
21+
if (agent === "hermes") return "Hermes Agent";
22+
if (agent === "opencode") return "OpenCode";
23+
if (agent === "cursor") return "Cursor";
24+
return "Unknown agent";
25+
}
26+
1127
function recordCard(record: ProofRecord, state: WorkspaceState): string {
1228
const session = state.sessions.find((item) => item.id === record.sessionId);
1329
const after = record.after;
1430
const beforeTokens = record.before.inputTokens + record.before.outputTokens;
1531
const afterTokens = after ? after.inputTokens + after.outputTokens : undefined;
1632
const change = afterTokens === undefined
17-
? "Baseline only"
18-
: `${compactNumber(beforeTokens - afterTokens)} fewer tokens`;
19-
const evidenceKind = record.status === "verified" ? "verified" : "measured";
33+
? "Historical reference"
34+
: `${compactNumber(Math.max(0, beforeTokens - afterTokens))} fewer tokens`;
35+
const evidenceKind = record.status === "verified"
36+
? "verified"
37+
: record.status === "baseline"
38+
? "reference"
39+
: "measured";
40+
const tokenLabel = record.status === "baseline" ? "reported or estimated tokens" : "baseline tokens";
2041

2142
return `
2243
<article class="proof-record">
2344
<div class="proof-record-head">
24-
<span class="proof-status ${record.status}">${escapeHtml(record.status)}</span>
45+
<span class="proof-status ${record.status}">${record.status === "baseline" ? "reference" : escapeHtml(record.status)}</span>
2546
<span>${dateTime(record.createdAt)}</span>
2647
</div>
27-
<h3>${escapeHtml(session?.title ?? record.sessionId)}</h3>
28-
<p>${escapeHtml(session?.agent ?? "unknown")} · ${escapeHtml(session?.project ?? "unknown project")}</p>
48+
<h3>${escapeHtml(session?.title ?? "Imported session")}</h3>
49+
<p>${escapeHtml(agentLabel(session?.agent))} · ${escapeHtml(session?.project ?? "Local project")}</p>
2950
<div class="proof-metrics">
30-
<span><strong>${compactNumber(beforeTokens)}</strong><small>baseline tokens</small></span>
51+
<span><strong>${compactNumber(beforeTokens)}</strong><small>${tokenLabel}</small></span>
3152
<span><strong>${record.before.toolCalls}</strong><small>tool calls</small></span>
3253
<span><strong>${record.before.repeatedReads}</strong><small>repeated reads</small></span>
33-
<span><strong>${currency(record.before.estimatedCostUsd)}</strong><small>baseline cost</small></span>
54+
<span><strong>${currency(record.before.estimatedCostUsd)}</strong><small>reported cost</small></span>
3455
</div>
3556
<div class="proof-outcome">
36-
<div><strong>${change}</strong><small>${after ? `Outcome: ${escapeHtml(after.taskStatus)}` : "No comparable outcome has been recorded."}</small></div>
57+
<div><strong>${change}</strong><small>${after ? `Comparable outcome: ${escapeHtml(after.taskStatus)}` : "This session is reference data only. It does not prove savings."}</small></div>
3758
${evidenceBadge(evidenceKind)}
3859
</div>
39-
<div class="proof-provenance">${record.provenance.map((item) => `<code>${escapeHtml(item)}</code>`).join("")}</div>
60+
<details class="proof-technical"><summary>Technical details</summary><div class="proof-provenance">${record.provenance.map((item) => `<code>${escapeHtml(item)}</code>`).join("")}</div></details>
4061
</article>`;
4162
}
4263

@@ -50,27 +71,33 @@ function storageLabel(state: WorkspaceState): string {
5071

5172
export function proofView(state: WorkspaceState): string {
5273
const records = state.proofRecords ?? [];
53-
const baselines = records.filter((record) => record.status === "baseline").length;
54-
const verified = records.filter((record) => record.status === "verified").length;
74+
const baselines = records.filter((record) => record.status === "baseline");
75+
const verified = records.filter((record) => record.status === "verified");
76+
const inProgress = records.filter((record) => record.status !== "baseline" && record.status !== "verified");
77+
const visibleResults = [...verified, ...inProgress];
5578
const storage = state.proofStorage;
79+
5680
return `
5781
<section class="proof-hero">
5882
<div>
5983
<span class="eyebrow">RESULTS</span>
60-
<h2>Optimization you can verify.</h2>
61-
<p>Every observed session begins with a baseline. Token Saver does not claim completed savings until a comparable outcome records usage, task status, and the applied fix.</p>
84+
<h2>Verified savings, not raw history.</h2>
85+
<p>Historical sessions are stored only as reference data. Token Saver shows a savings result here only after it observes a comparable successful outcome before and after optimization.</p>
6286
<div class="proof-storage ${escapeHtml(storage?.mode ?? "initializing")}">
6387
<span></span>
6488
<div><strong>${storageLabel(state)}</strong><small>${escapeHtml(storage?.detail ?? "Preparing local results storage.")}</small></div>
6589
</div>
6690
</div>
6791
<div class="proof-summary">
68-
<span><strong>${baselines}</strong> baselines</span>
69-
<span><strong>${verified}</strong> verified</span>
70-
<span><strong>${records.length - baselines - verified}</strong> in progress</span>
92+
<span><strong>${verified.length}</strong> verified savings</span>
93+
<span><strong>${inProgress.length}</strong> comparisons running</span>
94+
<span><strong>${baselines.length}</strong> historical references</span>
7195
</div>
7296
</section>
73-
<div class="proof-grid">
74-
${records.length ? records.map((record) => recordCard(record, state)).join("") : `<article class="panel"><span class="eyebrow">NO RESULTS YET</span><h2>Waiting for the first comparable outcome</h2><p>Automatic connectors will create baselines as work happens. File import remains available for compatibility and testing.</p><button class="button ghost" id="proof-import">Import a file</button></article>`}
75-
</div>`;
97+
98+
${visibleResults.length
99+
? `<div class="proof-grid">${visibleResults.map((record) => recordCard(record, state)).join("")}</div>`
100+
: `<article class="panel proof-empty-result"><span class="eyebrow">NO VERIFIED SAVINGS YET</span><h2>Your history was imported successfully.</h2><p>${baselines.length} historical session${baselines.length === 1 ? " was" : "s were"} recorded as reference data. They are not savings claims. A verified result will appear after Token Saver observes a comparable task with an active optimization.</p></article>`}
101+
102+
${baselines.length ? `<details class="proof-baseline-archive"><summary><div><strong>Historical reference sessions</strong><small>Raw imported history is hidden by default because it is not proof of savings.</small></div><span>${baselines.length}</span></summary><div class="proof-grid">${baselines.map((record) => recordCard(record, state)).join("")}</div></details>` : ""}`;
76103
}

0 commit comments

Comments
 (0)