lastlight-evals 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +98 -12
  2. package/dashboard/dist/assets/index-YwScAAxm.js +238 -0
  3. package/dashboard/dist/assets/index-uU9Sj3M4.css +1 -0
  4. package/dashboard/dist/index.html +19 -0
  5. package/dashboard/dist/logo.png +0 -0
  6. package/datasets/code-fix/repos/codefix__date-range-off-by-one/.github/workflows/ci.yml +16 -0
  7. package/datasets/code-fix/repos/codefix__date-range-off-by-one/README.md +7 -1
  8. package/datasets/code-fix/repos/codefix__date-range-off-by-one/package.json +3 -1
  9. package/datasets/code-fix/repos/codefix__date-range-off-by-one/scripts/lint.mjs +25 -0
  10. package/datasets/code-fix/repos/codefix__date-range-off-by-one/test/date-range.test.ts +14 -0
  11. package/datasets/code-fix/repos/codefix__date-range-off-by-one/tsconfig.json +13 -0
  12. package/datasets/code-fix/tests/codefix__date-range-off-by-one/date-range.test.ts +5 -5
  13. package/dist/config.js +100 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/mechanism.test.js +41 -0
  16. package/dist/mechanism.test.js.map +1 -1
  17. package/dist/metrics.js +83 -0
  18. package/dist/metrics.js.map +1 -1
  19. package/dist/paths.js +51 -1
  20. package/dist/paths.js.map +1 -1
  21. package/dist/report.js +112 -3
  22. package/dist/report.js.map +1 -1
  23. package/dist/run-instance.js +141 -14
  24. package/dist/run-instance.js.map +1 -1
  25. package/dist/run.js +342 -112
  26. package/dist/run.js.map +1 -1
  27. package/dist/serve.js +136 -0
  28. package/dist/serve.js.map +1 -0
  29. package/examples/overlay/README.md +30 -0
  30. package/examples/overlay/config.yaml +36 -0
  31. package/examples/overlay-anthropic/config.yaml +27 -0
  32. package/package.json +16 -6
  33. package/dist/html-report.js +0 -325
  34. package/dist/html-report.js.map +0 -1
@@ -1,325 +0,0 @@
1
- /**
2
- * Self-contained HTML scorecard, styled to match the Last Light site
3
- * (~/work/lastlight-www): dark navy theme, gold/orange/teal accents,
4
- * Inter + JetBrains Mono. No build step, no external assets beyond Google
5
- * Fonts — written straight to `evals/results/<tiers>/index.html`.
6
- *
7
- * One report, one tier per tab (radio-driven CSS, no JS). Each tab leads with
8
- * a model-comparison table — models as rows, sorted by the tier's primary
9
- * metric, with inline bar charts and best-in-column highlighting — followed by
10
- * the per-instance detail rows.
11
- */
12
- import { writeFileSync, mkdirSync, renameSync } from "node:fs";
13
- import { join } from "node:path";
14
- import { summarizeModels, fmtTokens } from "./report.js";
15
- const esc = (s) => String(s ?? "")
16
- .replace(/&/g, "&amp;")
17
- .replace(/</g, "&lt;")
18
- .replace(/>/g, "&gt;")
19
- .replace(/"/g, "&quot;");
20
- function pill(kind, label) {
21
- return `<span class="pill ${kind}">${esc(label)}</span>`;
22
- }
23
- function fmtMs(ms) {
24
- if (!ms)
25
- return "—";
26
- if (ms < 1000)
27
- return `${ms}ms`;
28
- const s = Math.round(ms / 1000);
29
- return s < 60 ? `${s}s` : `${Math.floor(s / 60)}m${String(s % 60).padStart(2, "0")}`;
30
- }
31
- function tierMetric(tier) {
32
- if (tier === "code-fix") {
33
- return {
34
- label: "resolved",
35
- rate: (m) => (m.codeFixTotal ? m.codeFixResolved / m.codeFixTotal : 0),
36
- frac: (m) => (m.codeFixTotal ? `${m.codeFixResolved}/${m.codeFixTotal}` : "—"),
37
- };
38
- }
39
- return {
40
- label: "behavioral",
41
- rate: (m) => (m.behavioralTotal ? m.behavioralOk / m.behavioralTotal : 0),
42
- frac: (m) => (m.behavioralTotal ? `${m.behavioralOk}/${m.behavioralTotal}` : "—"),
43
- };
44
- }
45
- /** A horizontal bar (0..1 fill) with a value label beside it. */
46
- function bar(frac, value, klass, best) {
47
- const pct = Math.max(0, Math.min(1, frac)) * 100;
48
- return `<div class="bar${best ? " best" : ""}"><span class="bar-track"><span class="bar-fill ${klass}" style="width:${pct.toFixed(1)}%"></span></span><span class="bar-val">${esc(value)}</span></div>`;
49
- }
50
- function compareTable(models, tier, labels) {
51
- const metric = tierMetric(tier);
52
- const ranked = [...models].sort((a, b) => metric.rate(b) - metric.rate(a) || a.totalCostUsd - b.totalCostUsd);
53
- // Best-in-column references. Cost/latency only consider models that actually
54
- // produced a run (cost > 0) so an errored 0-cost row isn't crowned "cheapest".
55
- const bestRate = Math.max(0, ...ranked.map(metric.rate));
56
- const costs = ranked.filter((m) => m.totalCostUsd > 0).map((m) => m.totalCostUsd);
57
- const lats = ranked.filter((m) => m.p50DurationMs > 0).map((m) => m.p50DurationMs);
58
- const minCost = costs.length ? Math.min(...costs) : Infinity;
59
- const minLat = lats.length ? Math.min(...lats) : Infinity;
60
- const maxCost = costs.length ? Math.max(...costs) : 1;
61
- const maxLat = lats.length ? Math.max(...lats) : 1;
62
- const rows = ranked
63
- .map((m, i) => {
64
- const rate = metric.rate(m);
65
- const isBestRate = metric.frac(m) !== "—" && rate >= bestRate && bestRate > 0;
66
- const isBestCost = m.totalCostUsd > 0 && m.totalCostUsd === minCost;
67
- const isBestLat = m.p50DurationMs > 0 && m.p50DurationMs === minLat;
68
- return `
69
- <tr>
70
- <td class="rank">${i + 1}</td>
71
- <td class="mono model">${esc(labels[m.model] ?? m.model)}</td>
72
- <td class="barcell">${bar(rate, metric.frac(m), "fill-gold", isBestRate)}</td>
73
- <td class="barcell">${bar(maxCost ? m.totalCostUsd / maxCost : 0, `$${m.totalCostUsd.toFixed(3)}`, "fill-teal", isBestCost)}</td>
74
- <td class="barcell">${bar(maxLat ? m.p50DurationMs / maxLat : 0, fmtMs(m.p50DurationMs), "fill-orange", isBestLat)}</td>
75
- <td class="mono num">${fmtTokens(m.avgInputTokens)}<span class="muted">/</span>${fmtTokens(m.avgCachedTokens)}<span class="muted">/</span>${fmtTokens(m.avgOutputTokens)}</td>
76
- <td class="mono num ${m.errors ? "fail-fg" : "muted"}">${m.errors}</td>
77
- </tr>`;
78
- })
79
- .join("\n");
80
- return `
81
- <table class="cmp">
82
- <thead>
83
- <tr>
84
- <th class="rank">#</th><th>model</th>
85
- <th>${esc(metric.label)} →</th><th>total cost ↓</th><th>p50 latency ↓</th>
86
- <th class="num">avg in/cached/out tok</th><th class="num">err</th>
87
- </tr>
88
- </thead>
89
- <tbody>${rows}</tbody>
90
- </table>`;
91
- }
92
- function checksHtml(r) {
93
- const checks = r.behavioral?.checks ?? [];
94
- if (!checks.length && r.resolved === undefined)
95
- return '<span class="muted">—</span>';
96
- const chips = checks
97
- .map((c) => `<span class="chip ${c.ok ? "ok" : "no"}" title="${esc(c.detail ?? "")}">${esc(c.name)}</span>`)
98
- .join("");
99
- return chips || '<span class="muted">—</span>';
100
- }
101
- function detailRows(results, tier, labels) {
102
- const showCodeFix = tier === "code-fix";
103
- // "2/3" pass-count when a case aggregates multiple trials (worst-case verdict).
104
- const frac = (pass, n) => pass !== undefined && n && n > 1 ? ` <span class="frac">${pass}/${n}</span>` : "";
105
- return results
106
- .map((r) => {
107
- const resolved = (r.resolved === undefined ? pill("na", "—") : r.resolved ? pill("pass", "resolved") : pill("fail", "unresolved")) +
108
- frac(r.resolvedPass, r.trials);
109
- const beh = (r.error
110
- ? pill("fail", "error")
111
- : r.behavioral
112
- ? r.behavioral.ok
113
- ? pill("pass", "ok")
114
- : pill("fail", "miss")
115
- : pill("na", "—")) + (r.error ? "" : frac(r.behavioralPass, r.trials));
116
- return `
117
- <tr>
118
- <td class="mono">${esc(r.instance_id)}</td>
119
- <td class="mono muted">${esc(labels[r.model] ?? r.model)}</td>
120
- ${showCodeFix ? `<td>${resolved}</td>` : ""}
121
- <td>${beh}</td>
122
- <td class="checks">${checksHtml(r)}</td>
123
- <td class="mono num">$${r.costUsd.toFixed(4)}</td>
124
- <td class="mono num">${fmtMs(r.durationMs)}</td>
125
- </tr>${r.error ? `<tr class="errrow"><td colspan="${showCodeFix ? 7 : 6}" class="mono err">${esc(r.error)}</td></tr>` : ""}`;
126
- })
127
- .join("\n");
128
- }
129
- /** Rows for cases still running / queued (live runs only). */
130
- function pendingRows(pending, tier, labels) {
131
- const showCodeFix = tier === "code-fix";
132
- // running before queued so the in-flight ones sit nearest the finished rows.
133
- const ordered = [...pending].sort((a, b) => (a.status === b.status ? 0 : a.status === "running" ? -1 : 1));
134
- return ordered
135
- .map((pn) => {
136
- const cell = pn.status === "running"
137
- ? '<span class="pill run">running…</span>'
138
- : '<span class="pill wait">queued</span>';
139
- const dash = '<span class="muted">—</span>';
140
- return `
141
- <tr class="pendingrow">
142
- <td class="mono muted">${esc(pn.instance_id)}</td>
143
- <td class="mono muted">${esc(labels[pn.model] ?? pn.model)}</td>
144
- ${showCodeFix ? `<td>${cell}</td><td>${dash}</td>` : `<td>${cell}</td>`}
145
- <td>${dash}</td>
146
- <td class="mono num muted">—</td>
147
- <td class="mono num muted">—</td>
148
- </tr>`;
149
- })
150
- .join("\n");
151
- }
152
- function tierPane(tier, results, pending, labels) {
153
- const models = summarizeModels(results);
154
- const showCodeFix = tier === "code-fix";
155
- const detailHead = showCodeFix
156
- ? "<th>instance</th><th>model</th><th>code-fix</th><th>behavioral</th><th>checks</th><th>cost</th><th>latency</th>"
157
- : "<th>instance</th><th>model</th><th>behavioral</th><th>checks</th><th>cost</th><th>latency</th>";
158
- return `
159
- <h2>Model comparison <span class="muted">— ${esc(tier)}</span></h2>
160
- ${compareTable(models, tier, labels)}
161
- <h2>Per-instance results</h2>
162
- <table>
163
- <thead><tr>${detailHead}</tr></thead>
164
- <tbody>${detailRows(results, tier, labels)}${pending.length ? pendingRows(pending, tier, labels) : ""}</tbody>
165
- </table>`;
166
- }
167
- export function renderHtml(card, meta) {
168
- const labels = meta.labels ?? {};
169
- const pending = meta.pending ?? [];
170
- // Preserve the requested tier order; keep tiers that have results OR pending
171
- // work (so a tier's tab shows up before its first case finishes).
172
- const tiers = meta.tiers.filter((t) => card.results.some((r) => (r.tier ?? meta.tiers[0]) === t) || pending.some((pn) => pn.tier === t));
173
- const useTiers = tiers.length ? tiers : meta.tiers.slice(0, 1);
174
- const radios = useTiers.map((_, i) => `<input type="radio" name="tier" id="t${i}"${i === 0 ? " checked" : ""}>`).join("\n ");
175
- const tabs = useTiers.map((t, i) => `<label for="t${i}">${esc(t)}</label>`).join("\n ");
176
- const panes = useTiers
177
- .map((t, i) => {
178
- const rs = card.results.filter((r) => (r.tier ?? useTiers[0]) === t);
179
- const pn = pending.filter((x) => x.tier === t);
180
- return `<section class="pane pane-${i}">${tierPane(t, rs, pn, labels)}</section>`;
181
- })
182
- .join("\n ");
183
- // Per-index CSS so the checked radio reveals its pane + lights its tab.
184
- const tabCss = useTiers
185
- .map((_, i) => `#t${i}:checked ~ .pane-${i}{display:block;} #t${i}:checked ~ .tabs label[for=t${i}]{background:var(--gold);color:var(--navy);border-color:var(--gold);}`)
186
- .join("\n ");
187
- return `<!doctype html>
188
- <html lang="en">
189
- <head>
190
- <meta charset="utf-8" />
191
- <meta name="viewport" content="width=device-width, initial-scale=1" />
192
- ${meta.live ? '<meta http-equiv="refresh" content="3" />' : ""}
193
- <title>Last Light — Eval Scorecard</title>
194
- <link rel="preconnect" href="https://fonts.googleapis.com" />
195
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
196
- <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
197
- <style>
198
- :root {
199
- --gold:#F0B429; --orange:#E8752A; --teal:#1A7A8A; --teal-dark:#135E6B;
200
- --navy:#1B2735; --bg:#0C1117; --bg-card:#141B24; --bg-card-hover:#1A2332;
201
- --border:#1E2A38; --text:#C9D1D9; --text-muted:#7D8694; --text-bright:#ECEFF4;
202
- --pass:#3FB950; --fail:#E5534B;
203
- --mono:'JetBrains Mono',monospace; --sans:'Inter',-apple-system,sans-serif;
204
- }
205
- * { box-sizing:border-box; }
206
- body { margin:0; background:var(--bg); color:var(--text); font-family:var(--sans); line-height:1.55; }
207
- .wrap { max-width:1100px; margin:0 auto; padding:48px 24px 80px; }
208
- header { border-bottom:1px solid var(--border); padding-bottom:24px; margin-bottom:24px; }
209
- h1 { color:var(--text-bright); font-size:30px; margin:0 0 6px; letter-spacing:-0.02em; }
210
- h1 .accent { color:var(--gold); }
211
- h2 { color:var(--text-bright); font-size:18px; margin:32px 0 14px; }
212
- h2 .muted { font-weight:400; }
213
- .meta { color:var(--text-muted); font-size:13px; font-family:var(--mono); }
214
- .meta b { color:var(--text); font-weight:600; }
215
-
216
- /* radio-driven tabs (no JS) */
217
- input[name=tier] { position:absolute; opacity:0; pointer-events:none; }
218
- .tabs { display:flex; gap:8px; margin-bottom:8px; flex-wrap:wrap; }
219
- .tabs label { cursor:pointer; font-family:var(--mono); font-size:13px; font-weight:600;
220
- padding:8px 16px; border-radius:8px; border:1px solid var(--border); color:var(--text-muted);
221
- background:var(--bg-card); user-select:none; }
222
- .tabs label:hover { color:var(--text-bright); border-color:var(--teal); }
223
- .pane { display:none; }
224
- ${tabCss}
225
-
226
- table { width:100%; border-collapse:collapse; background:var(--bg-card); border:1px solid var(--border); border-radius:12px; overflow:hidden; }
227
- th { text-align:left; color:var(--text-muted); font-size:11px; text-transform:uppercase; letter-spacing:0.05em; font-weight:600; padding:11px 14px; border-bottom:1px solid var(--border); background:var(--navy); }
228
- td { padding:10px 14px; border-bottom:1px solid var(--border); font-size:13px; vertical-align:middle; }
229
- tr:last-child td { border-bottom:none; }
230
- .mono { font-family:var(--mono); }
231
- .num { text-align:right; white-space:nowrap; }
232
- .muted { color:var(--text-muted); }
233
- .fail-fg { color:var(--fail); }
234
-
235
- /* comparison table */
236
- table.cmp td { vertical-align:middle; }
237
- .cmp .rank { width:30px; color:var(--text-muted); font-family:var(--mono); text-align:center; }
238
- .cmp .model { color:var(--gold); font-weight:600; white-space:nowrap; }
239
- .cmp .barcell { width:22%; min-width:140px; }
240
- .bar { display:flex; align-items:center; gap:8px; }
241
- .bar-track { flex:1; height:8px; background:var(--navy); border-radius:999px; overflow:hidden; }
242
- .bar-fill { display:block; height:100%; border-radius:999px; }
243
- .fill-gold { background:var(--gold); } .fill-teal { background:var(--teal); } .fill-orange { background:var(--orange); }
244
- .bar-val { font-family:var(--mono); font-size:12px; min-width:48px; text-align:right; color:var(--text); }
245
- .bar.best .bar-val { color:var(--pass); font-weight:600; }
246
- .bar.best .bar-val::after { content:" ★"; color:var(--gold); font-size:10px; }
247
-
248
- .pill { display:inline-block; font-family:var(--mono); font-size:11px; font-weight:600; padding:3px 9px; border-radius:999px; }
249
- .pill.pass { background:rgba(63,185,80,0.14); color:var(--pass); }
250
- .pill.fail { background:rgba(229,83,75,0.14); color:var(--fail); }
251
- .pill.na { background:var(--navy); color:var(--text-muted); }
252
- .pill.run { background:rgba(240,180,41,0.14); color:var(--gold); animation:pulse 1.4s ease-in-out infinite; }
253
- .pill.wait { background:var(--navy); color:var(--text-muted); }
254
- .pendingrow td { opacity:0.72; }
255
- .frac { font-family:var(--mono); font-size:11px; color:var(--text-muted); }
256
- .checks { line-height:2; }
257
- .chip { display:inline-block; font-family:var(--mono); font-size:10.5px; padding:2px 7px; border-radius:5px; margin:0 4px 4px 0; border:1px solid var(--border); }
258
- .chip.ok { color:var(--pass); border-color:rgba(63,185,80,0.4); }
259
- .chip.no { color:var(--fail); border-color:rgba(229,83,75,0.4); }
260
- .errrow td { color:var(--fail); background:rgba(229,83,75,0.06); }
261
- .err { white-space:pre-wrap; }
262
- footer { margin-top:40px; color:var(--text-muted); font-size:12px; font-family:var(--mono); }
263
- a { color:var(--gold); }
264
- .live { font-family:var(--mono); font-size:13px; color:var(--gold); font-weight:600; letter-spacing:0; vertical-align:middle; margin-left:10px; animation:pulse 1.4s ease-in-out infinite; }
265
- @keyframes pulse { 0%,100%{opacity:1;} 50%{opacity:0.35;} }
266
- </style>
267
- </head>
268
- <body>
269
- <div class="wrap">
270
- <header>
271
- <h1>Last Light <span class="accent">·</span> Eval Scorecard${meta.live ? ` <span class="live">● live${meta.progress ? ` ${esc(meta.progress)}` : ""}</span>` : ""}</h1>
272
- <div class="meta">
273
- <b>${esc(useTiers.join(" + "))}</b> &nbsp;·&nbsp;
274
- models: <b>${esc(meta.models.join(", "))}</b> &nbsp;·&nbsp;
275
- ${esc(card.results.length)}${pending.length ? ` / ${esc(card.results.length + pending.length)}` : ""} cases${meta.runs && meta.runs > 1
276
- ? ` &nbsp;·&nbsp; <b>${esc(meta.runs)}×</b> per case <span class="muted">(worst-case verdict · mean cost)</span>`
277
- : ""} &nbsp;·&nbsp;
278
- ${esc(meta.generatedAt)}
279
- </div>
280
- </header>
281
-
282
- <div class="tabwrap">
283
- ${radios}
284
- <nav class="tabs">
285
- ${tabs}
286
- </nav>
287
- ${panes}
288
- </div>
289
-
290
- <footer>
291
- Real production workflows · mocked GitHub · deterministic grading. ★ = best in column.
292
- Generated by <span class="mono">npm run eval</span>. Also: scorecard.json · predictions.jsonl.
293
- </footer>
294
- </div>
295
- <script>
296
- // Preserve the active tab + scroll position across the live auto-refresh.
297
- (function () {
298
- try {
299
- var K = "ll-eval-tab", S = "ll-eval-scroll";
300
- var saved = sessionStorage.getItem(K);
301
- if (saved) { var r = document.getElementById(saved); if (r) r.checked = true; }
302
- document.querySelectorAll('input[name=tier]').forEach(function (radio) {
303
- radio.addEventListener("change", function () { sessionStorage.setItem(K, radio.id); });
304
- });
305
- var y = sessionStorage.getItem(S);
306
- if (y) window.scrollTo(0, parseInt(y, 10) || 0);
307
- window.addEventListener("scroll", function () { sessionStorage.setItem(S, String(window.scrollY)); }, { passive: true });
308
- } catch (e) {}
309
- })();
310
- </script>
311
- </body>
312
- </html>
313
- `;
314
- }
315
- export function writeHtml(dir, card, meta) {
316
- mkdirSync(dir, { recursive: true });
317
- const file = join(dir, "index.html");
318
- // Write-then-rename so a browser auto-refreshing during a live run never
319
- // reads a half-written file (rename is atomic on the same filesystem).
320
- const tmp = join(dir, ".index.html.tmp");
321
- writeFileSync(tmp, renderHtml(card, meta));
322
- renameSync(tmp, file);
323
- return file;
324
- }
325
- //# sourceMappingURL=html-report.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"html-report.js","sourceRoot":"","sources":["../src/html-report.ts"],"names":[],"mappings":"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"}