ppef 1.0.1 → 1.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 (295) hide show
  1. package/README.md +76 -125
  2. package/bin/ppef.mjs +20 -0
  3. package/dist/__tests__/cli/evaluate-command.integration.test.d.ts +8 -0
  4. package/dist/__tests__/cli/evaluate-command.integration.test.d.ts.map +1 -0
  5. package/dist/__tests__/cli/evaluate-command.integration.test.js +308 -0
  6. package/dist/__tests__/cli/evaluate-command.integration.test.js.map +1 -0
  7. package/dist/__tests__/evaluators/claims-evaluator.unit.test.d.ts +8 -0
  8. package/dist/__tests__/evaluators/claims-evaluator.unit.test.d.ts.map +1 -0
  9. package/dist/__tests__/evaluators/claims-evaluator.unit.test.js +405 -0
  10. package/dist/__tests__/evaluators/claims-evaluator.unit.test.js.map +1 -0
  11. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.d.ts +8 -0
  12. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.d.ts.map +1 -0
  13. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.js +424 -0
  14. package/dist/__tests__/evaluators/metrics-evaluator.unit.test.js.map +1 -0
  15. package/dist/__tests__/evaluators/registry.unit.test.d.ts +7 -0
  16. package/dist/__tests__/evaluators/registry.unit.test.d.ts.map +1 -0
  17. package/dist/__tests__/evaluators/registry.unit.test.js +173 -0
  18. package/dist/__tests__/evaluators/registry.unit.test.js.map +1 -0
  19. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.d.ts +8 -0
  20. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.d.ts.map +1 -0
  21. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.js +260 -0
  22. package/dist/__tests__/evaluators/robustness-evaluator.unit.test.js.map +1 -0
  23. package/dist/__tests__/framework-pipeline.integration.test.js +49 -20
  24. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -1
  25. package/dist/__tests__/index-exports.unit.test.d.ts +8 -0
  26. package/dist/__tests__/index-exports.unit.test.d.ts.map +1 -0
  27. package/dist/__tests__/index-exports.unit.test.js +124 -0
  28. package/dist/__tests__/index-exports.unit.test.js.map +1 -0
  29. package/dist/__tests__/registry-executor.integration.test.js +12 -9
  30. package/dist/__tests__/registry-executor.integration.test.js.map +1 -1
  31. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts +7 -0
  32. package/dist/aggregation/__tests__/aggregators.unit.test.d.ts.map +1 -0
  33. package/dist/aggregation/__tests__/aggregators.unit.test.js +350 -0
  34. package/dist/aggregation/__tests__/aggregators.unit.test.js.map +1 -0
  35. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts +7 -0
  36. package/dist/aggregation/__tests__/pipeline.unit.test.d.ts.map +1 -0
  37. package/dist/aggregation/__tests__/pipeline.unit.test.js +213 -0
  38. package/dist/aggregation/__tests__/pipeline.unit.test.js.map +1 -0
  39. package/dist/aggregation/aggregators.d.ts +9 -0
  40. package/dist/aggregation/aggregators.d.ts.map +1 -1
  41. package/dist/aggregation/aggregators.js +1 -1
  42. package/dist/aggregation/aggregators.js.map +1 -1
  43. package/dist/aggregation/index.d.ts +1 -1
  44. package/dist/aggregation/index.d.ts.map +1 -1
  45. package/dist/aggregation/index.js +1 -1
  46. package/dist/aggregation/index.js.map +1 -1
  47. package/dist/aggregation/pipeline.d.ts.map +1 -1
  48. package/dist/aggregation/pipeline.js +40 -3
  49. package/dist/aggregation/pipeline.js.map +1 -1
  50. package/dist/claims/index.d.ts +6 -3
  51. package/dist/claims/index.d.ts.map +1 -1
  52. package/dist/claims/index.js +6 -3
  53. package/dist/claims/index.js.map +1 -1
  54. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts +7 -0
  55. package/dist/cli/__tests__/aggregate.command.unit.test.d.ts.map +1 -0
  56. package/dist/cli/__tests__/aggregate.command.unit.test.js +399 -0
  57. package/dist/cli/__tests__/aggregate.command.unit.test.js.map +1 -0
  58. package/dist/cli/__tests__/binary-sut.integration.test.d.ts +8 -0
  59. package/dist/cli/__tests__/binary-sut.integration.test.d.ts.map +1 -0
  60. package/dist/cli/__tests__/binary-sut.integration.test.js +165 -0
  61. package/dist/cli/__tests__/binary-sut.integration.test.js.map +1 -0
  62. package/dist/cli/__tests__/commands.unit.test.d.ts +10 -0
  63. package/dist/cli/__tests__/commands.unit.test.d.ts.map +1 -0
  64. package/dist/cli/__tests__/commands.unit.test.js +217 -0
  65. package/dist/cli/__tests__/commands.unit.test.js.map +1 -0
  66. package/dist/cli/__tests__/config-loader.unit.test.d.ts +7 -0
  67. package/dist/cli/__tests__/config-loader.unit.test.d.ts.map +1 -0
  68. package/dist/cli/__tests__/config-loader.unit.test.js +611 -0
  69. package/dist/cli/__tests__/config-loader.unit.test.js.map +1 -0
  70. package/dist/cli/__tests__/index.unit.test.d.ts +10 -0
  71. package/dist/cli/__tests__/index.unit.test.d.ts.map +1 -0
  72. package/dist/cli/__tests__/index.unit.test.js +65 -0
  73. package/dist/cli/__tests__/index.unit.test.js.map +1 -0
  74. package/dist/cli/__tests__/logger.unit.test.d.ts +11 -0
  75. package/dist/cli/__tests__/logger.unit.test.d.ts.map +1 -0
  76. package/dist/cli/__tests__/logger.unit.test.js +180 -0
  77. package/dist/cli/__tests__/logger.unit.test.js.map +1 -0
  78. package/dist/cli/__tests__/module-loader.unit.test.d.ts +11 -0
  79. package/dist/cli/__tests__/module-loader.unit.test.d.ts.map +1 -0
  80. package/dist/cli/__tests__/module-loader.unit.test.js +262 -0
  81. package/dist/cli/__tests__/module-loader.unit.test.js.map +1 -0
  82. package/dist/cli/__tests__/output-writer.unit.test.d.ts +10 -0
  83. package/dist/cli/__tests__/output-writer.unit.test.d.ts.map +1 -0
  84. package/dist/cli/__tests__/output-writer.unit.test.js +216 -0
  85. package/dist/cli/__tests__/output-writer.unit.test.js.map +1 -0
  86. package/dist/cli/__tests__/plan.command.unit.test.d.ts +7 -0
  87. package/dist/cli/__tests__/plan.command.unit.test.d.ts.map +1 -0
  88. package/dist/cli/__tests__/plan.command.unit.test.js +289 -0
  89. package/dist/cli/__tests__/plan.command.unit.test.js.map +1 -0
  90. package/dist/cli/__tests__/run.command.unit.test.d.ts +7 -0
  91. package/dist/cli/__tests__/run.command.unit.test.d.ts.map +1 -0
  92. package/dist/cli/__tests__/run.command.unit.test.js +422 -0
  93. package/dist/cli/__tests__/run.command.unit.test.js.map +1 -0
  94. package/dist/cli/__tests__/validate.command.unit.test.d.ts +7 -0
  95. package/dist/cli/__tests__/validate.command.unit.test.d.ts.map +1 -0
  96. package/dist/cli/__tests__/validate.command.unit.test.js +226 -0
  97. package/dist/cli/__tests__/validate.command.unit.test.js.map +1 -0
  98. package/dist/cli/command-deps.d.ts +137 -0
  99. package/dist/cli/command-deps.d.ts.map +1 -0
  100. package/dist/cli/command-deps.js +7 -0
  101. package/dist/cli/command-deps.js.map +1 -0
  102. package/dist/cli/commands/aggregate.d.ts +35 -0
  103. package/dist/cli/commands/aggregate.d.ts.map +1 -0
  104. package/dist/cli/commands/aggregate.js +124 -0
  105. package/dist/cli/commands/aggregate.js.map +1 -0
  106. package/dist/cli/commands/evaluate.d.ts +41 -0
  107. package/dist/cli/commands/evaluate.d.ts.map +1 -0
  108. package/dist/cli/commands/evaluate.js +287 -0
  109. package/dist/cli/commands/evaluate.js.map +1 -0
  110. package/dist/cli/commands/plan.d.ts +36 -0
  111. package/dist/cli/commands/plan.d.ts.map +1 -0
  112. package/dist/cli/commands/plan.js +109 -0
  113. package/dist/cli/commands/plan.js.map +1 -0
  114. package/dist/cli/commands/run.d.ts +33 -0
  115. package/dist/cli/commands/run.d.ts.map +1 -0
  116. package/dist/cli/commands/run.js +277 -0
  117. package/dist/cli/commands/run.js.map +1 -0
  118. package/dist/cli/commands/validate.d.ts +27 -0
  119. package/dist/cli/commands/validate.d.ts.map +1 -0
  120. package/dist/cli/commands/validate.js +88 -0
  121. package/dist/cli/commands/validate.js.map +1 -0
  122. package/dist/cli/config-loader.d.ts +30 -0
  123. package/dist/cli/config-loader.d.ts.map +1 -0
  124. package/dist/cli/config-loader.js +181 -0
  125. package/dist/cli/config-loader.js.map +1 -0
  126. package/dist/cli/index.d.ts +27 -0
  127. package/dist/cli/index.d.ts.map +1 -0
  128. package/dist/cli/index.js +60 -0
  129. package/dist/cli/index.js.map +1 -0
  130. package/dist/cli/logger.d.ts +75 -0
  131. package/dist/cli/logger.d.ts.map +1 -0
  132. package/dist/cli/logger.js +131 -0
  133. package/dist/cli/logger.js.map +1 -0
  134. package/dist/cli/module-loader.d.ts +68 -0
  135. package/dist/cli/module-loader.d.ts.map +1 -0
  136. package/dist/cli/module-loader.js +134 -0
  137. package/dist/cli/module-loader.js.map +1 -0
  138. package/dist/cli/output-writer.d.ts +51 -0
  139. package/dist/cli/output-writer.d.ts.map +1 -0
  140. package/dist/cli/output-writer.js +65 -0
  141. package/dist/cli/output-writer.js.map +1 -0
  142. package/dist/cli/types.d.ts +193 -0
  143. package/dist/cli/types.d.ts.map +1 -0
  144. package/dist/cli/types.js +7 -0
  145. package/dist/cli/types.js.map +1 -0
  146. package/dist/collector/__tests__/result-collector.unit.test.d.ts +7 -0
  147. package/dist/collector/__tests__/result-collector.unit.test.d.ts.map +1 -0
  148. package/dist/collector/__tests__/result-collector.unit.test.js +1021 -0
  149. package/dist/collector/__tests__/result-collector.unit.test.js.map +1 -0
  150. package/dist/collector/__tests__/schema.unit.test.d.ts +7 -0
  151. package/dist/collector/__tests__/schema.unit.test.d.ts.map +1 -0
  152. package/dist/collector/__tests__/schema.unit.test.js +360 -0
  153. package/dist/collector/__tests__/schema.unit.test.js.map +1 -0
  154. package/dist/evaluators/claims-evaluator.d.ts +87 -0
  155. package/dist/evaluators/claims-evaluator.d.ts.map +1 -0
  156. package/dist/evaluators/claims-evaluator.js +289 -0
  157. package/dist/evaluators/claims-evaluator.js.map +1 -0
  158. package/dist/evaluators/exploratory-evaluator.d.ts +136 -0
  159. package/dist/evaluators/exploratory-evaluator.d.ts.map +1 -0
  160. package/dist/evaluators/exploratory-evaluator.js +545 -0
  161. package/dist/evaluators/exploratory-evaluator.js.map +1 -0
  162. package/dist/evaluators/index.d.ts +13 -0
  163. package/dist/evaluators/index.d.ts.map +1 -0
  164. package/dist/evaluators/index.js +14 -0
  165. package/dist/evaluators/index.js.map +1 -0
  166. package/dist/evaluators/metrics-evaluator.d.ts +114 -0
  167. package/dist/evaluators/metrics-evaluator.d.ts.map +1 -0
  168. package/dist/evaluators/metrics-evaluator.js +433 -0
  169. package/dist/evaluators/metrics-evaluator.js.map +1 -0
  170. package/dist/evaluators/registry.d.ts +106 -0
  171. package/dist/evaluators/registry.d.ts.map +1 -0
  172. package/dist/evaluators/registry.js +148 -0
  173. package/dist/evaluators/registry.js.map +1 -0
  174. package/dist/evaluators/robustness-evaluator.d.ts +57 -0
  175. package/dist/evaluators/robustness-evaluator.d.ts.map +1 -0
  176. package/dist/evaluators/robustness-evaluator.js +186 -0
  177. package/dist/evaluators/robustness-evaluator.js.map +1 -0
  178. package/dist/executor/__tests__/binary-sut.unit.test.d.ts +8 -0
  179. package/dist/executor/__tests__/binary-sut.unit.test.d.ts.map +1 -0
  180. package/dist/executor/__tests__/binary-sut.unit.test.js +313 -0
  181. package/dist/executor/__tests__/binary-sut.unit.test.js.map +1 -0
  182. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +83 -1
  183. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -1
  184. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +3 -6
  185. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -1
  186. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +428 -159
  187. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -1
  188. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +148 -1
  189. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -1
  190. package/dist/executor/__tests__/executor.unit.test.js +123 -8
  191. package/dist/executor/__tests__/executor.unit.test.js.map +1 -1
  192. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts +7 -0
  193. package/dist/executor/__tests__/memory-monitor.unit.test.d.ts.map +1 -0
  194. package/dist/executor/__tests__/memory-monitor.unit.test.js +285 -0
  195. package/dist/executor/__tests__/memory-monitor.unit.test.js.map +1 -0
  196. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +2 -1
  197. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -1
  198. package/dist/executor/__tests__/parallel-executor.unit.test.js +426 -156
  199. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -1
  200. package/dist/executor/__tests__/resource-calculator.unit.test.d.ts +10 -0
  201. package/dist/executor/__tests__/resource-calculator.unit.test.d.ts.map +1 -0
  202. package/dist/executor/__tests__/resource-calculator.unit.test.js +104 -0
  203. package/dist/executor/__tests__/resource-calculator.unit.test.js.map +1 -0
  204. package/dist/executor/__tests__/run-id.unit.test.d.ts +8 -0
  205. package/dist/executor/__tests__/run-id.unit.test.d.ts.map +1 -0
  206. package/dist/executor/__tests__/run-id.unit.test.js +156 -0
  207. package/dist/executor/__tests__/run-id.unit.test.js.map +1 -0
  208. package/dist/executor/__tests__/worker-entry.integration.test.d.ts +24 -0
  209. package/dist/executor/__tests__/worker-entry.integration.test.d.ts.map +1 -0
  210. package/dist/executor/__tests__/worker-entry.integration.test.js +82 -0
  211. package/dist/executor/__tests__/worker-entry.integration.test.js.map +1 -0
  212. package/dist/executor/__tests__/worker-entry.unit.test.d.ts +7 -0
  213. package/dist/executor/__tests__/worker-entry.unit.test.d.ts.map +1 -0
  214. package/dist/executor/__tests__/worker-entry.unit.test.js +364 -0
  215. package/dist/executor/__tests__/worker-entry.unit.test.js.map +1 -0
  216. package/dist/executor/__tests__/worker-threads-executor.unit.test.d.ts +8 -0
  217. package/dist/executor/__tests__/worker-threads-executor.unit.test.d.ts.map +1 -0
  218. package/dist/executor/__tests__/worker-threads-executor.unit.test.js +276 -0
  219. package/dist/executor/__tests__/worker-threads-executor.unit.test.js.map +1 -0
  220. package/dist/executor/binary-sut.d.ts +105 -0
  221. package/dist/executor/binary-sut.d.ts.map +1 -0
  222. package/dist/executor/binary-sut.js +174 -0
  223. package/dist/executor/binary-sut.js.map +1 -0
  224. package/dist/executor/checkpoint-storage.d.ts.map +1 -1
  225. package/dist/executor/checkpoint-storage.js +6 -4
  226. package/dist/executor/checkpoint-storage.js.map +1 -1
  227. package/dist/executor/executor.d.ts +28 -0
  228. package/dist/executor/executor.d.ts.map +1 -1
  229. package/dist/executor/executor.js +85 -24
  230. package/dist/executor/executor.js.map +1 -1
  231. package/dist/executor/index.d.ts +4 -0
  232. package/dist/executor/index.d.ts.map +1 -1
  233. package/dist/executor/index.js +4 -0
  234. package/dist/executor/index.js.map +1 -1
  235. package/dist/executor/parallel-executor.d.ts +186 -0
  236. package/dist/executor/parallel-executor.d.ts.map +1 -1
  237. package/dist/executor/parallel-executor.js +218 -83
  238. package/dist/executor/parallel-executor.js.map +1 -1
  239. package/dist/executor/resource-calculator.d.ts +49 -0
  240. package/dist/executor/resource-calculator.d.ts.map +1 -0
  241. package/dist/executor/resource-calculator.js +129 -0
  242. package/dist/executor/resource-calculator.js.map +1 -0
  243. package/dist/executor/run-id.d.ts.map +1 -1
  244. package/dist/executor/run-id.js +8 -1
  245. package/dist/executor/run-id.js.map +1 -1
  246. package/dist/executor/worker-entry.d.ts +2 -0
  247. package/dist/executor/worker-entry.d.ts.map +1 -1
  248. package/dist/executor/worker-entry.js +46 -55
  249. package/dist/executor/worker-entry.js.map +1 -1
  250. package/dist/executor/worker-executor.d.ts +257 -0
  251. package/dist/executor/worker-executor.d.ts.map +1 -0
  252. package/dist/executor/worker-executor.js +308 -0
  253. package/dist/executor/worker-executor.js.map +1 -0
  254. package/dist/executor/worker-threads-executor.d.ts +245 -0
  255. package/dist/executor/worker-threads-executor.d.ts.map +1 -0
  256. package/dist/executor/worker-threads-executor.js +332 -0
  257. package/dist/executor/worker-threads-executor.js.map +1 -0
  258. package/dist/index.d.ts +1 -0
  259. package/dist/index.d.ts.map +1 -1
  260. package/dist/index.js +4 -2
  261. package/dist/index.js.map +1 -1
  262. package/dist/renderers/latex-renderer.d.ts +60 -0
  263. package/dist/renderers/latex-renderer.d.ts.map +1 -1
  264. package/dist/renderers/latex-renderer.js +299 -0
  265. package/dist/renderers/latex-renderer.js.map +1 -1
  266. package/dist/renderers/types.d.ts +9 -0
  267. package/dist/renderers/types.d.ts.map +1 -1
  268. package/dist/renderers/types.js.map +1 -1
  269. package/dist/robustness/__tests__/perturbations.unit.test.d.ts +11 -0
  270. package/dist/robustness/__tests__/perturbations.unit.test.d.ts.map +1 -0
  271. package/dist/robustness/__tests__/perturbations.unit.test.js +284 -0
  272. package/dist/robustness/__tests__/perturbations.unit.test.js.map +1 -0
  273. package/dist/robustness/index.d.ts +5 -2
  274. package/dist/robustness/index.d.ts.map +1 -1
  275. package/dist/robustness/index.js +4 -2
  276. package/dist/robustness/index.js.map +1 -1
  277. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts +7 -0
  278. package/dist/statistical/__tests__/mann-whitney-u.unit.test.d.ts.map +1 -0
  279. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js +185 -0
  280. package/dist/statistical/__tests__/mann-whitney-u.unit.test.js.map +1 -0
  281. package/dist/types/evaluator.d.ts +449 -0
  282. package/dist/types/evaluator.d.ts.map +1 -0
  283. package/dist/types/evaluator.js +9 -0
  284. package/dist/types/evaluator.js.map +1 -0
  285. package/dist/types/result.d.ts +2 -0
  286. package/dist/types/result.d.ts.map +1 -1
  287. package/package.json +8 -1
  288. package/dist/claims/evaluator.d.ts +0 -33
  289. package/dist/claims/evaluator.d.ts.map +0 -1
  290. package/dist/claims/evaluator.js +0 -174
  291. package/dist/claims/evaluator.js.map +0 -1
  292. package/dist/robustness/analyzer.d.ts +0 -61
  293. package/dist/robustness/analyzer.d.ts.map +0 -1
  294. package/dist/robustness/analyzer.js +0 -191
  295. 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
- - **Core**: Type-safe foundation with zero external dependencies
8
- - **Store**: Centralized registry for Systems Under Test (SUTs)
9
- - **Case**: Reusable test case infrastructure with setup/teardown
10
- - **Execute**: Deterministic test execution with snapshot capture
11
- - **Aggregate**: Statistical aggregation across test runs (mean, median, mode, min, max, stdDev)
12
- - **Evaluate**: Claim-driven validation with custom predicates
13
- - **Render**: Report generation in multiple formats (console, Markdown, JSON)
14
- - **Monitor**: Built-in memory and CPU monitoring for resource tracking
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 <repository-url>
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
- ## Quick Start
31
+ ## Development
30
32
 
31
- ```typescript
32
- import { Store, Case, Execute, Aggregate, Evaluate, Render } from 'ppef';
33
-
34
- // 1. Register your System Under Test (SUT)
35
- Store.register('sort-algo', {
36
- name: 'QuickSort',
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
- ## Modules
41
+ Run a single test file:
42
+ ```bash
43
+ npx tsx --test src/path/to/file.test.ts
44
+ ```
77
45
 
78
- ### Core
79
- Type-safe foundation providing primitive types and interfaces. Zero external dependencies - pure TypeScript utilities for the entire framework.
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
- ### Store
82
- Centralized registry for managing Systems Under Test (SUTs). Register implementations with unique identifiers and retrieve them for execution.
55
+ ## Architecture
83
56
 
84
- ```typescript
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
- ### Case
95
- Reusable test case infrastructure with lifecycle management. Each case includes setup, execution, and teardown phases with automatic resource cleanup.
96
-
97
- ```typescript
98
- const testCase = new Case({
99
- name: 'test-case-1',
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
- ### Execute
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
- ```typescript
109
- const results = Execute.run('my-sut', [testCase]);
110
- const snapshot = Execute.capture('my-sut', testCase);
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
- ### Aggregate
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
- ```typescript
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
- ### Evaluate
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
- ```typescript
126
- const claims = Evaluate.claims(results, {
127
- 'performance': (r) => r.duration < 100,
128
- 'correctness': (r) => r.output === expected,
129
- 'memory-safe': (r) => r.memoryUsage < 1024 * 1024
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
- ### Render
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
- ```typescript
137
- Render.console(results);
138
- Render.markdown(results, './report.md');
139
- Render.json(results, './report.json');
140
- ```
99
+ ### Subpath Exports
141
100
 
142
- ### Monitor
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
- const monitor = new Monitor();
147
- monitor.start();
148
- // ... run tests ...
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
- ## API Reference
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
- Detailed type definitions and API documentation are available in the source files:
111
+ ## Conventions
156
112
 
157
- - `src/core/` - Core types and interfaces
158
- - `src/store.ts` - SUT registry API
159
- - `src/case.ts` - Test case API
160
- - `src/execute.ts` - Execution engine API
161
- - `src/aggregate.ts` - Statistical functions
162
- - `src/evaluate.ts` - Claim evaluation API
163
- - `src/render.ts` - Report generation API
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.
package/bin/ppef.mjs ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PPEF CLI Entry Point
4
+ *
5
+ * This shim loads the CLI module and executes the command.
6
+ * Using .mjs extension ensures ESM compatibility.
7
+ */
8
+
9
+ import { runCli } from "../dist/cli/index.js";
10
+
11
+ // Run the CLI and exit with appropriate code
12
+ runCli().then(
13
+ (code) => {
14
+ process.exit(code);
15
+ },
16
+ (error) => {
17
+ console.error("Fatal error:", error);
18
+ process.exit(1);
19
+ },
20
+ );
@@ -0,0 +1,8 @@
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
+ export {};
8
+ //# sourceMappingURL=evaluate-command.integration.test.d.ts.map
@@ -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,8 @@
1
+ /**
2
+ * Unit tests for Claims Evaluator
3
+ *
4
+ * Tests the claims evaluator functionality including edge cases
5
+ * for different directions, thresholds, and the summarize method.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=claims-evaluator.unit.test.d.ts.map
@@ -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"}