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.
- package/dashboard/dist/assets/index-CcEkcmk_.css +1 -0
- package/dashboard/dist/assets/index-CvhUJzAp.js +113 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/fake-github.js +33 -0
- package/dist/fake-github.js.map +1 -1
- package/dist/judge.js +45 -7
- package/dist/judge.js.map +1 -1
- package/dist/labels-node.js +258 -0
- package/dist/labels-node.js.map +1 -0
- package/dist/labels.js +388 -0
- package/dist/labels.js.map +1 -0
- package/dist/labels.test.js +299 -0
- package/dist/labels.test.js.map +1 -0
- package/dist/mechanism.test.js +84 -13
- package/dist/mechanism.test.js.map +1 -1
- package/dist/micro-survey-node.js +21 -93
- package/dist/micro-survey-node.js.map +1 -1
- package/dist/phase-replay-node.js +321 -0
- package/dist/phase-replay-node.js.map +1 -0
- package/dist/phase-replay.js +147 -0
- package/dist/phase-replay.js.map +1 -0
- package/dist/phase-replay.test.js +104 -0
- package/dist/phase-replay.test.js.map +1 -0
- package/dist/pr-context.js +5 -1
- package/dist/pr-context.js.map +1 -1
- package/dist/report.js +78 -0
- package/dist/report.js.map +1 -1
- package/dist/run-instance.js +1 -0
- package/dist/run-instance.js.map +1 -1
- package/dist/schema.js.map +1 -1
- package/dist/serve.js +87 -1
- package/dist/serve.js.map +1 -1
- package/dist/site-review.js +43 -0
- package/dist/site-review.js.map +1 -0
- package/dist/site-review.test.js +125 -0
- package/dist/site-review.test.js.map +1 -0
- package/dist/site-summary.js +273 -0
- package/dist/site-summary.js.map +1 -0
- package/dist/site-summary.test.js +198 -0
- package/dist/site-summary.test.js.map +1 -0
- package/dist/unit-survey-index.js +180 -0
- package/dist/unit-survey-index.js.map +1 -0
- package/dist/unit-survey-index.test.js +221 -0
- package/dist/unit-survey-index.test.js.map +1 -0
- package/dist/unit-survey-replay.js +439 -0
- package/dist/unit-survey-replay.js.map +1 -0
- package/dist/unit-survey-replay.test.js +286 -0
- package/dist/unit-survey-replay.test.js.map +1 -0
- package/package.json +7 -8
- package/dashboard/dist/assets/index-CpwdOaLn.js +0 -111
- package/dashboard/dist/assets/index-DyUARjkE.css +0 -1
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Node half of a phase replay (`scripts/micro-falsify.ts`,
|
|
3
|
+
* `scripts/micro-adjudicate.ts`): fixtures, gold, the gold→hypothesis map, the
|
|
4
|
+
* agent run, and the live report writer. The report SHAPE and every derived
|
|
5
|
+
* number live in the node-free `phase-replay.ts`.
|
|
6
|
+
*
|
|
7
|
+
* Fidelity rules, inherited from `micro-survey.ts` (each learned by getting it
|
|
8
|
+
* wrong there):
|
|
9
|
+
*
|
|
10
|
+
* - Copy the TASK dir, not the checkout: the composed `AGENTS.md` is a sibling
|
|
11
|
+
* of the repo, and Pi loads the first one walking UP from cwd.
|
|
12
|
+
* - Stage skills FRESH from core (or an override), never the fixture's frozen
|
|
13
|
+
* bundle — iterating on them is the point.
|
|
14
|
+
* - `noSkills: true` — what core does on every backend.
|
|
15
|
+
* - Pass `gateTimeoutSeconds`: agentic-pi arms its bash reaper only when set.
|
|
16
|
+
*
|
|
17
|
+
* And one of its own: the loop. Core's `generic_loop` re-renders the SAME
|
|
18
|
+
* prompt every iteration (neither phase's prompt reads `{{previousOutput}}`)
|
|
19
|
+
* and stops as soon as the `until_bash` gate passes, so {@link runGateLoop}
|
|
20
|
+
* does exactly that — same prompt, gate between rounds, no feedback injected.
|
|
21
|
+
* (`promptForRound` is the one opt-out, used only by `micro-site-review`, an
|
|
22
|
+
* experiment that is not a core phase.)
|
|
23
|
+
*/
|
|
24
|
+
import { createHash } from "node:crypto";
|
|
25
|
+
import { cpSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
26
|
+
import { tmpdir } from "node:os";
|
|
27
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
28
|
+
import { AgenticShim } from "lastlight-core/evals";
|
|
29
|
+
import { readHypothesisSet } from "lastlight-code-facts";
|
|
30
|
+
import { renderTemplate } from "lastlight-workflow-engine";
|
|
31
|
+
import { gradeInternalRecall } from "./grade.js";
|
|
32
|
+
import { readSessionLog } from "./metrics.js";
|
|
33
|
+
import { microGoldVote } from "./micro-survey.js";
|
|
34
|
+
import { rowsAsJudgeFindings } from "./micro-survey-node.js";
|
|
35
|
+
// ── core paths ──────────────────────────────────────────────────────────────
|
|
36
|
+
export const coreRoot = resolve(process.env.LASTLIGHT_CORE_DIR ?? resolve(import.meta.dirname, "../../server"));
|
|
37
|
+
export const serverRoot = existsSync(join(coreRoot, "workflows")) ? coreRoot : join(coreRoot, "apps/server");
|
|
38
|
+
export function sha256(text) {
|
|
39
|
+
return createHash("sha256").update(text).digest("hex");
|
|
40
|
+
}
|
|
41
|
+
function asFixture(dir) {
|
|
42
|
+
const sandboxes = join(dir, "sandboxes");
|
|
43
|
+
if (!existsSync(sandboxes))
|
|
44
|
+
return null;
|
|
45
|
+
const task = readdirSync(sandboxes).find((e) => statSync(join(sandboxes, e)).isDirectory());
|
|
46
|
+
if (!task)
|
|
47
|
+
return null;
|
|
48
|
+
const taskDir = join(sandboxes, task);
|
|
49
|
+
const repo = readdirSync(taskDir).find((e) => existsSync(join(taskDir, e, ".git")));
|
|
50
|
+
if (!repo)
|
|
51
|
+
return null;
|
|
52
|
+
const checkout = join(taskDir, repo);
|
|
53
|
+
const prDir = join(checkout, ".lastlight", "pr-review");
|
|
54
|
+
if (!existsSync(prDir))
|
|
55
|
+
return null;
|
|
56
|
+
return { dir, instanceId: basename(dir), arm: basename(dirname(dir)), taskDir, repoDirName: repo, checkout, prDir };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Each argument is a fixture (a dir holding `sandboxes/`) or a directory of
|
|
60
|
+
* them (`…/2026-09-27-units-v7-haiku/arm1`). An argument that is neither is an
|
|
61
|
+
* error — a typo'd path must not quietly shrink the case set.
|
|
62
|
+
*/
|
|
63
|
+
export function resolveFixtures(paths, only) {
|
|
64
|
+
const out = [];
|
|
65
|
+
for (const p of paths.map((x) => resolve(x))) {
|
|
66
|
+
const direct = asFixture(p);
|
|
67
|
+
if (direct) {
|
|
68
|
+
out.push(direct);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (!existsSync(p))
|
|
72
|
+
throw new Error(`no such fixture path: ${p}`);
|
|
73
|
+
const kids = readdirSync(p)
|
|
74
|
+
.sort()
|
|
75
|
+
.map((e) => asFixture(join(p, e)))
|
|
76
|
+
.filter((f) => f !== null);
|
|
77
|
+
if (!kids.length)
|
|
78
|
+
throw new Error(`${p} is not a fixture and holds none (expected <case>/sandboxes/<task>/<repo>/.lastlight/pr-review)`);
|
|
79
|
+
out.push(...kids);
|
|
80
|
+
}
|
|
81
|
+
return only ? out.filter((f) => only.has(f.instanceId)) : out;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* A scratch COPY of the task dir: the phase writes into `.lastlight/pr-review/`
|
|
85
|
+
* and the fixture must stay pristine for the next repeat.
|
|
86
|
+
*/
|
|
87
|
+
export function scratchCopy(fx) {
|
|
88
|
+
const scratch = mkdtempSync(join(tmpdir(), `phase-replay-${fx.instanceId}-`));
|
|
89
|
+
const ws = join(scratch, "ws");
|
|
90
|
+
cpSync(fx.taskDir, ws, { recursive: true });
|
|
91
|
+
const checkout = join(ws, fx.repoDirName);
|
|
92
|
+
return { scratch, checkout, prDir: join(checkout, ".lastlight", "pr-review") };
|
|
93
|
+
}
|
|
94
|
+
export function loadInstances(path) {
|
|
95
|
+
if (!path)
|
|
96
|
+
return new Map();
|
|
97
|
+
const list = JSON.parse(readFileSync(path, "utf8"));
|
|
98
|
+
return new Map(list.map((i) => [i.instance_id, i]));
|
|
99
|
+
}
|
|
100
|
+
export function goldRefs(gold) {
|
|
101
|
+
return gold.map((g) => ({
|
|
102
|
+
...(g.file ? { file: g.file } : {}),
|
|
103
|
+
...(typeof g.line === "number" ? { line: g.line } : {}),
|
|
104
|
+
severity: g.severity,
|
|
105
|
+
summary: g.description.replace(/\*\*[^*]*\*\*/g, "").replace(/\s+/g, " ").trim().slice(0, 160),
|
|
106
|
+
}));
|
|
107
|
+
}
|
|
108
|
+
/** The PR fields both prompts render. */
|
|
109
|
+
export function promptContext(inst) {
|
|
110
|
+
const pr = (inst?.pr ?? {});
|
|
111
|
+
const [owner, repo] = (inst?.repo ?? "owner/repo").split("/");
|
|
112
|
+
return {
|
|
113
|
+
owner,
|
|
114
|
+
repo,
|
|
115
|
+
prNumber: pr.number ?? 0,
|
|
116
|
+
headSha: pr.head_commit ?? "HEAD",
|
|
117
|
+
baseBranch: pr.base_ref ?? "main",
|
|
118
|
+
prTitle: pr.title ?? "",
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
export function renderPhasePrompt(path, ctx) {
|
|
122
|
+
const text = renderTemplate(readFileSync(path, "utf8"), ctx);
|
|
123
|
+
return { text, unrendered: /\{\{|\}\}/.test(text) };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Which hypothesis each gold was matched to, by the internal-recall judge,
|
|
127
|
+
* majority over `votes` passes. Judged ONCE per (hypotheses bytes, gold, judge,
|
|
128
|
+
* votes) and cached on disk, so every arm replayed over a fixture reads the
|
|
129
|
+
* same map and its noise never shows up as a difference between arms.
|
|
130
|
+
* `null` when there is no gold, no judge, or the judge failed every pass.
|
|
131
|
+
*/
|
|
132
|
+
export async function goldRowMap(opts) {
|
|
133
|
+
const { prDir, gold, judgeModel, votes, cacheDir } = opts;
|
|
134
|
+
if (!gold.length || !judgeModel)
|
|
135
|
+
return null;
|
|
136
|
+
const set = readHypothesisSet(prDir);
|
|
137
|
+
if (!set.records.length)
|
|
138
|
+
return gold.map(() => null);
|
|
139
|
+
const hypDir = join(prDir, "hypotheses");
|
|
140
|
+
const bytes = readdirSync(hypDir)
|
|
141
|
+
.filter((f) => f.endsWith(".jsonl"))
|
|
142
|
+
.sort()
|
|
143
|
+
.map((f) => `${f}\n${readFileSync(join(hypDir, f), "utf8")}`)
|
|
144
|
+
.join("\n");
|
|
145
|
+
const key = sha256(JSON.stringify({ v: 1, bytes, gold, judgeModel, votes })).slice(0, 24);
|
|
146
|
+
const file = join(cacheDir, `${key}.json`);
|
|
147
|
+
if (existsSync(file))
|
|
148
|
+
return JSON.parse(readFileSync(file, "utf8"));
|
|
149
|
+
const findings = rowsAsJudgeFindings(set.records.map((r) => r.row));
|
|
150
|
+
const passes = await Promise.all(Array.from({ length: votes }, () => gradeInternalRecall({ gold, findings, judgeModel })));
|
|
151
|
+
const ok = passes.filter((g) => g && !g.error);
|
|
152
|
+
if (!ok.length)
|
|
153
|
+
return null;
|
|
154
|
+
const { rowForGold } = microGoldVote(ok.map((g) => g.goldToFinding), gold.length);
|
|
155
|
+
const map = rowForGold.map((i) => (i === null ? null : (set.records[i]?.id ?? null)));
|
|
156
|
+
mkdirSync(cacheDir, { recursive: true });
|
|
157
|
+
try {
|
|
158
|
+
writeFileSync(file, JSON.stringify(map), { flag: "wx" });
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// another run wrote first — its answer is the shared one
|
|
162
|
+
}
|
|
163
|
+
return JSON.parse(readFileSync(file, "utf8"));
|
|
164
|
+
}
|
|
165
|
+
let runFn = null;
|
|
166
|
+
/** One agent session, exactly as core's in-process executor runs a phase. */
|
|
167
|
+
export async function runPhaseAgent(opts) {
|
|
168
|
+
runFn ??= (await import("agentic-pi")).run;
|
|
169
|
+
// No phase deadline: agentic-pi's in-process `run()` takes no abort signal,
|
|
170
|
+
// and core's in-process backends (`none`, which evals use) cannot stop an
|
|
171
|
+
// agent phase either — `timeout_seconds` bounds commands there, not agents.
|
|
172
|
+
// So the replay records the wall clock rather than pretending to enforce one.
|
|
173
|
+
const started = Date.now();
|
|
174
|
+
// Core's own shim, fed exactly as the orchestrator feeds it — so the session
|
|
175
|
+
// on disk is the stream-json envelope a real run writes, and the dashboard's
|
|
176
|
+
// live viewer follows it unchanged.
|
|
177
|
+
const shim = new AgenticShim({
|
|
178
|
+
homeDir: opts.sessionsDir,
|
|
179
|
+
projectSlug: "-phase-replay",
|
|
180
|
+
model: opts.model,
|
|
181
|
+
initialPrompt: opts.prompt,
|
|
182
|
+
phase: opts.phase,
|
|
183
|
+
});
|
|
184
|
+
try {
|
|
185
|
+
const r = await runFn({
|
|
186
|
+
onEvent: (record) => shim.feed(record),
|
|
187
|
+
model: opts.model,
|
|
188
|
+
prompt: opts.prompt,
|
|
189
|
+
cwd: opts.cwd,
|
|
190
|
+
...(opts.skillDirs.length ? { skillPaths: opts.skillDirs } : {}),
|
|
191
|
+
noSkills: true,
|
|
192
|
+
sandbox: "none",
|
|
193
|
+
gateTimeoutSeconds: opts.gateTimeoutSeconds,
|
|
194
|
+
...(opts.thinking ? { thinking: opts.thinking } : {}),
|
|
195
|
+
...(opts.commandPolicy ? { commandPolicy: opts.commandPolicy } : {}),
|
|
196
|
+
});
|
|
197
|
+
return {
|
|
198
|
+
ok: r.ok !== false,
|
|
199
|
+
error: r.error ?? null,
|
|
200
|
+
wallMs: Date.now() - started,
|
|
201
|
+
costUsd: r.stats?.cost ?? 0,
|
|
202
|
+
turns: r.stats?.assistantMessages ?? 0,
|
|
203
|
+
outputTokens: r.stats?.tokens?.output ?? 0,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
return { ok: false, error: err.message.slice(0, 300), wallMs: Date.now() - started, costUsd: 0, turns: 0, outputTokens: 0 };
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
await shim.flush().catch(() => { });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* `generic_loop`, replayed: run, gate, and again only while the gate fails and
|
|
215
|
+
* rounds remain. The prompt is identical every round, as in core. Costs, turns
|
|
216
|
+
* and tokens are summed across rounds; wall clock is the whole loop's.
|
|
217
|
+
*/
|
|
218
|
+
export async function runGateLoop(opts) {
|
|
219
|
+
const started = Date.now();
|
|
220
|
+
// A per-case DEADLINE, because nothing else bounds an in-process agent:
|
|
221
|
+
// agentic-pi's `run()` takes no abort signal, and on 2026-09-27 six Sonnet
|
|
222
|
+
// adjudications sat 40 minutes on stalled API calls with the report still
|
|
223
|
+
// reading "running". Past it the case is recorded as timed out and the
|
|
224
|
+
// replay moves on; the orphaned session ends when the process exits.
|
|
225
|
+
let timer;
|
|
226
|
+
const deadline = new Promise((res) => {
|
|
227
|
+
timer = setTimeout(() => res("deadline"), opts.deadlineMs);
|
|
228
|
+
timer.unref?.();
|
|
229
|
+
});
|
|
230
|
+
const total = { ok: true, error: null, wallMs: 0, costUsd: 0, turns: 0, outputTokens: 0 };
|
|
231
|
+
let iterations = 0;
|
|
232
|
+
let satisfied = false;
|
|
233
|
+
while (iterations < Math.max(1, opts.rounds)) {
|
|
234
|
+
iterations++;
|
|
235
|
+
const prompt = opts.promptForRound ? opts.promptForRound(iterations) : opts.prompt;
|
|
236
|
+
const raced = await Promise.race([runPhaseAgent({ ...opts, prompt, phase: `${opts.phase}_${iterations}` }), deadline]);
|
|
237
|
+
if (raced === "deadline") {
|
|
238
|
+
total.ok = false;
|
|
239
|
+
total.error = `deadline — no result after ${Math.round(opts.deadlineMs / 60000)} min (round ${iterations})`;
|
|
240
|
+
satisfied = opts.gate();
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
const r = raced;
|
|
244
|
+
total.costUsd += r.costUsd;
|
|
245
|
+
total.turns += r.turns;
|
|
246
|
+
total.outputTokens += r.outputTokens;
|
|
247
|
+
if (!r.ok) {
|
|
248
|
+
total.ok = false;
|
|
249
|
+
total.error = r.error;
|
|
250
|
+
}
|
|
251
|
+
satisfied = opts.gate();
|
|
252
|
+
if (satisfied || !r.ok)
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
clearTimeout(timer);
|
|
256
|
+
return { ...total, wallMs: Date.now() - started, iterations, gateSatisfied: satisfied };
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Follow a case's session live, the way `run-instance.ts` does for a run: the
|
|
260
|
+
* consolidated transcript (`readSessionLog`, the same reader) is flushed
|
|
261
|
+
* ATOMICALLY to `<dir>/full.jsonl` every 1.5 s while the case runs and once at
|
|
262
|
+
* the end. Returns a stop function that does the final flush.
|
|
263
|
+
*/
|
|
264
|
+
export function followSession(sessionsDir, dir) {
|
|
265
|
+
const file = join(dir, "full.jsonl");
|
|
266
|
+
const flush = () => {
|
|
267
|
+
try {
|
|
268
|
+
const log = readSessionLog(sessionsDir);
|
|
269
|
+
if (!log)
|
|
270
|
+
return;
|
|
271
|
+
mkdirSync(dir, { recursive: true });
|
|
272
|
+
writeFileSync(`${file}.tmp`, log);
|
|
273
|
+
renameSync(`${file}.tmp`, file);
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
/* best-effort — a flush failure must never affect the case */
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
const t = setInterval(flush, 1500);
|
|
280
|
+
t.unref?.();
|
|
281
|
+
return () => {
|
|
282
|
+
clearInterval(t);
|
|
283
|
+
flush();
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
// ── the live report ─────────────────────────────────────────────────────────
|
|
287
|
+
/**
|
|
288
|
+
* Written at start, after every case, and by an unref'd 15 s heartbeat —
|
|
289
|
+
* ATOMICALLY (temp + rename), so a polling dashboard never reads a torn file.
|
|
290
|
+
*/
|
|
291
|
+
export class PhaseReportWriter {
|
|
292
|
+
report;
|
|
293
|
+
file;
|
|
294
|
+
timer;
|
|
295
|
+
constructor(report, outDir) {
|
|
296
|
+
this.report = report;
|
|
297
|
+
mkdirSync(outDir, { recursive: true });
|
|
298
|
+
this.file = join(outDir, `${report.startedAt.replace(/[:.]/g, "-")}-${report.kind}-${report.label}.json`);
|
|
299
|
+
this.write();
|
|
300
|
+
this.timer = setInterval(() => this.write(), 15_000);
|
|
301
|
+
this.timer.unref?.();
|
|
302
|
+
}
|
|
303
|
+
write() {
|
|
304
|
+
this.report.heartbeat = new Date().toISOString();
|
|
305
|
+
const tmp = join(dirname(this.file), `.${basename(this.file)}.${process.pid}.tmp`);
|
|
306
|
+
writeFileSync(tmp, `${JSON.stringify(this.report, null, 2)}\n`);
|
|
307
|
+
renameSync(tmp, this.file);
|
|
308
|
+
}
|
|
309
|
+
finish(error) {
|
|
310
|
+
clearInterval(this.timer);
|
|
311
|
+
this.report.status = error ? "failed" : "done";
|
|
312
|
+
this.report.error = error ?? null;
|
|
313
|
+
this.report.finishedAt = new Date().toISOString();
|
|
314
|
+
this.write();
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
export function removeScratch(scratch, keep) {
|
|
318
|
+
if (!keep)
|
|
319
|
+
rmSync(scratch, { recursive: true, force: true });
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=phase-replay-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase-replay-node.js","sourceRoot":"","sources":["../src/phase-replay-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase replays — ONE pr-review phase (`falsify`, or the per-site
|
|
3
|
+
* investigator `site-review`) re-run against preserved fixtures, in minutes
|
|
4
|
+
* rather than a full arm's hours. (`adjudicate` replays existed too; the phase
|
|
5
|
+
* and its script were removed, and their reports are no longer listed.)
|
|
6
|
+
*
|
|
7
|
+
* `scripts/micro-falsify.ts` and `scripts/micro-site-review.ts` write these
|
|
8
|
+
* reports to `eval-results/phase-replay/*.json`; `/api/phase-replay` lists them
|
|
9
|
+
* and the dashboard's `phase-replay` page renders them. This module is the ONE
|
|
10
|
+
* definition of the report shape and of every number derived from it, and it
|
|
11
|
+
* is **node-free** (like `micro-survey.ts` / `unit-survey-index.ts`) so the fs
|
|
12
|
+
* scan and the browser cannot disagree about a figure.
|
|
13
|
+
*
|
|
14
|
+
* Why these two phases and why replay: measured on the first unit-survey arm
|
|
15
|
+
* (2026-09-27), adjudicate on Sonnet 4.6 spent 8.7 minutes writing ~29k output
|
|
16
|
+
* tokens for 52 rows and was still inside one turn at 12 minutes on 173, while
|
|
17
|
+
* falsify was shown one owed row of 21 (the prompt keyed on a field the rows
|
|
18
|
+
* never carry). Both are questions about ONE phase over a FIXED input — the
|
|
19
|
+
* checkout, the hypotheses, the probe verdicts — so replaying that input holds
|
|
20
|
+
* the upstream variance still and measures the phase alone.
|
|
21
|
+
*
|
|
22
|
+
* Absent is not zero, everywhere below: an unjudged grade is `null`, never a
|
|
23
|
+
* zero recall; an audit (no model) has no cost rather than a free run.
|
|
24
|
+
*/
|
|
25
|
+
import { unitSurveyStatus } from "./unit-survey-index.js";
|
|
26
|
+
export const PHASE_REPLAY_DIR = "phase-replay";
|
|
27
|
+
export const PHASE_REPLAY_VERSION = 1;
|
|
28
|
+
export function phaseRange(values) {
|
|
29
|
+
const xs = values.filter((v) => typeof v === "number" && Number.isFinite(v));
|
|
30
|
+
if (!xs.length)
|
|
31
|
+
return null;
|
|
32
|
+
return { min: Math.min(...xs), max: Math.max(...xs), mean: xs.reduce((a, b) => a + b, 0) / xs.length, n: xs.length };
|
|
33
|
+
}
|
|
34
|
+
export function phaseMedian(values) {
|
|
35
|
+
const xs = values.filter((v) => typeof v === "number" && Number.isFinite(v)).sort((a, b) => a - b);
|
|
36
|
+
if (!xs.length)
|
|
37
|
+
return null;
|
|
38
|
+
const mid = Math.floor(xs.length / 2);
|
|
39
|
+
return xs.length % 2 ? xs[mid] : (xs[mid - 1] + xs[mid]) / 2;
|
|
40
|
+
}
|
|
41
|
+
const sum = (xs) => xs.reduce((a, b) => a + b, 0);
|
|
42
|
+
function mergeCounts(into, from) {
|
|
43
|
+
for (const [k, v] of Object.entries(from))
|
|
44
|
+
into[k] = (into[k] ?? 0) + v;
|
|
45
|
+
}
|
|
46
|
+
export function phaseReplayTotals(report) {
|
|
47
|
+
const all = report.cases ?? [];
|
|
48
|
+
const ok = all.filter((c) => c.ok);
|
|
49
|
+
const totals = {
|
|
50
|
+
cases: all.length,
|
|
51
|
+
errored: all.length - ok.length,
|
|
52
|
+
costUsd: report.audit ? null : sum(ok.map((c) => c.costUsd ?? 0)),
|
|
53
|
+
wallMedianMs: report.audit ? null : phaseMedian(ok.map((c) => c.wallMs)),
|
|
54
|
+
wallMaxMs: report.audit ? null : (phaseRange(ok.map((c) => c.wallMs))?.max ?? null),
|
|
55
|
+
outputTokens: report.audit ? null : sum(ok.map((c) => c.outputTokens ?? 0)),
|
|
56
|
+
rows: sum(ok.map((c) => c.rows)),
|
|
57
|
+
gold: sum(ok.map((c) => c.gold.length)),
|
|
58
|
+
};
|
|
59
|
+
// A case with gold but no judged map cannot say which rows were gold, so any
|
|
60
|
+
// gold count over it is unknown — never a measured zero.
|
|
61
|
+
const goldKnown = ok.every((c) => c.goldRows !== null || c.gold.length === 0);
|
|
62
|
+
if (report.kind === "falsify") {
|
|
63
|
+
const verdicts = {};
|
|
64
|
+
for (const c of ok)
|
|
65
|
+
if (c.falsify)
|
|
66
|
+
mergeCounts(verdicts, c.falsify.verdicts);
|
|
67
|
+
const f = ok.map((c) => c.falsify).filter((x) => !!x);
|
|
68
|
+
totals.falsify = {
|
|
69
|
+
owed: sum(f.map((x) => x.owed)),
|
|
70
|
+
selected: sum(f.map((x) => x.selected)),
|
|
71
|
+
answered: sum(f.map((x) => x.selected - (x.verdicts.none ?? 0))),
|
|
72
|
+
verdicts,
|
|
73
|
+
goldSelected: goldKnown ? sum(f.map((x) => x.goldSelected.length)) : null,
|
|
74
|
+
goldRefuted: goldKnown ? sum(f.map((x) => x.goldRefuted.length)) : null,
|
|
75
|
+
goldReproduced: goldKnown ? sum(f.map((x) => x.goldReproduced.length)) : null,
|
|
76
|
+
gateFailures: f.filter((x) => !x.gateSatisfied).length,
|
|
77
|
+
sites: f.some((x) => x.sites) ? sum(f.map((x) => x.sites?.length ?? 0)) : null,
|
|
78
|
+
claims: f.some((x) => x.sites?.some((s) => s.claims !== null))
|
|
79
|
+
? sum(f.flatMap((x) => (x.sites ?? []).map((s) => s.claims ?? 0)))
|
|
80
|
+
: null,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
const r = ok.map((c) => c.siteReview).filter((x) => !!x);
|
|
85
|
+
const sites = r.flatMap((x) => x.sites);
|
|
86
|
+
const judged = !report.audit && r.length > 0 && r.every((x) => x.goldStated !== null && x.matchedFindings !== null);
|
|
87
|
+
const findings = sum(r.map((x) => x.findings.length));
|
|
88
|
+
const matched = judged ? sum(r.map((x) => x.matchedFindings ?? 0)) : null;
|
|
89
|
+
totals.siteReview = {
|
|
90
|
+
sites: sites.length,
|
|
91
|
+
rowsInSites: sum(sites.map((s) => s.rows)),
|
|
92
|
+
leads: sum(sites.map((s) => s.leads)),
|
|
93
|
+
goldInSites: goldKnown ? sum(r.map((x) => x.goldInSites.length)) : null,
|
|
94
|
+
findings: report.audit ? null : findings,
|
|
95
|
+
noneSites: report.audit ? null : sites.filter((s) => s.none === true).length,
|
|
96
|
+
goldStated: judged ? sum(r.map((x) => x.goldStated.length)) : null,
|
|
97
|
+
matchedFindings: matched,
|
|
98
|
+
precision: matched !== null && findings > 0 ? matched / findings : null,
|
|
99
|
+
gateFailures: sites.filter((s) => s.gateSatisfied === false).length,
|
|
100
|
+
secondRounds: sites.filter((s) => (s.gapsByRound?.length ?? 0) > 1).length,
|
|
101
|
+
};
|
|
102
|
+
const summaries = sites.map((s) => s.summary).filter((x) => !!x);
|
|
103
|
+
if (summaries.length)
|
|
104
|
+
totals.siteReview.summary = {
|
|
105
|
+
sites: summaries.length,
|
|
106
|
+
concerns: sum(summaries.map((x) => x.concerns.length)),
|
|
107
|
+
uncovered: sum(summaries.map((x) => x.uncovered.length)),
|
|
108
|
+
fallbacks: summaries.filter((x) => x.fallback).length,
|
|
109
|
+
costUsd: summaries.every((x) => x.costUsd !== null) ? sum(summaries.map((x) => x.costUsd)) : null,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return totals;
|
|
113
|
+
}
|
|
114
|
+
/** `running` / `done` / `failed` / `stale` — the unit-survey rule, shared. */
|
|
115
|
+
export function phaseReplayStatus(r, nowMs) {
|
|
116
|
+
return unitSurveyStatus(r, nowMs);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Summarise one raw report file for the index, or `null` when it is not a
|
|
120
|
+
* phase-replay report (a stray JSON file, a different version). Tolerant of a
|
|
121
|
+
* report still being written — `cases` may be short of `planned`.
|
|
122
|
+
*/
|
|
123
|
+
export function summarisePhaseReplay(id, raw, mtime) {
|
|
124
|
+
const r = raw;
|
|
125
|
+
if (!r || typeof r !== "object" || r.version !== PHASE_REPLAY_VERSION)
|
|
126
|
+
return null;
|
|
127
|
+
if (r.kind !== "falsify" && r.kind !== "site-review")
|
|
128
|
+
return null;
|
|
129
|
+
if (!r.config || !Array.isArray(r.cases))
|
|
130
|
+
return null;
|
|
131
|
+
return {
|
|
132
|
+
id,
|
|
133
|
+
report: `/data/${PHASE_REPLAY_DIR}/${id}.json`,
|
|
134
|
+
kind: r.kind,
|
|
135
|
+
label: typeof r.label === "string" ? r.label : id,
|
|
136
|
+
audit: r.audit === true,
|
|
137
|
+
generatedAt: typeof r.startedAt === "string" ? r.startedAt : mtime,
|
|
138
|
+
finishedAt: typeof r.finishedAt === "string" ? r.finishedAt : null,
|
|
139
|
+
status: r.status === "running" || r.status === "failed" ? r.status : "done",
|
|
140
|
+
heartbeat: typeof r.heartbeat === "string" ? r.heartbeat : null,
|
|
141
|
+
error: typeof r.error === "string" ? r.error : null,
|
|
142
|
+
planned: Array.isArray(r.planned) ? r.planned.length : r.cases.length,
|
|
143
|
+
config: r.config,
|
|
144
|
+
totals: phaseReplayTotals({ kind: r.kind, audit: r.audit === true, cases: r.cases }),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=phase-replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase-replay.js","sourceRoot":"","sources":["../src/phase-replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { phaseReplayTotals, summarisePhaseReplay } from "./phase-replay.js";
|
|
3
|
+
const baseCase = (over) => ({
|
|
4
|
+
instanceId: "prreview__x",
|
|
5
|
+
arm: "arm1",
|
|
6
|
+
fixture: "/f",
|
|
7
|
+
repeat: 1,
|
|
8
|
+
ok: true,
|
|
9
|
+
error: null,
|
|
10
|
+
wallMs: 1000,
|
|
11
|
+
costUsd: 0.5,
|
|
12
|
+
turns: 3,
|
|
13
|
+
outputTokens: 100,
|
|
14
|
+
iterations: 1,
|
|
15
|
+
rows: 10,
|
|
16
|
+
gold: [{ severity: "high", summary: "g" }],
|
|
17
|
+
goldRows: ["security-001"],
|
|
18
|
+
...over,
|
|
19
|
+
});
|
|
20
|
+
const report = (over) => ({
|
|
21
|
+
version: 1,
|
|
22
|
+
kind: "falsify",
|
|
23
|
+
label: "l",
|
|
24
|
+
audit: false,
|
|
25
|
+
startedAt: "2026-09-27T12:00:00.000Z",
|
|
26
|
+
finishedAt: null,
|
|
27
|
+
status: "running",
|
|
28
|
+
heartbeat: "2026-09-27T12:00:01.000Z",
|
|
29
|
+
error: null,
|
|
30
|
+
config: { model: "m", thinking: null, prompt: "p", promptSha256: "s", promptOverride: false, skill: null, skillOverride: false, rounds: 2, judgeModel: null },
|
|
31
|
+
planned: [],
|
|
32
|
+
cases: [],
|
|
33
|
+
...over,
|
|
34
|
+
});
|
|
35
|
+
describe("phaseReplayTotals", () => {
|
|
36
|
+
it("an audit has no cost and no wall clock — n/a, not a free instant run", () => {
|
|
37
|
+
const t = phaseReplayTotals(report({ audit: true, cases: [baseCase({ wallMs: null, costUsd: null })] }));
|
|
38
|
+
expect(t.costUsd).toBeNull();
|
|
39
|
+
expect(t.wallMedianMs).toBeNull();
|
|
40
|
+
});
|
|
41
|
+
it("gold counts over an unjudged gold map are unknown (null), never zero", () => {
|
|
42
|
+
const t = phaseReplayTotals(report({
|
|
43
|
+
kind: "falsify",
|
|
44
|
+
cases: [baseCase({ goldRows: null, falsify: { owed: 1, selected: 1, deferred: 0, verdicts: { none: 1 }, gateSatisfied: true, gaps: 0, goldSelected: [], goldRefuted: [], goldReproduced: [] } })],
|
|
45
|
+
}));
|
|
46
|
+
expect(t.falsify).toMatchObject({ goldSelected: null, goldRefuted: null, goldReproduced: null });
|
|
47
|
+
});
|
|
48
|
+
it("falsify counts gold refuted and treats `none` as unanswered", () => {
|
|
49
|
+
const t = phaseReplayTotals(report({
|
|
50
|
+
kind: "falsify",
|
|
51
|
+
cases: [baseCase({ falsify: { owed: 5, selected: 3, deferred: 2, verdicts: { refuted: 1, none: 1, unprobed: 1 }, gateSatisfied: false, gaps: 1, goldSelected: ["security-001"], goldRefuted: ["security-001"], goldReproduced: [] } })],
|
|
52
|
+
}));
|
|
53
|
+
expect(t.falsify).toMatchObject({ owed: 5, selected: 3, answered: 2, goldRefuted: 1, gateFailures: 1 });
|
|
54
|
+
});
|
|
55
|
+
it("falsify sites: counts sessions and claims, and a rows-mode report has neither (null, not zero)", () => {
|
|
56
|
+
const f = { owed: 2, selected: 2, deferred: 0, verdicts: { corroborated: 2 }, gateSatisfied: true, gaps: 0, goldSelected: [], goldRefuted: [], goldReproduced: [] };
|
|
57
|
+
const site = (id, claims) => ({
|
|
58
|
+
id, origin: "support", path: "a.ts", startLine: 1, endLine: 2, rows: 1, gold: [], ok: true, error: null,
|
|
59
|
+
wallMs: 1, costUsd: 0, turns: 1, outputTokens: 1, gateSatisfied: true, verdicts: {}, claims, session: null,
|
|
60
|
+
});
|
|
61
|
+
const sites = phaseReplayTotals(report({ kind: "falsify", cases: [baseCase({ falsify: { ...f, sites: [site("site-001", 2), site("site-002", null)] } })] }));
|
|
62
|
+
expect(sites.falsify).toMatchObject({ sites: 2, claims: 2 });
|
|
63
|
+
const rows = phaseReplayTotals(report({ kind: "falsify", cases: [baseCase({ falsify: f })] }));
|
|
64
|
+
expect(rows.falsify).toMatchObject({ sites: null, claims: null });
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe("phaseReplayTotals — site-review", () => {
|
|
68
|
+
const site = (over = {}) => ({
|
|
69
|
+
id: "site-001", path: "a.ts", startLine: 1, endLine: 20, rows: 10, voters: 3, leads: 4, gold: [], ok: true, error: null,
|
|
70
|
+
wallMs: 1, costUsd: 0.1, turns: 5, outputTokens: 10, gateSatisfied: true, findings: 1, none: false, session: null, ...over,
|
|
71
|
+
});
|
|
72
|
+
const outcome = (over = {}) => ({
|
|
73
|
+
sitesFormed: 12, skippedRows: 3, sites: [site(), site({ id: "site-002", rows: 5, leads: 0, findings: 0, none: true, gateSatisfied: false, gapsByRound: [{ "too-many": 1 }, { "too-many": 1 }] })],
|
|
74
|
+
goldInSites: ["security-001"],
|
|
75
|
+
findings: [{ site: "site-001", path: "a.ts", line: 3, title: "t", strength: "read", leads: [], gold: 0 }, { site: "site-001", path: "a.ts", line: 9, title: "u", strength: "read", leads: [], gold: null }],
|
|
76
|
+
goldStated: [0], matchedFindings: 1, ...over,
|
|
77
|
+
});
|
|
78
|
+
it("counts sites, findings, gold stated and pooled precision", () => {
|
|
79
|
+
const t = phaseReplayTotals(report({ kind: "site-review", cases: [baseCase({ siteReview: outcome() }), baseCase({ siteReview: outcome({ goldStated: [], matchedFindings: 0 }) })] }));
|
|
80
|
+
expect(t.siteReview).toMatchObject({ sites: 4, rowsInSites: 30, leads: 8, goldInSites: 2, findings: 4, noneSites: 2, goldStated: 1, matchedFindings: 1, precision: 0.25, gateFailures: 2, secondRounds: 2 });
|
|
81
|
+
});
|
|
82
|
+
it("an audit has no findings and no judged numbers (n/a, not zero); an unjudged case nulls gold stated", () => {
|
|
83
|
+
const audit = phaseReplayTotals(report({ kind: "site-review", audit: true, cases: [baseCase({ siteReview: outcome({ findings: [], goldStated: null, matchedFindings: null }) })] }));
|
|
84
|
+
expect(audit.siteReview).toMatchObject({ findings: null, noneSites: null, goldStated: null, precision: null, goldInSites: 1 });
|
|
85
|
+
const unjudged = phaseReplayTotals(report({ kind: "site-review", cases: [baseCase({ siteReview: outcome() }), baseCase({ siteReview: outcome({ goldStated: null, matchedFindings: null }) })] }));
|
|
86
|
+
expect(unjudged.siteReview).toMatchObject({ goldStated: null, matchedFindings: null, precision: null, findings: 4 });
|
|
87
|
+
const noMap = phaseReplayTotals(report({ kind: "site-review", cases: [baseCase({ goldRows: null, siteReview: outcome() })] }));
|
|
88
|
+
expect(noMap.siteReview?.goldInSites).toBeNull();
|
|
89
|
+
});
|
|
90
|
+
it("is listed by the index", () => {
|
|
91
|
+
expect(summarisePhaseReplay("id", report({ kind: "site-review", cases: [baseCase({ siteReview: outcome() })] }), "t")).toMatchObject({ kind: "site-review", totals: { siteReview: { sites: 2 } } });
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe("summarisePhaseReplay", () => {
|
|
95
|
+
it("lists a phase-replay report and refuses anything else", () => {
|
|
96
|
+
const e = summarisePhaseReplay("id", report({ planned: [{ instanceId: "a", arm: "arm1", fixture: "/f", repeat: 1 }] }), "2026-01-01T00:00:00Z");
|
|
97
|
+
expect(e).toMatchObject({ id: "id", kind: "falsify", planned: 1, report: "/data/phase-replay/id.json", status: "running" });
|
|
98
|
+
expect(summarisePhaseReplay("x", { version: 2 }, "t")).toBeNull();
|
|
99
|
+
// The removed `adjudicate` replays are no longer listed.
|
|
100
|
+
expect(summarisePhaseReplay("x", { ...report({}), kind: "adjudicate" }, "t")).toBeNull();
|
|
101
|
+
expect(summarisePhaseReplay("x", { stage: "replay" }, "t")).toBeNull();
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=phase-replay.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phase-replay.test.js","sourceRoot":"","sources":["../src/phase-replay.test.ts"],"names":[],"mappings":"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"}
|