lastlight-evals 0.10.0 → 0.12.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/dashboard/dist/assets/index-B4TAaIUR.css +1 -0
- package/dashboard/dist/assets/index-LFdFc6Z9.js +109 -0
- package/dashboard/dist/index.html +2 -2
- package/datasets/aacr-bench/README.md +146 -0
- package/datasets/pr-review/README.md +41 -0
- package/datasets/pr-review/anchors.json +3709 -0
- package/dist/add-case.js.map +1 -1
- package/dist/arm.js +14 -5
- package/dist/arm.js.map +1 -1
- package/dist/bootstrap.js +14 -0
- package/dist/bootstrap.js.map +1 -1
- package/dist/clean.js.map +1 -1
- package/dist/config.js +59 -20
- package/dist/config.js.map +1 -1
- package/dist/fake-github.js +72 -0
- package/dist/fake-github.js.map +1 -1
- package/dist/grade.js +308 -64
- package/dist/grade.js.map +1 -1
- package/dist/init.js.map +1 -1
- package/dist/judge.js +19 -0
- package/dist/judge.js.map +1 -1
- package/dist/mechanism.test.js +303 -13
- package/dist/mechanism.test.js.map +1 -1
- package/dist/metrics.js +88 -9
- package/dist/metrics.js.map +1 -1
- package/dist/paths.js +135 -1
- package/dist/paths.js.map +1 -1
- package/dist/phase-models.js +56 -0
- package/dist/phase-models.js.map +1 -0
- package/dist/pool.js +32 -0
- package/dist/pool.js.map +1 -0
- package/dist/pool.test.js +180 -0
- package/dist/pool.test.js.map +1 -0
- package/dist/pr-context.js +77 -6
- package/dist/pr-context.js.map +1 -1
- package/dist/repeats.test.js +317 -0
- package/dist/repeats.test.js.map +1 -0
- package/dist/report.js +99 -5
- package/dist/report.js.map +1 -1
- package/dist/review-metrics.js +571 -0
- package/dist/review-metrics.js.map +1 -0
- package/dist/review-metrics.test.js +634 -0
- package/dist/review-metrics.test.js.map +1 -0
- package/dist/review-pipeline-stats.js +455 -0
- package/dist/review-pipeline-stats.js.map +1 -0
- package/dist/review-pipeline-stats.test.js +413 -0
- package/dist/review-pipeline-stats.test.js.map +1 -0
- package/dist/run-instance.js +176 -45
- package/dist/run-instance.js.map +1 -1
- package/dist/run.js +637 -122
- package/dist/run.js.map +1 -1
- package/dist/schema.js +22 -1
- package/dist/schema.js.map +1 -1
- package/package.json +9 -8
- package/dashboard/dist/assets/index-B1jNgf2P.js +0 -313
- 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;
|
|
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
|
package/dist/pool.js.map
ADDED
|
@@ -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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"}
|
package/dist/pr-context.js
CHANGED
|
@@ -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)
|
|
@@ -93,6 +93,12 @@ export function buildPrState(args) {
|
|
|
93
93
|
// gates attempt bookkeeping, which this harness does not run.
|
|
94
94
|
headAuthor: "dependabot[bot]",
|
|
95
95
|
headIsOurs: false,
|
|
96
|
+
// Nor did it OPEN the PR — a distinct question from `headIsOurs`, and the
|
|
97
|
+
// one the review gate reads. Every eval case is a third party's pull
|
|
98
|
+
// request; a case that set this would be asking the harness to grade a
|
|
99
|
+
// review the dispatch gate refuses to run at all.
|
|
100
|
+
authorLogin: "dependabot[bot]",
|
|
101
|
+
authorIsOurs: false,
|
|
96
102
|
headRef: s.head_ref ?? args.branch,
|
|
97
103
|
baseRef: s.base_ref ?? "main",
|
|
98
104
|
isDraft: s.is_draft ?? false,
|
|
@@ -111,6 +117,22 @@ export function buildPrState(args) {
|
|
|
111
117
|
lastBotReview: null,
|
|
112
118
|
pathsSinceLastBotReview: null,
|
|
113
119
|
ciReport: toCiReport(s.ci_jobs),
|
|
120
|
+
// The `spec` axis's two ends. Both inert unless the case seeds them AND the
|
|
121
|
+
// arm turns `review.analysis` on — with the axis off, `renderContext` omits
|
|
122
|
+
// every variable they feed, so a case that seeds neither is byte-identical
|
|
123
|
+
// to one written before WP0.
|
|
124
|
+
closes: (s.closes ?? []).map((c) => ({
|
|
125
|
+
number: c.number,
|
|
126
|
+
title: c.title,
|
|
127
|
+
body: c.body,
|
|
128
|
+
...(c.state ? { state: c.state } : {}),
|
|
129
|
+
...(c.url ? { url: c.url } : {}),
|
|
130
|
+
})),
|
|
131
|
+
// `??`, not `||`: a case seeding `[]` is asserting "this PR changes no
|
|
132
|
+
// files", which is a different fact from "we could not read the list" and
|
|
133
|
+
// yields a different degraded message. Only a genuinely absent seed falls
|
|
134
|
+
// through to the harness-derived set.
|
|
135
|
+
changedFiles: s.changed_files ?? args.changedFiles ?? null,
|
|
114
136
|
attempt: s.attempt ?? 1,
|
|
115
137
|
flakyDeferrals: s.flaky_deferrals ?? 0,
|
|
116
138
|
escalatedAtSha: null,
|
|
@@ -140,11 +162,37 @@ export function buildPrState(args) {
|
|
|
140
162
|
readErrors: [],
|
|
141
163
|
};
|
|
142
164
|
}
|
|
143
|
-
/**
|
|
144
|
-
|
|
165
|
+
/**
|
|
166
|
+
* The effective policy blocks for a case: shipped defaults under its overrides.
|
|
167
|
+
*
|
|
168
|
+
* Two override layers for `review`, applied in that order:
|
|
169
|
+
* 1. the case's `pr_state.review` (gold), then
|
|
170
|
+
* 2. the ARM's `review:` (its overlay `config.yaml`), which wins on the keys
|
|
171
|
+
* it names.
|
|
172
|
+
*
|
|
173
|
+
* The arm goes last because it is the axis under measurement: an overlay that
|
|
174
|
+
* says `analysis.enabled: true` must produce a pipeline-on run for every case in
|
|
175
|
+
* the tier, and a baseline overlay that says nothing about `analysis` must leave
|
|
176
|
+
* whatever the case declared alone. A gold file can therefore never flip an arm.
|
|
177
|
+
*/
|
|
178
|
+
export function prPolicy(seed, armReview) {
|
|
179
|
+
const reviewDefaults = defaultReviewConfig();
|
|
145
180
|
return {
|
|
146
181
|
fix: { ...defaultFixConfig(), ...(seed?.fix ?? {}) },
|
|
147
182
|
dependencies: { ...defaultDependenciesConfig(), ...(seed?.dependencies ?? {}) },
|
|
183
|
+
review: {
|
|
184
|
+
...reviewDefaults,
|
|
185
|
+
...(seed?.review ?? {}),
|
|
186
|
+
...(armReview ?? {}),
|
|
187
|
+
// A one-level spread would drop `maxSpecObligations` the moment a case
|
|
188
|
+
// seeded `{ analysis: { enabled: true } }`, so the nested block merges
|
|
189
|
+
// leaf-by-leaf.
|
|
190
|
+
analysis: {
|
|
191
|
+
...reviewDefaults.analysis,
|
|
192
|
+
...(seed?.review?.analysis ?? {}),
|
|
193
|
+
...(armReview?.analysis ?? {}),
|
|
194
|
+
},
|
|
195
|
+
},
|
|
148
196
|
};
|
|
149
197
|
}
|
|
150
198
|
/**
|
|
@@ -157,11 +205,34 @@ export function prPolicy(seed) {
|
|
|
157
205
|
* exactly what the seam contributes — and so a workflow that is not PR-scoped
|
|
158
206
|
* gets nothing at all.
|
|
159
207
|
*/
|
|
160
|
-
export function prContextPatch(args) {
|
|
208
|
+
export async function prContextPatch(args) {
|
|
161
209
|
const state = buildPrState(args);
|
|
162
|
-
|
|
210
|
+
// Production order, then the case's overrides. `resolveSpecContext` fills both
|
|
211
|
+
// ends unconditionally and never throws (a failed read lands in `readErrors`
|
|
212
|
+
// and leaves the field at the value that cannot cause a wrong claim), so the
|
|
213
|
+
// seeds are re-applied AFTER it — otherwise a case that deliberately seeds
|
|
214
|
+
// `changed_files: []` to measure the degraded path would have the resolver
|
|
215
|
+
// quietly answer its question for it.
|
|
216
|
+
if (args.github) {
|
|
217
|
+
await resolveSpecContext(state, { github: args.github });
|
|
218
|
+
if (args.seed?.closes) {
|
|
219
|
+
state.closes = args.seed.closes.map((c) => ({
|
|
220
|
+
number: c.number,
|
|
221
|
+
title: c.title,
|
|
222
|
+
body: c.body,
|
|
223
|
+
...(c.state ? { state: c.state } : {}),
|
|
224
|
+
...(c.url ? { url: c.url } : {}),
|
|
225
|
+
}));
|
|
226
|
+
}
|
|
227
|
+
if (args.seed?.changed_files)
|
|
228
|
+
state.changedFiles = args.seed.changed_files;
|
|
229
|
+
}
|
|
230
|
+
const { fix, dependencies, review } = prPolicy(args.seed, args.review);
|
|
163
231
|
return {
|
|
164
|
-
|
|
232
|
+
// `review` is passed but deliberately NOT seeded top-level the way `fix` and
|
|
233
|
+
// `dependencies` are: `build.yaml` already emits `output_var: review`, and a
|
|
234
|
+
// top-level object would shadow it (see `apps/server/CLAUDE.md`).
|
|
235
|
+
...renderContext(state, fix, dependencies, review),
|
|
165
236
|
prNumber: args.prNumber,
|
|
166
237
|
fix: fix,
|
|
167
238
|
dependencies: dependencies,
|
package/dist/pr-context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-context.js","sourceRoot":"","sources":["../src/pr-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAEH,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAChB,aAAa,
|
|
1
|
+
{"version":3,"file":"pr-context.js","sourceRoot":"","sources":["../src/pr-context.ts"],"names":[],"mappings":"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"}
|