lastlight-evals 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/report.js CHANGED
@@ -10,6 +10,19 @@
10
10
  */
11
11
  import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync } from "node:fs";
12
12
  import { join } from "node:path";
13
+ import { fLabel } from "./grade.js";
14
+ /** A live run's heartbeat must be refreshed within this window to count as
15
+ * genuinely running; beyond it the writer is presumed dead. Comfortably larger
16
+ * than the run loop's 20s heartbeat ticker. */
17
+ export const HEARTBEAT_STALE_MS = 90_000;
18
+ /** True if a heartbeat timestamp is recent enough that the writer is presumed
19
+ * alive. Absent/unparseable ⇒ not fresh (older orphaned runs have no heartbeat). */
20
+ export function heartbeatFresh(heartbeat, nowMs) {
21
+ if (!heartbeat)
22
+ return false;
23
+ const t = Date.parse(heartbeat);
24
+ return Number.isFinite(t) && nowMs - t <= HEARTBEAT_STALE_MS;
25
+ }
13
26
  /**
14
27
  * Fold N trials of ONE case (same model + instance) into a single result:
15
28
  * - binary verdicts (behavioral / resolved) are WORST-case — true only if
@@ -63,8 +76,28 @@ export function aggregateTrials(trials) {
63
76
  out.resolvedPass = passes;
64
77
  out.failToPass = rep.failToPass;
65
78
  out.passToPass = rep.passToPass;
79
+ out.executionLog = rep.executionLog; // log of the same trial the breakdown came from
66
80
  out.model_patch = (ok.find((t) => t.resolved) ?? ok[0]).model_patch;
67
81
  }
82
+ // review (pr-review): mean the metrics across non-errored trials; carry a
83
+ // representative trial's FP/FN lists (the worst — lowest F-beta — for inspection).
84
+ const rev = ok.filter((t) => t.review);
85
+ if (rev.length) {
86
+ const rep = [...rev].sort((a, b) => (a.review.fbeta - b.review.fbeta))[0];
87
+ out.review = {
88
+ precision: mean(rev.map((t) => t.review.precision)),
89
+ recall: mean(rev.map((t) => t.review.recall)),
90
+ fbeta: mean(rev.map((t) => t.review.fbeta)),
91
+ beta: rev[0].review.beta,
92
+ posted: Math.round(mean(rev.map((t) => t.review.posted))),
93
+ gold: rev[0].review.gold,
94
+ matched: Math.round(mean(rev.map((t) => t.review.matched))),
95
+ falsePositives: rep.review.falsePositives,
96
+ falseNegatives: rep.review.falseNegatives,
97
+ trace: rep.review.trace,
98
+ };
99
+ out.reviewTrials = rev.length;
100
+ }
68
101
  return out;
69
102
  }
70
103
  /** Per-model aggregation over a set of results (one tier or all of them). */
@@ -79,6 +112,7 @@ export function summarizeModels(results) {
79
112
  for (const [model, list] of byModel) {
80
113
  const codeFix = list.filter((r) => r.resolved !== undefined);
81
114
  const behavioral = list.filter((r) => r.behavioral !== undefined && !r.error);
115
+ const review = list.filter((r) => r.review !== undefined && !r.error);
82
116
  const durations = list.map((r) => r.durationMs).sort((a, b) => a - b);
83
117
  models.push({
84
118
  model,
@@ -87,6 +121,11 @@ export function summarizeModels(results) {
87
121
  codeFixTotal: codeFix.length,
88
122
  behavioralOk: behavioral.filter((r) => r.behavioral?.ok).length,
89
123
  behavioralTotal: behavioral.length,
124
+ reviewTotal: review.length,
125
+ avgPrecision: avg(review.map((r) => r.review.precision)),
126
+ avgRecall: avg(review.map((r) => r.review.recall)),
127
+ avgFbeta: avg(review.map((r) => r.review.fbeta)),
128
+ reviewBeta: review[0]?.review.beta,
90
129
  avgInputTokens: avg(list.map((r) => r.inputTokens)),
91
130
  avgCachedTokens: avg(list.map((r) => r.cachedTokens)),
92
131
  avgOutputTokens: avg(list.map((r) => r.outputTokens)),
@@ -100,12 +139,108 @@ export function summarizeModels(results) {
100
139
  export function summarize(results) {
101
140
  return { models: summarizeModels(results), results };
102
141
  }
142
+ /** Load a tier's Martian leaderboard sidecar, or undefined if it ships none. */
143
+ export function loadMartianSidecar(tierRoot) {
144
+ const path = join(tierRoot, "martian-leaderboard.json");
145
+ if (!existsSync(path))
146
+ return undefined;
147
+ try {
148
+ return JSON.parse(readFileSync(path, "utf8"));
149
+ }
150
+ catch {
151
+ return undefined; // a malformed sidecar just hides the panel, never breaks a run
152
+ }
153
+ }
154
+ const f1Of = (tp, fp, fn) => {
155
+ const p = tp + fp ? tp / (tp + fp) : 0;
156
+ const r = tp + fn ? tp / (tp + fn) : 0;
157
+ return { precision: p, recall: r, f1: p + r ? (2 * p * r) / (p + r) : 0 };
158
+ };
159
+ /**
160
+ * Rank this run's model(s) against Martian's Code Review Bench tools over EXACTLY
161
+ * the PRs the run covered (subset-fair). For each covered PR we have Martian's
162
+ * per-tool tp/fp/fn (from the sidecar) and our own (matched / posted-matched /
163
+ * gold-matched from the judge). Everything is micro-aggregated — summed then
164
+ * P/R/F1 — matching Martian's own `overall_metrics`. A tool is ranked only if it
165
+ * has data on EVERY covered PR, so every row is scored on the identical PR set.
166
+ * Returns undefined when nothing graded overlaps the sidecar (⇒ no panel).
167
+ */
168
+ export function computeMartianRanking(results, sidecar) {
169
+ // Covered PRs: graded (has a review) AND present in the sidecar. Dedup because a
170
+ // multi-model run repeats each instance_id once per model.
171
+ const covered = [...new Set(results.filter((r) => r.review && sidecar.instances[r.instance_id]).map((r) => r.instance_id))].sort();
172
+ if (!covered.length)
173
+ return undefined;
174
+ // Martian tools that appear on EVERY covered PR — only those are comparable on
175
+ // the identical subset. Micro-aggregate each across the covered PRs.
176
+ const onAll = covered
177
+ .map((id) => new Set(Object.keys(sidecar.instances[id].toolMetrics)))
178
+ .reduce((acc, s) => new Set([...acc].filter((t) => s.has(t))));
179
+ const tools = [...onAll]
180
+ .map((key) => {
181
+ let tp = 0, fp = 0, fn = 0;
182
+ for (const id of covered) {
183
+ const m = sidecar.instances[id].toolMetrics[key];
184
+ tp += m.tp;
185
+ fp += m.fp;
186
+ fn += m.fn;
187
+ }
188
+ return { key, name: sidecar.toolDisplayNames[key] ?? key, tp, fp, fn, ...f1Of(tp, fp, fn) };
189
+ })
190
+ .sort((a, b) => b.f1 - a.f1);
191
+ // Our arm(s): micro-aggregate the judge's matched/posted/gold over the covered
192
+ // PRs the arm actually graded, then slot into the tool ranking by F1.
193
+ const byModel = new Map();
194
+ for (const r of results) {
195
+ if (r.review && sidecar.instances[r.instance_id])
196
+ (byModel.get(r.model) ?? byModel.set(r.model, []).get(r.model)).push(r);
197
+ }
198
+ const models = [...byModel.entries()]
199
+ .map(([key, list]) => {
200
+ let tp = 0, fp = 0, fn = 0;
201
+ for (const r of list) {
202
+ const rev = r.review;
203
+ tp += rev.matched;
204
+ fp += Math.max(0, rev.posted - rev.matched);
205
+ fn += Math.max(0, rev.gold - rev.matched);
206
+ }
207
+ const score = f1Of(tp, fp, fn);
208
+ // Rank = 1 + (tools strictly better). `of` counts the tool field plus us.
209
+ const rank = 1 + tools.filter((t) => t.f1 > score.f1).length;
210
+ return { key, name: key, tp, fp, fn, ...score, rank, of: tools.length + 1 };
211
+ })
212
+ .sort((a, b) => b.f1 - a.f1);
213
+ return { judgeModel: sidecar.judgeModel, prCount: covered.length, coveredInstances: covered, tools, models };
214
+ }
103
215
  export function renderTable(card, labels = {}) {
104
- const header = ["model", "code-fix", "behavioral", "in tok", "cached", "out tok", "cost $", "p50", "err"];
216
+ // Show the pr-review columns (prec/rec/F-beta) only when some run graded a
217
+ // review — otherwise keep the table lean for triage/code-fix. The F-beta column
218
+ // is labelled by the β the run used (F1 by default).
219
+ const hasReview = card.models.some((m) => m.reviewTotal > 0);
220
+ const fCol = fLabel(card.models.find((m) => m.reviewBeta !== undefined)?.reviewBeta ?? 1);
221
+ const header = [
222
+ "model",
223
+ "code-fix",
224
+ "behavioral",
225
+ ...(hasReview ? ["prec", "rec", fCol] : []),
226
+ "in tok",
227
+ "cached",
228
+ "out tok",
229
+ "cost $",
230
+ "p50",
231
+ "err",
232
+ ];
105
233
  const rows = card.models.map((m) => [
106
234
  labels[m.model] ?? m.model,
107
235
  m.codeFixTotal ? `${m.codeFixResolved}/${m.codeFixTotal}` : "—",
108
236
  m.behavioralTotal ? `${m.behavioralOk}/${m.behavioralTotal}` : "—",
237
+ ...(hasReview
238
+ ? [
239
+ m.reviewTotal ? m.avgPrecision.toFixed(2) : "—",
240
+ m.reviewTotal ? m.avgRecall.toFixed(2) : "—",
241
+ m.reviewTotal ? m.avgFbeta.toFixed(2) : "—",
242
+ ]
243
+ : []),
109
244
  fmtTokens(m.avgInputTokens),
110
245
  fmtTokens(m.avgCachedTokens),
111
246
  fmtTokens(m.avgOutputTokens),
@@ -124,7 +259,11 @@ export function writeScorecard(dir, card) {
124
259
  mkdirSync(dir, { recursive: true });
125
260
  const file = join(dir, "scorecard.json");
126
261
  const tmp = join(dir, ".scorecard.json.tmp");
127
- writeFileSync(tmp, JSON.stringify(card, null, 2));
262
+ // Drop the heavy inline `model_patch` from the serialized scorecard — it's
263
+ // polled live every 1.5s and the diff can be large. predictions.jsonl keeps
264
+ // it (built from the in-memory card), and the dashboard reads the diff from
265
+ // each result's `modelPatchFile` (the discrete changes.diff artifact).
266
+ writeFileSync(tmp, JSON.stringify(card, (k, v) => (k === "model_patch" ? undefined : v), 2));
128
267
  renameSync(tmp, file);
129
268
  return file;
130
269
  }
@@ -138,8 +277,13 @@ export function writeArtifacts(dir, card) {
138
277
  }
139
278
  /** Map a parsed scorecard into an {@link IndexRun}. `dir` is the run subdir name
140
279
  * ("" for a legacy flat-layout run sitting directly in the tier dir). */
141
- function indexRun(tierKey, dir, card) {
280
+ function indexRun(tierKey, dir, card, nowMs) {
142
281
  const meta = card.meta;
282
+ // A run only counts as live if its heartbeat is fresh; a `live` scorecard with
283
+ // a stale/absent heartbeat (writer killed or crashed) is an interrupted run.
284
+ const fresh = heartbeatFresh(meta?.heartbeat, nowMs);
285
+ const isLive = !!meta?.live && fresh;
286
+ const isInterrupted = !!meta?.interrupted || (!!meta?.live && !fresh);
143
287
  const id = dir || "root";
144
288
  const data = dir ? `${dir}/scorecard.json` : "scorecard.json";
145
289
  const results = card.results ?? [];
@@ -171,10 +315,12 @@ function indexRun(tierKey, dir, card) {
171
315
  labels: meta?.labels ?? {},
172
316
  byTier,
173
317
  runs: meta?.runs ?? 1,
174
- live: !!meta?.live,
318
+ live: isLive,
319
+ interrupted: isInterrupted,
175
320
  progress: meta?.progress,
176
- running: (meta?.pending ?? []).filter((p) => p.status === "running").length,
177
- queued: (meta?.pending ?? []).filter((p) => p.status === "pending").length,
321
+ // No running/queued cases once interrupted — the writer is gone.
322
+ running: isInterrupted ? 0 : (meta?.pending ?? []).filter((p) => p.status === "running").length,
323
+ queued: isInterrupted ? 0 : (meta?.pending ?? []).filter((p) => p.status === "pending").length,
178
324
  };
179
325
  }
180
326
  const parseCard = (file) => {
@@ -187,7 +333,7 @@ const parseCard = (file) => {
187
333
  };
188
334
  /** Scan one tier-combo dir for runs (subdir-per-run, plus a legacy flat run if a
189
335
  * scorecard sits directly in the dir), newest first. */
190
- export function indexTier(resultsRoot, key) {
336
+ export function indexTier(resultsRoot, key, nowMs = Date.now()) {
191
337
  const tierDir = join(resultsRoot, key);
192
338
  if (!existsSync(tierDir))
193
339
  return [];
@@ -197,11 +343,11 @@ export function indexTier(resultsRoot, key) {
197
343
  continue;
198
344
  const card = parseCard(join(tierDir, ent.name, "scorecard.json"));
199
345
  if (card)
200
- runs.push(indexRun(key, ent.name, card));
346
+ runs.push(indexRun(key, ent.name, card, nowMs));
201
347
  }
202
348
  const flat = parseCard(join(tierDir, "scorecard.json"));
203
349
  if (flat)
204
- runs.push(indexRun(key, "", flat));
350
+ runs.push(indexRun(key, "", flat, nowMs));
205
351
  const sortKey = (r) => r.generatedAt || r.runId;
206
352
  return runs.sort((a, b) => (sortKey(a) < sortKey(b) ? 1 : sortKey(a) > sortKey(b) ? -1 : 0));
207
353
  }
@@ -214,11 +360,12 @@ export function indexTier(resultsRoot, key) {
214
360
  export function buildIndex(resultsRoot, generatedAt) {
215
361
  if (!existsSync(resultsRoot))
216
362
  return { generatedAt, tiers: [] };
363
+ const nowMs = Date.parse(generatedAt) || Date.now();
217
364
  const tiers = [];
218
365
  for (const ent of readdirSync(resultsRoot, { withFileTypes: true })) {
219
366
  if (!ent.isDirectory())
220
367
  continue;
221
- const runs = indexTier(resultsRoot, ent.name);
368
+ const runs = indexTier(resultsRoot, ent.name, nowMs);
222
369
  if (runs.length)
223
370
  tiers.push({ key: ent.name, runs });
224
371
  }
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
@@ -6,8 +6,10 @@
6
6
  * 2. (code-fix) Deterministically seed the workspace: fixture repo @ base
7
7
  * commit + a local bare `origin` so `git push` works offline.
8
8
  * 3. Load the REAL workflow YAML (build / issue-triage / …) via the loader.
9
- * 4. runWorkflow with `sandbox: "none"`, `githubApiBaseUrl → fake GitHub`,
10
- * and an EMPTY approvalConfig so gates never pause. No real GitHub creds.
9
+ * 4. runWorkflow with `sandbox` (default `"none"`; `"gondolin"` isolates the
10
+ * agent's tools in a QEMU micro-VM — see `opts.sandbox`), `githubApiBaseUrl
11
+ * → fake GitHub`, and an EMPTY approvalConfig so gates never pause. No real
12
+ * GitHub creds.
11
13
  * 5. Grade deterministically (execution + behavioral) and collect metrics.
12
14
  *
13
15
  * The only deviations from production are the ones we can't do unattended:
@@ -20,9 +22,9 @@ import { join } from "node:path";
20
22
  import { tmpdir } from "node:os";
21
23
  import { getWorkflow, runWorkflow, } from "lastlight/evals";
22
24
  import { startFakeGitHub } from "./fake-github.js";
23
- import { seedWorkspace, seedWorkspaceFromGit, isRealSha } from "./seed.js";
25
+ import { seedWorkspace, seedWorkspaceFromGit, seedWorkspacePrReview, prFilesFromGit, isRealSha } from "./seed.js";
24
26
  import { collectMetrics, drainSessions, readSessionLog, listSessionFiles, concatJsonl } from "./metrics.js";
25
- import { gradeBehavioral, gradeExecution, gradeTriage } from "./grade.js";
27
+ import { gradeBehavioral, gradeExecution, gradeTriage, gradeReview } from "./grade.js";
26
28
  const EVAL_ENV_KEYS = ["GITHUB_APP_ID", "GITHUB_APP_INSTALLATION_ID", "GITHUB_TOKEN", "GH_TOKEN", "GITHUB_API_URL"];
27
29
  /**
28
30
  * Install the eval's static-token GitHub env and return a restore fn:
@@ -50,21 +52,33 @@ export async function runInstance(inst, opts) {
50
52
  const start = Date.now();
51
53
  const { owner, name } = splitRepo(inst.repo);
52
54
  const workflowName = inst.workflow ?? opts.defaultWorkflow ?? "issue-triage";
53
- const isCodeFix = workflowName !== "issue-triage";
55
+ // Three tier shapes: triage (no repo), pr-review (checkout PR head, review-only,
56
+ // judge grade), and code-fix (everything else — seed a base checkout + execution
57
+ // grade). Keeping these explicit avoids the old `!== "issue-triage"` binary
58
+ // misclassifying pr-review as code-fix.
59
+ const isPrReview = workflowName === "pr-review";
60
+ const isCodeFix = !isPrReview && workflowName !== "issue-triage";
54
61
  const stateDir = opts.stateDir ?? mkdtempSync(join(tmpdir(), "ll-eval-"));
55
62
  const sessionsDir = join(stateDir, "agent-sessions");
56
63
  // The shim appends per-phase jsonl under <sessionsDir>/projects/<slug>/ and
57
64
  // does not create that parent recursively — pre-create it so token/cost
58
65
  // metrics are captured (collectMetrics reads those jsonl files).
59
66
  mkdirSync(join(sessionsDir, "projects"), { recursive: true });
60
- const taskId = `${name}-${inst.issue?.number ?? 0}-${workflowName}-${slug(inst.instance_id)}`;
61
- const issueNumber = inst.issue?.number ?? 1;
62
- const branch = isCodeFix ? `lastlight/${slug(inst.instance_id)}` : "main";
63
- // 1. Fake GitHub, seeded with the issue.
67
+ // The target number is the PR number for pr-review, else the issue number.
68
+ const targetNumber = inst.pr?.number ?? inst.issue?.number ?? 1;
69
+ const taskId = `${name}-${targetNumber}-${workflowName}-${slug(inst.instance_id)}`;
70
+ const issueNumber = targetNumber;
71
+ const branch = isCodeFix
72
+ ? `lastlight/${slug(inst.instance_id)}`
73
+ : isPrReview
74
+ ? inst.pr?.head_ref ?? "main"
75
+ : "main";
76
+ // 1. Fake GitHub, seeded with the issue and/or PR.
64
77
  const fake = await startFakeGitHub({
65
78
  owner,
66
79
  repo: name,
67
80
  issues: inst.issue ? [inst.issue] : [],
81
+ pulls: inst.pr ? [inst.pr] : [],
68
82
  existingLabels: inst.issue?.labels ?? [],
69
83
  });
70
84
  // Static-token mode: no App creds (so no real mint), a dummy token so the
@@ -88,23 +102,56 @@ export async function runInstance(inst, opts) {
88
102
  // fixture dir wins; otherwise a git-source case (real base SHA + real
89
103
  // repo) is checked out from the repo-local cache. Either way the agent
90
104
  // works in a pre-seeded dir with an offline origin — no GitHub clone.
105
+ // Seed the repo into a `<workspace>/<repo>/` SUBDIRECTORY (production's nested
106
+ // layout) and tell the executor to run the agent there (`config.repoSubdir`
107
+ // below). That keeps the workflow scaffolding core stages at the workspace
108
+ // root — AGENTS.md, .lastlight-skills/ — OUTSIDE the repo's git tree, so the
109
+ // captured diff (5b') is the repo's change alone. We keep the SeedResult to
110
+ // diff the agent's final tree against the seeded base (the agent commits +
111
+ // pushes, so a `git diff HEAD` would be empty — we diff against the base).
112
+ const repoSubdir = isCodeFix || isPrReview ? name : undefined;
113
+ let seed;
91
114
  if (isCodeFix) {
92
115
  const fixtureDir = opts.datasetDir ? join(opts.datasetDir, "repos", inst.instance_id) : undefined;
93
116
  if (fixtureDir && existsSync(fixtureDir)) {
94
- seedWorkspace({ stateDir, taskId, fixtureDir, branch });
117
+ seed = seedWorkspace({ stateDir, taskId, fixtureDir, branch, repoSubdir });
95
118
  }
96
119
  else if (isRealSha(inst.base_commit) && /^[^/]+\/[^/]+$/.test(inst.repo)) {
97
- seedWorkspaceFromGit({ stateDir, taskId, repo: inst.repo, baseCommit: inst.base_commit, branch });
120
+ seed = seedWorkspaceFromGit({ stateDir, taskId, repo: inst.repo, baseCommit: inst.base_commit, branch, repoSubdir });
98
121
  }
99
122
  }
123
+ else if (isPrReview && inst.pr && /^[^/]+\/[^/]+$/.test(inst.repo)) {
124
+ // Check out the PR HEAD into a `<repo>/` subdir (skills/pr-review's
125
+ // pre-clone contract), with an offline origin carrying base + head.
126
+ seed = seedWorkspacePrReview({
127
+ stateDir,
128
+ taskId,
129
+ repo: inst.repo,
130
+ pullNumber: inst.pr.number,
131
+ baseRef: inst.pr.base_ref,
132
+ headRef: inst.pr.head_ref,
133
+ baseCommit: inst.pr.base_commit,
134
+ headCommit: inst.pr.head_commit,
135
+ repoSubdir,
136
+ });
137
+ }
138
+ // The repo's working dir (the nested subdir when seeded) — where grading and
139
+ // the diff run. Falls back to the workspace root if nothing was seeded.
140
+ const repoDir = seed?.workDir ?? join(stateDir, "sandboxes", taskId);
141
+ // Serve the PR's changed files at GET /pulls/:n/files (pr-review): computed
142
+ // from base..head in the just-seeded workspace, so a review agent that lists
143
+ // files via the API gets the real changed set instead of a 404.
144
+ if (isPrReview && inst.pr && seed) {
145
+ fake.setPullFiles(inst.pr.number, prFilesFromGit(repoDir, inst.pr.base_commit, inst.pr.head_commit));
146
+ }
100
147
  // 3. Real workflow definition + run context.
101
148
  const def = getWorkflow(workflowName);
102
149
  const ctx = {
103
150
  owner,
104
151
  repo: name,
105
152
  issueNumber,
106
- issueTitle: inst.issue?.title ?? inst.instance_id,
107
- issueBody: inst.issue?.body ?? inst.problem_statement,
153
+ issueTitle: (isPrReview ? inst.pr?.title : inst.issue?.title) ?? inst.instance_id,
154
+ issueBody: (isPrReview ? inst.pr?.body : inst.issue?.body) ?? inst.problem_statement,
108
155
  issueLabels: inst.issue?.labels ?? [],
109
156
  commentBody: "",
110
157
  sender: "eval",
@@ -112,6 +159,17 @@ export async function runInstance(inst, opts) {
112
159
  taskId,
113
160
  issueDir: `.lastlight/issue-${issueNumber}`,
114
161
  bootstrapLabel: "lastlight:bootstrap",
162
+ // pr-review's Context block keys off `prNumber` — the skill goes straight
163
+ // to github_get_pull_request when it's set (buildPhasePrompt dumps every
164
+ // defined ctx field into the "Context:" block). `baseBranch` is what the
165
+ // deterministic `post-review` phase reads to compute the commentable diff
166
+ // (`git diff origin/<baseBranch>...HEAD`) — WITHOUT it every finding is
167
+ // demoted to the review body and the line-anchored inline-comment path
168
+ // (the point of the tier) never fires. Prod sets it from the PR's base ref;
169
+ // the eval must too, or it diverges from what ships.
170
+ ...(isPrReview && inst.pr
171
+ ? { prNumber: inst.pr.number, prTitle: inst.pr.title, baseBranch: inst.pr.base_ref }
172
+ : {}),
115
173
  // No prePopulateBranch → the runner never clones from GitHub; the agent
116
174
  // works in the dir we seeded above (or an empty dir for triage).
117
175
  };
@@ -122,9 +180,14 @@ export async function runInstance(inst, opts) {
122
180
  // context untouched and return just their forced id.
123
181
  const prepared = opts.arm.prepare(ctx);
124
182
  const config = {
125
- sandbox: "none",
183
+ sandbox: opts.sandbox ?? "none",
126
184
  stateDir,
127
185
  sessionsDir,
186
+ // Run the agent inside the pre-seeded `<workspace>/<repo>/` checkout (only
187
+ // when we actually seeded one), matching production's nested layout. Core
188
+ // nests `agentCwd` here without a clone; AGENTS.md/.lastlight-skills stay
189
+ // at the workspace root, siblings outside the repo.
190
+ repoSubdir: seed ? repoSubdir : undefined,
128
191
  // `config` arms let core pick per phase (this is only the fallback for
129
192
  // phases that resolve to nothing — the merged config's `default`); `models`
130
193
  // arms force their one id across every step.
@@ -207,6 +270,32 @@ export async function runInstance(inst, opts) {
207
270
  : "workflow failed";
208
271
  }
209
272
  }
273
+ // 5b'. Capture the agent's changed files as a unified diff BEFORE grading
274
+ // touches the tree (gradeExecution copies held-out tests in / `git apply`s
275
+ // the test patch). Diff against the seeded base — the agent commits its work,
276
+ // so a `git diff HEAD` would be empty. Always-on for code-fix (independent of
277
+ // whether tests are configured), so the dashboard can browse what changed.
278
+ if (isCodeFix && seed) {
279
+ const patch = gitDiffAgainstBase(repoDir, seed.baseCommit);
280
+ // Kept in-memory for the SWE-bench predictions.jsonl roll-up.
281
+ result.model_patch = patch;
282
+ // Also persist as a DISCRETE artifact beside the trial's logs
283
+ // (execution.log, session jsonl) — same run-relative path scheme as
284
+ // `executionLog`. It publishes with the rest of the run tree
285
+ // (`build-site.ts` copies eval-results/ verbatim) and keeps the
286
+ // live-polled scorecard.json lean (the heavy diff is stripped from it —
287
+ // see writeScorecard). The dashboard fetches this file for the viewer.
288
+ if (patch && trialDir) {
289
+ try {
290
+ mkdirSync(trialDir, { recursive: true });
291
+ writeFileSync(join(trialDir, "changes.diff"), patch);
292
+ result.modelPatchFile = `${opts.sessionTrialRel ?? trialDir}/changes.diff`;
293
+ }
294
+ catch {
295
+ /* best-effort: a missing file just hides the dashboard "files" button */
296
+ }
297
+ }
298
+ }
210
299
  // 5a. Behavioral grade (GitHub mutations).
211
300
  const behavioralExpect = gradeBehavioral(inst.expect_github, fake, { issueNumber, branch });
212
301
  const triage = gradeTriage(inst.triage_gold, fake, issueNumber);
@@ -214,23 +303,78 @@ export async function runInstance(inst, opts) {
214
303
  ok: behavioralExpect.ok && triage.ok,
215
304
  checks: [...behavioralExpect.checks, ...triage.checks],
216
305
  };
217
- // 5b. Execution grade (code-fix only).
218
- if (isCodeFix && (inst.FAIL_TO_PASS?.length || inst.test_patch || inst.test_cmd)) {
219
- const workDir = join(stateDir, "sandboxes", taskId);
306
+ // 5b-pr. PR-review grade (pr-review only): the submitted review scored
307
+ // against the gold set by an LLM judge → precision / recall / F-beta. A judge
308
+ // failure is surfaced as a harness error (the case is ungraded) rather than a
309
+ // silent zero, so it doesn't masquerade as a real score.
310
+ if (isPrReview && inst.review_gold) {
311
+ const reviews = fake.submittedReviews(issueNumber);
312
+ // Opt-in (`--judge-with-diff`): feed the PR diff to the judge so it can
313
+ // resolve terse, location-anchored review comments. The diff is base..head,
314
+ // already in the seeded workspace — no network.
315
+ let diff;
316
+ if (opts.judge?.withDiff && inst.pr && seed) {
317
+ try {
318
+ diff = execFileSync("git", ["diff", `${inst.pr.base_commit}..${inst.pr.head_commit}`], {
319
+ cwd: repoDir,
320
+ encoding: "utf8",
321
+ maxBuffer: 64 * 1024 * 1024,
322
+ });
323
+ }
324
+ catch {
325
+ /* leave diff undefined — judge falls back to diff-blind */
326
+ }
327
+ }
328
+ const rg = await gradeReview({ gold: inst.review_gold, reviews, beta: opts.judge?.beta, diff });
329
+ result.review = {
330
+ precision: rg.precision,
331
+ recall: rg.recall,
332
+ fbeta: rg.fbeta,
333
+ beta: rg.beta,
334
+ posted: rg.posted,
335
+ gold: rg.gold,
336
+ matched: rg.matched,
337
+ falsePositives: rg.falsePositives,
338
+ falseNegatives: rg.falseNegatives,
339
+ trace: rg.trace,
340
+ };
341
+ if (rg.error)
342
+ result.error = result.error ?? `review judge: ${rg.error}`;
343
+ }
344
+ // 5b. Execution grade (code-fix only). Two modes:
345
+ // - Default (suite): run the repo's own `test_cmd` on the agent's final
346
+ // tree, resolved iff it exits 0. Nothing held out, nothing applied.
347
+ // - Hold-out (`hold_out_tests`): SWE-bench style — apply the maintainer's
348
+ // `test_patch` the agent never saw and grade named FAIL_TO_PASS / PASS_TO_PASS.
349
+ if (isCodeFix && (inst.test_cmd || inst.test_patch || inst.FAIL_TO_PASS?.length)) {
350
+ const holdOut = !!inst.hold_out_tests;
220
351
  const heldOutDir = opts.datasetDir ? join(opts.datasetDir, "tests", inst.instance_id) : undefined;
221
352
  const exec = gradeExecution({
222
- workDir,
223
- heldOutDir,
224
- testPatch: inst.test_patch,
225
- failToPass: inst.FAIL_TO_PASS ?? [],
226
- passToPass: inst.PASS_TO_PASS ?? [],
353
+ workDir: repoDir,
354
+ heldOutDir: holdOut ? heldOutDir : undefined,
355
+ testPatch: holdOut ? inst.test_patch : undefined,
356
+ failToPass: holdOut ? inst.FAIL_TO_PASS ?? [] : [],
357
+ passToPass: holdOut ? inst.PASS_TO_PASS ?? [] : [],
227
358
  testCmd: inst.test_cmd,
228
359
  setupCmd: inst.setup_cmd,
229
360
  });
230
361
  result.resolved = exec.resolved;
231
362
  result.failToPass = exec.failToPass;
232
363
  result.passToPass = exec.passToPass;
233
- result.model_patch = gitDiff(workDir);
364
+ // (model_patch is captured in 5b' above, before grading mutates the tree.)
365
+ // Persist the held-out test output (setup log + TAP) so the dashboard can
366
+ // show WHY a case was (un)resolved, not just the verdict. Lives beside the
367
+ // trial's session logs, referenced by the same run-relative path scheme.
368
+ if (trialDir) {
369
+ try {
370
+ mkdirSync(trialDir, { recursive: true });
371
+ writeFileSync(join(trialDir, "execution.log"), exec.raw ?? "");
372
+ result.executionLog = `${opts.sessionTrialRel ?? trialDir}/execution.log`;
373
+ }
374
+ catch {
375
+ /* best-effort: a missing log just hides the dashboard link */
376
+ }
377
+ }
234
378
  }
235
379
  // 5c. Metrics. Drain the fire-and-forget session flush first so the final
236
380
  // `result` envelope (cost/tokens) has landed before we read + clean up.
@@ -323,12 +467,35 @@ function restoreEnv(snap) {
323
467
  process.env[k] = v;
324
468
  }
325
469
  }
326
- function gitDiff(workDir) {
470
+ /**
471
+ * Unified diff of the agent's final tree vs the seeded `base` commit — capturing
472
+ * committed, uncommitted AND new/deleted files. Run inside the repo subdir, so
473
+ * workflow scaffolding (AGENTS.md, .lastlight-skills/) at the workspace root is
474
+ * naturally out of scope, and `git add -A` honours the repo's ignores (incl. the
475
+ * harness's `node_modules` exclude from {@link seedWorkspace}) — so the diff is
476
+ * the repo's own change alone. Staged into a throwaway index (`GIT_INDEX_FILE`)
477
+ * so the repo's real index is untouched and the later `gradeExecution`
478
+ * `git apply` still works.
479
+ */
480
+ export function gitDiffAgainstBase(workDir, base) {
481
+ const tmpIndex = join(workDir, ".git", `eval-index-${process.pid}`);
482
+ const env = { ...process.env, GIT_INDEX_FILE: tmpIndex };
327
483
  try {
328
- return execFileSync("git", ["diff", "HEAD"], { cwd: workDir, stdio: ["ignore", "pipe", "ignore"] }).toString();
484
+ execFileSync("git", ["read-tree", base], { cwd: workDir, env, stdio: "ignore" });
485
+ execFileSync("git", ["add", "-A"], { cwd: workDir, env, stdio: "ignore" });
486
+ const out = execFileSync("git", ["diff", "--cached", base], {
487
+ cwd: workDir,
488
+ env,
489
+ maxBuffer: 64 * 1024 * 1024,
490
+ stdio: ["ignore", "pipe", "ignore"],
491
+ }).toString();
492
+ return out || undefined;
329
493
  }
330
494
  catch {
331
495
  return undefined;
332
496
  }
497
+ finally {
498
+ rmSync(tmpIndex, { force: true });
499
+ }
333
500
  }
334
501
  //# sourceMappingURL=run-instance.js.map