ppef 1.1.0 → 1.2.1
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/README.md +76 -125
- package/dist/__tests__/cli/evaluate-command.integration.test.d.ts +8 -0
- package/dist/__tests__/cli/evaluate-command.integration.test.d.ts.map +1 -0
- package/dist/__tests__/cli/evaluate-command.integration.test.js +308 -0
- package/dist/__tests__/cli/evaluate-command.integration.test.js.map +1 -0
- package/dist/__tests__/evaluators/claims-evaluator.unit.test.d.ts +8 -0
- package/dist/__tests__/evaluators/claims-evaluator.unit.test.d.ts.map +1 -0
- package/dist/__tests__/evaluators/claims-evaluator.unit.test.js +405 -0
- package/dist/__tests__/evaluators/claims-evaluator.unit.test.js.map +1 -0
- package/dist/__tests__/evaluators/metrics-evaluator.unit.test.d.ts +8 -0
- package/dist/__tests__/evaluators/metrics-evaluator.unit.test.d.ts.map +1 -0
- package/dist/__tests__/evaluators/metrics-evaluator.unit.test.js +424 -0
- package/dist/__tests__/evaluators/metrics-evaluator.unit.test.js.map +1 -0
- package/dist/__tests__/evaluators/registry.unit.test.d.ts +7 -0
- package/dist/__tests__/evaluators/registry.unit.test.d.ts.map +1 -0
- package/dist/__tests__/evaluators/registry.unit.test.js +173 -0
- package/dist/__tests__/evaluators/registry.unit.test.js.map +1 -0
- package/dist/__tests__/evaluators/robustness-evaluator.unit.test.d.ts +8 -0
- package/dist/__tests__/evaluators/robustness-evaluator.unit.test.d.ts.map +1 -0
- package/dist/__tests__/evaluators/robustness-evaluator.unit.test.js +260 -0
- package/dist/__tests__/evaluators/robustness-evaluator.unit.test.js.map +1 -0
- package/dist/__tests__/framework-pipeline.integration.test.js +36 -9
- package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -1
- package/dist/__tests__/index-exports.unit.test.js +9 -12
- package/dist/__tests__/index-exports.unit.test.js.map +1 -1
- package/dist/aggregation/pipeline.d.ts.map +1 -1
- package/dist/aggregation/pipeline.js +40 -3
- package/dist/aggregation/pipeline.js.map +1 -1
- package/dist/claims/index.d.ts +6 -3
- package/dist/claims/index.d.ts.map +1 -1
- package/dist/claims/index.js +6 -3
- package/dist/claims/index.js.map +1 -1
- package/dist/cli/__tests__/aggregate.command.unit.test.js +3 -0
- package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -1
- package/dist/cli/__tests__/binary-sut.integration.test.d.ts +8 -0
- package/dist/cli/__tests__/binary-sut.integration.test.d.ts.map +1 -0
- package/dist/cli/__tests__/binary-sut.integration.test.js +165 -0
- package/dist/cli/__tests__/binary-sut.integration.test.js.map +1 -0
- package/dist/cli/__tests__/config-loader.unit.test.d.ts +7 -0
- package/dist/cli/__tests__/config-loader.unit.test.d.ts.map +1 -0
- package/dist/cli/__tests__/config-loader.unit.test.js +611 -0
- package/dist/cli/__tests__/config-loader.unit.test.js.map +1 -0
- package/dist/cli/command-deps.d.ts +13 -1
- package/dist/cli/command-deps.d.ts.map +1 -1
- package/dist/cli/commands/aggregate.d.ts.map +1 -1
- package/dist/cli/commands/aggregate.js +3 -0
- package/dist/cli/commands/aggregate.js.map +1 -1
- package/dist/cli/commands/evaluate.d.ts +41 -0
- package/dist/cli/commands/evaluate.d.ts.map +1 -0
- package/dist/cli/commands/evaluate.js +287 -0
- package/dist/cli/commands/evaluate.js.map +1 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +93 -1
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/index.d.ts +2 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +3 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/module-loader.d.ts +23 -1
- package/dist/cli/module-loader.d.ts.map +1 -1
- package/dist/cli/module-loader.js +19 -1
- package/dist/cli/module-loader.js.map +1 -1
- package/dist/cli/types.d.ts +19 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/evaluators/claims-evaluator.d.ts +87 -0
- package/dist/evaluators/claims-evaluator.d.ts.map +1 -0
- package/dist/evaluators/claims-evaluator.js +289 -0
- package/dist/evaluators/claims-evaluator.js.map +1 -0
- package/dist/evaluators/exploratory-evaluator.d.ts +136 -0
- package/dist/evaluators/exploratory-evaluator.d.ts.map +1 -0
- package/dist/evaluators/exploratory-evaluator.js +545 -0
- package/dist/evaluators/exploratory-evaluator.js.map +1 -0
- package/dist/evaluators/index.d.ts +13 -0
- package/dist/evaluators/index.d.ts.map +1 -0
- package/dist/evaluators/index.js +14 -0
- package/dist/evaluators/index.js.map +1 -0
- package/dist/evaluators/metrics-evaluator.d.ts +114 -0
- package/dist/evaluators/metrics-evaluator.d.ts.map +1 -0
- package/dist/evaluators/metrics-evaluator.js +433 -0
- package/dist/evaluators/metrics-evaluator.js.map +1 -0
- package/dist/evaluators/registry.d.ts +106 -0
- package/dist/evaluators/registry.d.ts.map +1 -0
- package/dist/evaluators/registry.js +148 -0
- package/dist/evaluators/registry.js.map +1 -0
- package/dist/evaluators/robustness-evaluator.d.ts +57 -0
- package/dist/evaluators/robustness-evaluator.d.ts.map +1 -0
- package/dist/evaluators/robustness-evaluator.js +186 -0
- package/dist/evaluators/robustness-evaluator.js.map +1 -0
- package/dist/executor/__tests__/binary-sut.unit.test.d.ts +8 -0
- package/dist/executor/__tests__/binary-sut.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/binary-sut.unit.test.js +313 -0
- package/dist/executor/__tests__/binary-sut.unit.test.js.map +1 -0
- package/dist/executor/__tests__/checkpoint-storage.unit.test.js +43 -0
- package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -1
- package/dist/executor/__tests__/executor.unit.test.js +56 -9
- package/dist/executor/__tests__/executor.unit.test.js.map +1 -1
- package/dist/executor/__tests__/resource-calculator.unit.test.d.ts +10 -0
- package/dist/executor/__tests__/resource-calculator.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/resource-calculator.unit.test.js +104 -0
- package/dist/executor/__tests__/resource-calculator.unit.test.js.map +1 -0
- package/dist/executor/__tests__/worker-threads-executor.unit.test.d.ts +8 -0
- package/dist/executor/__tests__/worker-threads-executor.unit.test.d.ts.map +1 -0
- package/dist/executor/__tests__/worker-threads-executor.unit.test.js +276 -0
- package/dist/executor/__tests__/worker-threads-executor.unit.test.js.map +1 -0
- package/dist/executor/binary-sut.d.ts +105 -0
- package/dist/executor/binary-sut.d.ts.map +1 -0
- package/dist/executor/binary-sut.js +174 -0
- package/dist/executor/binary-sut.js.map +1 -0
- package/dist/executor/checkpoint-storage.d.ts.map +1 -1
- package/dist/executor/checkpoint-storage.js +6 -4
- package/dist/executor/checkpoint-storage.js.map +1 -1
- package/dist/executor/executor.d.ts +28 -0
- package/dist/executor/executor.d.ts.map +1 -1
- package/dist/executor/executor.js +85 -24
- package/dist/executor/executor.js.map +1 -1
- package/dist/executor/index.d.ts +4 -0
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/index.js +4 -0
- package/dist/executor/index.js.map +1 -1
- package/dist/executor/resource-calculator.d.ts +49 -0
- package/dist/executor/resource-calculator.d.ts.map +1 -0
- package/dist/executor/resource-calculator.js +129 -0
- package/dist/executor/resource-calculator.js.map +1 -0
- package/dist/executor/worker-entry.js +26 -10
- package/dist/executor/worker-entry.js.map +1 -1
- package/dist/executor/worker-executor.d.ts +104 -3
- package/dist/executor/worker-executor.d.ts.map +1 -1
- package/dist/executor/worker-executor.js +224 -4
- package/dist/executor/worker-executor.js.map +1 -1
- package/dist/executor/worker-threads-executor.d.ts +245 -0
- package/dist/executor/worker-threads-executor.d.ts.map +1 -0
- package/dist/executor/worker-threads-executor.js +332 -0
- package/dist/executor/worker-threads-executor.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/renderers/latex-renderer.d.ts +60 -0
- package/dist/renderers/latex-renderer.d.ts.map +1 -1
- package/dist/renderers/latex-renderer.js +299 -0
- package/dist/renderers/latex-renderer.js.map +1 -1
- package/dist/renderers/types.d.ts +9 -0
- package/dist/renderers/types.d.ts.map +1 -1
- package/dist/renderers/types.js.map +1 -1
- package/dist/robustness/index.d.ts +5 -2
- package/dist/robustness/index.d.ts.map +1 -1
- package/dist/robustness/index.js +4 -2
- package/dist/robustness/index.js.map +1 -1
- package/dist/types/evaluator.d.ts +449 -0
- package/dist/types/evaluator.d.ts.map +1 -0
- package/dist/types/evaluator.js +9 -0
- package/dist/types/evaluator.js.map +1 -0
- package/dist/types/result.d.ts +2 -0
- package/dist/types/result.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/claims/__tests__/evaluator.unit.test.d.ts +0 -12
- package/dist/claims/__tests__/evaluator.unit.test.d.ts.map +0 -1
- package/dist/claims/__tests__/evaluator.unit.test.js +0 -801
- package/dist/claims/__tests__/evaluator.unit.test.js.map +0 -1
- package/dist/claims/evaluator.d.ts +0 -33
- package/dist/claims/evaluator.d.ts.map +0 -1
- package/dist/claims/evaluator.js +0 -174
- package/dist/claims/evaluator.js.map +0 -1
- package/dist/robustness/__tests__/analyzer.unit.test.d.ts +0 -11
- package/dist/robustness/__tests__/analyzer.unit.test.d.ts.map +0 -1
- package/dist/robustness/__tests__/analyzer.unit.test.js +0 -455
- package/dist/robustness/__tests__/analyzer.unit.test.js.map +0 -1
- package/dist/robustness/analyzer.d.ts +0 -61
- package/dist/robustness/analyzer.d.ts.map +0 -1
- package/dist/robustness/analyzer.js +0 -191
- package/dist/robustness/analyzer.js.map +0 -1
package/README.md
CHANGED
|
@@ -2,16 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
A claim-driven, deterministic evaluation framework for experiments. PPEF provides a structured approach to testing and validating software components through reusable test cases, statistical aggregation, and claim-based evaluation.
|
|
4
4
|
|
|
5
|
+
Published npm package with dual ESM/CJS output. Single runtime dependency: `commander`.
|
|
6
|
+
|
|
5
7
|
## Features
|
|
6
8
|
|
|
7
|
-
- **
|
|
8
|
-
- **
|
|
9
|
-
- **
|
|
10
|
-
- **
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
14
|
-
- **
|
|
9
|
+
- **Type-safe**: Strict TypeScript with generic SUT, Case, and Evaluator abstractions
|
|
10
|
+
- **Registry**: Centralized registries for Systems Under Test (SUTs) and evaluation cases with role/tag filtering
|
|
11
|
+
- **Execution**: Deterministic execution with worker threads, checkpointing, memory monitoring, and binary SUT support
|
|
12
|
+
- **Statistical**: Mann-Whitney U test, Cohen's d, confidence intervals
|
|
13
|
+
- **Aggregation**: Summary stats, pairwise comparisons, and rankings across runs
|
|
14
|
+
- **Evaluation**: Four built-in evaluators — claims, robustness, metrics, and exploratory
|
|
15
|
+
- **Rendering**: LaTeX table generation for thesis integration
|
|
16
|
+
- **CLI**: Five commands for running, validating, planning, aggregating, and evaluating experiments
|
|
15
17
|
|
|
16
18
|
## Installation
|
|
17
19
|
|
|
@@ -20,153 +22,102 @@ A claim-driven, deterministic evaluation framework for experiments. PPEF provide
|
|
|
20
22
|
pnpm add ppef
|
|
21
23
|
|
|
22
24
|
# Or use locally for development
|
|
23
|
-
git clone
|
|
25
|
+
git clone https://github.com/Mearman/ppef.git
|
|
24
26
|
cd ppef
|
|
25
27
|
pnpm install
|
|
26
28
|
pnpm build
|
|
27
29
|
```
|
|
28
30
|
|
|
29
|
-
##
|
|
31
|
+
## Development
|
|
30
32
|
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
execute: (input: number[]) => input.sort((a, b) => a - b)
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
// 2. Define test cases
|
|
41
|
-
const ascendingCase = new Case({
|
|
42
|
-
name: 'ascending-order',
|
|
43
|
-
setup: () => [1, 2, 3, 4, 5],
|
|
44
|
-
teardown: (result) => console.log('Result:', result)
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
const descendingCase = new Case({
|
|
48
|
-
name: 'descending-order',
|
|
49
|
-
setup: () => [5, 4, 3, 2, 1],
|
|
50
|
-
teardown: (result) => console.log('Result:', result)
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
// 3. Execute tests
|
|
54
|
-
const results = Execute.run('sort-algo', [ascendingCase, descendingCase]);
|
|
55
|
-
|
|
56
|
-
// 4. Aggregate metrics across multiple runs
|
|
57
|
-
const aggregated = Aggregate.mean(results);
|
|
58
|
-
|
|
59
|
-
// 5. Evaluate claims
|
|
60
|
-
const claims = Evaluate.claims(aggregated, {
|
|
61
|
-
'always-sorted': (result) => {
|
|
62
|
-
const arr = result.output;
|
|
63
|
-
for (let i = 0; i < arr.length - 1; i++) {
|
|
64
|
-
if (arr[i] > arr[i + 1]) return false;
|
|
65
|
-
}
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// 6. Render reports
|
|
71
|
-
Render.console(claims);
|
|
72
|
-
Render.markdown(claims, './results.md');
|
|
73
|
-
Render.json(claims, './results.json');
|
|
33
|
+
```bash
|
|
34
|
+
pnpm install # Install dependencies
|
|
35
|
+
pnpm build # TypeScript compile + CJS wrapper generation
|
|
36
|
+
pnpm typecheck # Type-check only (tsc --noEmit)
|
|
37
|
+
pnpm lint # ESLint + Prettier with auto-fix
|
|
38
|
+
pnpm test # Run all tests with coverage (c8 + tsx + Node native test runner)
|
|
74
39
|
```
|
|
75
40
|
|
|
76
|
-
|
|
41
|
+
Run a single test file:
|
|
42
|
+
```bash
|
|
43
|
+
npx tsx --test src/path/to/file.test.ts
|
|
44
|
+
```
|
|
77
45
|
|
|
78
|
-
|
|
79
|
-
|
|
46
|
+
CLI (after build):
|
|
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
|
|
53
|
+
```
|
|
80
54
|
|
|
81
|
-
|
|
82
|
-
Centralized registry for managing Systems Under Test (SUTs). Register implementations with unique identifiers and retrieve them for execution.
|
|
55
|
+
## Architecture
|
|
83
56
|
|
|
84
|
-
|
|
85
|
-
Store.register('my-sut', {
|
|
86
|
-
name: 'My Implementation',
|
|
87
|
-
version: '1.0.0',
|
|
88
|
-
execute: (input) => { /* implementation */ }
|
|
89
|
-
});
|
|
57
|
+
### Data Flow Pipeline
|
|
90
58
|
|
|
91
|
-
const sut = Store.get('my-sut');
|
|
92
59
|
```
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
setup: () => ({ data: [1, 2, 3] }),
|
|
101
|
-
teardown: (result) => console.log('Cleanup:', result)
|
|
102
|
-
});
|
|
60
|
+
SUTs + Cases (Registries)
|
|
61
|
+
→ Executor (runs SUTs against cases, deterministic runIds)
|
|
62
|
+
→ EvaluationResult (canonical schema)
|
|
63
|
+
→ ResultCollector (validates + filters)
|
|
64
|
+
→ Aggregation Pipeline (summary stats, comparisons, rankings)
|
|
65
|
+
→ Evaluators (claims, robustness, metrics, exploratory)
|
|
66
|
+
→ Renderers (LaTeX tables for thesis)
|
|
103
67
|
```
|
|
104
68
|
|
|
105
|
-
###
|
|
106
|
-
Deterministic test execution engine. Runs SUTs against test cases and captures snapshots of inputs, outputs, and execution metadata.
|
|
69
|
+
### Module Map (`src/`)
|
|
107
70
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
71
|
+
| Module | Purpose |
|
|
72
|
+
|--------|---------|
|
|
73
|
+
| `types/` | All canonical type definitions (result, sut, case, claims, evaluator, aggregate, perturbation) |
|
|
74
|
+
| `registry/` | `SUTRegistry` and `CaseRegistry` — generic registries with role/tag filtering |
|
|
75
|
+
| `executor/` | Orchestrator with worker threads, checkpointing, memory monitoring, binary SUT support |
|
|
76
|
+
| `collector/` | Result aggregation and JSON schema validation |
|
|
77
|
+
| `statistical/` | Mann-Whitney U test, Cohen's d, confidence intervals |
|
|
78
|
+
| `aggregation/` | `computeSummaryStats()`, `computeComparison()`, `computeRankings()`, pipeline |
|
|
79
|
+
| `evaluators/` | Four built-in evaluators + extensible registry (see below) |
|
|
80
|
+
| `claims/` | Claim type definitions |
|
|
81
|
+
| `robustness/` | Perturbation configs and robustness metric types |
|
|
82
|
+
| `renderers/` | LaTeX table renderer |
|
|
83
|
+
| `cli/` | Five commands with config loading, module loading, output writing |
|
|
112
84
|
|
|
113
|
-
###
|
|
114
|
-
Statistical aggregation utilities for analyzing test results across multiple runs. Compute mean, median, mode, min, max, and standard deviation.
|
|
85
|
+
### Key Abstractions
|
|
115
86
|
|
|
116
|
-
|
|
117
|
-
const stats = Aggregate.mean(results);
|
|
118
|
-
const median = Aggregate.median(results);
|
|
119
|
-
const deviation = Aggregate.stdDev(results);
|
|
120
|
-
```
|
|
87
|
+
**SUT** (`SUT<TInputs, TResult>`): Generic System Under Test. Has `id`, `config`, and `run(inputs)`. Roles: `primary`, `baseline`, `oracle`.
|
|
121
88
|
|
|
122
|
-
|
|
123
|
-
Claim-driven validation framework. Define custom predicates to validate test results against expected properties and behaviors.
|
|
89
|
+
**CaseDefinition** (`CaseDefinition<TInput, TInputs>`): Two-phase resource factory — `getInput()` loads a resource once, `getInputs()` returns algorithm-specific inputs.
|
|
124
90
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
});
|
|
131
|
-
```
|
|
91
|
+
**Evaluator** (`Evaluator<TConfig, TInput, TOutput>`): Extensible evaluation with `validateConfig()`, `evaluate()`, `summarize()`. Four built-in types:
|
|
92
|
+
- **ClaimsEvaluator** — tests explicit hypotheses with statistical significance
|
|
93
|
+
- **RobustnessEvaluator** — sensitivity analysis under perturbations
|
|
94
|
+
- **MetricsEvaluator** — multi-criterion threshold/baseline/target-range evaluation
|
|
95
|
+
- **ExploratoryEvaluator** — hypothesis-free analysis (rankings, pairwise comparisons, correlations, case-class effects)
|
|
132
96
|
|
|
133
|
-
|
|
134
|
-
Multi-format report generation. Output results to console, Markdown files, or JSON for documentation and CI/CD integration.
|
|
97
|
+
**EvaluationResult**: Canonical output schema capturing run identity (deterministic SHA-256 `runId`), correctness, metrics, output artefacts, and provenance.
|
|
135
98
|
|
|
136
|
-
|
|
137
|
-
Render.console(results);
|
|
138
|
-
Render.markdown(results, './report.md');
|
|
139
|
-
Render.json(results, './report.json');
|
|
140
|
-
```
|
|
99
|
+
### Subpath Exports
|
|
141
100
|
|
|
142
|
-
|
|
143
|
-
Built-in resource tracking for performance profiling. Monitor memory usage and CPU consumption during test execution.
|
|
101
|
+
Each module is independently importable:
|
|
144
102
|
|
|
145
103
|
```typescript
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
const metrics = monitor.stop();
|
|
150
|
-
console.log('Memory used:', metrics.memoryUsage);
|
|
104
|
+
import { SUTRegistry } from 'ppef/registry';
|
|
105
|
+
import { EvaluationResult } from 'ppef/types';
|
|
106
|
+
import { computeSummaryStats } from 'ppef/aggregation';
|
|
151
107
|
```
|
|
152
108
|
|
|
153
|
-
|
|
109
|
+
Available subpaths: `ppef/types`, `ppef/registry`, `ppef/executor`, `ppef/collector`, `ppef/statistical`, `ppef/aggregation`, `ppef/evaluators`, `ppef/claims`, `ppef/robustness`, `ppef/renderers`.
|
|
154
110
|
|
|
155
|
-
|
|
111
|
+
## Conventions
|
|
156
112
|
|
|
157
|
-
-
|
|
158
|
-
-
|
|
159
|
-
-
|
|
160
|
-
-
|
|
161
|
-
-
|
|
162
|
-
- `
|
|
163
|
-
- `
|
|
164
|
-
- `src/monitor.ts` - Resource monitoring API
|
|
113
|
+
- TypeScript strict mode, ES2023 target, ES modules
|
|
114
|
+
- Node.js native test runner (`node:test` + `node:assert`) — not Vitest/Jest
|
|
115
|
+
- Coverage via c8 (text + html + json-summary in `./coverage/`)
|
|
116
|
+
- Conventional commits enforced via commitlint + husky
|
|
117
|
+
- Semantic release from all branches
|
|
118
|
+
- No `any` types — use `unknown` with type guards
|
|
119
|
+
- Executor produces deterministic `runId` via SHA-256 hash of inputs
|
|
165
120
|
|
|
166
121
|
## License
|
|
167
122
|
|
|
168
123
|
MIT
|
|
169
|
-
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
**PPEF** - Making experiments reproducible, evaluable, and documentable.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate-command.integration.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/cli/evaluate-command.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for Evaluate Command
|
|
3
|
+
*
|
|
4
|
+
* Tests the CLI evaluate command using dependency injection
|
|
5
|
+
* for file system and process exit mocking.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it } from "node:test";
|
|
8
|
+
import { strict as assert } from "node:assert";
|
|
9
|
+
import { executeEvaluate } from "../../cli/commands/evaluate.js";
|
|
10
|
+
import { createMockAggregate, createMockSummaryStats } from "../test-helpers.js";
|
|
11
|
+
/**
|
|
12
|
+
* Test helpers
|
|
13
|
+
*/
|
|
14
|
+
function createMockAggregatesFile() {
|
|
15
|
+
const aggregates = [
|
|
16
|
+
createMockAggregate("primary-sut", "primary", undefined, {
|
|
17
|
+
accuracy: createMockSummaryStats([0.85, 0.87, 0.86]),
|
|
18
|
+
}),
|
|
19
|
+
createMockAggregate("baseline-sut", "baseline", undefined, {
|
|
20
|
+
accuracy: createMockSummaryStats([0.75, 0.77, 0.76]),
|
|
21
|
+
}),
|
|
22
|
+
];
|
|
23
|
+
return JSON.stringify({ aggregates }, null, 2);
|
|
24
|
+
}
|
|
25
|
+
function createMockClaimsConfig() {
|
|
26
|
+
return JSON.stringify({
|
|
27
|
+
claims: [
|
|
28
|
+
{
|
|
29
|
+
claimId: "C001",
|
|
30
|
+
description: "Test claim",
|
|
31
|
+
sut: "primary-sut",
|
|
32
|
+
baseline: "baseline-sut",
|
|
33
|
+
metric: "accuracy",
|
|
34
|
+
direction: "greater",
|
|
35
|
+
scope: "global",
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
}, null, 2);
|
|
39
|
+
}
|
|
40
|
+
function createMockMetricsConfig() {
|
|
41
|
+
return JSON.stringify({
|
|
42
|
+
criteria: [
|
|
43
|
+
{
|
|
44
|
+
criterionId: "C001",
|
|
45
|
+
description: "Test criterion",
|
|
46
|
+
type: "threshold",
|
|
47
|
+
metric: "accuracy",
|
|
48
|
+
sut: "primary-sut",
|
|
49
|
+
threshold: { operator: "gte", value: 0.8 },
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
}, null, 2);
|
|
53
|
+
}
|
|
54
|
+
function createMockRobustnessConfig() {
|
|
55
|
+
return JSON.stringify({
|
|
56
|
+
metrics: ["accuracy"],
|
|
57
|
+
perturbations: ["noise"],
|
|
58
|
+
}, null, 2);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Spy logger that captures all calls
|
|
62
|
+
*/
|
|
63
|
+
class SpyLogger {
|
|
64
|
+
calls = [];
|
|
65
|
+
header(message) {
|
|
66
|
+
this.calls.push(`header:${message}`);
|
|
67
|
+
}
|
|
68
|
+
subheader(message) {
|
|
69
|
+
this.calls.push(`subheader:${message}`);
|
|
70
|
+
}
|
|
71
|
+
info(message) {
|
|
72
|
+
this.calls.push(`info:${message}`);
|
|
73
|
+
}
|
|
74
|
+
debug(message) {
|
|
75
|
+
this.calls.push(`debug:${message}`);
|
|
76
|
+
}
|
|
77
|
+
error(message) {
|
|
78
|
+
this.calls.push(`error:${message}`);
|
|
79
|
+
}
|
|
80
|
+
warn(message) {
|
|
81
|
+
this.calls.push(`warn:${message}`);
|
|
82
|
+
}
|
|
83
|
+
setProgress(_enabled) {
|
|
84
|
+
// Ignore
|
|
85
|
+
}
|
|
86
|
+
hasInfo(message) {
|
|
87
|
+
return this.calls.includes(`info:${message}`);
|
|
88
|
+
}
|
|
89
|
+
hasError(message) {
|
|
90
|
+
return this.calls.some((call) => call.startsWith(`error:`) && call.includes(message));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Mock file system
|
|
95
|
+
*/
|
|
96
|
+
class MockFS {
|
|
97
|
+
files = new Map();
|
|
98
|
+
constructor(files) {
|
|
99
|
+
Object.entries(files).forEach(([path, content]) => {
|
|
100
|
+
this.files.set(path, content);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async readFile(path, _encoding) {
|
|
104
|
+
const content = this.files.get(path);
|
|
105
|
+
if (content === undefined) {
|
|
106
|
+
throw new Error(`File not found: ${path}`);
|
|
107
|
+
}
|
|
108
|
+
return content;
|
|
109
|
+
}
|
|
110
|
+
async writeFile(path, data, _encoding) {
|
|
111
|
+
this.files.set(path, data);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
describe("evaluate command - integration tests", () => {
|
|
115
|
+
describe("claims evaluation", () => {
|
|
116
|
+
it("should evaluate claims successfully", async () => {
|
|
117
|
+
const aggregatesFile = "/mock/aggregates.json";
|
|
118
|
+
const configFile = "/mock/config.json";
|
|
119
|
+
const mockFS = new MockFS({
|
|
120
|
+
[aggregatesFile]: createMockAggregatesFile(),
|
|
121
|
+
[configFile]: createMockClaimsConfig(),
|
|
122
|
+
});
|
|
123
|
+
const mockLogger = new SpyLogger();
|
|
124
|
+
let exitCode;
|
|
125
|
+
const mockExit = (code) => {
|
|
126
|
+
exitCode = code;
|
|
127
|
+
throw new Error(`Exit ${code}`);
|
|
128
|
+
};
|
|
129
|
+
// executeEvaluate doesn't call processExit on success
|
|
130
|
+
try {
|
|
131
|
+
await executeEvaluate(aggregatesFile, { type: "claims", config: configFile, verbose: true }, { logger: mockLogger, fileSystem: mockFS, processExit: mockExit });
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
// If processExit was called, we should see the exit code and logged errors
|
|
135
|
+
if (exitCode !== undefined) {
|
|
136
|
+
const errorLogs = mockLogger.calls.filter((call) => call.startsWith("error:"));
|
|
137
|
+
assert.fail(`processExit was called with code ${exitCode}. Logged errors:\n${errorLogs.join("\n")}`);
|
|
138
|
+
}
|
|
139
|
+
throw e;
|
|
140
|
+
}
|
|
141
|
+
assert.strictEqual(exitCode, undefined, "processExit should not be called on success");
|
|
142
|
+
// Check for "Evaluation complete: claims" message
|
|
143
|
+
assert.ok(mockLogger.calls.some((call) => call.startsWith("info:Evaluation complete:")));
|
|
144
|
+
});
|
|
145
|
+
it("should use provided config file", async () => {
|
|
146
|
+
const aggregatesFile = "/mock/aggregates.json";
|
|
147
|
+
const configFile = "/mock/config.json";
|
|
148
|
+
const mockFS = new MockFS({
|
|
149
|
+
[aggregatesFile]: createMockAggregatesFile(),
|
|
150
|
+
[configFile]: createMockClaimsConfig(),
|
|
151
|
+
});
|
|
152
|
+
const mockLogger = new SpyLogger();
|
|
153
|
+
let exitCode;
|
|
154
|
+
const mockExit = (code) => {
|
|
155
|
+
exitCode = code;
|
|
156
|
+
throw new Error(`Exit ${code}`);
|
|
157
|
+
};
|
|
158
|
+
try {
|
|
159
|
+
await executeEvaluate(aggregatesFile, { type: "claims", config: configFile }, { logger: mockLogger, fileSystem: mockFS, processExit: mockExit });
|
|
160
|
+
}
|
|
161
|
+
catch (e) {
|
|
162
|
+
if (exitCode !== undefined) {
|
|
163
|
+
const errorLogs = mockLogger.calls.filter((call) => call.startsWith("error:"));
|
|
164
|
+
assert.fail(`processExit was called with code ${exitCode}. Logged errors:\n${errorLogs.join("\n")}`);
|
|
165
|
+
}
|
|
166
|
+
throw e;
|
|
167
|
+
}
|
|
168
|
+
assert.strictEqual(exitCode, undefined, "processExit should not be called on success");
|
|
169
|
+
});
|
|
170
|
+
it("should handle invalid config gracefully", async () => {
|
|
171
|
+
const aggregatesFile = "/mock/aggregates.json";
|
|
172
|
+
const configFile = "/mock/config.json";
|
|
173
|
+
const mockFS = new MockFS({
|
|
174
|
+
[aggregatesFile]: createMockAggregatesFile(),
|
|
175
|
+
[configFile]: JSON.stringify({ invalid: "config" }),
|
|
176
|
+
});
|
|
177
|
+
const mockLogger = new SpyLogger();
|
|
178
|
+
let exitCode = 0;
|
|
179
|
+
const mockExit = (code) => {
|
|
180
|
+
exitCode = code;
|
|
181
|
+
throw new Error(`Exit ${code}`);
|
|
182
|
+
};
|
|
183
|
+
await executeEvaluate(aggregatesFile, { type: "claims", config: configFile }, { logger: mockLogger, fileSystem: mockFS, processExit: mockExit }).catch(() => {
|
|
184
|
+
// Expected
|
|
185
|
+
});
|
|
186
|
+
assert.strictEqual(exitCode, 1);
|
|
187
|
+
assert.ok(mockLogger.hasError("validation failed"));
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
describe("metrics evaluation", () => {
|
|
191
|
+
it("should evaluate metrics successfully", async () => {
|
|
192
|
+
const aggregatesFile = "/mock/aggregates.json";
|
|
193
|
+
const configFile = "/mock/config.json";
|
|
194
|
+
const mockFS = new MockFS({
|
|
195
|
+
[aggregatesFile]: createMockAggregatesFile(),
|
|
196
|
+
[configFile]: createMockMetricsConfig(),
|
|
197
|
+
});
|
|
198
|
+
const mockLogger = new SpyLogger();
|
|
199
|
+
let exitCode;
|
|
200
|
+
const mockExit = (code) => {
|
|
201
|
+
exitCode = code;
|
|
202
|
+
throw new Error(`Exit ${code}`);
|
|
203
|
+
};
|
|
204
|
+
try {
|
|
205
|
+
await executeEvaluate(aggregatesFile, {
|
|
206
|
+
type: "metrics",
|
|
207
|
+
config: configFile,
|
|
208
|
+
verbose: true,
|
|
209
|
+
}, { logger: mockLogger, fileSystem: mockFS, processExit: mockExit });
|
|
210
|
+
}
|
|
211
|
+
catch (e) {
|
|
212
|
+
if (exitCode !== undefined) {
|
|
213
|
+
const errorLogs = mockLogger.calls.filter((call) => call.startsWith("error:"));
|
|
214
|
+
assert.fail(`processExit was called with code ${exitCode}. Logged errors:\n${errorLogs.join("\n")}`);
|
|
215
|
+
}
|
|
216
|
+
throw e;
|
|
217
|
+
}
|
|
218
|
+
assert.strictEqual(exitCode, undefined, "processExit should not be called on success");
|
|
219
|
+
assert.ok(mockLogger.calls.some((call) => call.startsWith("info:Evaluation complete:")));
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
describe("error handling", () => {
|
|
223
|
+
it("should exit with error when file not found", async () => {
|
|
224
|
+
const mockFS = new MockFS({});
|
|
225
|
+
const mockLogger = new SpyLogger();
|
|
226
|
+
let exitCode = 0;
|
|
227
|
+
const mockExit = (code) => {
|
|
228
|
+
exitCode = code;
|
|
229
|
+
throw new Error(`Exit ${code}`);
|
|
230
|
+
};
|
|
231
|
+
await executeEvaluate("/mock/missing.json", { type: "claims" }, { logger: mockLogger, fileSystem: mockFS, processExit: mockExit }).catch(() => {
|
|
232
|
+
// Expected
|
|
233
|
+
});
|
|
234
|
+
assert.strictEqual(exitCode, 1);
|
|
235
|
+
assert.ok(mockLogger.calls.some((call) => call.startsWith("error:")));
|
|
236
|
+
});
|
|
237
|
+
it("should handle invalid JSON gracefully", async () => {
|
|
238
|
+
const aggregatesFile = "/mock/aggregates.json";
|
|
239
|
+
const mockFS = new MockFS({
|
|
240
|
+
[aggregatesFile]: "invalid json{",
|
|
241
|
+
});
|
|
242
|
+
const mockLogger = new SpyLogger();
|
|
243
|
+
let exitCode = 0;
|
|
244
|
+
const mockExit = (code) => {
|
|
245
|
+
exitCode = code;
|
|
246
|
+
throw new Error(`Exit ${code}`);
|
|
247
|
+
};
|
|
248
|
+
await executeEvaluate(aggregatesFile, { type: "claims" }, { logger: mockLogger, fileSystem: mockFS, processExit: mockExit }).catch(() => {
|
|
249
|
+
// Expected
|
|
250
|
+
});
|
|
251
|
+
assert.strictEqual(exitCode, 1);
|
|
252
|
+
});
|
|
253
|
+
it("should handle missing aggregates in file", async () => {
|
|
254
|
+
const aggregatesFile = "/mock/aggregates.json";
|
|
255
|
+
const mockFS = new MockFS({
|
|
256
|
+
[aggregatesFile]: JSON.stringify({ results: [] }),
|
|
257
|
+
});
|
|
258
|
+
const mockLogger = new SpyLogger();
|
|
259
|
+
let exitCode = 0;
|
|
260
|
+
const mockExit = (code) => {
|
|
261
|
+
exitCode = code;
|
|
262
|
+
throw new Error(`Exit ${code}`);
|
|
263
|
+
};
|
|
264
|
+
await executeEvaluate(aggregatesFile, { type: "claims" }, { logger: mockLogger, fileSystem: mockFS, processExit: mockExit }).catch(() => {
|
|
265
|
+
// Expected
|
|
266
|
+
});
|
|
267
|
+
assert.strictEqual(exitCode, 1);
|
|
268
|
+
assert.ok(mockLogger.calls.some((call) => call.startsWith("error:") && call.includes("aggregate")));
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
describe("robustness evaluation", () => {
|
|
272
|
+
it("should require raw results for robustness", async () => {
|
|
273
|
+
const aggregatesFile = "/mock/aggregates.json";
|
|
274
|
+
const configFile = "/mock/config.json";
|
|
275
|
+
const mockFS = new MockFS({
|
|
276
|
+
[aggregatesFile]: JSON.stringify({
|
|
277
|
+
aggregates: [
|
|
278
|
+
createMockAggregate("sut-1", "primary", undefined, {
|
|
279
|
+
accuracy: createMockSummaryStats([0.85]),
|
|
280
|
+
}),
|
|
281
|
+
],
|
|
282
|
+
}),
|
|
283
|
+
[configFile]: createMockRobustnessConfig(),
|
|
284
|
+
});
|
|
285
|
+
const mockLogger = new SpyLogger();
|
|
286
|
+
let exitCode = 0;
|
|
287
|
+
const mockExit = (code) => {
|
|
288
|
+
exitCode = code;
|
|
289
|
+
throw new Error(`Exit ${code}`);
|
|
290
|
+
};
|
|
291
|
+
await executeEvaluate(aggregatesFile, { type: "robustness", config: configFile }, { logger: mockLogger, fileSystem: mockFS, processExit: mockExit }).catch(() => {
|
|
292
|
+
// Expected to throw due to mockExit
|
|
293
|
+
});
|
|
294
|
+
// Check exitCode first
|
|
295
|
+
if (exitCode !== 1) {
|
|
296
|
+
assert.fail(`Expected exitCode to be 1, but got ${exitCode}. All calls:\n${mockLogger.calls.join("\n")}`);
|
|
297
|
+
}
|
|
298
|
+
// Check for error message
|
|
299
|
+
const hasRawResultsError = mockLogger.calls.some((call) => call.startsWith("error:") && call.includes("raw results"));
|
|
300
|
+
if (!hasRawResultsError) {
|
|
301
|
+
assert.fail(`Expected error message containing 'raw results', but got:\n${mockLogger.calls
|
|
302
|
+
.filter((c) => c.startsWith("error:"))
|
|
303
|
+
.join("\n")}`);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
//# sourceMappingURL=evaluate-command.integration.test.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claims-evaluator.unit.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/evaluators/claims-evaluator.unit.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|