@cef-ai/eval 0.0.0-stage → 0.2.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 (54) hide show
  1. package/README.md +195 -2
  2. package/dist/capture.d.ts +37 -0
  3. package/dist/capture.d.ts.map +1 -0
  4. package/dist/capture.js +70 -0
  5. package/dist/capture.js.map +1 -0
  6. package/dist/conformance.d.ts +6 -0
  7. package/dist/conformance.d.ts.map +1 -0
  8. package/dist/conformance.js +256 -0
  9. package/dist/conformance.js.map +1 -0
  10. package/dist/contract.d.ts +18 -0
  11. package/dist/contract.d.ts.map +1 -0
  12. package/dist/contract.js +176 -0
  13. package/dist/contract.js.map +1 -0
  14. package/dist/index.d.ts +18 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +11 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/layout.d.ts +105 -0
  19. package/dist/layout.d.ts.map +1 -0
  20. package/dist/layout.js +215 -0
  21. package/dist/layout.js.map +1 -0
  22. package/dist/pool.d.ts +13 -0
  23. package/dist/pool.d.ts.map +1 -0
  24. package/dist/pool.js +34 -0
  25. package/dist/pool.js.map +1 -0
  26. package/dist/result.d.ts +11 -0
  27. package/dist/result.d.ts.map +1 -0
  28. package/dist/result.js +72 -0
  29. package/dist/result.js.map +1 -0
  30. package/dist/run.d.ts +86 -0
  31. package/dist/run.d.ts.map +1 -0
  32. package/dist/run.js +240 -0
  33. package/dist/run.js.map +1 -0
  34. package/dist/score.d.ts +102 -0
  35. package/dist/score.d.ts.map +1 -0
  36. package/dist/score.js +433 -0
  37. package/dist/score.js.map +1 -0
  38. package/dist/storage.d.ts +218 -0
  39. package/dist/storage.d.ts.map +1 -0
  40. package/dist/storage.js +577 -0
  41. package/dist/storage.js.map +1 -0
  42. package/dist/summary.d.ts +105 -0
  43. package/dist/summary.d.ts.map +1 -0
  44. package/dist/summary.js +219 -0
  45. package/dist/summary.js.map +1 -0
  46. package/dist/types.d.ts +265 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +14 -0
  49. package/dist/types.js.map +1 -0
  50. package/dist/vault-store.d.ts +46 -0
  51. package/dist/vault-store.d.ts.map +1 -0
  52. package/dist/vault-store.js +127 -0
  53. package/dist/vault-store.js.map +1 -0
  54. package/package.json +27 -3
@@ -0,0 +1,105 @@
1
+ import type { DatasetDiff, Experiment, Metrics, RunRecord, Summary, VersionEntry } from "./types.js";
2
+ export declare function emptyMetrics(): Metrics;
3
+ /** Nearest-rank percentile of a sorted list; null when empty. */
4
+ export declare function percentile(sorted: number[], p: number): number | null;
5
+ /**
6
+ * Roll a set of runs up. `passed`/`failed` count runs whose `pass` is
7
+ * true/false; `unscored` those with null (no expectations, or the harness
8
+ * errored); `errored` those with status `error` (they are also unscored).
9
+ * `passRate` is passed / (passed + failed), null when nothing was judged
10
+ * (ROC calls it Accuracy). `fields` is the same per expected field, over every
11
+ * run's `eval/field@1` score for it; n/a scores (`pass: null`) are counted
12
+ * apart and never move a rate.
13
+ */
14
+ export declare function summarize(runs: RunRecord[]): Summary;
15
+ export type Change = "improved" | "regressed" | "unchanged" | "only-in-base" | "only-in-candidate";
16
+ export interface MetricDelta {
17
+ base: number | null;
18
+ candidate: number | null;
19
+ /** candidate − base; null when either side is missing. */
20
+ delta: number | null;
21
+ /** delta / base; null when base is 0 or missing. */
22
+ relative: number | null;
23
+ }
24
+ export interface RunComparison {
25
+ caseId: string;
26
+ repeat: number;
27
+ change: Change;
28
+ base?: Pick<RunRecord, "status" | "pass" | "output" | "metrics">;
29
+ candidate?: Pick<RunRecord, "status" | "pass" | "output" | "metrics">;
30
+ /** Whether the two outputs differ, pass or not. */
31
+ outputChanged: boolean;
32
+ durationMs: MetricDelta;
33
+ totalTokens: MetricDelta;
34
+ cost: MetricDelta;
35
+ steps: MetricDelta;
36
+ }
37
+ export interface CaseComparison {
38
+ caseId: string;
39
+ change: Change;
40
+ /** Pass rate over the case's judged repeats, each side. */
41
+ basePassRate: number | null;
42
+ candidatePassRate: number | null;
43
+ /** Mean duration over the case's repeats, each side. */
44
+ durationMs: MetricDelta;
45
+ totalTokens: MetricDelta;
46
+ cost: MetricDelta;
47
+ }
48
+ export interface ExperimentComparison {
49
+ base: {
50
+ id: string;
51
+ workflowVersion?: string;
52
+ datasetVersion?: number;
53
+ };
54
+ candidate: {
55
+ id: string;
56
+ workflowVersion?: string;
57
+ datasetVersion?: number;
58
+ };
59
+ /**
60
+ * How the dataset changed from base to candidate (case ids; edited = another
61
+ * revision). Absent unless BOTH sides gave their version's `cases`: derived
62
+ * from run records, a case one side never ran (a cancelled or errored
63
+ * experiment) would read as added or removed though the dataset is the same.
64
+ */
65
+ datasetDiff?: DatasetDiff;
66
+ /** Cases compared: present on both sides at the same revision. */
67
+ comparedOn: number;
68
+ counts: Record<Change, number>;
69
+ cases: CaseComparison[];
70
+ runs: RunComparison[];
71
+ metrics: {
72
+ passRate: MetricDelta;
73
+ durationP50: MetricDelta;
74
+ durationP95: MetricDelta;
75
+ tokensPerRun: MetricDelta;
76
+ costPerRun: MetricDelta;
77
+ stepsPerRun: MetricDelta;
78
+ limitBreaches: MetricDelta;
79
+ };
80
+ }
81
+ export interface ComparisonSide {
82
+ experiment?: Pick<Experiment, "id" | "workflowVersion" | "datasetVersion">;
83
+ runs: RunRecord[];
84
+ /**
85
+ * The cases the side's dataset version pins. Default: read off the runs'
86
+ * `caseRev` — enough to pick the like-for-like cases, not to say how the
87
+ * dataset changed: `datasetDiff` is left out unless both sides give these.
88
+ */
89
+ cases?: ReadonlyArray<Pick<VersionEntry, "id" | "rev">>;
90
+ }
91
+ type Side = ComparisonSide;
92
+ /**
93
+ * How a candidate experiment differs from a baseline: per run (case × repeat),
94
+ * per case (over its repeats), and in the summary metrics.
95
+ *
96
+ * LIKE FOR LIKE ONLY. When the dataset changed between the two experiments,
97
+ * the comparison covers only the cases present on both sides at the same
98
+ * revision (`comparedOn`), and `datasetDiff` (when both sides name their
99
+ * cases) says what was left out: a case whose expectation was edited is not
100
+ * evidence the workflow improved or regressed. Metrics are computed over the compared runs too. A run present on
101
+ * one side only (a repeat that did not run) is still reported as such.
102
+ */
103
+ export declare function compareExperiments(base: Side, candidate: Side): ExperimentComparison;
104
+ export {};
105
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAuB,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1H,wBAAgB,YAAY,IAAI,OAAO,CAYtC;AAED,iEAAiE;AACjE,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIrE;AAID;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAiCpD;AAiBD,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAqBnG,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AASD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC;IACjE,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAC;IACtE,mDAAmD;IACnD,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,wDAAwD;IACxD,UAAU,EAAE,WAAW,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7E;;;;;OAKG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,OAAO,EAAE;QACP,QAAQ,EAAE,WAAW,CAAC;QACtB,WAAW,EAAE,WAAW,CAAC;QACzB,WAAW,EAAE,WAAW,CAAC;QACzB,YAAY,EAAE,WAAW,CAAC;QAC1B,UAAU,EAAE,WAAW,CAAC;QACxB,WAAW,EAAE,WAAW,CAAC;QACzB,aAAa,EAAE,WAAW,CAAC;KAC5B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,iBAAiB,GAAG,gBAAgB,CAAC,CAAC;IAC3E,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;CACzD;AACD,KAAK,IAAI,GAAG,cAAc,CAAC;AAuB3B;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,oBAAoB,CAoFpF"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * An experiment's numbers, and how two experiments differ.
3
+ */
4
+ import { deepEqual, FIELD_SCORER, LIMIT_SCORER } from "./score.js";
5
+ import { diffVersionEntries } from "./storage.js";
6
+ export function emptyMetrics() {
7
+ return {
8
+ durationMs: null,
9
+ inputTokens: 0,
10
+ outputTokens: 0,
11
+ totalTokens: 0,
12
+ cost: 0,
13
+ steps: 0,
14
+ modelCalls: 0,
15
+ cpuUnits: 0,
16
+ gpuUnits: 0,
17
+ };
18
+ }
19
+ /** Nearest-rank percentile of a sorted list; null when empty. */
20
+ export function percentile(sorted, p) {
21
+ if (sorted.length === 0)
22
+ return null;
23
+ const rank = Math.ceil((p / 100) * sorted.length);
24
+ return sorted[Math.min(sorted.length, Math.max(1, rank)) - 1];
25
+ }
26
+ const round = (n, places = 6) => Math.round(n * 10 ** places) / 10 ** places;
27
+ /**
28
+ * Roll a set of runs up. `passed`/`failed` count runs whose `pass` is
29
+ * true/false; `unscored` those with null (no expectations, or the harness
30
+ * errored); `errored` those with status `error` (they are also unscored).
31
+ * `passRate` is passed / (passed + failed), null when nothing was judged
32
+ * (ROC calls it Accuracy). `fields` is the same per expected field, over every
33
+ * run's `eval/field@1` score for it; n/a scores (`pass: null`) are counted
34
+ * apart and never move a rate.
35
+ */
36
+ export function summarize(runs) {
37
+ const passed = runs.filter((r) => r.pass === true).length;
38
+ const failed = runs.filter((r) => r.pass === false).length;
39
+ const durations = runs
40
+ .map((r) => r.metrics.durationMs)
41
+ .filter((d) => typeof d === "number" && Number.isFinite(d))
42
+ .sort((a, b) => a - b);
43
+ const tokens = runs.reduce((s, r) => s + (r.metrics.totalTokens || 0), 0);
44
+ const cost = runs.reduce((s, r) => s + (r.metrics.cost || 0), 0);
45
+ const steps = runs.reduce((s, r) => s + (r.metrics.steps || 0), 0);
46
+ const n = runs.length;
47
+ return {
48
+ cases: new Set(runs.map((r) => r.caseId)).size,
49
+ runs: n,
50
+ passed,
51
+ failed,
52
+ errored: runs.filter((r) => r.status === "error").length,
53
+ unscored: runs.filter((r) => r.pass === null).length,
54
+ passRate: passed + failed === 0 ? null : round(passed / (passed + failed)),
55
+ durationMs: {
56
+ p50: percentile(durations, 50),
57
+ p95: percentile(durations, 95),
58
+ mean: durations.length ? round(durations.reduce((s, d) => s + d, 0) / durations.length, 1) : null,
59
+ },
60
+ tokens: { total: tokens, meanPerRun: n ? round(tokens / n, 2) : 0 },
61
+ cost: { total: round(cost), meanPerRun: n ? round(cost / n) : 0 },
62
+ steps: { meanPerRun: n ? round(steps / n, 2) : 0 },
63
+ limitBreaches: runs.reduce((s, r) => s + r.scores.filter((x) => x.scorer === LIMIT_SCORER && x.pass === false).length, 0),
64
+ fields: fieldAccuracy(runs),
65
+ };
66
+ }
67
+ function fieldAccuracy(runs) {
68
+ const out = {};
69
+ for (const r of runs) {
70
+ for (const s of r.scores) {
71
+ if (s.scorer !== FIELD_SCORER)
72
+ continue;
73
+ const f = (out[s.name] ??= { passed: 0, failed: 0, notApplicable: 0, rate: null });
74
+ if (s.pass === true)
75
+ f.passed++;
76
+ else if (s.pass === false)
77
+ f.failed++;
78
+ else
79
+ f.notApplicable++;
80
+ }
81
+ }
82
+ for (const f of Object.values(out))
83
+ f.rate = f.passed + f.failed === 0 ? null : round(f.passed / (f.passed + f.failed));
84
+ return out;
85
+ }
86
+ /** true > null > false: a pass beats "not judged", which beats a failure. */
87
+ const rank = (p) => (p === true ? 2 : p === null ? 1 : 0);
88
+ const changeBy = (d) => (d > 0 ? "improved" : d < 0 ? "regressed" : "unchanged");
89
+ function changeOf(base, cand) {
90
+ return changeBy(rank(cand) - rank(base));
91
+ }
92
+ /**
93
+ * A case's standing over its repeats on the SAME scale a single run is ranked
94
+ * on: the mean run rank. For one repeat it is exactly the run's rank, so the
95
+ * case and its run never disagree; when every repeat was judged it orders
96
+ * cases as their pass rates do. A case whose repeats all went unscored sits
97
+ * between a passing and a failing one — not below a failure, which is what a
98
+ * pass rate of "none" compared as -1 made it.
99
+ */
100
+ const caseRank = (runs) => runs.reduce((s, r) => s + rank(r.pass), 0) / runs.length;
101
+ function delta(base, cand) {
102
+ const b = base ?? null;
103
+ const c = cand ?? null;
104
+ const d = b === null || c === null ? null : round(c - b);
105
+ return { base: b, candidate: c, delta: d, relative: d === null || !b ? null : round(d / b, 4) };
106
+ }
107
+ /** A side's cases at their revisions: given, or from its runs. */
108
+ function casesOf(s) {
109
+ if (s.cases)
110
+ return s.cases.map(({ id, rev }) => ({ id, rev }));
111
+ const revs = new Map();
112
+ for (const r of s.runs)
113
+ revs.set(r.caseId, r.caseRev);
114
+ return [...revs].map(([id, rev]) => ({ id, rev }));
115
+ }
116
+ const passRateOf = (runs) => {
117
+ const judged = runs.filter((r) => r.pass !== null);
118
+ return judged.length ? round(judged.filter((r) => r.pass).length / judged.length) : null;
119
+ };
120
+ const meanOf = (xs) => {
121
+ const ok = xs.filter((x) => typeof x === "number");
122
+ return ok.length ? round(ok.reduce((s, x) => s + x, 0) / ok.length, 2) : null;
123
+ };
124
+ /** Same output, as field scoring judges sameness: key order does not count. */
125
+ const sameJson = (a, b) => deepEqual(a ?? null, b ?? null);
126
+ /**
127
+ * How a candidate experiment differs from a baseline: per run (case × repeat),
128
+ * per case (over its repeats), and in the summary metrics.
129
+ *
130
+ * LIKE FOR LIKE ONLY. When the dataset changed between the two experiments,
131
+ * the comparison covers only the cases present on both sides at the same
132
+ * revision (`comparedOn`), and `datasetDiff` (when both sides name their
133
+ * cases) says what was left out: a case whose expectation was edited is not
134
+ * evidence the workflow improved or regressed. Metrics are computed over the compared runs too. A run present on
135
+ * one side only (a repeat that did not run) is still reported as such.
136
+ */
137
+ export function compareExperiments(base, candidate) {
138
+ const baseCases = casesOf(base);
139
+ const candCases = casesOf(candidate);
140
+ const datasetDiff = base.cases && candidate.cases ? diffVersionEntries(baseCases, candCases) : undefined;
141
+ const candRev = new Map(candCases.map((e) => [e.id, e.rev]));
142
+ const shared = new Set(baseCases.filter((e) => candRev.get(e.id) === e.rev).map((e) => e.id));
143
+ const baseRuns = base.runs.filter((r) => shared.has(r.caseId));
144
+ const candRuns = candidate.runs.filter((r) => shared.has(r.caseId));
145
+ const key = (r) => `${r.caseId}\u0000${r.repeat}`;
146
+ const b = new Map(baseRuns.map((r) => [key(r), r]));
147
+ const c = new Map(candRuns.map((r) => [key(r), r]));
148
+ const keys = [...new Set([...b.keys(), ...c.keys()])].sort();
149
+ const pick = (r) => ({ status: r.status, pass: r.pass, output: r.output, metrics: r.metrics });
150
+ const runs = keys.map((k) => {
151
+ const x = b.get(k);
152
+ const y = c.get(k);
153
+ const [caseId, repeat] = k.split("\u0000");
154
+ return {
155
+ caseId,
156
+ repeat: Number(repeat),
157
+ change: !x ? "only-in-candidate" : !y ? "only-in-base" : changeOf(x.pass, y.pass),
158
+ ...(x ? { base: pick(x) } : {}),
159
+ ...(y ? { candidate: pick(y) } : {}),
160
+ outputChanged: !!x && !!y && !sameJson(x.output, y.output),
161
+ durationMs: delta(x?.metrics.durationMs, y?.metrics.durationMs),
162
+ totalTokens: delta(x?.metrics.totalTokens, y?.metrics.totalTokens),
163
+ cost: delta(x?.metrics.cost, y?.metrics.cost),
164
+ steps: delta(x?.metrics.steps, y?.metrics.steps),
165
+ };
166
+ });
167
+ const caseIds = [...new Set([...baseRuns, ...candRuns].map((r) => r.caseId))].sort();
168
+ const cases = caseIds.map((caseId) => {
169
+ const xs = baseRuns.filter((r) => r.caseId === caseId);
170
+ const ys = candRuns.filter((r) => r.caseId === caseId);
171
+ const bp = passRateOf(xs);
172
+ const cp = passRateOf(ys);
173
+ const change = !xs.length
174
+ ? "only-in-candidate"
175
+ : !ys.length
176
+ ? "only-in-base"
177
+ : changeBy(round(caseRank(ys) - caseRank(xs)));
178
+ return {
179
+ caseId,
180
+ change,
181
+ basePassRate: bp,
182
+ candidatePassRate: cp,
183
+ durationMs: delta(meanOf(xs.map((r) => r.metrics.durationMs)), meanOf(ys.map((r) => r.metrics.durationMs))),
184
+ totalTokens: delta(meanOf(xs.map((r) => r.metrics.totalTokens)), meanOf(ys.map((r) => r.metrics.totalTokens))),
185
+ cost: delta(meanOf(xs.map((r) => r.metrics.cost)), meanOf(ys.map((r) => r.metrics.cost))),
186
+ };
187
+ });
188
+ const sb = summarize(baseRuns);
189
+ const sc = summarize(candRuns);
190
+ const counts = {
191
+ improved: 0, regressed: 0, unchanged: 0, "only-in-base": 0, "only-in-candidate": 0,
192
+ };
193
+ for (const r of runs)
194
+ counts[r.change]++;
195
+ const label = (s, fallback) => ({
196
+ id: s.experiment?.id ?? fallback,
197
+ ...(s.experiment?.workflowVersion !== undefined ? { workflowVersion: s.experiment.workflowVersion } : {}),
198
+ ...(s.experiment?.datasetVersion !== undefined ? { datasetVersion: s.experiment.datasetVersion } : {}),
199
+ });
200
+ return {
201
+ base: label(base, "base"),
202
+ candidate: label(candidate, "candidate"),
203
+ ...(datasetDiff ? { datasetDiff } : {}),
204
+ comparedOn: shared.size,
205
+ counts,
206
+ cases,
207
+ runs,
208
+ metrics: {
209
+ passRate: delta(sb.passRate, sc.passRate),
210
+ durationP50: delta(sb.durationMs.p50, sc.durationMs.p50),
211
+ durationP95: delta(sb.durationMs.p95, sc.durationMs.p95),
212
+ tokensPerRun: delta(sb.tokens.meanPerRun, sc.tokens.meanPerRun),
213
+ costPerRun: delta(sb.cost.meanPerRun, sc.cost.meanPerRun),
214
+ stepsPerRun: delta(sb.steps.meanPerRun, sc.steps.meanPerRun),
215
+ limitBreaches: delta(sb.limitBreaches, sc.limitBreaches),
216
+ },
217
+ };
218
+ }
219
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../src/summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,265 @@
1
+ /**
2
+ * The vocabulary.
3
+ *
4
+ * Dataset a versioned set of Cases for one workflow
5
+ * Case one input (a `workflow.start` payload) and what its Result should be
6
+ * Version a frozen cut of a dataset: each case pinned at one revision by sha256
7
+ * Experiment one dataset version × one workflow version × N repeats
8
+ * Run one case × one repeat inside an experiment — a RunRecord
9
+ *
10
+ * Everything here is plain JSON on the wire: ROC and the CLI read and write the
11
+ * same objects at the same keys (see layout.ts).
12
+ */
13
+ export type Json = string | number | boolean | null | Json[] | {
14
+ [k: string]: Json;
15
+ };
16
+ /** Thresholds a run should stay under. Breaching one WARNS — it never fails a case. */
17
+ export interface Limits {
18
+ maxDurationMs?: number;
19
+ maxTokens?: number;
20
+ maxSteps?: number;
21
+ maxCost?: number;
22
+ }
23
+ /** `workflows/<wf>/datasets/<dataset>/header.json` — mutable; each version embeds a snapshot. */
24
+ export interface Header {
25
+ dataset: string;
26
+ workflowId: string;
27
+ description?: string;
28
+ limits?: Limits;
29
+ createdAt: string;
30
+ /** The experiment others are compared to. Mutable; set with `setBaseline`. */
31
+ baselineId?: string;
32
+ }
33
+ /** The value types a Result field may declare (the runner's `resultTypes`). */
34
+ export type ResultFieldType = "string" | "number" | "boolean" | "object" | "array";
35
+ /**
36
+ * One field of a workflow version's declared Result: a key of an `output`
37
+ * node's `params.result`, with its `resultTypes` entry when it has one. See
38
+ * `resultFieldsFromGraph`.
39
+ */
40
+ export interface ResultField {
41
+ name: string;
42
+ /** Usually a {@link ResultFieldType}; any other word is treated as "untyped". */
43
+ type?: string;
44
+ }
45
+ /**
46
+ * How one expected field is matched.
47
+ *
48
+ * A plain value is deep equality, except that a plain OBJECT is a subset match
49
+ * (keys it does not mention are ignored) and a string such as `">= 0.8"` is a
50
+ * numeric band when the actual value is a number.
51
+ */
52
+ export type Matcher = {
53
+ $eq: Json;
54
+ } | {
55
+ $oneOf: Json[];
56
+ } | {
57
+ $contains: Json;
58
+ } | {
59
+ $regex: string;
60
+ } | {
61
+ $between: [number, number];
62
+ } | {
63
+ $gte: number;
64
+ } | {
65
+ $lte: number;
66
+ } | {
67
+ $exists: boolean;
68
+ } | {
69
+ $approx: number;
70
+ $tol: number;
71
+ };
72
+ /** One input and the Result it should produce. Stored as write-once revisions. */
73
+ export interface Case {
74
+ /** Human readable, `[A-Za-z0-9._-]{1,80}`. */
75
+ id: string;
76
+ /** The `workflow.start` payload. */
77
+ input: Record<string, Json>;
78
+ /** Keyed by Result field; dot paths reach into nested fields. */
79
+ expected?: Record<string, Json | Matcher>;
80
+ /** Per-case limits; each one overrides the header's. */
81
+ limits?: Limits;
82
+ tags?: string[];
83
+ notes?: string;
84
+ /** Where the case came from, when it was captured from a real run. */
85
+ source?: {
86
+ context: string;
87
+ workflowVersion?: string;
88
+ capturedAt: string;
89
+ };
90
+ }
91
+ /** One case as a version pins it. */
92
+ export interface VersionEntry {
93
+ id: string;
94
+ rev: number;
95
+ sha256: string;
96
+ }
97
+ /** `workflows/<wf>/datasets/<dataset>/versions/v<n>.json` — written once. */
98
+ export interface VersionManifest {
99
+ version: number;
100
+ header: Header;
101
+ cases: VersionEntry[];
102
+ createdAt: string;
103
+ note?: string;
104
+ }
105
+ /** What a run cost. Tokens and cost include agent-reported (A2A) figures. */
106
+ export interface Metrics {
107
+ durationMs: number | null;
108
+ inputTokens: number;
109
+ outputTokens: number;
110
+ totalTokens: number;
111
+ cost: number;
112
+ steps: number;
113
+ modelCalls: number;
114
+ cpuUnits: number;
115
+ gpuUnits: number;
116
+ }
117
+ export interface Score {
118
+ /** The Result field (dot path) for a field score; `limit.<name>` for a limit score. */
119
+ name: string;
120
+ value: number | string | boolean | null;
121
+ /** null = not judged. */
122
+ pass: boolean | null;
123
+ /** `eval/field@1` | `eval/limit@1` | a future `judge/<model>@1`. */
124
+ scorer: string;
125
+ source: "eval" | "annotation";
126
+ detail?: string;
127
+ }
128
+ export type RunStatus = "done" | "failed" | "timeout" | "error";
129
+ /**
130
+ * `workflows/<wf>/experiments/<expId>/runs/<caseId>.<repeat>.json` — written once.
131
+ * Records written before v2 carry `trial` instead of `repeat`; the parser maps it.
132
+ */
133
+ export interface RunRecord {
134
+ caseId: string;
135
+ caseRev: number;
136
+ /** Which repeat of the case this run is; 1-based. */
137
+ repeat: number;
138
+ /** Which attempt of the experiment ran it (1 = the first; each resume adds one). Part of `context`. */
139
+ attempt?: number;
140
+ context: string;
141
+ runId: string;
142
+ /**
143
+ * `done` the workflow completed; `failed` it announced a failure; `timeout`
144
+ * it did not end in time; `error` the harness could not run it at all.
145
+ */
146
+ status: RunStatus;
147
+ output: Json | null;
148
+ /** The declared Result's outcome label, when the run carried one. */
149
+ outcome?: string;
150
+ error?: string;
151
+ /** The start event's server timestamp when the target read it, else when the harness published it. */
152
+ startedAt: string;
153
+ endedAt: string | null;
154
+ metrics: Metrics;
155
+ scores: Score[];
156
+ /** All field scores pass; null when the case has no expectations or the harness errored. */
157
+ pass: boolean | null;
158
+ }
159
+ export type ExperimentStatus = "running" | "done" | "cancelled" | "error";
160
+ /** `workflows/<wf>/experiments/<expId>/meta.json` — rewritten as the experiment moves through its states. */
161
+ export interface Experiment {
162
+ id: string;
163
+ dataset: string;
164
+ datasetVersion: number;
165
+ workflowId: string;
166
+ workflowVersion: string;
167
+ /** Whether the workflow's live deployment ran it (no version pin). */
168
+ live?: boolean;
169
+ /** How many times each case runs. */
170
+ repeats: number;
171
+ /**
172
+ * The Result the workflow version declares, when known. Expected fields it
173
+ * does not declare, or declares with an incompatible type, are scored n/a.
174
+ */
175
+ resultFields?: ResultField[];
176
+ /** 1 when created; each resume adds one, so its runs get contexts no earlier attempt used. Absent = 1. */
177
+ attempt?: number;
178
+ startedAt: string;
179
+ finishedAt?: string;
180
+ status: ExperimentStatus;
181
+ origin: "roc" | "cli";
182
+ createdBy?: string;
183
+ baselineId?: string;
184
+ note?: string;
185
+ /** Why the experiment ended in `error`. */
186
+ error?: string;
187
+ summary?: Summary;
188
+ }
189
+ /** How one expected field fared across an experiment's runs. */
190
+ export interface FieldAccuracy {
191
+ passed: number;
192
+ failed: number;
193
+ /** Scores with `pass: null`: not in the version's Result, or its type changed. */
194
+ notApplicable: number;
195
+ /** passed / (passed + failed); null when nothing was judged. */
196
+ rate: number | null;
197
+ }
198
+ export interface Summary {
199
+ cases: number;
200
+ runs: number;
201
+ passed: number;
202
+ failed: number;
203
+ errored: number;
204
+ unscored: number;
205
+ passRate: number | null;
206
+ durationMs: {
207
+ p50: number | null;
208
+ p95: number | null;
209
+ mean: number | null;
210
+ };
211
+ tokens: {
212
+ total: number;
213
+ meanPerRun: number;
214
+ };
215
+ cost: {
216
+ total: number;
217
+ meanPerRun: number;
218
+ };
219
+ steps: {
220
+ meanPerRun: number;
221
+ };
222
+ limitBreaches: number;
223
+ /** Per expected field (dot path). Absent on summaries written before v2. */
224
+ fields: Record<string, FieldAccuracy>;
225
+ }
226
+ /** How a dataset's cases changed between two points (versions, or the experiments that ran them). */
227
+ export interface DatasetDiff {
228
+ added: string[];
229
+ removed: string[];
230
+ /** Same id, another revision. */
231
+ edited: string[];
232
+ }
233
+ /** How a run ended, as the target saw it. */
234
+ export interface RunEnd {
235
+ status: "done" | "failed" | "timeout";
236
+ output?: Json;
237
+ outcome?: string;
238
+ error?: string;
239
+ /** Server timestamp of the end event. */
240
+ endedAt?: string;
241
+ /**
242
+ * Server timestamp of the run's own `workflow.start` event, read back from
243
+ * the context. With `endedAt` it is the run's duration; neither is ever
244
+ * compared with the harness's local clock.
245
+ */
246
+ startedAt?: string;
247
+ }
248
+ /**
249
+ * Where experiments run. Injected: ROC implements it over the browser's vault
250
+ * and orchestrator clients, the CLI over Node's.
251
+ */
252
+ export interface WorkflowTarget {
253
+ /** Publish `workflow.start` with `input` into `context`, targeted at the workflow agent. */
254
+ start(input: Record<string, Json>, context: string): Promise<void>;
255
+ /** Wait for `workflow.completed` / `workflow.failed` in `context`; report both events' server timestamps. */
256
+ waitForEnd(context: string, timeoutMs: number): Promise<RunEnd>;
257
+ /** What the runs in `context` cost. `durationMs` is the fallback when `waitForEnd` lacks a timestamp; server-measured or null. */
258
+ metrics(context: string): Promise<Metrics>;
259
+ /**
260
+ * Route runs whose context starts with `contextPrefix` to `version`, until
261
+ * the returned `release()` is called. Needed for a non-live version only.
262
+ */
263
+ pinVersion?(version: string, contextPrefix: string): Promise<() => Promise<void>>;
264
+ }
265
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The vocabulary.
3
+ *
4
+ * Dataset a versioned set of Cases for one workflow
5
+ * Case one input (a `workflow.start` payload) and what its Result should be
6
+ * Version a frozen cut of a dataset: each case pinned at one revision by sha256
7
+ * Experiment one dataset version × one workflow version × N repeats
8
+ * Run one case × one repeat inside an experiment — a RunRecord
9
+ *
10
+ * Everything here is plain JSON on the wire: ROC and the CLI read and write the
11
+ * same objects at the same keys (see layout.ts).
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}