ppef 1.2.1 → 1.3.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 (111) hide show
  1. package/README.md +270 -6
  2. package/dist/__tests__/cli/evaluate-command.integration.test.js +60 -0
  3. package/dist/__tests__/cli/evaluate-command.integration.test.js.map +1 -1
  4. package/dist/__tests__/examples.integration.test.d.ts +8 -0
  5. package/dist/__tests__/examples.integration.test.d.ts.map +1 -0
  6. package/dist/__tests__/examples.integration.test.js +236 -0
  7. package/dist/__tests__/examples.integration.test.js.map +1 -0
  8. package/dist/cli/__tests__/commands.unit.test.js +12 -5
  9. package/dist/cli/__tests__/commands.unit.test.js.map +1 -1
  10. package/dist/cli/__tests__/config-loader.unit.test.js +30 -25
  11. package/dist/cli/__tests__/config-loader.unit.test.js.map +1 -1
  12. package/dist/cli/__tests__/evaluator-schemas.unit.test.d.ts +9 -0
  13. package/dist/cli/__tests__/evaluator-schemas.unit.test.d.ts.map +1 -0
  14. package/dist/cli/__tests__/evaluator-schemas.unit.test.js +334 -0
  15. package/dist/cli/__tests__/evaluator-schemas.unit.test.js.map +1 -0
  16. package/dist/cli/commands/aggregate.d.ts.map +1 -1
  17. package/dist/cli/commands/aggregate.js +20 -12
  18. package/dist/cli/commands/aggregate.js.map +1 -1
  19. package/dist/cli/commands/evaluate.d.ts.map +1 -1
  20. package/dist/cli/commands/evaluate.js +130 -24
  21. package/dist/cli/commands/evaluate.js.map +1 -1
  22. package/dist/cli/commands/plan.d.ts.map +1 -1
  23. package/dist/cli/commands/plan.js +40 -6
  24. package/dist/cli/commands/plan.js.map +1 -1
  25. package/dist/cli/commands/run.d.ts +9 -0
  26. package/dist/cli/commands/run.d.ts.map +1 -1
  27. package/dist/cli/commands/run.js +71 -12
  28. package/dist/cli/commands/run.js.map +1 -1
  29. package/dist/cli/commands/validate.d.ts.map +1 -1
  30. package/dist/cli/commands/validate.js +55 -0
  31. package/dist/cli/commands/validate.js.map +1 -1
  32. package/dist/cli/config-loader.d.ts +6 -3
  33. package/dist/cli/config-loader.d.ts.map +1 -1
  34. package/dist/cli/config-loader.js +31 -106
  35. package/dist/cli/config-loader.js.map +1 -1
  36. package/dist/cli/evaluator-schemas.d.ts +395 -0
  37. package/dist/cli/evaluator-schemas.d.ts.map +1 -0
  38. package/dist/cli/evaluator-schemas.js +285 -0
  39. package/dist/cli/evaluator-schemas.js.map +1 -0
  40. package/dist/cli/index.d.ts.map +1 -1
  41. package/dist/cli/index.js +11 -1
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/cli/module-loader.d.ts.map +1 -1
  44. package/dist/cli/module-loader.js +38 -20
  45. package/dist/cli/module-loader.js.map +1 -1
  46. package/dist/cli/type-utils.d.ts +31 -0
  47. package/dist/cli/type-utils.d.ts.map +1 -0
  48. package/dist/cli/type-utils.js +38 -0
  49. package/dist/cli/type-utils.js.map +1 -0
  50. package/dist/cli/types.d.ts +284 -94
  51. package/dist/cli/types.d.ts.map +1 -1
  52. package/dist/cli/types.js +177 -1
  53. package/dist/cli/types.js.map +1 -1
  54. package/dist/collector/schema.js.map +1 -1
  55. package/dist/evaluators/claims-evaluator.d.ts.map +1 -1
  56. package/dist/evaluators/claims-evaluator.js +1 -1
  57. package/dist/evaluators/claims-evaluator.js.map +1 -1
  58. package/dist/evaluators/exploratory-evaluator.js.map +1 -1
  59. package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -1
  60. package/dist/executor/__tests__/worker-entry.integration.test.js +19 -4
  61. package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -1
  62. package/dist/executor/binary-sut.d.ts.map +1 -1
  63. package/dist/executor/binary-sut.js +2 -1
  64. package/dist/executor/binary-sut.js.map +1 -1
  65. package/dist/executor/checkpoint-storage.d.ts.map +1 -1
  66. package/dist/executor/checkpoint-storage.js +13 -4
  67. package/dist/executor/checkpoint-storage.js.map +1 -1
  68. package/dist/executor/executor.d.ts +22 -0
  69. package/dist/executor/executor.d.ts.map +1 -1
  70. package/dist/executor/executor.js +133 -6
  71. package/dist/executor/executor.js.map +1 -1
  72. package/dist/executor/parallel-executor.d.ts.map +1 -1
  73. package/dist/executor/parallel-executor.js +9 -2
  74. package/dist/executor/parallel-executor.js.map +1 -1
  75. package/dist/executor/worker-entry.js +3 -1
  76. package/dist/executor/worker-entry.js.map +1 -1
  77. package/dist/executor/worker-executor.d.ts +9 -0
  78. package/dist/executor/worker-executor.d.ts.map +1 -1
  79. package/dist/executor/worker-executor.js +88 -9
  80. package/dist/executor/worker-executor.js.map +1 -1
  81. package/dist/executor/worker-threads-executor.d.ts.map +1 -1
  82. package/dist/executor/worker-threads-executor.js +52 -18
  83. package/dist/executor/worker-threads-executor.js.map +1 -1
  84. package/dist/index.cjs +1 -1
  85. package/dist/index.d.ts +1 -0
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +2 -0
  88. package/dist/index.js.map +1 -1
  89. package/dist/renderers/latex-renderer.d.ts.map +1 -1
  90. package/dist/renderers/latex-renderer.js +20 -12
  91. package/dist/renderers/latex-renderer.js.map +1 -1
  92. package/dist/schemas/__tests__/json-schema-validator.unit.test.d.ts +8 -0
  93. package/dist/schemas/__tests__/json-schema-validator.unit.test.d.ts.map +1 -0
  94. package/dist/schemas/__tests__/json-schema-validator.unit.test.js +170 -0
  95. package/dist/schemas/__tests__/json-schema-validator.unit.test.js.map +1 -0
  96. package/dist/schemas/index.d.ts +7 -0
  97. package/dist/schemas/index.d.ts.map +1 -0
  98. package/dist/schemas/index.js +7 -0
  99. package/dist/schemas/index.js.map +1 -0
  100. package/dist/schemas/json-schema-validator.d.ts +59 -0
  101. package/dist/schemas/json-schema-validator.d.ts.map +1 -0
  102. package/dist/schemas/json-schema-validator.js +67 -0
  103. package/dist/schemas/json-schema-validator.js.map +1 -0
  104. package/dist/types/case.d.ts +4 -0
  105. package/dist/types/case.d.ts.map +1 -1
  106. package/dist/types/result.d.ts +2 -0
  107. package/dist/types/result.d.ts.map +1 -1
  108. package/dist/types/sut.d.ts +4 -0
  109. package/dist/types/sut.d.ts.map +1 -1
  110. package/package.json +15 -5
  111. package/ppef.schema.json +1178 -0
package/README.md CHANGED
@@ -45,11 +45,275 @@ npx tsx --test src/path/to/file.test.ts
45
45
 
46
46
  CLI (after build):
47
47
  ```bash
48
- ppef run # Execute experiments
49
- ppef validate # Validate configuration
50
- ppef plan # Dry-run execution plan
51
- ppef aggregate # Post-process results
52
- ppef evaluate # Run evaluators on results
48
+ ppef experiment.json # Run experiment (default command)
49
+ ppef run config.json # Explicit run command
50
+ ppef validate # Validate configuration
51
+ ppef plan # Dry-run execution plan
52
+ ppef aggregate # Post-process results
53
+ ppef evaluate # Run evaluators on results
54
+ ```
55
+
56
+ ## Quick Start
57
+
58
+ Create a minimal experiment with three files and a config:
59
+
60
+ **experiment.json**
61
+ ```json
62
+ {
63
+ "experiment": {
64
+ "name": "string-length",
65
+ "description": "Compare string length implementations"
66
+ },
67
+ "executor": {
68
+ "repetitions": 3
69
+ },
70
+ "suts": [
71
+ {
72
+ "id": "builtin-length",
73
+ "module": "./sut.mjs",
74
+ "exportName": "createSut",
75
+ "registration": {
76
+ "name": "Built-in .length",
77
+ "version": "1.0.0",
78
+ "role": "primary"
79
+ }
80
+ }
81
+ ],
82
+ "cases": [
83
+ {
84
+ "id": "hello-world",
85
+ "module": "./case.mjs",
86
+ "exportName": "createCase"
87
+ }
88
+ ],
89
+ "metricsExtractor": {
90
+ "module": "./metrics.mjs",
91
+ "exportName": "extract"
92
+ },
93
+ "output": {
94
+ "path": "./results"
95
+ }
96
+ }
97
+ ```
98
+
99
+ **sut.mjs** — System Under Test factory
100
+ ```js
101
+ export function createSut() {
102
+ return {
103
+ id: "builtin-length",
104
+ config: {},
105
+ run: async (input) => ({ length: input.text.length }),
106
+ };
107
+ }
108
+ ```
109
+
110
+ **case.mjs** — Test case definition
111
+ ```js
112
+ export function createCase() {
113
+ return {
114
+ case: {
115
+ caseId: "hello-world",
116
+ caseClass: "basic",
117
+ name: "Hello World",
118
+ version: "1.0.0",
119
+ inputs: { text: "hello world" },
120
+ },
121
+ getInput: async () => ({ text: "hello world" }),
122
+ getInputs: () => ({ text: "hello world" }),
123
+ };
124
+ }
125
+ ```
126
+
127
+ **metrics.mjs** — Metrics extractor
128
+ ```js
129
+ export function extract(result) {
130
+ return { length: result.length ?? 0 };
131
+ }
132
+ ```
133
+
134
+ Run it:
135
+ ```bash
136
+ npx ppef experiment.json
137
+ ```
138
+
139
+ ## Workflows
140
+
141
+ The typical pipeline chains CLI commands: validate, run, aggregate, then evaluate.
142
+
143
+ ```
144
+ ppef validate config.json
145
+ → ppef run config.json
146
+ → ppef aggregate results.json
147
+ → ppef evaluate aggregates.json -t claims -c claims.json
148
+ ```
149
+
150
+ ### 1. Validate Configuration
151
+
152
+ Check an experiment config for errors before running:
153
+
154
+ ```bash
155
+ ppef validate experiment.json
156
+ ```
157
+
158
+ ### 2. Preview Execution Plan
159
+
160
+ See what would run without executing (SUTs x cases x repetitions):
161
+
162
+ ```bash
163
+ ppef plan experiment.json
164
+ ```
165
+
166
+ ### 3. Run an Experiment
167
+
168
+ Execute all SUTs against all cases with worker thread isolation:
169
+
170
+ ```bash
171
+ ppef run experiment.json
172
+ ppef run experiment.json -o ./output -j 4 --verbose
173
+ ppef run experiment.json --unsafe-in-process # No worker isolation (debugging only)
174
+ ```
175
+
176
+ The output directory contains a results JSON and (by default) an aggregates JSON.
177
+
178
+ ### 4. Aggregate Results
179
+
180
+ Compute summary statistics, pairwise comparisons, and rankings from raw results:
181
+
182
+ ```bash
183
+ ppef aggregate results.json
184
+ ppef aggregate results.json -o aggregates.json --compute-comparisons
185
+ ```
186
+
187
+ ### 5. Evaluate Results
188
+
189
+ Run evaluators against aggregated (or raw) results. Each evaluator type takes a JSON config file.
190
+
191
+ #### Claims — Test Explicit Hypotheses
192
+
193
+ Test whether SUT A outperforms baseline B on a given metric with statistical significance:
194
+
195
+ ```bash
196
+ ppef evaluate aggregates.json -t claims -c claims.json -v
197
+ ```
198
+
199
+ **claims.json**:
200
+ ```json
201
+ {
202
+ "claims": [
203
+ {
204
+ "claimId": "C001",
205
+ "description": "Primary has greater accuracy than baseline",
206
+ "sut": "primary-sut",
207
+ "baseline": "baseline-sut",
208
+ "metric": "accuracy",
209
+ "direction": "greater",
210
+ "scope": "global"
211
+ }
212
+ ],
213
+ "significanceLevel": 0.05
214
+ }
215
+ ```
216
+
217
+ #### Metrics — Threshold, Baseline, and Range Criteria
218
+
219
+ Evaluate metrics against fixed thresholds, baselines, or target ranges:
220
+
221
+ ```bash
222
+ ppef evaluate aggregates.json -t metrics -c metrics-config.json
223
+ ```
224
+
225
+ **metrics-config.json**:
226
+ ```json
227
+ {
228
+ "criteria": [
229
+ {
230
+ "criterionId": "exec-time",
231
+ "description": "Execution time under 1000ms",
232
+ "type": "threshold",
233
+ "metric": "executionTime",
234
+ "sut": "*",
235
+ "threshold": { "operator": "lt", "value": 1000 }
236
+ },
237
+ {
238
+ "criterionId": "f1-range",
239
+ "description": "F1 score in [0.8, 1.0]",
240
+ "type": "target-range",
241
+ "metric": "f1Score",
242
+ "sut": "*",
243
+ "targetRange": { "min": 0.8, "max": 1.0, "minInclusive": true, "maxInclusive": true }
244
+ }
245
+ ]
246
+ }
247
+ ```
248
+
249
+ #### Robustness — Sensitivity Under Perturbations
250
+
251
+ Measure how performance degrades under perturbations at varying intensity levels:
252
+
253
+ ```bash
254
+ ppef evaluate results.json -t robustness -c robustness-config.json
255
+ ```
256
+
257
+ **robustness-config.json**:
258
+ ```json
259
+ {
260
+ "metrics": ["executionTime", "accuracy"],
261
+ "perturbations": ["edge-removal", "noise", "seed-shift"],
262
+ "intensityLevels": [0.1, 0.2, 0.3, 0.4, 0.5],
263
+ "runsPerLevel": 10
264
+ }
265
+ ```
266
+
267
+ #### Output Formats
268
+
269
+ All evaluators support JSON and LaTeX output:
270
+
271
+ ```bash
272
+ ppef evaluate aggregates.json -t claims -c claims.json -f latex
273
+ ppef evaluate aggregates.json -t metrics -c metrics.json -f json -o results.json
274
+ ```
275
+
276
+ ### Inline Evaluators
277
+
278
+ Evaluator configs can be embedded directly in the experiment config via the optional `evaluators` field, making the config self-contained:
279
+
280
+ ```json
281
+ {
282
+ "experiment": { "name": "my-experiment" },
283
+ "executor": { "repetitions": 10 },
284
+ "suts": [ ... ],
285
+ "cases": [ ... ],
286
+ "metricsExtractor": { ... },
287
+ "output": { "path": "./results" },
288
+ "evaluators": [
289
+ {
290
+ "type": "claims",
291
+ "config": {
292
+ "claims": [ ... ]
293
+ }
294
+ }
295
+ ]
296
+ }
297
+ ```
298
+
299
+ ### JSON Schema Validation
300
+
301
+ Experiment configs can reference the generated schema for IDE autocompletion:
302
+
303
+ ```json
304
+ {
305
+ "$schema": "./ppef.schema.json",
306
+ "experiment": { ... }
307
+ }
308
+ ```
309
+
310
+ Standalone evaluator configs reference schema `$defs`:
311
+
312
+ ```json
313
+ {
314
+ "$schema": "./ppef.schema.json#/$defs/ClaimsEvaluatorConfig",
315
+ "claims": [ ... ]
316
+ }
53
317
  ```
54
318
 
55
319
  ## Architecture
@@ -114,7 +378,7 @@ Available subpaths: `ppef/types`, `ppef/registry`, `ppef/executor`, `ppef/collec
114
378
  - Node.js native test runner (`node:test` + `node:assert`) — not Vitest/Jest
115
379
  - Coverage via c8 (text + html + json-summary in `./coverage/`)
116
380
  - Conventional commits enforced via commitlint + husky
117
- - Semantic release from all branches
381
+ - Semantic release from main branch
118
382
  - No `any` types — use `unknown` with type guards
119
383
  - Executor produces deterministic `runId` via SHA-256 hash of inputs
120
384
 
@@ -268,6 +268,66 @@ describe("evaluate command - integration tests", () => {
268
268
  assert.ok(mockLogger.calls.some((call) => call.startsWith("error:") && call.includes("aggregate")));
269
269
  });
270
270
  });
271
+ describe("exploratory evaluation", () => {
272
+ it("should evaluate exploratory analysis successfully", async () => {
273
+ const aggregatesFile = "/mock/aggregates.json";
274
+ const configFile = "/mock/config.json";
275
+ const mockFS = new MockFS({
276
+ [aggregatesFile]: createMockAggregatesFile(),
277
+ [configFile]: JSON.stringify({ metrics: ["accuracy"] }),
278
+ });
279
+ const mockLogger = new SpyLogger();
280
+ let exitCode;
281
+ const mockExit = (code) => {
282
+ exitCode = code;
283
+ throw new Error(`Exit ${code}`);
284
+ };
285
+ try {
286
+ await executeEvaluate(aggregatesFile, {
287
+ type: "exploratory",
288
+ config: configFile,
289
+ verbose: true,
290
+ }, { logger: mockLogger, fileSystem: mockFS, processExit: mockExit });
291
+ }
292
+ catch (e) {
293
+ if (exitCode !== undefined) {
294
+ const errorLogs = mockLogger.calls.filter((call) => call.startsWith("error:"));
295
+ assert.fail(`processExit was called with code ${exitCode}. Logged errors:\n${errorLogs.join("\n")}`);
296
+ }
297
+ throw e;
298
+ }
299
+ assert.strictEqual(exitCode, undefined, "processExit should not be called on success");
300
+ assert.ok(mockLogger.calls.some((call) => call.startsWith("info:Evaluation complete:")));
301
+ });
302
+ it("should handle empty config for exploratory", async () => {
303
+ const aggregatesFile = "/mock/aggregates.json";
304
+ const configFile = "/mock/config.json";
305
+ const mockFS = new MockFS({
306
+ [aggregatesFile]: createMockAggregatesFile(),
307
+ [configFile]: JSON.stringify({}),
308
+ });
309
+ const mockLogger = new SpyLogger();
310
+ let exitCode;
311
+ const mockExit = (code) => {
312
+ exitCode = code;
313
+ throw new Error(`Exit ${code}`);
314
+ };
315
+ try {
316
+ await executeEvaluate(aggregatesFile, {
317
+ type: "exploratory",
318
+ config: configFile,
319
+ }, { logger: mockLogger, fileSystem: mockFS, processExit: mockExit });
320
+ }
321
+ catch (e) {
322
+ if (exitCode !== undefined) {
323
+ const errorLogs = mockLogger.calls.filter((call) => call.startsWith("error:"));
324
+ assert.fail(`processExit was called with code ${exitCode}. Logged errors:\n${errorLogs.join("\n")}`);
325
+ }
326
+ throw e;
327
+ }
328
+ assert.strictEqual(exitCode, undefined, "processExit should not be called on success");
329
+ });
330
+ });
271
331
  describe("robustness evaluation", () => {
272
332
  it("should require raw results for robustness", async () => {
273
333
  const aggregatesFile = "/mock/aggregates.json";
@@ -1 +1 @@
1
- {"version":3,"file":"evaluate-command.integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/cli/evaluate-command.integration.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evaluate-command.integration.test.js","sourceRoot":"","sources":["../../../src/__tests__/cli/evaluate-command.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Example Integration Tests
3
+ *
4
+ * Runs example experiments via the CLI binary to verify
5
+ * end-to-end functionality. Requires `pnpm build` first.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=examples.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"examples.integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/examples.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Example Integration Tests
3
+ *
4
+ * Runs example experiments via the CLI binary to verify
5
+ * end-to-end functionality. Requires `pnpm build` first.
6
+ */
7
+ import { describe, it, before, after } from "node:test";
8
+ import { strict as assert } from "node:assert";
9
+ import { execFile } from "node:child_process";
10
+ import { mkdtemp, rm, readdir, readFile, access } from "node:fs/promises";
11
+ import { join } from "node:path";
12
+ import { tmpdir } from "node:os";
13
+ import { promisify } from "node:util";
14
+ const execFileAsync = promisify(execFile);
15
+ const PROJECT_ROOT = join(import.meta.dirname, "..", "..");
16
+ const BIN_PATH = join(PROJECT_ROOT, "bin", "ppef.mjs");
17
+ const EXAMPLES_DIR = join(PROJECT_ROOT, "examples");
18
+ /**
19
+ * Verify dist/ exists before running tests.
20
+ */
21
+ async function assertDistExists() {
22
+ try {
23
+ await access(join(PROJECT_ROOT, "dist"));
24
+ }
25
+ catch {
26
+ throw new Error("dist/ not found — run `pnpm build` before running integration tests");
27
+ }
28
+ }
29
+ describe("Example Integration Tests", () => {
30
+ let tempDir;
31
+ before(async () => {
32
+ await assertDistExists();
33
+ tempDir = await mkdtemp(join(tmpdir(), "ppef-examples-"));
34
+ });
35
+ after(async () => {
36
+ if (tempDir) {
37
+ await rm(tempDir, { recursive: true, force: true });
38
+ }
39
+ });
40
+ describe("string-length example", () => {
41
+ it("runs end-to-end and produces results", async () => {
42
+ const outputDir = join(tempDir, "string-length-results");
43
+ const configPath = join(EXAMPLES_DIR, "string-length", "experiment.json");
44
+ // Read the config and override output path
45
+ const configContent = JSON.parse(await readFile(configPath, "utf-8"));
46
+ configContent.output.path = outputDir;
47
+ // Write modified config to temp dir
48
+ const tempConfig = join(tempDir, "experiment.json");
49
+ const { writeFile: writeFileFs } = await import("node:fs/promises");
50
+ await writeFileFs(tempConfig, JSON.stringify(configContent));
51
+ // Copy example modules to temp dir so relative paths resolve
52
+ const { copyFile } = await import("node:fs/promises");
53
+ await copyFile(join(EXAMPLES_DIR, "string-length", "sut.mjs"), join(tempDir, "sut.mjs"));
54
+ await copyFile(join(EXAMPLES_DIR, "string-length", "case.mjs"), join(tempDir, "case.mjs"));
55
+ await copyFile(join(EXAMPLES_DIR, "string-length", "metrics.mjs"), join(tempDir, "metrics.mjs"));
56
+ const { stdout } = await execFileAsync("node", [BIN_PATH, "run", tempConfig, "--unsafe-in-process"], {
57
+ cwd: tempDir,
58
+ timeout: 30000,
59
+ });
60
+ assert.ok(stdout.length > 0, "Expected CLI output");
61
+ // Verify output directory exists with results
62
+ const files = await readdir(outputDir);
63
+ assert.ok(files.length > 0, `Expected result files in ${outputDir}, found none`);
64
+ // Find a results JSON file and verify structure
65
+ const jsonFiles = files.filter((f) => f.endsWith(".json"));
66
+ assert.ok(jsonFiles.length > 0, "Expected at least one JSON result file");
67
+ const resultContent = JSON.parse(await readFile(join(outputDir, jsonFiles[0]), "utf-8"));
68
+ // Verify results have the expected structure
69
+ assert.ok(resultContent.results ?? resultContent.aggregates, "Expected results or aggregates in output");
70
+ });
71
+ it("validates config successfully", async () => {
72
+ const configPath = join(EXAMPLES_DIR, "string-length", "experiment.json");
73
+ const { stdout } = await execFileAsync("node", [BIN_PATH, "validate", configPath], {
74
+ cwd: PROJECT_ROOT,
75
+ timeout: 10000,
76
+ });
77
+ assert.ok(stdout.length > 0, "Expected validation output");
78
+ });
79
+ it("dry-run produces no output files", async () => {
80
+ const outputDir = join(tempDir, "dry-run-results");
81
+ const configPath = join(EXAMPLES_DIR, "string-length", "experiment.json");
82
+ // Read config and override output path
83
+ const configContent = JSON.parse(await readFile(configPath, "utf-8"));
84
+ configContent.output.path = outputDir;
85
+ const tempConfig = join(tempDir, "dry-run-experiment.json");
86
+ const { writeFile: writeFileFs } = await import("node:fs/promises");
87
+ await writeFileFs(tempConfig, JSON.stringify(configContent));
88
+ // Copy modules
89
+ // (already copied from previous test, but be explicit)
90
+ const { copyFile } = await import("node:fs/promises");
91
+ for (const file of ["sut.mjs", "case.mjs", "metrics.mjs"]) {
92
+ await copyFile(join(EXAMPLES_DIR, "string-length", file), join(tempDir, file));
93
+ }
94
+ await execFileAsync("node", [BIN_PATH, "plan", tempConfig], {
95
+ cwd: tempDir,
96
+ timeout: 10000,
97
+ });
98
+ // Verify no output directory was created
99
+ try {
100
+ await access(outputDir);
101
+ assert.fail("Expected output directory to not exist after dry-run");
102
+ }
103
+ catch {
104
+ // Expected — directory should not exist
105
+ }
106
+ });
107
+ });
108
+ describe("two-sut evaluation pipeline", () => {
109
+ let twoSutOutputDir;
110
+ let twoSutAggregatesPath;
111
+ it("runs two-SUT experiment end-to-end", async () => {
112
+ twoSutOutputDir = join(tempDir, "two-sut-results");
113
+ const configPath = join(EXAMPLES_DIR, "string-length", "experiment-two-suts.json");
114
+ // Read config and override output path
115
+ const configContent = JSON.parse(await readFile(configPath, "utf-8"));
116
+ configContent.output.path = twoSutOutputDir;
117
+ const tempConfig = join(tempDir, "experiment-two-suts.json");
118
+ const { writeFile: writeFileFs, copyFile } = await import("node:fs/promises");
119
+ await writeFileFs(tempConfig, JSON.stringify(configContent));
120
+ // Copy all required modules
121
+ for (const file of [
122
+ "sut.mjs",
123
+ "sut-spread.mjs",
124
+ "case.mjs",
125
+ "case-unicode.mjs",
126
+ "metrics.mjs",
127
+ ]) {
128
+ await copyFile(join(EXAMPLES_DIR, "string-length", file), join(tempDir, file));
129
+ }
130
+ const { stdout } = await execFileAsync("node", [BIN_PATH, "run", tempConfig, "--unsafe-in-process"], {
131
+ cwd: tempDir,
132
+ timeout: 30000,
133
+ });
134
+ assert.ok(stdout.length > 0, "Expected CLI output");
135
+ // Find the aggregates file
136
+ const files = await readdir(twoSutOutputDir);
137
+ const aggregatesFiles = files.filter((f) => f.includes("aggregates"));
138
+ assert.ok(aggregatesFiles.length > 0, "Expected aggregates file");
139
+ twoSutAggregatesPath = join(twoSutOutputDir, aggregatesFiles[0]);
140
+ // Verify aggregates structure
141
+ const aggContent = JSON.parse(await readFile(twoSutAggregatesPath, "utf-8"));
142
+ assert.ok(Array.isArray(aggContent.aggregates), "Expected aggregates array in output");
143
+ assert.ok(aggContent.aggregates.length >= 2, "Expected at least 2 aggregated results");
144
+ });
145
+ it("evaluates claims on two-SUT results", async () => {
146
+ assert.ok(twoSutAggregatesPath, "Aggregates path must be set by previous test");
147
+ const claimsConfig = join(EXAMPLES_DIR, "string-length", "eval-claims.json");
148
+ const claimsOutput = join(tempDir, "claims-output.json");
149
+ const { stdout } = await execFileAsync("node", [
150
+ BIN_PATH,
151
+ "evaluate",
152
+ twoSutAggregatesPath,
153
+ "-t",
154
+ "claims",
155
+ "-c",
156
+ claimsConfig,
157
+ "-o",
158
+ claimsOutput,
159
+ "-v",
160
+ ], {
161
+ cwd: tempDir,
162
+ timeout: 15000,
163
+ });
164
+ assert.ok(stdout.length > 0, "Expected CLI output");
165
+ const output = JSON.parse(await readFile(claimsOutput, "utf-8"));
166
+ assert.strictEqual(output.type, "claims", "Expected claims evaluation type");
167
+ });
168
+ it("evaluates exploratory analysis on two-SUT results", async () => {
169
+ assert.ok(twoSutAggregatesPath, "Aggregates path must be set by previous test");
170
+ const exploratoryConfig = join(EXAMPLES_DIR, "string-length", "eval-exploratory.json");
171
+ const exploratoryOutput = join(tempDir, "exploratory-output.json");
172
+ const { stdout } = await execFileAsync("node", [
173
+ BIN_PATH,
174
+ "evaluate",
175
+ twoSutAggregatesPath,
176
+ "-t",
177
+ "exploratory",
178
+ "-c",
179
+ exploratoryConfig,
180
+ "-o",
181
+ exploratoryOutput,
182
+ "-v",
183
+ ], {
184
+ cwd: tempDir,
185
+ timeout: 15000,
186
+ });
187
+ assert.ok(stdout.length > 0, "Expected CLI output");
188
+ const output = JSON.parse(await readFile(exploratoryOutput, "utf-8"));
189
+ assert.strictEqual(output.type, "exploratory", "Expected exploratory evaluation type");
190
+ assert.ok(output.data.rankings, "Expected rankings in exploratory output");
191
+ assert.ok(Array.isArray(output.data.pairwiseComparisons), "Expected pairwiseComparisons array");
192
+ });
193
+ it("evaluates metrics on two-SUT results", async () => {
194
+ assert.ok(twoSutAggregatesPath, "Aggregates path must be set by previous test");
195
+ const metricsConfig = join(EXAMPLES_DIR, "metrics-only", "eval-config.json");
196
+ const metricsOutput = join(tempDir, "metrics-output.json");
197
+ const { stdout } = await execFileAsync("node", [
198
+ BIN_PATH,
199
+ "evaluate",
200
+ twoSutAggregatesPath,
201
+ "-t",
202
+ "metrics",
203
+ "-c",
204
+ metricsConfig,
205
+ "-o",
206
+ metricsOutput,
207
+ "-v",
208
+ ], {
209
+ cwd: tempDir,
210
+ timeout: 15000,
211
+ });
212
+ assert.ok(stdout.length > 0, "Expected CLI output");
213
+ const output = JSON.parse(await readFile(metricsOutput, "utf-8"));
214
+ assert.strictEqual(output.type, "metrics", "Expected metrics evaluation type");
215
+ });
216
+ });
217
+ describe("invalid config", () => {
218
+ it("rejects malformed config with non-zero exit code", async () => {
219
+ const invalidConfig = join(tempDir, "invalid.json");
220
+ const { writeFile: writeFileFs } = await import("node:fs/promises");
221
+ await writeFileFs(invalidConfig, JSON.stringify({ invalid: true }));
222
+ try {
223
+ await execFileAsync("node", [BIN_PATH, invalidConfig], {
224
+ cwd: tempDir,
225
+ timeout: 10000,
226
+ });
227
+ assert.fail("Expected non-zero exit code for invalid config");
228
+ }
229
+ catch (error) {
230
+ // execFile rejects on non-zero exit code
231
+ assert.ok(error, "Expected error for invalid config");
232
+ }
233
+ });
234
+ });
235
+ });
236
+ //# sourceMappingURL=examples.integration.test.js.map