lastlight-evals 0.14.0 → 0.15.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 (51) hide show
  1. package/dashboard/dist/assets/index-CcEkcmk_.css +1 -0
  2. package/dashboard/dist/assets/index-CvhUJzAp.js +113 -0
  3. package/dashboard/dist/index.html +2 -2
  4. package/dist/fake-github.js +33 -0
  5. package/dist/fake-github.js.map +1 -1
  6. package/dist/judge.js +45 -7
  7. package/dist/judge.js.map +1 -1
  8. package/dist/labels-node.js +258 -0
  9. package/dist/labels-node.js.map +1 -0
  10. package/dist/labels.js +388 -0
  11. package/dist/labels.js.map +1 -0
  12. package/dist/labels.test.js +299 -0
  13. package/dist/labels.test.js.map +1 -0
  14. package/dist/mechanism.test.js +84 -13
  15. package/dist/mechanism.test.js.map +1 -1
  16. package/dist/micro-survey-node.js +21 -93
  17. package/dist/micro-survey-node.js.map +1 -1
  18. package/dist/phase-replay-node.js +321 -0
  19. package/dist/phase-replay-node.js.map +1 -0
  20. package/dist/phase-replay.js +147 -0
  21. package/dist/phase-replay.js.map +1 -0
  22. package/dist/phase-replay.test.js +104 -0
  23. package/dist/phase-replay.test.js.map +1 -0
  24. package/dist/pr-context.js +5 -1
  25. package/dist/pr-context.js.map +1 -1
  26. package/dist/report.js +78 -0
  27. package/dist/report.js.map +1 -1
  28. package/dist/run-instance.js +1 -0
  29. package/dist/run-instance.js.map +1 -1
  30. package/dist/schema.js.map +1 -1
  31. package/dist/serve.js +87 -1
  32. package/dist/serve.js.map +1 -1
  33. package/dist/site-review.js +43 -0
  34. package/dist/site-review.js.map +1 -0
  35. package/dist/site-review.test.js +125 -0
  36. package/dist/site-review.test.js.map +1 -0
  37. package/dist/site-summary.js +273 -0
  38. package/dist/site-summary.js.map +1 -0
  39. package/dist/site-summary.test.js +198 -0
  40. package/dist/site-summary.test.js.map +1 -0
  41. package/dist/unit-survey-index.js +180 -0
  42. package/dist/unit-survey-index.js.map +1 -0
  43. package/dist/unit-survey-index.test.js +221 -0
  44. package/dist/unit-survey-index.test.js.map +1 -0
  45. package/dist/unit-survey-replay.js +439 -0
  46. package/dist/unit-survey-replay.js.map +1 -0
  47. package/dist/unit-survey-replay.test.js +286 -0
  48. package/dist/unit-survey-replay.test.js.map +1 -0
  49. package/package.json +7 -8
  50. package/dashboard/dist/assets/index-CpwdOaLn.js +0 -111
  51. package/dashboard/dist/assets/index-DyUARjkE.css +0 -1
package/dist/labels.js ADDED
@@ -0,0 +1,388 @@
1
+ /**
2
+ * Human grades for review findings — the label contract, the key rule, and
3
+ * every number derived from labels. **Node-free** (like `phase-replay.ts`), so
4
+ * the server that stores labels and the dashboard that shows the metrics
5
+ * cannot disagree about a key or a figure. The fs half (scanning reports,
6
+ * reading `findings.jsonl` and fixture excerpts, appending labels) is
7
+ * `labels-node.ts`.
8
+ *
9
+ * Why this exists: gold is incomplete and the judge mis-matches (a credited
10
+ * row was found, by hand, to assert something false). So the user grades every
11
+ * finding the pipeline flags on two axes — REAL? (yes / no / unsure) ×
12
+ * IMPORTANCE (must-fix / worth-mentioning / nit, meaningful only when real is
13
+ * yes) — plus an optional "same as gold N" link and a short note. Arms are then
14
+ * read on human precision and real-important findings, gold recall secondary.
15
+ *
16
+ * ## Storage
17
+ *
18
+ * `eval-results/labels/findings.jsonl`, append-only, one {@link FindingLabel}
19
+ * per line; the LAST line for a key wins ({@link foldLabels}). A line with
20
+ * `real: null` clears the grade. Every line carries the finding text it graded
21
+ * and the time, so a label is auditable after the reports it came from are
22
+ * gone, and a re-grade is history rather than an overwrite.
23
+ *
24
+ * ## The key rule
25
+ *
26
+ * `labelKey` = hash of:
27
+ * - the **PR**: the instance id with a trailing `-r<N>` stripped
28
+ * ({@link prIdentity}) — `prreview__skillspro-1587-r1/-r2/-r3` are re-runs
29
+ * of ONE PR at different heads, so one grade covers the same finding on all
30
+ * three. Deliberately NOT `repo#number` from `instances.json`: the key must
31
+ * not change with whether that file happens to be readable;
32
+ * - the **path**, verbatim;
33
+ * - a **line bucket**, `round(line / 7)` ({@link lineBucket}) — seven-line
34
+ * buckets centred on multiples of 7, i.e. ±3 of the centre. Fixed buckets
35
+ * have edges (lines 3 and 4 fall in different buckets), which is accepted:
36
+ * it only ever costs a re-grade, never a wrong label;
37
+ * - the **title + mechanism**, lowercased with whitespace collapsed
38
+ * ({@link normaliseText}).
39
+ *
40
+ * Trade-off: too TIGHT and a near-duplicate (the same defect reworded on the
41
+ * next repeat, or shifted a few lines on the next PR revision) needs grading
42
+ * again; too LOOSE and one label silently covers two different findings — a
43
+ * false grade, which is the thing this whole exercise is meant to remove. The
44
+ * rule errs tight on purpose: model text rarely repeats verbatim, so most
45
+ * findings will be distinct keys, and {@link similarLabelled} surfaces graded
46
+ * neighbours (same PR + path, lines within {@link SIMILAR_LINES}) so a
47
+ * near-duplicate is a one-click copy, decided by the grader, never by the key.
48
+ */
49
+ export const LABELS_DIR = "labels";
50
+ export const LABELS_FILE = "findings.jsonl";
51
+ export const LABEL_KEY_VERSION = 1;
52
+ export const REAL_VALUES = ["yes", "no", "unsure"];
53
+ export const IMPORTANCE_VALUES = ["must-fix", "worth-mentioning", "nit"];
54
+ /** Lines either side within which a graded finding on the same PR + path is offered as "similar". */
55
+ export const SIMILAR_LINES = 10;
56
+ export const NOTE_MAX = 500;
57
+ // ── the key ─────────────────────────────────────────────────────────────────
58
+ /** `prreview__skillspro-1587-r2` → `prreview__skillspro-1587`. */
59
+ export function prIdentity(instanceId) {
60
+ return instanceId.replace(/-r\d+$/, "");
61
+ }
62
+ export function normaliseText(s) {
63
+ return s.toLowerCase().replace(/\s+/g, " ").trim();
64
+ }
65
+ export function lineBucket(line) {
66
+ return Math.round(line / 7);
67
+ }
68
+ /** The exact string the key hashes — exposed so a test can pin the rule. */
69
+ export function labelKeyInput(f) {
70
+ return JSON.stringify([LABEL_KEY_VERSION, f.pr, f.path, lineBucket(f.line), normaliseText(f.title), normaliseText(f.mechanism)]);
71
+ }
72
+ /** cyrb53 — a small, stable, pure-JS 53-bit string hash (no `node:crypto`, so the browser shares it). */
73
+ function cyrb53(s, seed) {
74
+ let h1 = 0xdeadbeef ^ seed;
75
+ let h2 = 0x41c6ce57 ^ seed;
76
+ for (let i = 0; i < s.length; i++) {
77
+ const c = s.charCodeAt(i);
78
+ h1 = Math.imul(h1 ^ c, 2654435761);
79
+ h2 = Math.imul(h2 ^ c, 1597334677);
80
+ }
81
+ h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
82
+ h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
83
+ return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(16).padStart(14, "0");
84
+ }
85
+ /** `f1-` + 28 hex chars (two seeds of cyrb53). */
86
+ export function labelKey(f) {
87
+ const s = labelKeyInput(f);
88
+ return `f${LABEL_KEY_VERSION}-${cyrb53(s, 1)}${cyrb53(s, 2)}`;
89
+ }
90
+ const KEY_RE = /^f\d+-[0-9a-f]{28}$/;
91
+ /**
92
+ * Validate a `POST /api/labels` body. `importance` is forced to `null` unless
93
+ * `real === "yes"` (it means nothing otherwise); `real: null` clears the grade
94
+ * and carries nothing else.
95
+ */
96
+ export function validateLabelInput(raw) {
97
+ if (!raw || typeof raw !== "object" || Array.isArray(raw))
98
+ return { ok: false, error: "body must be a JSON object" };
99
+ const r = raw;
100
+ if (typeof r.key !== "string" || !KEY_RE.test(r.key))
101
+ return { ok: false, error: "key: expected a label key (f1-<28 hex>)" };
102
+ const real = r.real ?? null;
103
+ if (real !== null && !REAL_VALUES.includes(real))
104
+ return { ok: false, error: `real: expected one of ${REAL_VALUES.join(" / ")} or null` };
105
+ if (real === null)
106
+ return { ok: true, value: { key: r.key, real: null, importance: null, gold: null, note: null } };
107
+ const importance = r.importance ?? null;
108
+ if (importance !== null && !IMPORTANCE_VALUES.includes(importance))
109
+ return { ok: false, error: `importance: expected one of ${IMPORTANCE_VALUES.join(" / ")} or null` };
110
+ let gold = null;
111
+ if (r.gold !== undefined && r.gold !== null) {
112
+ const g = r.gold;
113
+ if (typeof g !== "object" || typeof g.instanceId !== "string" || !g.instanceId || !Number.isInteger(g.index) || g.index < 0)
114
+ return { ok: false, error: "gold: expected null or { instanceId: string, index: integer ≥ 0 }" };
115
+ gold = { instanceId: g.instanceId, index: g.index };
116
+ }
117
+ let note = null;
118
+ if (r.note !== undefined && r.note !== null) {
119
+ if (typeof r.note !== "string")
120
+ return { ok: false, error: "note: expected a string or null" };
121
+ if (r.note.length > NOTE_MAX)
122
+ return { ok: false, error: `note: at most ${NOTE_MAX} characters` };
123
+ note = r.note.trim() || null;
124
+ }
125
+ return { ok: true, value: { key: r.key, real: real, importance: real === "yes" ? importance : null, gold, note } };
126
+ }
127
+ /** Parse `findings.jsonl` text into lines, skipping torn/malformed ones. */
128
+ export function parseLabelLines(text) {
129
+ const out = [];
130
+ for (const raw of text.split("\n")) {
131
+ if (!raw.trim())
132
+ continue;
133
+ try {
134
+ const v = JSON.parse(raw);
135
+ if (v && typeof v === "object" && typeof v.key === "string")
136
+ out.push(v);
137
+ }
138
+ catch {
139
+ /* a torn last line from a crashed append — skip it */
140
+ }
141
+ }
142
+ return out;
143
+ }
144
+ /** Last write per key wins; a `real: null` line removes the key. */
145
+ export function foldLabels(lines) {
146
+ const m = new Map();
147
+ for (const l of lines) {
148
+ if (l.real === null)
149
+ m.delete(l.key);
150
+ else
151
+ m.set(l.key, l);
152
+ }
153
+ return m;
154
+ }
155
+ /**
156
+ * Collapse raw findings to one per label key. The first appearance supplies the
157
+ * text and the excerpt; appearances accumulate; gold is kept per instance.
158
+ */
159
+ export function dedupFindings(raw, labels = new Map(), proposals = new Map()) {
160
+ const byKey = new Map();
161
+ for (const r of raw) {
162
+ const key = labelKey(r);
163
+ let f = byKey.get(key);
164
+ if (!f) {
165
+ f = {
166
+ key,
167
+ pr: r.pr,
168
+ path: r.path,
169
+ line: r.line,
170
+ title: r.title,
171
+ mechanism: r.mechanism,
172
+ consequence: r.consequence,
173
+ strength: r.strength,
174
+ appearances: [],
175
+ excerpt: r.excerpt,
176
+ gold: [],
177
+ label: labels.get(key) ?? null,
178
+ similar: [],
179
+ proposals: proposalsFor(proposals, key),
180
+ };
181
+ byKey.set(key, f);
182
+ }
183
+ f.excerpt ??= r.excerpt;
184
+ f.appearances.push(r.appearance);
185
+ if (!f.gold.some((g) => g.instanceId === r.appearance.instanceId))
186
+ f.gold.push({ instanceId: r.appearance.instanceId, items: r.gold });
187
+ }
188
+ const out = [...byKey.values()];
189
+ for (const f of out)
190
+ f.similar = similarLabelled(f, out);
191
+ return out;
192
+ }
193
+ /** Graded findings on the same PR + path within {@link SIMILAR_LINES} — offered, never applied. */
194
+ export function similarLabelled(f, all) {
195
+ return all
196
+ .filter((o) => o.key !== f.key && o.label && o.pr === f.pr && o.path === f.path && Math.abs(o.line - f.line) <= SIMILAR_LINES)
197
+ .sort((a, b) => Math.abs(a.line - f.line) - Math.abs(b.line - f.line))
198
+ .slice(0, 3)
199
+ .map((o) => ({ key: o.key, line: o.line, title: o.title, label: o.label }));
200
+ }
201
+ /**
202
+ * Per group (report label by default): how many distinct findings, how many
203
+ * graded, and what the grades say. A finding counts once per group however
204
+ * many repeats/sites it appeared in within that group.
205
+ */
206
+ export function gradedMetrics(findings, labels, groupOf = (a) => a.reportLabel) {
207
+ const keys = new Map();
208
+ for (const f of findings)
209
+ for (const a of f.appearances) {
210
+ const g = groupOf(a);
211
+ if (!keys.has(g))
212
+ keys.set(g, new Set());
213
+ keys.get(g).add(f.key);
214
+ }
215
+ return [...keys.entries()]
216
+ .map(([group, ks]) => {
217
+ const ls = [...ks].map((k) => labels.get(k)).filter((l) => !!l && l.real !== null);
218
+ const real = ls.filter((l) => l.real === "yes");
219
+ return {
220
+ group,
221
+ findings: ks.size,
222
+ graded: ls.length,
223
+ real: real.length,
224
+ notReal: ls.filter((l) => l.real === "no").length,
225
+ unsure: ls.filter((l) => l.real === "unsure").length,
226
+ realImportant: real.filter((l) => l.importance === "must-fix" || l.importance === "worth-mentioning").length,
227
+ precision: ls.length ? real.length / ls.length : null,
228
+ goldLinked: ls.filter((l) => l.gold !== null).length,
229
+ };
230
+ })
231
+ .sort((a, b) => a.group.localeCompare(b.group));
232
+ }
233
+ /** The label map a findings response already carries. */
234
+ export function labelsOf(findings) {
235
+ const m = new Map();
236
+ for (const f of findings)
237
+ if (f.label)
238
+ m.set(f.key, f.label);
239
+ return m;
240
+ }
241
+ // ── machine proposals ───────────────────────────────────────────────────────
242
+ //
243
+ // A grader model (e.g. `fable`) proposes a grade per finding, appended to
244
+ // `eval-results/labels/proposals-<grader>.jsonl` — same shape as a label minus
245
+ // the note/finding snapshot, plus a `reason`. Proposals are SHOWN beside the
246
+ // human controls and compared with the human labels ({@link agreementMetrics});
247
+ // they are never a label and no human metric ({@link gradedMetrics}) reads
248
+ // them. A human may accept one, which POSTs it as their own label.
249
+ export const PROPOSALS_PREFIX = "proposals-";
250
+ export const PROPOSALS_SUFFIX = ".jsonl";
251
+ /** `proposals-fable.jsonl` → `fable`; `null` for any other name. */
252
+ export function graderOfFile(name) {
253
+ if (!name.startsWith(PROPOSALS_PREFIX) || !name.endsWith(PROPOSALS_SUFFIX))
254
+ return null;
255
+ const g = name.slice(PROPOSALS_PREFIX.length, -PROPOSALS_SUFFIX.length);
256
+ return g || null;
257
+ }
258
+ /**
259
+ * Parse one proposals file. Torn/partial lines (the file may be mid-write) and
260
+ * lines with an invalid `real`/`importance`/`gold` are skipped. The line's own
261
+ * `grader` wins over the file name's. `real: null` is kept as a tombstone
262
+ * (`real` is `null` only in the returned line list, never in a folded map).
263
+ */
264
+ export function parseProposalLines(text, fileGrader) {
265
+ const out = [];
266
+ for (const raw of text.split("\n")) {
267
+ if (!raw.trim())
268
+ continue;
269
+ let v;
270
+ try {
271
+ v = JSON.parse(raw);
272
+ }
273
+ catch {
274
+ continue;
275
+ }
276
+ if (!v || typeof v !== "object" || Array.isArray(v) || typeof v.key !== "string")
277
+ continue;
278
+ const real = v.real ?? null;
279
+ if (real !== null && !REAL_VALUES.includes(real))
280
+ continue;
281
+ const importance = v.importance ?? null;
282
+ if (importance !== null && !IMPORTANCE_VALUES.includes(importance))
283
+ continue;
284
+ let gold = null;
285
+ if (v.gold !== undefined && v.gold !== null) {
286
+ const g = v.gold;
287
+ if (typeof g !== "object" || typeof g.instanceId !== "string" || !Number.isInteger(g.index) || g.index < 0)
288
+ continue;
289
+ gold = { instanceId: g.instanceId, index: g.index };
290
+ }
291
+ out.push({
292
+ key: v.key,
293
+ grader: typeof v.grader === "string" && v.grader ? v.grader : fileGrader,
294
+ real: real,
295
+ importance: real === "yes" ? importance : null,
296
+ gold: real === null ? null : gold,
297
+ reason: typeof v.reason === "string" ? v.reason : null,
298
+ gradedAt: typeof v.gradedAt === "string" ? v.gradedAt : null,
299
+ });
300
+ }
301
+ return out;
302
+ }
303
+ /** Last write per (grader, key) wins; a `real: null` line removes that grader's proposal. */
304
+ export function foldProposals(lines, into = new Map()) {
305
+ for (const { key, ...p } of lines) {
306
+ if (p.real === null) {
307
+ into.get(key)?.delete(p.grader);
308
+ continue;
309
+ }
310
+ if (!into.has(key))
311
+ into.set(key, new Map());
312
+ into.get(key).set(p.grader, p);
313
+ }
314
+ return into;
315
+ }
316
+ export function proposalsFor(m, key) {
317
+ return [...(m.get(key)?.values() ?? [])].sort((a, b) => a.grader.localeCompare(b.grader));
318
+ }
319
+ const sameGold = (a, b) => (a === null || b === null ? a === b : a.instanceId === b.instanceId && a.index === b.index);
320
+ /**
321
+ * Does the human label agree with a proposal? `real` must match and, when both
322
+ * say yes, so must `importance`. The gold link is NOT part of it (reported
323
+ * separately as `goldAgree`) — the grade page's "disagrees" filter reads this.
324
+ */
325
+ export function proposalAgrees(label, p) {
326
+ return label.real === p.real && (label.real !== "yes" || label.importance === p.importance);
327
+ }
328
+ /**
329
+ * Cohen's kappa over a square confusion matrix: (po − pe) ÷ (1 − pe).
330
+ * `null` with no pairs, or when chance agreement is total (pe = 1: both sides
331
+ * used one and the same category, so kappa is undefined).
332
+ */
333
+ export function cohenKappa(m) {
334
+ const n = m.reduce((s, r) => s + r.reduce((a, b) => a + b, 0), 0);
335
+ if (!n)
336
+ return null;
337
+ const po = m.reduce((s, r, i) => s + r[i], 0) / n;
338
+ let pe = 0;
339
+ for (let i = 0; i < m.length; i++) {
340
+ const row = m[i].reduce((a, b) => a + b, 0);
341
+ const col = m.reduce((a, r) => a + r[i], 0);
342
+ pe += (row / n) * (col / n);
343
+ }
344
+ return pe >= 1 ? null : (po - pe) / (1 - pe);
345
+ }
346
+ /**
347
+ * Per grader, over findings that carry both a human label and that grader's
348
+ * proposal. Reads only the two; the human label is the reference.
349
+ */
350
+ export function agreementMetrics(findings) {
351
+ const by = new Map();
352
+ for (const f of findings)
353
+ for (const p of f.proposals) {
354
+ if (!by.has(p.grader))
355
+ by.set(p.grader, { proposals: 0, pairs: [] });
356
+ const g = by.get(p.grader);
357
+ g.proposals++;
358
+ if (f.label && f.label.real !== null)
359
+ g.pairs.push([f.label, p]);
360
+ }
361
+ const rate = (a, b) => (b ? a / b : null);
362
+ return [...by.entries()]
363
+ .map(([grader, { proposals, pairs }]) => {
364
+ const confusion = REAL_VALUES.map(() => REAL_VALUES.map(() => 0));
365
+ for (const [l, p] of pairs)
366
+ confusion[REAL_VALUES.indexOf(l.real)][REAL_VALUES.indexOf(p.real)]++;
367
+ const realAgree = pairs.filter(([l, p]) => l.real === p.real).length;
368
+ const both = pairs.filter(([l, p]) => l.real === "yes" && p.real === "yes");
369
+ const importanceAgree = both.filter(([l, p]) => l.importance === p.importance).length;
370
+ const goldAgree = both.filter(([l, p]) => sameGold(l.gold, p.gold)).length;
371
+ return {
372
+ grader,
373
+ proposals,
374
+ n: pairs.length,
375
+ realAgree,
376
+ realAgreeRate: rate(realAgree, pairs.length),
377
+ kappa: cohenKappa(confusion),
378
+ bothReal: both.length,
379
+ importanceAgree,
380
+ importanceAgreeRate: rate(importanceAgree, both.length),
381
+ goldAgree,
382
+ goldAgreeRate: rate(goldAgree, both.length),
383
+ confusion,
384
+ };
385
+ })
386
+ .sort((a, b) => a.grader.localeCompare(b.grader));
387
+ }
388
+ //# sourceMappingURL=labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.js","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"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"}