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,299 @@
1
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
+ import { appendLabel, buildFindings, labelsFilePath, readLabels, readProposals } from "./labels-node.js";
6
+ import { agreementMetrics, cohenKappa, dedupFindings, foldProposals, graderOfFile, parseProposalLines, proposalAgrees, foldLabels, gradedMetrics, labelKey, labelsOf, lineBucket, parseLabelLines, prIdentity, validateLabelInput, } from "./labels.js";
7
+ const base = { pr: "prreview__x-1587", path: "src/a.ts", line: 70, title: "Null deref in parse", mechanism: "parse() reads x.y when x is null." };
8
+ describe("labelKey", () => {
9
+ it("is stable and shaped f1-<28 hex>", () => {
10
+ expect(labelKey(base)).toBe(labelKey({ ...base }));
11
+ expect(labelKey(base)).toMatch(/^f1-[0-9a-f]{28}$/);
12
+ });
13
+ it("normalises case and whitespace in title + mechanism", () => {
14
+ expect(labelKey({ ...base, title: " NULL deref\n in parse " })).toBe(labelKey(base));
15
+ expect(labelKey({ ...base, mechanism: "parse() reads\tX.Y when x is null." })).toBe(labelKey(base));
16
+ });
17
+ it("strips the re-run suffix, so re-runs of one PR share a key", () => {
18
+ expect(prIdentity("prreview__skillspro-1587-r2")).toBe("prreview__skillspro-1587");
19
+ expect(prIdentity("prreview__skillspro-1641")).toBe("prreview__skillspro-1641");
20
+ });
21
+ it("buckets lines by round(line / 7)", () => {
22
+ expect(lineBucket(70)).toBe(10);
23
+ expect(lineBucket(67)).toBe(10);
24
+ expect(lineBucket(73)).toBe(10);
25
+ expect(lineBucket(74)).toBe(11);
26
+ expect(labelKey({ ...base, line: 72 })).toBe(labelKey(base));
27
+ expect(labelKey({ ...base, line: 80 })).not.toBe(labelKey(base));
28
+ });
29
+ it("separates different paths, PRs and texts", () => {
30
+ expect(labelKey({ ...base, path: "src/b.ts" })).not.toBe(labelKey(base));
31
+ expect(labelKey({ ...base, pr: "prreview__x-1667" })).not.toBe(labelKey(base));
32
+ expect(labelKey({ ...base, mechanism: "something else" })).not.toBe(labelKey(base));
33
+ });
34
+ });
35
+ describe("validateLabelInput", () => {
36
+ const key = labelKey(base);
37
+ it("accepts a full grade", () => {
38
+ const v = validateLabelInput({ key, real: "yes", importance: "must-fix", gold: { instanceId: "i", index: 2 }, note: " x " });
39
+ expect(v).toEqual({ ok: true, value: { key, real: "yes", importance: "must-fix", gold: { instanceId: "i", index: 2 }, note: "x" } });
40
+ });
41
+ it("rejects bad enums, keys, gold and notes", () => {
42
+ expect(validateLabelInput({ key, real: "maybe" }).ok).toBe(false);
43
+ expect(validateLabelInput({ key, real: "yes", importance: "critical" }).ok).toBe(false);
44
+ expect(validateLabelInput({ key: "nope", real: "yes" }).ok).toBe(false);
45
+ expect(validateLabelInput({ key, real: "yes", gold: { instanceId: "i", index: -1 } }).ok).toBe(false);
46
+ expect(validateLabelInput({ key, real: "yes", gold: 3 }).ok).toBe(false);
47
+ expect(validateLabelInput({ key, real: "yes", note: "x".repeat(501) }).ok).toBe(false);
48
+ expect(validateLabelInput([]).ok).toBe(false);
49
+ });
50
+ it("drops importance unless real is yes, and real:null clears everything", () => {
51
+ expect(validateLabelInput({ key, real: "no", importance: "nit" })).toMatchObject({ ok: true, value: { importance: null } });
52
+ expect(validateLabelInput({ key, real: null, importance: "nit", note: "n" })).toEqual({
53
+ ok: true,
54
+ value: { key, real: null, importance: null, gold: null, note: null },
55
+ });
56
+ });
57
+ });
58
+ const lbl = (key, real, extra = {}) => ({
59
+ key,
60
+ real,
61
+ importance: null,
62
+ gold: null,
63
+ note: null,
64
+ gradedAt: "t",
65
+ finding: { ...base, consequence: "" },
66
+ ...extra,
67
+ });
68
+ describe("foldLabels", () => {
69
+ it("last write per key wins; real:null clears; torn lines are skipped", () => {
70
+ const text = [
71
+ JSON.stringify(lbl("a", "no")),
72
+ JSON.stringify(lbl("b", "yes")),
73
+ JSON.stringify(lbl("a", "yes", { importance: "nit" })),
74
+ JSON.stringify(lbl("b", null)),
75
+ '{"key":"c","re',
76
+ ].join("\n");
77
+ const m = foldLabels(parseLabelLines(text));
78
+ expect([...m.keys()]).toEqual(["a"]);
79
+ expect(m.get("a")).toMatchObject({ real: "yes", importance: "nit" });
80
+ });
81
+ });
82
+ const app = (reportLabel, instanceId, extra = {}) => ({
83
+ source: "site-review",
84
+ reportId: `r-${reportLabel}`,
85
+ reportLabel,
86
+ instanceId,
87
+ arm: "arm1",
88
+ repeat: 1,
89
+ site: "site-001",
90
+ session: null,
91
+ ...extra,
92
+ });
93
+ const raw = (a, over = {}) => ({
94
+ ...base,
95
+ consequence: "c",
96
+ strength: "read",
97
+ excerpt: null,
98
+ gold: [{ index: 0, severity: "high", summary: `gold of ${a.instanceId}` }],
99
+ appearance: a,
100
+ ...over,
101
+ });
102
+ describe("dedupFindings", () => {
103
+ it("collapses the same finding across reports and re-runs, keeping gold per instance", () => {
104
+ const out = dedupFindings([
105
+ raw(app("armA", "prreview__x-1587-r1")),
106
+ raw(app("armC", "prreview__x-1587-r2"), { title: "null DEREF in parse", line: 71 }),
107
+ raw(app("armC", "prreview__x-1587-r2"), { path: "src/other.ts" }),
108
+ ]);
109
+ expect(out).toHaveLength(2);
110
+ const [f] = out;
111
+ expect(f.appearances.map((a) => a.reportLabel)).toEqual(["armA", "armC"]);
112
+ expect(f.gold.map((g) => g.instanceId)).toEqual(["prreview__x-1587-r1", "prreview__x-1587-r2"]);
113
+ expect(f.title).toBe(base.title); // the first appearance supplies the text
114
+ });
115
+ it("attaches the current label and offers graded neighbours as similar", () => {
116
+ const k = labelKey(base);
117
+ const out = dedupFindings([raw(app("armA", "p-r1")), raw(app("armA", "p-r1"), { line: 78, title: "Different" }), raw(app("armA", "p-r1"), { line: 200, title: "Far" })], new Map([[k, lbl(k, "yes")]]));
118
+ expect(out[0].label?.real).toBe("yes");
119
+ expect(out[1].similar.map((s) => s.key)).toEqual([k]);
120
+ expect(out[2].similar).toEqual([]);
121
+ });
122
+ });
123
+ describe("gradedMetrics", () => {
124
+ it("counts distinct findings per arm and derives precision = real / graded", () => {
125
+ const fs = [
126
+ { key: "a", appearances: [app("armA", "p"), app("armA", "p", { repeat: 2 }), app("armC", "p")] },
127
+ { key: "b", appearances: [app("armA", "p")] },
128
+ { key: "c", appearances: [app("armA", "p")] },
129
+ { key: "d", appearances: [app("armA", "p")] },
130
+ { key: "e", appearances: [app("armC", "p")] },
131
+ ];
132
+ const labels = new Map([
133
+ ["a", lbl("a", "yes", { importance: "must-fix", gold: { instanceId: "p", index: 0 } })],
134
+ ["b", lbl("b", "yes", { importance: "nit" })],
135
+ ["c", lbl("c", "no")],
136
+ ["d", lbl("d", "unsure")],
137
+ ]);
138
+ const [a, c] = gradedMetrics(fs, labels);
139
+ expect(a).toEqual({ group: "armA", findings: 4, graded: 4, real: 2, notReal: 1, unsure: 1, realImportant: 1, precision: 0.5, goldLinked: 1 });
140
+ expect(c).toEqual({ group: "armC", findings: 2, graded: 1, real: 1, notReal: 0, unsure: 0, realImportant: 1, precision: 1, goldLinked: 1 });
141
+ });
142
+ it("has no precision with nothing graded", () => {
143
+ expect(gradedMetrics([{ key: "a", appearances: [app("armA", "p")] }], new Map())[0].precision).toBeNull();
144
+ });
145
+ });
146
+ describe("the fs half", () => {
147
+ let dir;
148
+ afterEach(() => rmSync(dir, { recursive: true, force: true }));
149
+ it("reads full text from findings.jsonl beside the session, an excerpt from the fixture, and round-trips a label", () => {
150
+ dir = mkdtempSync(join(tmpdir(), "labels-test-"));
151
+ const results = join(dir, "eval-results");
152
+ const fixture = join(dir, "fx", "arm1", "prreview__x-1587-r1");
153
+ const checkout = join(fixture, "sandboxes", "task", "repo");
154
+ mkdirSync(join(checkout, ".git"), { recursive: true });
155
+ mkdirSync(join(checkout, "src"), { recursive: true });
156
+ writeFileSync(join(checkout, "src", "a.ts"), Array.from({ length: 100 }, (_, i) => `line ${i + 1}`).join("\n"));
157
+ const sessionDir = join(results, "phase-replay", "sessions", "rep", "arm1__prreview__x-1587-r1__r1", "site-001");
158
+ mkdirSync(sessionDir, { recursive: true });
159
+ writeFileSync(join(sessionDir, "findings.jsonl"), `${JSON.stringify({ ...base, site: "site-001", consequence: "boom", strength: "read" })}\n`);
160
+ const session = "/data/phase-replay/sessions/rep/arm1__prreview__x-1587-r1__r1/site-001/full.jsonl";
161
+ const report = {
162
+ version: 1,
163
+ kind: "site-review",
164
+ label: "armA",
165
+ cases: [
166
+ {
167
+ instanceId: "prreview__x-1587-r1",
168
+ arm: "arm1",
169
+ fixture,
170
+ repeat: 1,
171
+ gold: [{ severity: "high", summary: "g" }],
172
+ siteReview: {
173
+ sites: [{ id: "site-001", session }],
174
+ findings: [
175
+ { site: "site-001", path: base.path, line: base.line, title: base.title, strength: "read", leads: [], gold: 0 },
176
+ { site: "site-001", path: base.path, line: 5, title: "no text on disk", strength: "read", leads: [] },
177
+ ],
178
+ },
179
+ },
180
+ ],
181
+ };
182
+ writeFileSync(join(results, "phase-replay", "rep.json"), JSON.stringify(report));
183
+ writeFileSync(join(results, "phase-replay", "torn.json"), '{"version":1,');
184
+ const r = buildFindings(results, "now");
185
+ expect(r.unreadable).toBe(1);
186
+ expect(r.findings).toHaveLength(1);
187
+ const f = r.findings[0];
188
+ expect(f).toMatchObject({ pr: "prreview__x-1587", consequence: "boom", key: labelKey(base) });
189
+ expect(f.appearances[0]).toMatchObject({ reportLabel: "armA", judgeGold: 0, session });
190
+ expect(f.excerpt).toEqual({ startLine: 62, lines: Array.from({ length: 17 }, (_, i) => `line ${62 + i}`) });
191
+ const file = labelsFilePath(results);
192
+ appendLabel(file, { key: f.key, real: "no", importance: null, gold: null, note: null }, f);
193
+ appendLabel(file, { key: f.key, real: "yes", importance: "nit", gold: null, note: "n" }, f);
194
+ expect(readLabels(file).get(f.key)).toMatchObject({ real: "yes", importance: "nit", finding: { mechanism: base.mechanism } });
195
+ expect(buildFindings(results, "now").findings[0].label?.importance).toBe("nit");
196
+ // Proposals from every proposals-*.jsonl beside findings.jsonl (one mid-write),
197
+ // attached per finding; the human label and metrics are untouched by them.
198
+ const dirL = join(results, "labels");
199
+ writeFileSync(join(dirL, "proposals-fable.jsonl"), `${JSON.stringify({ key: f.key, real: "no", reason: "r" })}\n{"key":"${f.key}","real":"ye`);
200
+ writeFileSync(join(dirL, "proposals-haiku.jsonl"), `${JSON.stringify({ key: f.key, real: "yes", importance: "nit" })}\n`);
201
+ writeFileSync(join(dirL, "other.jsonl"), `${JSON.stringify({ key: f.key, real: "no", grader: "ghost" })}\n`);
202
+ const r2 = buildFindings(results, "now");
203
+ expect(r2.findings[0].proposals.map((p) => [p.grader, p.real])).toEqual([
204
+ ["fable", "no"],
205
+ ["haiku", "yes"],
206
+ ]);
207
+ expect(r2.findings[0].label).toMatchObject({ real: "yes", importance: "nit" });
208
+ expect(r2.agreement.map((a) => [a.grader, a.n, a.realAgree])).toEqual([
209
+ ["fable", 1, 0],
210
+ ["haiku", 1, 1],
211
+ ]);
212
+ expect(readProposals(join(dir, "missing")).size).toBe(0);
213
+ });
214
+ });
215
+ const prop = (grader, real, extra = {}) => ({
216
+ grader,
217
+ real,
218
+ importance: null,
219
+ gold: null,
220
+ reason: null,
221
+ gradedAt: null,
222
+ ...extra,
223
+ });
224
+ describe("proposals", () => {
225
+ it("names the grader from the file, and skips torn / invalid lines", () => {
226
+ expect(graderOfFile("proposals-fable.jsonl")).toBe("fable");
227
+ expect(graderOfFile("findings.jsonl")).toBeNull();
228
+ expect(graderOfFile("proposals-.jsonl")).toBeNull();
229
+ const text = [
230
+ JSON.stringify({ key: "a", real: "yes", importance: "must-fix", gold: { instanceId: "i", index: 1 }, reason: "because", gradedAt: "t" }),
231
+ JSON.stringify({ key: "b", real: "maybe" }),
232
+ JSON.stringify({ key: "c", real: "no", importance: "nit" }),
233
+ JSON.stringify({ key: "d", real: "yes", gold: { instanceId: "i", index: -1 } }),
234
+ JSON.stringify({ key: "e", real: "yes", grader: "other" }),
235
+ '{"key":"f","real":"y',
236
+ ].join("\n");
237
+ const lines = parseProposalLines(text, "fable");
238
+ expect(lines.map((l) => l.key)).toEqual(["a", "c", "e"]);
239
+ expect(lines[0]).toEqual({ key: "a", grader: "fable", real: "yes", importance: "must-fix", gold: { instanceId: "i", index: 1 }, reason: "because", gradedAt: "t" });
240
+ expect(lines[1].importance).toBeNull(); // importance means nothing unless real = yes
241
+ expect(lines[2].grader).toBe("other"); // the line's own grader wins
242
+ });
243
+ it("folds last write per (grader, key); a real:null line removes only that grader's proposal", () => {
244
+ const m = foldProposals(parseProposalLines([{ key: "a", real: "no" }, { key: "a", real: "yes" }, { key: "b", real: "no" }, { key: "b", real: null }].map((l) => JSON.stringify(l)).join("\n"), "fable"));
245
+ foldProposals(parseProposalLines(JSON.stringify({ key: "a", real: "unsure" }), "haiku"), m);
246
+ expect(m.get("a")?.get("fable")?.real).toBe("yes");
247
+ expect(m.get("a")?.get("haiku")?.real).toBe("unsure");
248
+ expect(m.get("b")?.size).toBe(0);
249
+ });
250
+ it("never count as human grades: labels, similar and gradedMetrics ignore them", () => {
251
+ const k = labelKey(base);
252
+ const proposals = new Map([[k, new Map([["fable", prop("fable", "yes", { importance: "must-fix" })]])]]);
253
+ const out = dedupFindings([raw(app("armA", "p-r1")), raw(app("armA", "p-r1"), { line: 78, title: "Other" })], new Map(), proposals);
254
+ expect(out[0].proposals.map((p) => p.grader)).toEqual(["fable"]);
255
+ expect(out[0].label).toBeNull();
256
+ expect(out[1].similar).toEqual([]);
257
+ const [m] = gradedMetrics(out, labelsOf(out));
258
+ expect(m).toMatchObject({ findings: 2, graded: 0, real: 0, precision: null });
259
+ });
260
+ it("agree on real, and on importance when both say yes", () => {
261
+ expect(proposalAgrees({ real: "no", importance: null }, prop("g", "no"))).toBe(true);
262
+ expect(proposalAgrees({ real: "yes", importance: "nit" }, prop("g", "yes", { importance: "nit" }))).toBe(true);
263
+ expect(proposalAgrees({ real: "yes", importance: "nit" }, prop("g", "yes", { importance: "must-fix" }))).toBe(false);
264
+ expect(proposalAgrees({ real: "unsure", importance: null }, prop("g", "no"))).toBe(false);
265
+ });
266
+ });
267
+ describe("agreement", () => {
268
+ it("Cohen's kappa on a hand-computed matrix", () => {
269
+ // n=10, po = 8/10; row/col marginals 5,4,1 → pe = .25+.16+.01 = .42; κ = .38/.58 = 19/29.
270
+ expect(cohenKappa([[4, 1, 0], [1, 3, 0], [0, 0, 1]])).toBeCloseTo(19 / 29, 10);
271
+ expect(cohenKappa([[3, 0, 0], [0, 0, 0], [0, 0, 0]])).toBeNull(); // pe = 1: undefined
272
+ expect(cohenKappa([[0, 0, 0], [0, 0, 0], [0, 0, 0]])).toBeNull();
273
+ expect(cohenKappa([[0, 2, 0], [2, 0, 0], [0, 0, 0]])).toBe(-1);
274
+ });
275
+ it("builds the human × grader confusion matrix over findings carrying both", () => {
276
+ const L = (real, extra = {}) => lbl("k", real, extra);
277
+ const g = { instanceId: "i", index: 0 };
278
+ const fs = [
279
+ { label: L("yes", { importance: "nit", gold: g }), proposals: [prop("fable", "yes", { importance: "nit", gold: g }), prop("haiku", "no")] },
280
+ { label: L("yes", { importance: "must-fix" }), proposals: [prop("fable", "yes", { importance: "nit", gold: g })] },
281
+ { label: L("no"), proposals: [prop("fable", "yes")] },
282
+ { label: L("unsure"), proposals: [prop("fable", "unsure")] },
283
+ { label: null, proposals: [prop("fable", "no")] }, // no human label: proposed, not paired
284
+ { label: L("no"), proposals: [] },
285
+ ];
286
+ const [fable, haiku] = agreementMetrics(fs);
287
+ expect(fable).toMatchObject({ grader: "fable", proposals: 5, n: 4, realAgree: 3, realAgreeRate: 0.75, bothReal: 2, importanceAgree: 1, goldAgree: 1 });
288
+ expect(fable.confusion).toEqual([
289
+ [2, 0, 0],
290
+ [1, 0, 0],
291
+ [0, 0, 1],
292
+ ]);
293
+ // po = .75; rows 2,1,1 · cols 3,0,1 → pe = (6+0+1)/16; κ = (.75 − 7/16)/(1 − 7/16) = 5/9.
294
+ expect(fable.kappa).toBeCloseTo(5 / 9, 10);
295
+ expect(haiku).toMatchObject({ n: 1, realAgree: 0, bothReal: 0, importanceAgreeRate: null, goldAgreeRate: null });
296
+ expect(haiku.confusion[0]).toEqual([0, 1, 0]);
297
+ });
298
+ });
299
+ //# sourceMappingURL=labels.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.test.js","sourceRoot":"","sources":["../src/labels.test.ts"],"names":[],"mappings":"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"}
@@ -741,9 +741,9 @@ describe("Arm seam — model-selection adapters (arm.ts)", () => {
741
741
  // The overlay `makeRoots` writes has no `review:` — absent, not empty.
742
742
  expect(modelsArm("m", "f", overlay).review).toBeUndefined();
743
743
  expect(modelsArm("m", "f").review).toBeUndefined();
744
- writeFileSync(join(overlay, "config.yaml"), "models:\n default: openai/gpt-5.4-mini\nreview:\n postsCheck: true\n analysis:\n enabled: true\n surveyPasses: 6\n");
744
+ writeFileSync(join(overlay, "config.yaml"), "models:\n default: openai/gpt-5.4-mini\nreview:\n postsCheck: true\n analysis:\n enabled: true\n");
745
745
  const arm = modelsArm("m", "f", overlay);
746
- expect(arm.review).toEqual({ postsCheck: true, analysis: { enabled: true, surveyPasses: 6 } });
746
+ expect(arm.review).toEqual({ postsCheck: true, analysis: { enabled: true } });
747
747
  // Config arms read the same block from the same file.
748
748
  expect(configArm(root, overlay).review).toEqual(arm.review);
749
749
  }
@@ -1190,6 +1190,14 @@ describe("PR context — core's own projection, not a copy", () => {
1190
1190
  expect(ctx.flakyDeferrals).toBe(2);
1191
1191
  expect(ctx.maxFlakyDeferrals).toBe(defaultFixConfig().maxFlakyDeferrals);
1192
1192
  });
1193
+ it("projects the instance's base branch, with the case's pr_state winning", async () => {
1194
+ // A `master`-based PR (sentry) read `"main"` here, and `baseBranch` from this
1195
+ // projection overwrote the harness's own — post-review then diffed against
1196
+ // an `origin/main` that does not exist and demoted every finding.
1197
+ expect((await prContextPatch({ ...args, baseRef: "master" })).baseBranch).toBe("master");
1198
+ expect((await prContextPatch({ ...args, baseRef: "master", seed: { base_ref: "develop" } })).baseBranch).toBe("develop");
1199
+ expect((await prContextPatch(args)).baseBranch).toBe("main");
1200
+ });
1193
1201
  it("projects the merge gate's verdict AND its reason, from one decision", async () => {
1194
1202
  const green = await prContextPatch({
1195
1203
  ...args,
@@ -1225,14 +1233,12 @@ describe("PR context — core's own projection, not a copy", () => {
1225
1233
  // stays off, with no per-case special-casing.
1226
1234
  const off = await prContextPatch({ ...args, review: { postsCheck: true } });
1227
1235
  expect(off.analysisEnabled).toBeUndefined();
1228
- expect(off.prBody).toBeUndefined();
1229
1236
  // wp3/config.yaml: the same block plus `analysis.enabled`.
1230
1237
  const on = await prContextPatch({
1231
1238
  ...args,
1232
- review: { postsCheck: true, analysis: { enabled: true, maxObligations: 40, surveyPasses: 6 } },
1239
+ review: { postsCheck: true, analysis: { enabled: true, maxObligations: 40 } },
1233
1240
  });
1234
1241
  expect(on.analysisEnabled).toBe("true");
1235
- expect(on.prBody).toBe(args.body);
1236
1242
  // No arm policy at all is byte-identical to a policy that names no analysis.
1237
1243
  expect((await prContextPatch(args)).analysisEnabled).toBeUndefined();
1238
1244
  });
@@ -1245,7 +1251,7 @@ describe("PR context — core's own projection, not a copy", () => {
1245
1251
  // obligations vanish and the branch spends a model call saying it cannot work.
1246
1252
  //
1247
1253
  // Both failures were silent in the sense that mattered: the run went green.
1248
- const withAnalysis = { enabled: true, maxObligations: 40, surveyPasses: 6 };
1254
+ const withAnalysis = { enabled: true, maxObligations: 40 };
1249
1255
  const specBody = "### What & why\n\nCloses #1586.\n\n### Acceptance criteria\n\n- [ ] Silent login must not show the Google popup on a returning session\n";
1250
1256
  it("harness-derived changed files give the spec axis its second end", async () => {
1251
1257
  const ctx = await prContextPatch({
@@ -1254,7 +1260,7 @@ describe("PR context — core's own projection, not a copy", () => {
1254
1260
  review: { analysis: withAnalysis },
1255
1261
  changedFiles: ["src/auth/redirect-sign-in.ts", "src/auth/session.ts"],
1256
1262
  });
1257
- const block = ctx.specObligations;
1263
+ const block = ctx.specObligationsJson;
1258
1264
  expect(block).toBeDefined();
1259
1265
  // The obligation names both ends: the criterion verbatim, and a changed file.
1260
1266
  expect(block).toContain("Silent login must not show the Google popup");
@@ -1264,9 +1270,8 @@ describe("PR context — core's own projection, not a copy", () => {
1264
1270
  it("without them the axis degrades LOUDLY rather than silently passing", async () => {
1265
1271
  const ctx = await prContextPatch({ ...args, body: specBody, review: { analysis: withAnalysis } });
1266
1272
  // Locked decision 6: "could not look" and "looked and it is fine" are
1267
- // different facts, so the block still renders and says which.
1268
- expect(ctx.specObligations).toContain("changed-file list could not be read");
1269
- expect(ctx.specObligations).toContain("That is NOT a pass");
1273
+ // different facts, so the set is still projected and says which.
1274
+ expect(ctx.specObligationsJson).toContain("changed-file list could not be read");
1270
1275
  });
1271
1276
  it("a case seeding [] means 'changes nothing', not 'could not read'", async () => {
1272
1277
  const ctx = await prContextPatch({
@@ -1278,8 +1283,8 @@ describe("PR context — core's own projection, not a copy", () => {
1278
1283
  });
1279
1284
  // The seed wins over the harness-derived set, and its degraded message is
1280
1285
  // the other one — a `||` fallback here would silently swap the two.
1281
- expect(ctx.specObligations).toContain("changes no files");
1282
- expect(ctx.specObligations).not.toContain("src/auth/session.ts");
1286
+ expect(ctx.specObligationsJson).toContain("changes no files");
1287
+ expect(ctx.specObligationsJson).not.toContain("src/auth/session.ts");
1283
1288
  });
1284
1289
  it("the arm wins over a case's own review seed — gold can never flip an arm", async () => {
1285
1290
  const ctx = await prContextPatch({
@@ -1333,7 +1338,7 @@ describe("PR context — core's own projection, not a copy", () => {
1333
1338
  review: { analysis: withAnalysis },
1334
1339
  github: resolveReviewGitHubClient({ githubApiBaseUrl: fake.url }),
1335
1340
  });
1336
- const block = ctx.specObligations;
1341
+ const block = ctx.specObligationsJson;
1337
1342
  expect(block).toBeDefined();
1338
1343
  expect(block).toContain("nearform.com domain server-side");
1339
1344
  expect(block).toContain("src/auth/session.ts");
@@ -1343,6 +1348,72 @@ describe("PR context — core's own projection, not a copy", () => {
1343
1348
  await fake.close();
1344
1349
  }
1345
1350
  });
1351
+ // `select`'s view of the PR's prior conversation, through the same production
1352
+ // path: core's resolver → a real client → the fake's discussion query, served
1353
+ // from the case's seeds. A resolved thread must read as resolved — it is the
1354
+ // one fact REST cannot carry.
1355
+ it("serves the prior discussion to core's resolver, resolution included", async () => {
1356
+ const fake = await startFakeGitHub({
1357
+ owner: "acme",
1358
+ repo: "widgets",
1359
+ pulls: [
1360
+ {
1361
+ number: 413,
1362
+ title: "fix: cache ttl",
1363
+ body: "Keeps the TTL at 120s.",
1364
+ base_ref: "main",
1365
+ head_ref: "fix/ttl",
1366
+ base_commit: "a".repeat(40),
1367
+ head_commit: "b".repeat(40),
1368
+ reviews: [{ user: "alice", state: "CHANGES_REQUESTED", body: "TTL outlives the fetch." }],
1369
+ review_comments: [
1370
+ { user: "last-light[bot]", path: "src/cache.ts", line: 12, body: "Null deref on miss.", resolved: true },
1371
+ { user: "bob", path: "src/cache.ts", line: 40, body: "Off by one?" },
1372
+ ],
1373
+ issue_comments: [{ user: "carol", body: "LGTM once CI is green" }],
1374
+ },
1375
+ ],
1376
+ });
1377
+ try {
1378
+ fake.setPullFiles(413, [{ filename: "src/cache.ts", status: "modified", additions: 3, deletions: 1, changes: 4, sha: "c".repeat(40) }]);
1379
+ const ctx = await prContextPatch({
1380
+ repo: "acme/widgets",
1381
+ prNumber: 413,
1382
+ title: "fix: cache ttl",
1383
+ body: "Keeps the TTL at 120s.",
1384
+ branch: "fix/ttl",
1385
+ review: { analysis: withAnalysis },
1386
+ github: resolveReviewGitHubClient({ githubApiBaseUrl: fake.url }),
1387
+ });
1388
+ const block = String(ctx.priorDiscussion ?? "");
1389
+ expect(block).toContain("@alice — CHANGES_REQUESTED: TTL outlives the fetch.");
1390
+ expect(block).toContain("`src/cache.ts:12` [RESOLVED] @last-light (bot): Null deref on miss.");
1391
+ expect(block).toContain("`src/cache.ts:40` [open] @bob: Off by one?");
1392
+ expect(block).toContain("@carol: LGTM once CI is green");
1393
+ // The investigators' side of the same projection.
1394
+ expect(String(ctx.prIntent ?? "")).toContain("Keeps the TTL at 120s.");
1395
+ }
1396
+ finally {
1397
+ await fake.close();
1398
+ }
1399
+ });
1400
+ // The common case — a Martian PR nobody has discussed — must answer EMPTY
1401
+ // from the fake, not error: an error would read as "could not look" and log
1402
+ // a read failure on every pr-review case.
1403
+ it("answers the discussion query for an undiscussed PR with empty lists, not an error", async () => {
1404
+ const fake = await startFakeGitHub({
1405
+ owner: "acme",
1406
+ repo: "widgets",
1407
+ pulls: [{ number: 414, title: "t", body: "", base_ref: "main", head_ref: "x", base_commit: "a".repeat(40), head_commit: "b".repeat(40) }],
1408
+ });
1409
+ try {
1410
+ const gh = resolveReviewGitHubClient({ githubApiBaseUrl: fake.url });
1411
+ await expect(gh.getPullRequestDiscussion("acme", "widgets", 414)).resolves.toEqual({ reviews: [], threads: [], comments: [] });
1412
+ }
1413
+ finally {
1414
+ await fake.close();
1415
+ }
1416
+ });
1346
1417
  // GitHub's own boundary: a closing keyword links, a bare reference does not.
1347
1418
  // Getting this wrong would seed the axis with criteria from an issue the PR
1348
1419
  // never promised to satisfy — a confident obligation about the wrong "what