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
@@ -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":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7I,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAkB,MAAM,wBAAwB,CAAC;AAI7E,+EAA+E;AAE/E,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;AAChH,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAE7G,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAiBD,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5F,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACpF,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AACtH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAe,EAAE,IAAkB;IACjE,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC;aACxB,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aACjC,MAAM,CAAC,CAAC,CAAC,EAAgB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,iGAAiG,CAAC,CAAC;QACzI,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAAW;IACrC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gBAAgB,EAAE,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAC9E,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;IAC1C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC;AACjF,CAAC;AAYD,MAAM,UAAU,aAAa,CAAC,IAAwB;IACpD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAe,CAAC;IAClE,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAmB;IAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;KAC/F,CAAC,CAAC,CAAC;AACN,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,aAAa,CAAC,IAA0B;IACtD,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAoC,CAAC;IAC/D,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9D,OAAO;QACL,KAAK;QACL,IAAI;QACJ,QAAQ,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC;QACxB,OAAO,EAAE,EAAE,CAAC,WAAW,IAAI,MAAM;QACjC,UAAU,EAAE,EAAE,CAAC,QAAQ,IAAI,MAAM;QACjC,OAAO,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,GAA4B;IAC1E,MAAM,IAAI,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,GAAY,CAAC,CAAC;IACtE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACtD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAMhC;IACC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC1D,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC;SAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;SACnC,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;SAC5D,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1F,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;IAC3C,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAsB,CAAC;IAEzF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAgB,CAAC,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CACzF,CAAC;IACF,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,EAAE,UAAU,EAAE,GAAG,aAAa,CAClC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAE,CAAC,aAAa,CAAC,EAC/B,IAAI,CAAC,MAAM,CACZ,CAAC;IACF,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACtF,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,yDAAyD;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAsB,CAAC;AACrE,CAAC;AAkBD,IAAI,KAAK,GAAsB,IAAI,CAAC;AAEpC,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAYnC;IACC,KAAK,KAAM,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAAoC,CAAC,GAAG,CAAC;IAC/E,4EAA4E;IAC5E,0EAA0E;IAC1E,4EAA4E;IAC5E,8EAA8E;IAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,6EAA6E;IAC7E,6EAA6E;IAC7E,oCAAoC;IACpC,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC;QAC3B,OAAO,EAAE,IAAI,CAAC,WAAW;QACzB,WAAW,EAAE,eAAe;QAC5B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,aAAa,EAAE,IAAI,CAAC,MAAM;QAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC;YACpB,OAAO,EAAE,CAAC,MAAe,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAA4C,CAAC;YACrF,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChE,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,MAAM;YACf,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC,CAAC;QACH,OAAO;YACL,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK;YAClB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;YACtB,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;YAC5B,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC;YAC3B,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,iBAAiB,IAAI,CAAC;YACtC,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;SAC3C,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IACzI,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAUC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,wEAAwE;IACxE,2EAA2E;IAC3E,0EAA0E;IAC1E,uEAAuE;IACvE,qEAAqE;IACrE,IAAI,KAAiC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAa,CAAC,GAAG,EAAE,EAAE;QAC/C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3D,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAiB,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IACxG,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,OAAO,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7C,UAAU,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACnF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACvH,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YACzB,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC;YACjB,KAAK,CAAC,KAAK,GAAG,8BAA8B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,eAAe,UAAU,GAAG,CAAC;YAC5G,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACxB,MAAM;QACR,CAAC;QACD,MAAM,CAAC,GAAG,KAAK,CAAC;QAChB,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC;QAC3B,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC;QACvB,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,CAAC;QACrC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACV,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC;YACjB,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QACxB,CAAC;QACD,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC,EAAE;YAAE,MAAM;IAChC,CAAC;IACD,YAAY,CAAC,KAAK,CAAC,CAAC;IACpB,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;AAC1F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB,EAAE,GAAW;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACpC,aAAa,CAAC,GAAG,IAAI,MAAM,EAAE,GAAG,CAAC,CAAC;YAClC,UAAU,CAAC,GAAG,IAAI,MAAM,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,8DAA8D;QAChE,CAAC;IACH,CAAC,CAAC;IACF,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;IACZ,OAAO,GAAG,EAAE;QACV,aAAa,CAAC,CAAC,CAAC,CAAC;QACjB,KAAK,EAAE,CAAC;IACV,CAAC,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,OAAO,iBAAiB;IAIjB,MAAM;IAHR,IAAI,CAAS;IACd,KAAK,CAAiB;IAC9B,YACW,MAAyB,EAClC,MAAc;sBADL,MAAM;QAGf,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,OAAO,CAAC,CAAC;QAC1G,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACvB,CAAC;IACD,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;QACnF,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAChE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,CAAC,KAAc;QACnB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClD,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,IAAa;IAC1D,IAAI,CAAC,IAAI;QAAE,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/D,CAAC"}
@@ -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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"}