lastlight-evals 0.16.0 → 0.18.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.
@@ -0,0 +1,512 @@
1
+ /**
2
+ * Multi-round re-review cases (issue #429) — the AI-free mechanism: the case
3
+ * contract, the snapshot a round is dispatched with, what the fake records
4
+ * across rounds, the run store the ledger rides in, and the late-discovery
5
+ * instrument. No model, no network; the one code-facts integration test runs
6
+ * the built `lastlight-facts` CLI over a two-commit temp repo ($0).
7
+ */
8
+ import { execFileSync } from "node:child_process";
9
+ import { mkdtempSync, mkdirSync, readFileSync, rmSync, utimesSync, writeFileSync } from "node:fs";
10
+ import { tmpdir } from "node:os";
11
+ import { join } from "node:path";
12
+ import { afterAll, describe, expect, it } from "vitest";
13
+ import { LINE_HASH_CHARS, lineHash } from "lastlight-code-facts";
14
+ import { reviewLedgerContext, coerceLedger, foldReviewLedger, resolveReviewGitHubClient } from "lastlight-core/evals";
15
+ import { startFakeGitHub } from "./fake-github.js";
16
+ import { buildPrState, caseHeadSha, PLACEHOLDER_HEAD_SHA, prContextPatch } from "./pr-context.js";
17
+ import { promptContext } from "./phase-replay-node.js";
18
+ import { readStoredRunContext, writeStoredRunContext } from "./phase-replay-context.js";
19
+ import { coverageSummary, deltaCounts, dispositionCounts, goldMatchedOf, ledgerCounts, planRounds, reviewStateOf, rollupRereview, summarizeRereview, } from "./rereview.js";
20
+ import { carryForward, createRoundStore, cutUnits, judgeComments, outdatedResolver, priorReviewFromUnits, readFreshJson, roundScratch, snapshotMtimes, UnitsOracle, } from "./rereview-node.js";
21
+ import { checkoutRound, injectRepoContext, mergeBaseOf, prFilesFromGit } from "./seed.js";
22
+ import { resolveFactsBin } from "./paths.js";
23
+ const tmp = [];
24
+ afterAll(() => {
25
+ for (const d of tmp)
26
+ rmSync(d, { recursive: true, force: true });
27
+ });
28
+ function tempDir(prefix) {
29
+ const d = mkdtempSync(join(tmpdir(), prefix));
30
+ tmp.push(d);
31
+ return d;
32
+ }
33
+ const GIT_ENV = { ...process.env, GIT_AUTHOR_NAME: "t", GIT_AUTHOR_EMAIL: "t@t", GIT_COMMITTER_NAME: "t", GIT_COMMITTER_EMAIL: "t@t" };
34
+ function git(cwd, args) {
35
+ return execFileSync("git", args, { cwd, env: GIT_ENV, stdio: ["ignore", "pipe", "pipe"] }).toString().trim();
36
+ }
37
+ /** A repo with one commit per entry of `commits` (path → content, cumulative). */
38
+ function repoWith(commits) {
39
+ const dir = tempDir("rereview-repo-");
40
+ git(dir, ["init", "-q", "-b", "main"]);
41
+ const shas = [];
42
+ for (const files of commits) {
43
+ for (const [p, c] of Object.entries(files)) {
44
+ mkdirSync(join(dir, p, ".."), { recursive: true });
45
+ writeFileSync(join(dir, p), c);
46
+ }
47
+ git(dir, ["add", "-A"]);
48
+ git(dir, ["commit", "-q", "-m", `c${shas.length}`]);
49
+ shas.push(git(dir, ["rev-parse", "HEAD"]));
50
+ }
51
+ return { dir, shas };
52
+ }
53
+ const A = "a".repeat(40);
54
+ const B = "b".repeat(40);
55
+ const C = "c".repeat(40);
56
+ const pr = { number: 7, title: "t", body: "", base_ref: "main", head_ref: "feat", base_commit: A, head_commit: C };
57
+ function sampleLedger(head = "h1") {
58
+ return foldReviewLedger({
59
+ prior: null,
60
+ head,
61
+ units: [{ key: "src/a.ts::f", contentSha: "x" }],
62
+ lines: { "src/a.ts": lineHash("const value = compute(input);") },
63
+ dispositions: [
64
+ { tier: "inline", reason: null, finding: { path: "src/a.ts", line: 2, existingCode: "const value = compute(input);", title: "Unchecked compute", importance: "must-fix" } },
65
+ ],
66
+ excerptPresent: () => true,
67
+ threads: null,
68
+ bot: "last-light",
69
+ });
70
+ }
71
+ // ── the case contract ───────────────────────────────────────────────────────
72
+ describe("planRounds", () => {
73
+ it("is null for a case that runs once — no rounds, or one round on the PR head", () => {
74
+ expect(planRounds({ instance_id: "x", pr })).toBeNull();
75
+ expect(planRounds({ instance_id: "x", pr, rounds: [{ head_commit: C }] })).toBeNull();
76
+ });
77
+ it("returns the ordered chain when the last round is the PR's head", () => {
78
+ expect(planRounds({ instance_id: "x", pr, rounds: [{ head_commit: B }, { head_commit: C }] })?.map((r) => r.head_commit)).toEqual([B, C]);
79
+ });
80
+ it("refuses a chain whose last round is not the scored head, a short SHA, or no PR", () => {
81
+ expect(() => planRounds({ instance_id: "x", pr, rounds: [{ head_commit: C }, { head_commit: B }] })).toThrow(/must equal pr.head_commit/);
82
+ expect(() => planRounds({ instance_id: "x", pr, rounds: [{ head_commit: "1d60d667" }, { head_commit: C }] })).toThrow(/40-hex/);
83
+ expect(() => planRounds({ instance_id: "x", rounds: [{ head_commit: B }, { head_commit: C }] })).toThrow(/needs `pr`/);
84
+ expect(() => planRounds({ instance_id: "x", pr, rounds: [{ head_commit: B }] })).toThrow(/must equal pr.head_commit/);
85
+ });
86
+ it("refuses seeded discussion held for a round the chain never reaches", () => {
87
+ const rounds = [{ head_commit: B }, { head_commit: C }];
88
+ expect(planRounds({ instance_id: "x", pr: { ...pr, reviews: [{ from_round: 2 }] }, rounds })).toHaveLength(2);
89
+ expect(() => planRounds({ instance_id: "x", pr: { ...pr, reviews: [{ from_round: 3 }] }, rounds })).toThrow(/reviews\[0\]\.from_round/);
90
+ expect(() => planRounds({ instance_id: "x", pr: { ...pr, issue_comments: [{ from_round: 0 }] }, rounds })).toThrow(/issue_comments/);
91
+ });
92
+ });
93
+ // ── the snapshot ────────────────────────────────────────────────────────────
94
+ describe("PR snapshot — head SHA and the re-review fields", () => {
95
+ const args = { repo: "acme/widget", prNumber: 7, title: "t", body: "b", branch: "feat" };
96
+ it("carries the PR's real head instead of the placeholder", () => {
97
+ expect(buildPrState({ ...args, headSha: C }).headSha).toBe(C);
98
+ expect(buildPrState({ ...args, headSha: C, seed: { head_sha: B } }).headSha).toBe(B);
99
+ expect(buildPrState(args).headSha).toBe(PLACEHOLDER_HEAD_SHA);
100
+ expect(caseHeadSha({ pr: { head_commit: C } })).toBe(C);
101
+ expect(caseHeadSha({ pr: { head_commit: "0".repeat(40) } })).toBe(PLACEHOLDER_HEAD_SHA);
102
+ expect(caseHeadSha({ pr: { head_commit: C }, pr_state: { head_sha: B } })).toBe(B);
103
+ });
104
+ it("defaults every re-review field to the value that cannot suppress a review", () => {
105
+ const s = buildPrState(args);
106
+ expect([s.botReviewAtHead, s.lastBotReview, s.pathsSinceLastBotReview, s.prDiffUnchangedSinceLastReview, s.reviewLedger]).toEqual([null, null, null, null, null]);
107
+ });
108
+ it("maps the seeded re-review fields onto core's camelCase snapshot", () => {
109
+ const ledger = sampleLedger();
110
+ const s = buildPrState({
111
+ ...args,
112
+ seed: {
113
+ last_bot_review: { state: "COMMENTED", sha: B, body: "earlier" },
114
+ bot_review_at_head: { state: "APPROVED", submitted_at: "2026-01-01T01:00:00Z" },
115
+ paths_since_last_bot_review: ["src/a.ts"],
116
+ pr_diff_unchanged_since_last_review: false,
117
+ review_ledger: JSON.parse(JSON.stringify(ledger)),
118
+ },
119
+ });
120
+ expect(s.lastBotReview).toEqual({ state: "COMMENTED", sha: B, body: "earlier" });
121
+ expect(s.botReviewAtHead).toEqual({ state: "APPROVED", submittedAt: "2026-01-01T01:00:00Z" });
122
+ expect(s.pathsSinceLastBotReview).toEqual(["src/a.ts"]);
123
+ expect(s.prDiffUnchangedSinceLastReview).toBe(false);
124
+ expect(s.reviewLedger).toEqual(coerceLedger(ledger));
125
+ // Through core's coercion: anything that is not a ledger reads as none.
126
+ expect(buildPrState({ ...args, seed: { review_ledger: { version: 99 } } }).reviewLedger).toBeNull();
127
+ });
128
+ it("projects the ledger for select + units only with analysis on, and the snapshot only when asked", async () => {
129
+ const seed = { review_ledger: sampleLedger() };
130
+ const off = await prContextPatch({ ...args, seed });
131
+ expect(off.prState).toBeUndefined();
132
+ expect(off.priorLedger ?? "").toBe("");
133
+ const on = await prContextPatch({ ...args, seed, review: { analysis: { enabled: true } }, snapshot: true, headSha: C });
134
+ // The two keys are derived by core's runner from the snapshot, at run time.
135
+ const derived = reviewLedgerContext(on.prState);
136
+ expect(derived.priorLedger).toContain("Unchecked compute");
137
+ expect(derived.priorReviewJson).toContain("src/a.ts::f");
138
+ expect(on.prState.headSha).toBe(C);
139
+ expect(on.prState.reviewLedger.findings[0].title).toBe("Unchecked compute");
140
+ });
141
+ });
142
+ // ── the fake across rounds ──────────────────────────────────────────────────
143
+ describe("fake GitHub — rounds", () => {
144
+ it("links inline comments to their review and commit, scopes grading to the round, and orders reviews in time", async () => {
145
+ const fake = await startFakeGitHub({ owner: "acme", repo: "widgets", pulls: [{ ...pr, head_commit: B }] });
146
+ try {
147
+ const post = (body) => fetch(`${fake.url}/repos/acme/widgets/pulls/7/reviews`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(body) });
148
+ await post({ event: "COMMENT", body: "r1", comments: [{ path: "src/a.ts", line: 4, start_line: 2, side: "RIGHT", body: "range" }] });
149
+ const r1 = fake.submittedReviews(7);
150
+ expect(r1).toHaveLength(1);
151
+ expect(r1[0].commitId).toBe(B);
152
+ expect(r1[0].comments[0]).toMatchObject({ path: "src/a.ts", line: 4, start_line: 2 });
153
+ const t1 = r1[0].submittedAt;
154
+ fake.setHead(7, C);
155
+ fake.advanceClock(60 * 60 * 1000);
156
+ fake.startRound();
157
+ expect(fake.submittedReviews(7)).toEqual([]);
158
+ await post({ event: "APPROVE", body: "r2" });
159
+ const r2 = fake.submittedReviews(7);
160
+ expect(r2).toHaveLength(1);
161
+ expect(r2[0].commitId).toBe(C);
162
+ expect(Date.parse(r2[0].submittedAt)).toBeGreaterThan(Date.parse(t1));
163
+ expect(fake.submittedReviews(7, { all: true })).toHaveLength(2);
164
+ expect(fake.submittedCount(7)).toBe(2);
165
+ const comments = (await (await fetch(`${fake.url}/repos/acme/widgets/pulls/7/comments`)).json());
166
+ expect(comments[0]).toMatchObject({ commit_id: B, original_commit_id: B });
167
+ expect(typeof comments[0].pull_request_review_id).toBe("number");
168
+ }
169
+ finally {
170
+ await fake.close();
171
+ }
172
+ });
173
+ it("holds seeded discussion until its from_round starts on a chained case, and serves it all otherwise", async () => {
174
+ const seeded = {
175
+ ...pr,
176
+ reviews: [
177
+ { user: "human", body: "early", state: "COMMENTED" },
178
+ { user: "human", body: "late", state: "CHANGES_REQUESTED", from_round: 2 },
179
+ ],
180
+ review_comments: [{ user: "human", path: "src/a.ts", line: 1, body: "late thread", from_round: 2 }],
181
+ issue_comments: [{ user: "human", body: "late note", from_round: 2 }],
182
+ };
183
+ const bodies = async (url, path) => (await (await fetch(`${url}${path}`)).json()).map((r) => r.body);
184
+ const chained = await startFakeGitHub({ owner: "acme", repo: "widgets", pulls: [seeded], chained: true });
185
+ try {
186
+ chained.startRound(1);
187
+ expect(await bodies(chained.url, "/repos/acme/widgets/pulls/7/reviews")).toEqual(["early"]);
188
+ expect(await bodies(chained.url, "/repos/acme/widgets/pulls/7/comments")).toEqual([]);
189
+ expect(await bodies(chained.url, "/repos/acme/widgets/issues/7/comments")).toEqual([]);
190
+ await fetch(`${chained.url}/repos/acme/widgets/pulls/7/reviews`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ event: "APPROVE", body: "bot r1" }) });
191
+ chained.advanceClock(60 * 60 * 1000);
192
+ chained.startRound(2);
193
+ // Released in time order: after round 1's own review, stamped with the clock.
194
+ const reviews = (await (await fetch(`${chained.url}/repos/acme/widgets/pulls/7/reviews`)).json());
195
+ expect(reviews.map((r) => r.body)).toEqual(["early", "bot r1", "late"]);
196
+ expect(Date.parse(reviews[2].submitted_at)).toBeGreaterThan(Date.parse(reviews[1].submitted_at));
197
+ expect(await bodies(chained.url, "/repos/acme/widgets/pulls/7/comments")).toEqual(["late thread"]);
198
+ expect(await bodies(chained.url, "/repos/acme/widgets/issues/7/comments")).toEqual(["late note"]);
199
+ }
200
+ finally {
201
+ await chained.close();
202
+ }
203
+ const single = await startFakeGitHub({ owner: "acme", repo: "widgets", pulls: [seeded] });
204
+ try {
205
+ expect(await bodies(single.url, "/repos/acme/widgets/pulls/7/reviews")).toEqual(["early", "late"]);
206
+ expect(await bodies(single.url, "/repos/acme/widgets/issues/7/comments")).toEqual(["late note"]);
207
+ }
208
+ finally {
209
+ await single.close();
210
+ }
211
+ });
212
+ it("computes isOutdated through the resolver, honours a seeded flag, and is never outdated by default", async () => {
213
+ const fake = await startFakeGitHub({
214
+ owner: "acme",
215
+ repo: "widgets",
216
+ pulls: [
217
+ {
218
+ ...pr,
219
+ review_comments: [
220
+ { user: "last-light[bot]", path: "src/a.ts", line: 2, body: "old", commit_id: B },
221
+ { user: "human", path: "src/b.ts", line: 1, body: "forced", outdated: true },
222
+ ],
223
+ },
224
+ ],
225
+ });
226
+ try {
227
+ const gh = resolveReviewGitHubClient({ githubApiBaseUrl: fake.url });
228
+ const outdated = async () => (await gh.getPullRequestDiscussion("acme", "widgets", 7)).threads.map((t) => t.isOutdated);
229
+ expect(await outdated()).toEqual([false, true]);
230
+ fake.setOutdatedResolver((a) => a.commitId === B && a.path === "src/a.ts");
231
+ expect(await outdated()).toEqual([true, true]);
232
+ }
233
+ finally {
234
+ await fake.close();
235
+ }
236
+ });
237
+ });
238
+ // ── the next round's dispatch ───────────────────────────────────────────────
239
+ describe("mergeBaseOf — a round's PR files when the base moved", () => {
240
+ it("diffs an earlier head from where it forked, not from the case's newer base", () => {
241
+ const { dir, shas } = repoWith([{ "a.ts": "base\n" }]);
242
+ const fork = shas[0];
243
+ git(dir, ["checkout", "-q", "-b", "feat"]);
244
+ writeFileSync(join(dir, "feat.ts"), "feature\n");
245
+ git(dir, ["add", "-A"]);
246
+ git(dir, ["commit", "-q", "-m", "feat"]);
247
+ const head1 = git(dir, ["rev-parse", "HEAD"]);
248
+ git(dir, ["checkout", "-q", "main"]);
249
+ writeFileSync(join(dir, "main-later.ts"), "later\n");
250
+ git(dir, ["add", "-A"]);
251
+ git(dir, ["commit", "-q", "-m", "main moves"]);
252
+ const newerBase = git(dir, ["rev-parse", "HEAD"]);
253
+ expect(mergeBaseOf(dir, newerBase, head1)).toBe(fork);
254
+ expect(prFilesFromGit(dir, mergeBaseOf(dir, newerBase, head1), head1).map((f) => f.filename)).toEqual(["feat.ts"]);
255
+ // The old two-dot range lists main's later file as a deletion in the PR.
256
+ expect(prFilesFromGit(dir, newerBase, head1).map((f) => f.filename).sort()).toEqual(["feat.ts", "main-later.ts"]);
257
+ // An ancestor base is its own merge base — every single-round case is unchanged.
258
+ expect(mergeBaseOf(dir, fork, head1)).toBe(fork);
259
+ });
260
+ });
261
+ describe("carryForward / outdatedResolver", () => {
262
+ const { dir, shas } = repoWith([
263
+ { "src/a.ts": "export function f(input: number) {\n const value = compute(input);\n return value;\n}\n" },
264
+ { "src/a.ts": "export function f(input: number) {\n const value = compute(input);\n return value + 1;\n}\n" },
265
+ { "src/b.ts": "export const g = 2;\n" },
266
+ ]);
267
+ const [base, h1, h2] = shas;
268
+ it("builds lastBotReview, the compare paths, the diff gate and the ledger from what round k left", () => {
269
+ const ledger = sampleLedger(h1);
270
+ const next = carryForward({
271
+ repoDir: dir,
272
+ baseCommit: base,
273
+ prevHead: h1,
274
+ nextHead: h2,
275
+ reviews: [{ event: "REQUEST_CHANGES", body: "fix it", comments: [], commitId: h1, submittedAt: "2026-01-01T00:00:00Z" }],
276
+ prev: { head_sha: h1 },
277
+ scratch: { reviewLedger: ledger },
278
+ });
279
+ expect(next.head_sha).toBe(h2);
280
+ expect(next.last_bot_review).toEqual({ state: "CHANGES_REQUESTED", sha: h1, body: "fix it" });
281
+ expect(next.bot_review_at_head).toBeUndefined();
282
+ expect(next.paths_since_last_bot_review).toEqual(["src/b.ts"]);
283
+ expect(next.pr_diff_unchanged_since_last_review).toBe(false);
284
+ expect(next.review_ledger).toEqual(coerceLedger(ledger));
285
+ });
286
+ it("carries the dispatched ledger and last review when the round posted nothing (core's fallback)", () => {
287
+ const ledger = sampleLedger(h1);
288
+ const next = carryForward({
289
+ repoDir: dir,
290
+ baseCommit: base,
291
+ prevHead: h1,
292
+ nextHead: h2,
293
+ reviews: [],
294
+ prev: { head_sha: h1, last_bot_review: { state: "COMMENTED", sha: base }, review_ledger: ledger },
295
+ scratch: {},
296
+ });
297
+ expect(next.last_bot_review?.sha).toBe(base);
298
+ expect(next.review_ledger).toEqual(coerceLedger(ledger));
299
+ });
300
+ it("marks a thread outdated when its anchored line is gone at the current head", () => {
301
+ let head = h1;
302
+ const isOutdated = outdatedResolver(dir, () => head);
303
+ // `return value;` (line 3 at base) is rewritten at h1.
304
+ expect(isOutdated({ path: "src/a.ts", line: 3, commitId: base })).toBe(true);
305
+ expect(isOutdated({ path: "src/a.ts", line: 2, commitId: base })).toBe(false);
306
+ expect(isOutdated({ path: "src/a.ts", line: 3, commitId: h1 })).toBe(false);
307
+ head = h2;
308
+ expect(isOutdated({ path: "src/a.ts", line: 3, commitId: h1 })).toBe(false);
309
+ expect(isOutdated({ path: "src/a.ts", line: 3 })).toBe(false);
310
+ });
311
+ });
312
+ describe("the run store a chained case dispatches through", () => {
313
+ it("keeps each round's scratch apart, as post-review's mergeScratch writes it", async () => {
314
+ const store = createRoundStore();
315
+ await store.runs.mergeScratch("t:round-1", { reviewLedger: { a: 1 } });
316
+ await store.runs.mergeScratch("t:round-1", { reviewCoverage: { b: 2 } });
317
+ expect(await roundScratch(store, "t:round-1")).toEqual({ reviewLedger: { a: 1 }, reviewCoverage: { b: 2 } });
318
+ expect(await roundScratch(store, "t:round-2")).toEqual({});
319
+ // A fresh workflow id runs every phase (no dedup hit across rounds).
320
+ expect(await store.executions.shouldRunPhase("pr-review:units", "acme/widgets#7", "t:round-2")).toBe("run");
321
+ });
322
+ });
323
+ describe("artifact freshness in a reused workspace", () => {
324
+ it("reads a file only when the round rewrote it", () => {
325
+ const dir = tempDir("rereview-fresh-");
326
+ writeFileSync(join(dir, "units.json"), '{"units":[1]}');
327
+ utimesSync(join(dir, "units.json"), new Date(1_000_000), new Date(1_000_000));
328
+ const before = snapshotMtimes(dir, ["units.json", "disposition.json"]);
329
+ expect(readFreshJson(dir, "units.json", before)).toBeUndefined();
330
+ expect(readFreshJson(dir, "disposition.json", before)).toBeUndefined();
331
+ writeFileSync(join(dir, "units.json"), '{"units":[2]}');
332
+ writeFileSync(join(dir, "disposition.json"), '{"findings":[]}');
333
+ expect(readFreshJson(dir, "units.json", before)).toEqual({ units: [2] });
334
+ expect(readFreshJson(dir, "disposition.json", before)).toEqual({ findings: [] });
335
+ });
336
+ });
337
+ describe("checkoutRound + re-injected repo context", () => {
338
+ function withOrigin(commits) {
339
+ const r = repoWith(commits);
340
+ const origin = tempDir("rereview-origin-");
341
+ git(origin, ["init", "--bare", "-q"]);
342
+ git(r.dir, ["remote", "add", "origin", `file://${origin}`]);
343
+ git(r.dir, ["checkout", "-q", "-B", "feat", r.shas[0]]);
344
+ return { ...r, origin };
345
+ }
346
+ const count = (text) => text.split("lastlight-evals: injected repo context").length - 1;
347
+ it("moves the head (and origin's branch), keeps untracked review state, and injects exactly one block", () => {
348
+ const { dir, shas, origin } = withOrigin([{ "AGENTS.md": "# repo\n", "a.ts": "1\n" }, { "a.ts": "2\n" }]);
349
+ mkdirSync(join(dir, ".lastlight", "pr-review"), { recursive: true });
350
+ writeFileSync(join(dir, ".lastlight", "pr-review", "units.json"), "{}");
351
+ injectRepoContext(dir, "be careful");
352
+ checkoutRound(dir, "feat", shas[1]);
353
+ expect(git(dir, ["rev-parse", "HEAD"])).toBe(shas[1]);
354
+ expect(git(origin, ["rev-parse", "refs/heads/feat"])).toBe(shas[1]);
355
+ expect(readFileSync(join(dir, ".lastlight", "pr-review", "units.json"), "utf8")).toBe("{}");
356
+ expect(count(readFileSync(join(dir, "AGENTS.md"), "utf8"))).toBe(0);
357
+ injectRepoContext(dir, "be careful");
358
+ expect(count(readFileSync(join(dir, "AGENTS.md"), "utf8"))).toBe(1);
359
+ });
360
+ it("does not stack blocks in a harness-created (untracked) AGENTS.md", () => {
361
+ const { dir, shas } = withOrigin([{ "a.ts": "1\n" }, { "a.ts": "2\n" }]);
362
+ injectRepoContext(dir, "be careful");
363
+ checkoutRound(dir, "feat", shas[1]);
364
+ injectRepoContext(dir, "be careful");
365
+ const text = readFileSync(join(dir, "AGENTS.md"), "utf8");
366
+ expect(count(text)).toBe(1);
367
+ expect(text).toContain("be careful");
368
+ });
369
+ });
370
+ // ── the instrument ──────────────────────────────────────────────────────────
371
+ describe("late discovery — the convergence gate's own test, per posted comment", () => {
372
+ const unit = (over) => ({ id: "u1", kind: "symbol", file: "src/a.ts", symbol: "f", lines: [1, 4], key: "src/a.ts::f", contentSha: "x", ...over });
373
+ const oldLines = ["export function f(input: number) {", " const value = compute(input);", " return value;", "}"];
374
+ it("projects a head's units into the prior review the next round is judged against", () => {
375
+ const prior = priorReviewFromUnits([unit({ lineHashes: lineHash(oldLines[1]) + lineHash(oldLines[2]) }), unit({ id: "u1b", splitOf: "u1", lineHashes: lineHash(oldLines[2]) })], "h1");
376
+ expect(prior.units).toEqual([{ key: "src/a.ts::f", contentSha: "x" }]);
377
+ expect(prior.files["src/a.ts"]).toHaveLength(2 * LINE_HASH_CHARS);
378
+ });
379
+ it("is `unchanged` only when every anchored line was already there", () => {
380
+ const prior = priorReviewFromUnits([unit({ lineHashes: oldLines.map(lineHash).join("") })], "h1");
381
+ const head = [...oldLines.slice(0, 2), " if (value < 0) throw new Error('negative');", ...oldLines.slice(2)].join("\n");
382
+ const v = judgeComments({
383
+ comments: [{ path: "src/a.ts", line: 2 }, { path: "src/a.ts", line: 3 }, { path: "src/a.ts", start_line: 2, line: 3 }, { path: "src/a.ts" }],
384
+ prior,
385
+ units: [unit({ lines: [1, 5], delta: "changed" })],
386
+ fileText: () => head,
387
+ });
388
+ expect(v.map((x) => x.verdict)).toEqual(["unchanged", "new", "new", null]);
389
+ expect(v[0].unit).toEqual({ key: "src/a.ts::f", delta: "changed" });
390
+ // A first review has nothing to be late against.
391
+ expect(judgeComments({ comments: [{ path: "src/a.ts", line: 2 }], prior: null, units: [], fileText: () => head })[0].verdict).toBeNull();
392
+ });
393
+ });
394
+ describe("round counts and roll-ups", () => {
395
+ const round = (over) => ({
396
+ round: 1,
397
+ headSha: A,
398
+ workflowSucceeded: true,
399
+ inlinePosted: 0,
400
+ costUsd: 0.5,
401
+ inputTokens: 0,
402
+ cachedTokens: 0,
403
+ outputTokens: 0,
404
+ durationMs: 0,
405
+ ...over,
406
+ });
407
+ it("counts dispositions, deltas, ledger statuses and coverage", () => {
408
+ expect(dispositionCounts([
409
+ { tier: "inline", reason: null, finding: { lateDiscovery: true } },
410
+ { tier: "internal", reason: "converged" },
411
+ { tier: "internal", reason: "already-raised" },
412
+ { tier: "body", reason: "cap" },
413
+ ])).toEqual({ tiers: { inline: 1, internal: 2, body: 1 }, converged: 1, alreadyRaised: 1, lateLabelled: 1 });
414
+ expect(deltaCounts([{ delta: "new" }, { delta: "unchanged" }, { delta: "unchanged" }, {}])).toEqual({ new: 1, unchanged: 2 });
415
+ expect(deltaCounts([{}])).toBeUndefined();
416
+ expect(ledgerCounts({ findings: [{ status: "open" }, { status: "withheld" }, { status: "open" }] })).toEqual({ open: 2, withheld: 1 });
417
+ expect(coverageSummary({ version: 1, rereview: true, inScope: { units: 4, surveyedWeighted: 80, investigatedWeighted: 40.5 }, carried: { units: 3 }, notInvestigated: ["a", "b"] })).toEqual({
418
+ rereview: true,
419
+ units: 4,
420
+ surveyedWeighted: 80,
421
+ investigatedWeighted: 40.5,
422
+ carriedUnits: 3,
423
+ notInvestigated: 2,
424
+ });
425
+ expect(coverageSummary({ version: 2 })).toBeUndefined();
426
+ expect(goldMatchedOf({ gold: [{ matchedFinding: 0 }, { matchedFinding: null }, { matchedFinding: 3 }] })).toEqual([0, 2]);
427
+ expect(goldMatchedOf(undefined)).toBeNull();
428
+ expect(reviewStateOf("APPROVE")).toBe("APPROVED");
429
+ });
430
+ it("sums late discoveries over rounds ≥ 2 and credits each gold once across rounds", () => {
431
+ const rr = rollupRereview([
432
+ round({ round: 1, inlinePosted: 4, goldMatched: [0], converged: 0 }),
433
+ round({ round: 2, inlinePosted: 3, lateDiscovery: 2, lateDiscoveryOf: 3, converged: 4, alreadyRaised: 1, goldMatched: [0, 2] }),
434
+ round({ round: 3, inlinePosted: 1, lateDiscovery: 0, lateDiscoveryOf: 1, converged: 1, alreadyRaised: 0 }),
435
+ ], 4);
436
+ expect(rr).toMatchObject({ lateDiscovery: 2, lateDiscoveryOf: 4, converged: 5, alreadyRaised: 1, laterInlinePosted: 4, cumulativeMatched: 2, gold: 4, cumulativeRecall: 0.5, costUsd: 1.5 });
437
+ });
438
+ it("leaves unmeasured totals absent rather than zero", () => {
439
+ const rr = rollupRereview([round({ round: 1 }), round({ round: 2, inlinePosted: 2 })], undefined);
440
+ expect(rr.lateDiscovery).toBeUndefined();
441
+ expect(rr.converged).toBeUndefined();
442
+ expect(rr.cumulativeMatched).toBeUndefined();
443
+ });
444
+ it("totals an arm's chained cases for the dashboard, skipping single-round ones", () => {
445
+ const res = (model, rereview) => ({
446
+ instance_id: "x",
447
+ model,
448
+ workflowSucceeded: true,
449
+ inputTokens: 0,
450
+ cachedTokens: 0,
451
+ outputTokens: 0,
452
+ costUsd: 0,
453
+ durationMs: 0,
454
+ phases: [],
455
+ ...(rereview ? { rereview } : {}),
456
+ });
457
+ const rr = rollupRereview([round({ round: 1, goldMatched: [1] }), round({ round: 2, lateDiscovery: 1, lateDiscoveryOf: 2, converged: 0, goldMatched: [] })], 3);
458
+ const out = summarizeRereview([res("arm-a", rr), res("arm-a", rr), res("arm-b")]);
459
+ expect(out).toHaveLength(1);
460
+ expect(out[0]).toMatchObject({ model: "arm-a", cases: 2, rounds: 4, lateDiscovery: 2, lateDiscoveryOf: 4, converged: 0, cumulativeMatched: 2, gold: 6, costUsd: 2 });
461
+ });
462
+ });
463
+ // ── micro-select's stored context ───────────────────────────────────────────
464
+ describe("phase-replay stored run context", () => {
465
+ it("round-trips the replayable keys beside the artifacts and feeds promptContext", () => {
466
+ const trial = tempDir("rereview-trial-");
467
+ writeStoredRunContext(trial, { priorDiscussion: "earlier talk", priorLedger: "- `a.ts:2` [must-fix] X", headSha: C, owner: "acme", empty: "" });
468
+ const stored = readStoredRunContext(join(trial, "pr-review"));
469
+ expect(stored).toEqual({ priorDiscussion: "earlier talk", priorLedger: "- `a.ts:2` [must-fix] X", headSha: C });
470
+ const ctx = promptContext({ instance_id: "x", repo: "acme/widgets", pr: { ...pr, head_commit: B } }, stored);
471
+ expect(ctx).toMatchObject({ priorDiscussion: "earlier talk", priorLedger: "- `a.ts:2` [must-fix] X", headSha: C });
472
+ // A run recorded before the file existed renders exactly as before.
473
+ expect(readStoredRunContext(join(tempDir("rereview-none-"), "pr-review"))).toEqual({});
474
+ expect(promptContext({ instance_id: "x", repo: "acme/widgets", pr })).not.toHaveProperty("priorLedger");
475
+ });
476
+ });
477
+ // ── the oracle, end to end over the real CLI ($0) ──────────────────────────
478
+ const factsBin = resolveFactsBin();
479
+ describe.skipIf(!factsBin)("units oracle — code-facts over two heads", () => {
480
+ it("cuts units at each head, deltas the second against the first, and flags a comment on old lines as late", () => {
481
+ const { dir, shas } = repoWith([
482
+ { "package.json": '{"name":"t","version":"1.0.0"}\n', "src/base.ts": "export const base = 1;\n" },
483
+ {
484
+ "src/a.ts": "export function alpha(input: number): number {\n const doubled = input * 2;\n const shifted = doubled + 10;\n return shifted;\n}\n",
485
+ },
486
+ {
487
+ "src/b.ts": "export function beta(name: string): string {\n const greeting = `hello ${name}`;\n return greeting.toUpperCase();\n}\n",
488
+ },
489
+ ]);
490
+ const heads = [shas[1], shas[2]];
491
+ const oracle = new UnitsOracle({ repoDir: dir, base: shas[0], factsBin: factsBin });
492
+ const r1 = oracle.at(heads, 0);
493
+ expect(r1.units.some((u) => u.key === "src/a.ts::alpha")).toBe(true);
494
+ expect(r1.units.every((u) => u.delta === undefined)).toBe(true);
495
+ const r2 = oracle.at(heads, 1);
496
+ const byKey = new Map(r2.units.map((u) => [u.key, u]));
497
+ expect(byKey.get("src/a.ts::alpha")?.delta).toBe("unchanged");
498
+ expect(byKey.get("src/b.ts::beta")?.delta).toBe("new");
499
+ const verdicts = judgeComments({
500
+ comments: [{ path: "src/a.ts", line: 3 }, { path: "src/b.ts", line: 2 }],
501
+ prior: oracle.priorFor(heads, 1),
502
+ units: r2.units,
503
+ fileText: (p) => git(dir, ["show", `${heads[1]}:${p}`]),
504
+ });
505
+ expect(verdicts.map((v) => v.verdict)).toEqual(["unchanged", "new"]);
506
+ // The worktrees are gone; the checkout is untouched.
507
+ expect(git(dir, ["worktree", "list"]).split("\n")).toHaveLength(1);
508
+ // A single cut with no prior carries no delta at all.
509
+ expect(cutUnits({ repoDir: dir, base: shas[0], head: heads[0], factsBin: factsBin }).units.every((u) => u.delta === undefined)).toBe(true);
510
+ }, 180_000);
511
+ });
512
+ //# sourceMappingURL=rereview.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rereview.test.js","sourceRoot":"","sources":["../src/rereview.test.ts"],"names":[],"mappings":"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"}