lastlight-evals 0.10.0 → 0.11.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 (56) hide show
  1. package/dashboard/dist/assets/index-B4TAaIUR.css +1 -0
  2. package/dashboard/dist/assets/index-LFdFc6Z9.js +109 -0
  3. package/dashboard/dist/index.html +2 -2
  4. package/datasets/aacr-bench/README.md +146 -0
  5. package/datasets/pr-review/README.md +41 -0
  6. package/datasets/pr-review/anchors.json +3709 -0
  7. package/dist/add-case.js.map +1 -1
  8. package/dist/arm.js +14 -5
  9. package/dist/arm.js.map +1 -1
  10. package/dist/bootstrap.js +14 -0
  11. package/dist/bootstrap.js.map +1 -1
  12. package/dist/clean.js.map +1 -1
  13. package/dist/config.js +59 -20
  14. package/dist/config.js.map +1 -1
  15. package/dist/fake-github.js +72 -0
  16. package/dist/fake-github.js.map +1 -1
  17. package/dist/grade.js +308 -64
  18. package/dist/grade.js.map +1 -1
  19. package/dist/init.js.map +1 -1
  20. package/dist/judge.js +19 -0
  21. package/dist/judge.js.map +1 -1
  22. package/dist/mechanism.test.js +303 -13
  23. package/dist/mechanism.test.js.map +1 -1
  24. package/dist/metrics.js +88 -9
  25. package/dist/metrics.js.map +1 -1
  26. package/dist/paths.js +135 -1
  27. package/dist/paths.js.map +1 -1
  28. package/dist/phase-models.js +56 -0
  29. package/dist/phase-models.js.map +1 -0
  30. package/dist/pool.js +32 -0
  31. package/dist/pool.js.map +1 -0
  32. package/dist/pool.test.js +180 -0
  33. package/dist/pool.test.js.map +1 -0
  34. package/dist/pr-context.js +71 -6
  35. package/dist/pr-context.js.map +1 -1
  36. package/dist/repeats.test.js +317 -0
  37. package/dist/repeats.test.js.map +1 -0
  38. package/dist/report.js +99 -5
  39. package/dist/report.js.map +1 -1
  40. package/dist/review-metrics.js +571 -0
  41. package/dist/review-metrics.js.map +1 -0
  42. package/dist/review-metrics.test.js +634 -0
  43. package/dist/review-metrics.test.js.map +1 -0
  44. package/dist/review-pipeline-stats.js +414 -0
  45. package/dist/review-pipeline-stats.js.map +1 -0
  46. package/dist/review-pipeline-stats.test.js +413 -0
  47. package/dist/review-pipeline-stats.test.js.map +1 -0
  48. package/dist/run-instance.js +176 -45
  49. package/dist/run-instance.js.map +1 -1
  50. package/dist/run.js +637 -122
  51. package/dist/run.js.map +1 -1
  52. package/dist/schema.js +22 -1
  53. package/dist/schema.js.map +1 -1
  54. package/package.json +9 -8
  55. package/dashboard/dist/assets/index-B1jNgf2P.js +0 -313
  56. package/dashboard/dist/assets/index-Sic0jI7y.css +0 -1
package/dist/paths.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,gFAAgF;AAChF,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,mBAAmB;IACjC,OAAO,OAAO,CAAC,WAAW,EAAE,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,yBAAyB;QAC1C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;QAChD,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB;QACpC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC1C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACnF,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,GAAG,IAAI,SAAS,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,IAAU,EAAE,MAAe,EAAE,SAAkB;IACvE,+CAA+C;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACnD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,EAAE,GAAG,IAAI,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE;QAAE,EAAE,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;IAC1E,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Map a runner phase ROW back to the YAML `model:` template that governed it,
3
+ * for scorecard RECORDING (`PhaseMetric.model`) in `config` runs.
4
+ *
5
+ * `wf.phases` rows carry LEDGER labels, not YAML phase names: a `type: fanout`
6
+ * phase's branches come back as `<parent>_branch_<name>` (plus `_retry` /
7
+ * `_check` — see `packages/workflow-engine/src/core/phase-ref.ts`, the single
8
+ * authority for those labels). A naive `def.phases`-by-name lookup therefore
9
+ * missed every branch row, and `recordPhaseModel(undefined, <label>)` fell all
10
+ * the way through to `models.default` — the scorecard said surveys ran the
11
+ * default model while the session envelopes proved otherwise (money trap 12
12
+ * in `docs/plans/deterministic-pr-levers.md`; journal §2j in git history).
13
+ * Execution was always correct (`fanout.ts:776` resolves
14
+ * `branch.model ?? phase.model`); only the recording lied.
15
+ *
16
+ * So the label is parsed back through core's own `PhaseRef.parse`, and a branch
17
+ * row resolves its template exactly as core's executor does
18
+ * (`apps/server/src/workflows/handlers/fanout.ts` `branchConfig`):
19
+ * `branch.model ?? phase.model`, with the PARENT phase name as the resolver's
20
+ * fallback task. Non-branch rows keep the old behaviour byte-for-byte
21
+ * (a declared name maps to its own `model:`; a loop-derived `_fix_`/`_iter_`
22
+ * label maps to no template, as before — those run `fix_model`/the loop's own
23
+ * config, which this recorder has never modelled).
24
+ */
25
+ import { PhaseRef } from "lastlight-workflow-engine";
26
+ /** Resolve the `model:` template (and fallback task) for one `wf.phases` row. */
27
+ export function modelTemplateForRow(phases, label) {
28
+ // A declared phase name wins outright — even one that happens to look like a
29
+ // generated label — matching the old exact-name map.
30
+ const declared = phases.find((p) => p.name === label);
31
+ if (declared)
32
+ return { template: declared.model, fallbackPhase: undefined };
33
+ const ref = PhaseRef.parse(label);
34
+ if (ref.kind === "branch" || ref.kind === "branchRetry" || ref.kind === "branchCheck") {
35
+ const parent = phases.find((p) => p.name === ref.base);
36
+ const branch = parent?.branches?.find((b) => b.name === ref.branch);
37
+ // `branch.model ?? phase.model` — the branch may declare its own override
38
+ // (none do today, but core honours it, so the recorder must too).
39
+ return { template: branch?.model ?? parent?.model, fallbackPhase: ref.base };
40
+ }
41
+ // A generic-loop iteration re-runs ITS OWN phase — `adjudicate_iter_1` is the
42
+ // `adjudicate` phase, template and all — so it resolves the base phase's
43
+ // `model:` exactly like the plain row. Without this, the one workflow phase
44
+ // that always runs as `_iter_N` (adjudicate) stamped `models.default` while
45
+ // the session envelope proved it ran the `{{#if models.review-adjudicate}}`
46
+ // template's answer — the same lie as the branch rows, one label shape over.
47
+ if (ref.kind === "iter" || ref.kind === "retry" || ref.kind === "check") {
48
+ const parent = phases.find((p) => p.name === ref.base);
49
+ return { template: parent?.model, fallbackPhase: ref.base };
50
+ }
51
+ // Reviewer-loop rows (`_fix_N` / `_recheck_N`): no template, as before —
52
+ // those run `fix_model`/the loop's own config, which this recorder has never
53
+ // modelled; recordPhaseModel then resolves models[<label>] → models.default.
54
+ return { template: undefined, fallbackPhase: undefined };
55
+ }
56
+ //# sourceMappingURL=phase-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-models.js","sourceRoot":"","sources":["../src/phase-models.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAkBrD,iFAAiF;AACjF,MAAM,UAAU,mBAAmB,CAAC,MAAmC,EAAE,KAAa;IACpF,6EAA6E;IAC7E,qDAAqD;IACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IACtD,IAAI,QAAQ;QAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;IAE5E,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACtF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;QACpE,0EAA0E;QAC1E,kEAAkE;QAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IAC/E,CAAC;IAED,8EAA8E;IAC9E,yEAAyE;IACzE,4EAA4E;IAC5E,4EAA4E;IAC5E,4EAA4E;IAC5E,6EAA6E;IAC7E,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;QACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9D,CAAC;IAED,yEAAyE;IACzE,6EAA6E;IAC7E,6EAA6E;IAC7E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;AAC3D,CAAC"}
package/dist/pool.js ADDED
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Bounded-concurrency map that preserves input order.
3
+ *
4
+ * One implementation, two callers: the eval runner's within-arm case concurrency
5
+ * (`--concurrency N`) and `scripts/aacr-adjudicate.ts`. Order preservation is the
6
+ * load-bearing property — results index-align with `items`, so a caller can zip
7
+ * them back against its own list without threading ids through.
8
+ *
9
+ * `limit <= 1` degenerates to a single worker draining the queue in order, which
10
+ * is exactly a serial `for` loop. That is what makes the default safe: nothing
11
+ * about the surrounding run changes when concurrency is off.
12
+ *
13
+ * Errors are NOT caught here. A caller that must not let one bad item take the
14
+ * batch down returns the failure as a value (both callers do — an eval case
15
+ * records `result.error`, an adjudicated row records an `error` field), which
16
+ * keeps "this item failed" distinguishable from "this item was never attempted".
17
+ */
18
+ export async function mapPool(items, limit, fn) {
19
+ const out = new Array(items.length);
20
+ let next = 0;
21
+ const workers = Array.from({ length: Math.max(1, Math.min(limit, items.length)) }, async () => {
22
+ for (;;) {
23
+ const i = next++;
24
+ if (i >= items.length)
25
+ return;
26
+ out[i] = await fn(items[i], i);
27
+ }
28
+ });
29
+ await Promise.all(workers);
30
+ return out;
31
+ }
32
+ //# sourceMappingURL=pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.js","sourceRoot":"","sources":["../src/pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,KAAU,EACV,KAAa,EACb,EAAsC;IAEtC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;QAC5F,SAAS,CAAC;YACR,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO;YAC9B,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,180 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { mkdtempSync, mkdirSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { mapPool } from "./pool.js";
6
+ import { bucketSessionsByPhase, listSessionFiles } from "./metrics.js";
7
+ /**
8
+ * `mapPool` is what makes `--concurrency N` safe to default to 1: the whole
9
+ * "byte-identical when the flag is absent" claim rests on limit<=1 being an
10
+ * ordinary serial loop, and on results index-aligning with their inputs.
11
+ */
12
+ describe("mapPool", () => {
13
+ it("preserves input order regardless of completion order", async () => {
14
+ // Later items finish FIRST, so any implementation that pushes on completion
15
+ // rather than assigning by index comes back reversed.
16
+ const items = [40, 30, 20, 10];
17
+ const out = await mapPool(items, 4, async (ms) => {
18
+ await new Promise((r) => setTimeout(r, ms));
19
+ return ms;
20
+ });
21
+ expect(out).toEqual([40, 30, 20, 10]);
22
+ });
23
+ it("never exceeds the concurrency bound", async () => {
24
+ let inFlight = 0;
25
+ let peak = 0;
26
+ await mapPool(Array.from({ length: 20 }, (_, i) => i), 3, async (i) => {
27
+ inFlight++;
28
+ peak = Math.max(peak, inFlight);
29
+ await new Promise((r) => setTimeout(r, 5));
30
+ inFlight--;
31
+ return i;
32
+ });
33
+ expect(peak).toBe(3);
34
+ });
35
+ it("limit 1 is a serial loop — the default's no-op property", async () => {
36
+ const order = [];
37
+ let peak = 0;
38
+ let inFlight = 0;
39
+ await mapPool([1, 2, 3, 4], 1, async (i) => {
40
+ inFlight++;
41
+ peak = Math.max(peak, inFlight);
42
+ await new Promise((r) => setTimeout(r, 1));
43
+ order.push(i);
44
+ inFlight--;
45
+ return i;
46
+ });
47
+ expect(peak).toBe(1);
48
+ // Started AND finished strictly in order — no interleaving at all.
49
+ expect(order).toEqual([1, 2, 3, 4]);
50
+ });
51
+ it("handles an empty list without spawning a worker", async () => {
52
+ expect(await mapPool([], 8, async () => 1)).toEqual([]);
53
+ });
54
+ it("propagates a rejection rather than swallowing it", async () => {
55
+ await expect(mapPool([1, 2], 2, async (i) => {
56
+ if (i === 2)
57
+ throw new Error("boom");
58
+ return i;
59
+ })).rejects.toThrow("boom");
60
+ });
61
+ });
62
+ /**
63
+ * Phase attribution is the other half of the instrument: a session file belongs
64
+ * to the last phase that started at or before its first line.
65
+ */
66
+ describe("bucketSessionsByPhase", () => {
67
+ const starts = [
68
+ { phase: "facts", start: 1_000 },
69
+ { phase: "seed", start: 2_000 },
70
+ { phase: "survey", start: 3_000 },
71
+ ];
72
+ it("attributes each session to the phase whose window it falls in", () => {
73
+ const { buckets, order } = bucketSessionsByPhase([
74
+ { file: "a.jsonl", firstTs: 1_100 },
75
+ { file: "b.jsonl", firstTs: 2_500 },
76
+ { file: "c.jsonl", firstTs: 3_200 },
77
+ ], starts);
78
+ expect(order).toEqual(["facts", "seed", "survey"]);
79
+ expect(buckets.get("facts")).toEqual(["a.jsonl"]);
80
+ expect(buckets.get("seed")).toEqual(["b.jsonl"]);
81
+ expect(buckets.get("survey")).toEqual(["c.jsonl"]);
82
+ });
83
+ it("collapses an UNSTAMPED fan-out onto one phase — the limit the stamp exists to fix", () => {
84
+ // Six concurrent branches, no stamps: the window rule can only answer with
85
+ // the last phase started before each file, so all six land on the parent.
86
+ // That is exactly the misattribution that hid $1.23 of a $2.01 case, and it
87
+ // is why this is the FALLBACK. The stamped case below is the real rule.
88
+ const files = [3_050, 3_060, 3_070, 3_080, 3_090, 3_100].map((t, i) => ({
89
+ file: `s${i}.jsonl`,
90
+ firstTs: t,
91
+ }));
92
+ const { buckets, order } = bucketSessionsByPhase(files, starts);
93
+ expect(order).toEqual(["survey"]);
94
+ expect(buckets.get("survey")).toHaveLength(6);
95
+ });
96
+ it("gives a session 50ms of slack against its phase's start", () => {
97
+ // The write lands fractionally before the callback records the start.
98
+ const { buckets } = bucketSessionsByPhase([{ file: "x.jsonl", firstTs: 1_970 }], starts);
99
+ expect(buckets.get("seed")).toEqual(["x.jsonl"]);
100
+ });
101
+ it("falls back to the first phase for a session that predates every start", () => {
102
+ const { buckets } = bucketSessionsByPhase([{ file: "early.jsonl", firstTs: 5 }], starts);
103
+ expect(buckets.get("facts")).toEqual(["early.jsonl"]);
104
+ });
105
+ it("is total on an empty phase list", () => {
106
+ const { buckets } = bucketSessionsByPhase([{ file: "o.jsonl", firstTs: 9 }], []);
107
+ expect(buckets.get("session")).toEqual(["o.jsonl"]);
108
+ });
109
+ it("prefers the stamp over the window when they disagree", () => {
110
+ // `writeCommandSession` writes a command's session AFTER it finishes, so
111
+ // `facts`' jsonl can land at `seed`'s start. The window rule bills it to
112
+ // `seed` — a model-free bash phase reporting agent time. The stamp does not.
113
+ const { buckets } = bucketSessionsByPhase([{ file: "facts.jsonl", firstTs: 2_400, phase: "facts" }], starts);
114
+ expect(buckets.get("facts")).toEqual(["facts.jsonl"]);
115
+ expect(buckets.has("seed")).toBe(false);
116
+ });
117
+ it("gives every stamped fan-out branch its own bucket", () => {
118
+ const families = ["contract", "enforcement", "security", "state", "tests", "spec"];
119
+ // Launched within 35ms of each other — indistinguishable to a start-time
120
+ // lookup, exact under the stamp.
121
+ const files = families.map((f, i) => ({
122
+ file: `${f}.jsonl`,
123
+ firstTs: 3_050 + i * 7,
124
+ phase: `survey_branch_${f}`,
125
+ }));
126
+ const { buckets, order } = bucketSessionsByPhase(files, starts);
127
+ expect(order).toEqual(families.map((f) => `survey_branch_${f}`));
128
+ for (const f of families)
129
+ expect(buckets.get(`survey_branch_${f}`)).toEqual([`${f}.jsonl`]);
130
+ });
131
+ it("mixes stamped and unstamped sessions in one run", () => {
132
+ // What a re-scored historical run looks like mid-migration.
133
+ const { buckets } = bucketSessionsByPhase([
134
+ { file: "old.jsonl", firstTs: 1_100 },
135
+ { file: "new.jsonl", firstTs: 1_200, phase: "survey_branch_spec" },
136
+ ], starts);
137
+ expect(buckets.get("facts")).toEqual(["old.jsonl"]);
138
+ expect(buckets.get("survey_branch_spec")).toEqual(["new.jsonl"]);
139
+ });
140
+ it("ignores an empty stamp rather than bucketing under the empty string", () => {
141
+ const { buckets } = bucketSessionsByPhase([{ file: "e.jsonl", firstTs: 1_100, phase: "" }], starts);
142
+ expect(buckets.get("facts")).toEqual(["e.jsonl"]);
143
+ });
144
+ });
145
+ describe("listSessionFiles", () => {
146
+ const write = (dir, name, lines) => {
147
+ mkdirSync(dir, { recursive: true });
148
+ writeFileSync(join(dir, name), lines.map((l) => JSON.stringify(l)).join("\n") + "\n");
149
+ };
150
+ it("reads the phase stamp off the opening envelope", () => {
151
+ const root = mkdtempSync(join(tmpdir(), "ll-sessions-"));
152
+ const proj = join(root, "projects", "-w");
153
+ write(proj, "a.jsonl", [
154
+ { type: "user", timestamp: "2026-08-22T14:40:10.500Z", phase: "survey_branch_contract" },
155
+ { type: "result", timestamp: "2026-08-22T14:40:26.000Z", phase: "survey_branch_contract" },
156
+ ]);
157
+ const [f] = listSessionFiles(root);
158
+ expect(f.phase).toBe("survey_branch_contract");
159
+ expect(f.firstTs).toBe(Date.parse("2026-08-22T14:40:10.500Z"));
160
+ });
161
+ it("finds a stamp that only appears on the closing envelope", () => {
162
+ // A session bootstrapped from a stub `session` record carries no stamp on
163
+ // line 1, so the scan must not stop at the first timestamp.
164
+ const root = mkdtempSync(join(tmpdir(), "ll-sessions-"));
165
+ write(join(root, "projects", "-w"), "b.jsonl", [
166
+ { type: "session", timestamp: "2026-08-22T14:40:10.500Z" },
167
+ { type: "result", timestamp: "2026-08-22T14:40:26.000Z", phase: "review" },
168
+ ]);
169
+ expect(listSessionFiles(root)[0].phase).toBe("review");
170
+ });
171
+ it("leaves phase undefined for a pre-stamp session", () => {
172
+ const root = mkdtempSync(join(tmpdir(), "ll-sessions-"));
173
+ write(join(root, "projects", "-w"), "c.jsonl", [
174
+ { type: "user", timestamp: "2026-08-20T10:00:00.000Z" },
175
+ { type: "result", timestamp: "2026-08-20T10:01:00.000Z" },
176
+ ]);
177
+ expect(listSessionFiles(root)[0].phase).toBeUndefined();
178
+ });
179
+ });
180
+ //# sourceMappingURL=pool.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool.test.js","sourceRoot":"","sources":["../src/pool.test.ts"],"names":[],"mappings":"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"}
@@ -51,7 +51,7 @@
51
51
  * `class=`, and does it behave differently on the attempt where `flakyPromoted`
52
52
  * is set. The snapshot is therefore an INPUT here, never an assertion target.
53
53
  */
54
- import { defaultDependenciesConfig, defaultFixConfig, renderContext, } from "lastlight-core/evals";
54
+ import { defaultDependenciesConfig, defaultFixConfig, defaultReviewConfig, renderContext, resolveSpecContext, } from "lastlight-core/evals";
55
55
  const CHECKS_DEFAULT = "none";
56
56
  function toCiReport(seeds) {
57
57
  if (!seeds || seeds.length === 0)
@@ -111,6 +111,22 @@ export function buildPrState(args) {
111
111
  lastBotReview: null,
112
112
  pathsSinceLastBotReview: null,
113
113
  ciReport: toCiReport(s.ci_jobs),
114
+ // The `spec` axis's two ends. Both inert unless the case seeds them AND the
115
+ // arm turns `review.analysis` on — with the axis off, `renderContext` omits
116
+ // every variable they feed, so a case that seeds neither is byte-identical
117
+ // to one written before WP0.
118
+ closes: (s.closes ?? []).map((c) => ({
119
+ number: c.number,
120
+ title: c.title,
121
+ body: c.body,
122
+ ...(c.state ? { state: c.state } : {}),
123
+ ...(c.url ? { url: c.url } : {}),
124
+ })),
125
+ // `??`, not `||`: a case seeding `[]` is asserting "this PR changes no
126
+ // files", which is a different fact from "we could not read the list" and
127
+ // yields a different degraded message. Only a genuinely absent seed falls
128
+ // through to the harness-derived set.
129
+ changedFiles: s.changed_files ?? args.changedFiles ?? null,
114
130
  attempt: s.attempt ?? 1,
115
131
  flakyDeferrals: s.flaky_deferrals ?? 0,
116
132
  escalatedAtSha: null,
@@ -140,11 +156,37 @@ export function buildPrState(args) {
140
156
  readErrors: [],
141
157
  };
142
158
  }
143
- /** The effective policy blocks for a case: shipped defaults under its overrides. */
144
- export function prPolicy(seed) {
159
+ /**
160
+ * The effective policy blocks for a case: shipped defaults under its overrides.
161
+ *
162
+ * Two override layers for `review`, applied in that order:
163
+ * 1. the case's `pr_state.review` (gold), then
164
+ * 2. the ARM's `review:` (its overlay `config.yaml`), which wins on the keys
165
+ * it names.
166
+ *
167
+ * The arm goes last because it is the axis under measurement: an overlay that
168
+ * says `analysis.enabled: true` must produce a pipeline-on run for every case in
169
+ * the tier, and a baseline overlay that says nothing about `analysis` must leave
170
+ * whatever the case declared alone. A gold file can therefore never flip an arm.
171
+ */
172
+ export function prPolicy(seed, armReview) {
173
+ const reviewDefaults = defaultReviewConfig();
145
174
  return {
146
175
  fix: { ...defaultFixConfig(), ...(seed?.fix ?? {}) },
147
176
  dependencies: { ...defaultDependenciesConfig(), ...(seed?.dependencies ?? {}) },
177
+ review: {
178
+ ...reviewDefaults,
179
+ ...(seed?.review ?? {}),
180
+ ...(armReview ?? {}),
181
+ // A one-level spread would drop `maxSpecObligations` the moment a case
182
+ // seeded `{ analysis: { enabled: true } }`, so the nested block merges
183
+ // leaf-by-leaf.
184
+ analysis: {
185
+ ...reviewDefaults.analysis,
186
+ ...(seed?.review?.analysis ?? {}),
187
+ ...(armReview?.analysis ?? {}),
188
+ },
189
+ },
148
190
  };
149
191
  }
150
192
  /**
@@ -157,11 +199,34 @@ export function prPolicy(seed) {
157
199
  * exactly what the seam contributes — and so a workflow that is not PR-scoped
158
200
  * gets nothing at all.
159
201
  */
160
- export function prContextPatch(args) {
202
+ export async function prContextPatch(args) {
161
203
  const state = buildPrState(args);
162
- const { fix, dependencies } = prPolicy(args.seed);
204
+ // Production order, then the case's overrides. `resolveSpecContext` fills both
205
+ // ends unconditionally and never throws (a failed read lands in `readErrors`
206
+ // and leaves the field at the value that cannot cause a wrong claim), so the
207
+ // seeds are re-applied AFTER it — otherwise a case that deliberately seeds
208
+ // `changed_files: []` to measure the degraded path would have the resolver
209
+ // quietly answer its question for it.
210
+ if (args.github) {
211
+ await resolveSpecContext(state, { github: args.github });
212
+ if (args.seed?.closes) {
213
+ state.closes = args.seed.closes.map((c) => ({
214
+ number: c.number,
215
+ title: c.title,
216
+ body: c.body,
217
+ ...(c.state ? { state: c.state } : {}),
218
+ ...(c.url ? { url: c.url } : {}),
219
+ }));
220
+ }
221
+ if (args.seed?.changed_files)
222
+ state.changedFiles = args.seed.changed_files;
223
+ }
224
+ const { fix, dependencies, review } = prPolicy(args.seed, args.review);
163
225
  return {
164
- ...renderContext(state, fix, dependencies),
226
+ // `review` is passed but deliberately NOT seeded top-level the way `fix` and
227
+ // `dependencies` are: `build.yaml` already emits `output_var: review`, and a
228
+ // top-level object would shadow it (see `apps/server/CLAUDE.md`).
229
+ ...renderContext(state, fix, dependencies, review),
165
230
  prNumber: args.prNumber,
166
231
  fix: fix,
167
232
  dependencies: dependencies,
@@ -1 +1 @@
1
- {"version":3,"file":"pr-context.js","sourceRoot":"","sources":["../src/pr-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pr-context.js","sourceRoot":"","sources":["../src/pr-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAEH,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,kBAAkB,GAOnB,MAAM,sBAAsB,CAAC;AA8F9B,MAAM,cAAc,GAAG,MAAe,CAAC;AAEvC,SAAS,UAAU,CAAC,KAA8B;IAChD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,MAAM,IAAI,GAAmB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,SAAS;QACrC,UAAU,EAAE,CAAC,CAAC,WAAW;QACzB,aAAa,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI;QACvC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,2EAA2E;QAC3E,uEAAuE;QACvE,iDAAiD;QACjD,GAAG,CAAC,CAAC,CAAC,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,WAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrF,CAAC,CAAC,CAAC;IACJ,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACxD,OAAO;QACL,IAAI;QACJ,aAAa;QACb,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,WAAoB,EAAE,CAAC;KACxE,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAS5B;IACC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,CAAC,CAAC,QAAQ,IAAI,SAAS;QAChC,4EAA4E;QAC5E,8DAA8D;QAC9D,UAAU,EAAE,iBAAiB;QAC7B,UAAU,EAAE,KAAK;QACjB,OAAO,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM;QAClC,OAAO,EAAE,CAAC,CAAC,QAAQ,IAAI,MAAM;QAC7B,OAAO,EAAE,CAAC,CAAC,QAAQ,IAAI,KAAK;QAC5B,MAAM,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK;QAC1B,gBAAgB,EAAE,IAAI,CAAC,IAAI;QAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE;QACtB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,CAAC,CAAC,YAAY,IAAI,cAAc;QAC7C,iBAAiB,EAAE,CAAC,CAAC,mBAAmB,IAAI,CAAC;QAC7C,eAAe,EAAE,CAAC,CAAC,iBAAiB,IAAI,cAAc;QACtD,eAAe,EAAE,IAAI;QACrB,4EAA4E;QAC5E,yEAAyE;QACzE,sBAAsB;QACtB,aAAa,EAAE,IAAI;QACnB,uBAAuB,EAAE,IAAI;QAC7B,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC;QAC/B,4EAA4E;QAC5E,4EAA4E;QAC5E,2EAA2E;QAC3E,6BAA6B;QAC7B,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjC,CAAC,CAAC;QACH,uEAAuE;QACvE,0EAA0E;QAC1E,0EAA0E;QAC1E,sCAAsC;QACtC,YAAY,EAAE,CAAC,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI;QAC1D,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC;QACvB,cAAc,EAAE,CAAC,CAAC,eAAe,IAAI,CAAC;QACtC,cAAc,EAAE,IAAI;QACpB,yEAAyE;QACzE,0EAA0E;QAC1E,0EAA0E;QAC1E,YAAY,EAAE,IAAI;QAClB,gBAAgB,EAAE,IAAI;QACtB,aAAa,EAAE,CAAC,CAAC,cAAc,IAAI,EAAE;QACrC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,EAAE;YACF,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,CAAC,CAAC,IAAa;YACrB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpC,CAAC,CAAC;QACH,mBAAmB,EAAE,CAAC,CAAC,CAAC,qBAAqB,IAAI,IAAI,CAAU;QAC/D,iBAAiB,EAAE,CAAC,CAAC,mBAAmB,IAAI,CAAC;QAC7C,eAAe,EAAE,CAAC,CAAC,iBAAiB,IAAI,CAAC;QACzC,yBAAyB,EAAE,EAAE;QAC7B,WAAW,EAAE,IAAI;QACjB,2EAA2E;QAC3E,iEAAiE;QACjE,iEAAiE;QACjE,UAAU,EAAE,EAAE;KACf,CAAC;AACJ,CAAC;AAYD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,QAAQ,CACtB,IAAkB,EAClB,SAA0B;IAM1B,MAAM,cAAc,GAAG,mBAAmB,EAAE,CAAC;IAC7C,OAAO;QACL,GAAG,EAAE,EAAE,GAAG,gBAAgB,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE;QACpD,YAAY,EAAE,EAAE,GAAG,yBAAyB,EAAE,EAAE,GAAG,CAAC,IAAI,EAAE,YAAY,IAAI,EAAE,CAAC,EAAE;QAC/E,MAAM,EAAE;YACN,GAAG,cAAc;YACjB,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;YACvB,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;YACpB,uEAAuE;YACvE,uEAAuE;YACvE,gBAAgB;YAChB,QAAQ,EAAE;gBACR,GAAG,cAAc,CAAC,QAAQ;gBAC1B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC;gBACjC,GAAG,CAAC,SAAS,EAAE,QAAQ,IAAI,EAAE,CAAC;aAC/B;SACF;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IA4CpC;IACC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAEjC,+EAA+E;IAC/E,6EAA6E;IAC7E,6EAA6E;IAC7E,2EAA2E;IAC3E,2EAA2E;IAC3E,sCAAsC;IACtC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,kBAAkB,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAe,EAAE,CAAC,CAAC;QAClE,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YACtB,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1C,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACjC,CAAC,CAAC,CAAC;QACN,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,aAAa;YAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;IAC7E,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACvE,OAAO;QACL,6EAA6E;QAC7E,6EAA6E;QAC7E,kEAAkE;QAClE,GAAG,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC;QAClD,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,GAAG,EAAE,GAAyC;QAC9C,YAAY,EAAE,YAAkD;KACjE,CAAC;AACJ,CAAC"}