ppef 1.0.0 → 1.0.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.
Files changed (199) hide show
  1. package/README.md +172 -0
  2. package/dist/__tests__/framework-pipeline.integration.test.d.ts +7 -0
  3. package/dist/__tests__/framework-pipeline.integration.test.d.ts.map +1 -0
  4. package/dist/__tests__/framework-pipeline.integration.test.js +413 -0
  5. package/dist/__tests__/framework-pipeline.integration.test.js.map +1 -0
  6. package/dist/__tests__/registry-executor.integration.test.d.ts +5 -0
  7. package/dist/__tests__/registry-executor.integration.test.d.ts.map +1 -0
  8. package/dist/__tests__/registry-executor.integration.test.js +349 -0
  9. package/dist/__tests__/registry-executor.integration.test.js.map +1 -0
  10. package/dist/__tests__/test-helpers.d.ts +94 -0
  11. package/dist/__tests__/test-helpers.d.ts.map +1 -0
  12. package/dist/__tests__/test-helpers.js +271 -0
  13. package/dist/__tests__/test-helpers.js.map +1 -0
  14. package/dist/aggregation/aggregators.d.ts +54 -0
  15. package/dist/aggregation/aggregators.d.ts.map +1 -0
  16. package/dist/aggregation/aggregators.js +228 -0
  17. package/dist/aggregation/aggregators.js.map +1 -0
  18. package/dist/aggregation/index.d.ts +8 -0
  19. package/dist/aggregation/index.d.ts.map +1 -0
  20. package/dist/aggregation/index.js +8 -0
  21. package/dist/aggregation/index.js.map +1 -0
  22. package/dist/aggregation/pipeline.d.ts +38 -0
  23. package/dist/aggregation/pipeline.d.ts.map +1 -0
  24. package/dist/aggregation/pipeline.js +198 -0
  25. package/dist/aggregation/pipeline.js.map +1 -0
  26. package/dist/claims/evaluator.d.ts +33 -0
  27. package/dist/claims/evaluator.d.ts.map +1 -0
  28. package/dist/claims/evaluator.js +174 -0
  29. package/dist/claims/evaluator.js.map +1 -0
  30. package/dist/claims/index.d.ts +7 -0
  31. package/dist/claims/index.d.ts.map +1 -0
  32. package/dist/claims/index.js +7 -0
  33. package/dist/claims/index.js.map +1 -0
  34. package/dist/collector/index.d.ts +8 -0
  35. package/dist/collector/index.d.ts.map +1 -0
  36. package/dist/collector/index.js +8 -0
  37. package/dist/collector/index.js.map +1 -0
  38. package/dist/collector/result-collector.d.ts +159 -0
  39. package/dist/collector/result-collector.d.ts.map +1 -0
  40. package/dist/collector/result-collector.js +213 -0
  41. package/dist/collector/result-collector.js.map +1 -0
  42. package/dist/collector/schema.d.ts +34 -0
  43. package/dist/collector/schema.d.ts.map +1 -0
  44. package/dist/collector/schema.js +145 -0
  45. package/dist/collector/schema.js.map +1 -0
  46. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts +10 -0
  47. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.d.ts.map +1 -0
  48. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js +122 -0
  49. package/dist/executor/__tests__/checkpoint-hash-bug.diagnostic.test.js.map +1 -0
  50. package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts +7 -0
  51. package/dist/executor/__tests__/checkpoint-manager.integration.test.d.ts.map +1 -0
  52. package/dist/executor/__tests__/checkpoint-manager.integration.test.js +330 -0
  53. package/dist/executor/__tests__/checkpoint-manager.integration.test.js.map +1 -0
  54. package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts +7 -0
  55. package/dist/executor/__tests__/checkpoint-manager.unit.test.d.ts.map +1 -0
  56. package/dist/executor/__tests__/checkpoint-manager.unit.test.js +449 -0
  57. package/dist/executor/__tests__/checkpoint-manager.unit.test.js.map +1 -0
  58. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts +11 -0
  59. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.d.ts.map +1 -0
  60. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js +224 -0
  61. package/dist/executor/__tests__/checkpoint-merge-bug.diagnostic.test.js.map +1 -0
  62. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts +8 -0
  63. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.d.ts.map +1 -0
  64. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js +164 -0
  65. package/dist/executor/__tests__/checkpoint-merge-bug.unit.test.js.map +1 -0
  66. package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts +7 -0
  67. package/dist/executor/__tests__/checkpoint-storage.unit.test.d.ts.map +1 -0
  68. package/dist/executor/__tests__/checkpoint-storage.unit.test.js +386 -0
  69. package/dist/executor/__tests__/checkpoint-storage.unit.test.js.map +1 -0
  70. package/dist/executor/__tests__/executor.unit.test.d.ts +7 -0
  71. package/dist/executor/__tests__/executor.unit.test.d.ts.map +1 -0
  72. package/dist/executor/__tests__/executor.unit.test.js +134 -0
  73. package/dist/executor/__tests__/executor.unit.test.js.map +1 -0
  74. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts +12 -0
  75. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.d.ts.map +1 -0
  76. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js +196 -0
  77. package/dist/executor/__tests__/parallel-checkpoint-merge.integration.test.js.map +1 -0
  78. package/dist/executor/__tests__/parallel-executor.integration.test.d.ts +7 -0
  79. package/dist/executor/__tests__/parallel-executor.integration.test.d.ts.map +1 -0
  80. package/dist/executor/__tests__/parallel-executor.integration.test.js +249 -0
  81. package/dist/executor/__tests__/parallel-executor.integration.test.js.map +1 -0
  82. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts +7 -0
  83. package/dist/executor/__tests__/parallel-executor.unit.test.d.ts.map +1 -0
  84. package/dist/executor/__tests__/parallel-executor.unit.test.js +203 -0
  85. package/dist/executor/__tests__/parallel-executor.unit.test.js.map +1 -0
  86. package/dist/executor/checkpoint-manager.d.ts +231 -0
  87. package/dist/executor/checkpoint-manager.d.ts.map +1 -0
  88. package/dist/executor/checkpoint-manager.js +395 -0
  89. package/dist/executor/checkpoint-manager.js.map +1 -0
  90. package/dist/executor/checkpoint-storage.d.ts +230 -0
  91. package/dist/executor/checkpoint-storage.d.ts.map +1 -0
  92. package/dist/executor/checkpoint-storage.js +370 -0
  93. package/dist/executor/checkpoint-storage.js.map +1 -0
  94. package/dist/executor/checkpoint-types.d.ts +48 -0
  95. package/dist/executor/checkpoint-types.d.ts.map +1 -0
  96. package/dist/executor/checkpoint-types.js +8 -0
  97. package/dist/executor/checkpoint-types.js.map +1 -0
  98. package/dist/executor/executor.d.ts +164 -0
  99. package/dist/executor/executor.d.ts.map +1 -0
  100. package/dist/executor/executor.js +408 -0
  101. package/dist/executor/executor.js.map +1 -0
  102. package/dist/executor/index.d.ts +11 -0
  103. package/dist/executor/index.d.ts.map +1 -0
  104. package/dist/executor/index.js +11 -0
  105. package/dist/executor/index.js.map +1 -0
  106. package/dist/executor/memory-monitor.d.ts +115 -0
  107. package/dist/executor/memory-monitor.d.ts.map +1 -0
  108. package/dist/executor/memory-monitor.js +168 -0
  109. package/dist/executor/memory-monitor.js.map +1 -0
  110. package/dist/executor/parallel-executor.d.ts +53 -0
  111. package/dist/executor/parallel-executor.d.ts.map +1 -0
  112. package/dist/executor/parallel-executor.js +194 -0
  113. package/dist/executor/parallel-executor.js.map +1 -0
  114. package/dist/executor/run-id.d.ts +71 -0
  115. package/dist/executor/run-id.d.ts.map +1 -0
  116. package/dist/executor/run-id.js +67 -0
  117. package/dist/executor/run-id.js.map +1 -0
  118. package/dist/executor/worker-entry.d.ts +8 -0
  119. package/dist/executor/worker-entry.d.ts.map +1 -0
  120. package/dist/executor/worker-entry.js +67 -0
  121. package/dist/executor/worker-entry.js.map +1 -0
  122. package/dist/index.cjs +11 -0
  123. package/dist/index.d.ts +15 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +24 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/registry/case-registry.d.ts +113 -0
  128. package/dist/registry/case-registry.d.ts.map +1 -0
  129. package/dist/registry/case-registry.js +160 -0
  130. package/dist/registry/case-registry.js.map +1 -0
  131. package/dist/registry/index.d.ts +8 -0
  132. package/dist/registry/index.d.ts.map +1 -0
  133. package/dist/registry/index.js +8 -0
  134. package/dist/registry/index.js.map +1 -0
  135. package/dist/registry/sut-registry.d.ts +96 -0
  136. package/dist/registry/sut-registry.d.ts.map +1 -0
  137. package/dist/registry/sut-registry.js +126 -0
  138. package/dist/registry/sut-registry.js.map +1 -0
  139. package/dist/renderers/index.d.ts +10 -0
  140. package/dist/renderers/index.d.ts.map +1 -0
  141. package/dist/renderers/index.js +9 -0
  142. package/dist/renderers/index.js.map +1 -0
  143. package/dist/renderers/latex-renderer.d.ts +84 -0
  144. package/dist/renderers/latex-renderer.d.ts.map +1 -0
  145. package/dist/renderers/latex-renderer.js +208 -0
  146. package/dist/renderers/latex-renderer.js.map +1 -0
  147. package/dist/renderers/types.d.ts +106 -0
  148. package/dist/renderers/types.d.ts.map +1 -0
  149. package/dist/renderers/types.js +23 -0
  150. package/dist/renderers/types.js.map +1 -0
  151. package/dist/robustness/analyzer.d.ts +61 -0
  152. package/dist/robustness/analyzer.d.ts.map +1 -0
  153. package/dist/robustness/analyzer.js +191 -0
  154. package/dist/robustness/analyzer.js.map +1 -0
  155. package/dist/robustness/index.d.ts +8 -0
  156. package/dist/robustness/index.d.ts.map +1 -0
  157. package/dist/robustness/index.js +8 -0
  158. package/dist/robustness/index.js.map +1 -0
  159. package/dist/robustness/perturbations.d.ts +46 -0
  160. package/dist/robustness/perturbations.d.ts.map +1 -0
  161. package/dist/robustness/perturbations.js +184 -0
  162. package/dist/robustness/perturbations.js.map +1 -0
  163. package/dist/statistical/index.d.ts +8 -0
  164. package/dist/statistical/index.d.ts.map +1 -0
  165. package/dist/statistical/index.js +8 -0
  166. package/dist/statistical/index.js.map +1 -0
  167. package/dist/statistical/mann-whitney-u.d.ts +62 -0
  168. package/dist/statistical/mann-whitney-u.d.ts.map +1 -0
  169. package/dist/statistical/mann-whitney-u.js +127 -0
  170. package/dist/statistical/mann-whitney-u.js.map +1 -0
  171. package/dist/types/aggregate.d.ts +124 -0
  172. package/dist/types/aggregate.d.ts.map +1 -0
  173. package/dist/types/aggregate.js +9 -0
  174. package/dist/types/aggregate.js.map +1 -0
  175. package/dist/types/case.d.ts +105 -0
  176. package/dist/types/case.d.ts.map +1 -0
  177. package/dist/types/case.js +10 -0
  178. package/dist/types/case.js.map +1 -0
  179. package/dist/types/claims.d.ts +122 -0
  180. package/dist/types/claims.d.ts.map +1 -0
  181. package/dist/types/claims.js +14 -0
  182. package/dist/types/claims.js.map +1 -0
  183. package/dist/types/index.d.ts +12 -0
  184. package/dist/types/index.d.ts.map +1 -0
  185. package/dist/types/index.js +7 -0
  186. package/dist/types/index.js.map +1 -0
  187. package/dist/types/perturbation.d.ts +105 -0
  188. package/dist/types/perturbation.d.ts.map +1 -0
  189. package/dist/types/perturbation.js +9 -0
  190. package/dist/types/perturbation.js.map +1 -0
  191. package/dist/types/result.d.ts +150 -0
  192. package/dist/types/result.d.ts.map +1 -0
  193. package/dist/types/result.js +12 -0
  194. package/dist/types/result.js.map +1 -0
  195. package/dist/types/sut.d.ts +128 -0
  196. package/dist/types/sut.d.ts.map +1 -0
  197. package/dist/types/sut.js +12 -0
  198. package/dist/types/sut.js.map +1 -0
  199. package/package.json +283 -7
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Diagnostic Tests for Checkpoint Integration Bug
3
+ *
4
+ * Tests to diagnose why parallel workers aren't properly using checkpoints.
5
+ * Symptoms:
6
+ * - Workers report "No checkpoint"
7
+ * - Workers report "Total runs: 0, From checkpoint: 0, New this run: 0"
8
+ * - Main checkpoint has 123/132 runs but workers start fresh
9
+ */
10
+ import { createHash, randomBytes } from "node:crypto";
11
+ import { rmSync } from "node:fs";
12
+ import { tmpdir } from "node:os";
13
+ import { join } from "node:path";
14
+ import { strict as assert } from "node:assert";
15
+ import { afterEach, beforeEach, describe, it } from "node:test";
16
+ import { CheckpointManager } from "../checkpoint-manager.js";
17
+ import { FileStorage } from "../checkpoint-storage.js";
18
+ describe("Checkpoint Integration Bug Diagnostics", () => {
19
+ let testDir;
20
+ let checkpoint;
21
+ let checkpointPath;
22
+ beforeEach(() => {
23
+ testDir = join(tmpdir(), `checkpoint-test-${randomBytes(8).toString("hex")}`);
24
+ checkpointPath = join(testDir, "checkpoint.json");
25
+ checkpoint = new CheckpointManager({ storage: new FileStorage(checkpointPath) });
26
+ });
27
+ afterEach(() => {
28
+ rmSync(testDir, { recursive: true, force: true });
29
+ });
30
+ it("diagnostic-1: should save and load single run", async () => {
31
+ const sut = createMockSut();
32
+ const testCase = createMockCase("case-001");
33
+ const { Executor } = await import("../executor.js");
34
+ const executor = new Executor({
35
+ repetitions: 1,
36
+ seedBase: 42,
37
+ timeoutMs: 5000,
38
+ collectProvenance: false,
39
+ onResult: async (result) => {
40
+ await checkpoint.saveIncremental(result);
41
+ },
42
+ });
43
+ // Execute
44
+ const summary = await executor.execute([sut], [testCase], () => ({}));
45
+ // Verify
46
+ assert.strictEqual(summary.successfulRuns, 1);
47
+ const results = checkpoint.getResults();
48
+ assert.strictEqual(results.length, 1);
49
+ // Load fresh checkpoint
50
+ const fresh = new CheckpointManager({ storage: new FileStorage(checkpointPath) });
51
+ await fresh.load();
52
+ assert.strictEqual(fresh.getResults().length, 1);
53
+ });
54
+ it("diagnostic-2: should detect config hash mismatch", async () => {
55
+ // Save with one config
56
+ const result = {
57
+ run: {
58
+ runId: "test-run-001",
59
+ sut: "test-sut",
60
+ sutRole: "primary",
61
+ sutVersion: "1.0.0",
62
+ caseId: "case-001",
63
+ caseClass: "test-class",
64
+ seed: 42,
65
+ repetition: 0,
66
+ },
67
+ correctness: {
68
+ expectedExists: false,
69
+ producedOutput: true,
70
+ valid: true,
71
+ matchesExpected: null,
72
+ },
73
+ outputs: { summary: {} },
74
+ metrics: { numeric: { test: 1 } },
75
+ provenance: {
76
+ runtime: { platform: "linux", arch: "x64", nodeVersion: "v22.0.0" },
77
+ },
78
+ };
79
+ await checkpoint.saveIncremental(result);
80
+ // Try to load with different config
81
+ const fresh = new CheckpointManager({ storage: new FileStorage(checkpointPath) });
82
+ await fresh.load();
83
+ // Check if stale with different config
84
+ const isStale = fresh.isStale([createMockSut()], [createMockCase("case-001")], {
85
+ repetitions: 2, // Different from original (1)
86
+ seedBase: 42,
87
+ timeoutMs: 5000,
88
+ collectProvenance: false,
89
+ }, 1);
90
+ assert.strictEqual(isStale, true);
91
+ });
92
+ it("diagnostic-3: should find worker shards", async () => {
93
+ // Create mock worker shards
94
+ const shard1 = join(testDir, "checkpoint-worker-00.json");
95
+ const shard2 = join(testDir, "checkpoint-worker-01.json");
96
+ const storage1 = new FileStorage(shard1);
97
+ const storage2 = new FileStorage(shard2);
98
+ await storage1.save({
99
+ configHash: "test-hash",
100
+ createdAt: new Date().toISOString(),
101
+ updatedAt: new Date().toISOString(),
102
+ completedRunIds: ["run-001", "run-002"],
103
+ results: {},
104
+ totalPlanned: 0,
105
+ });
106
+ await storage2.save({
107
+ configHash: "test-hash",
108
+ createdAt: new Date().toISOString(),
109
+ updatedAt: new Date().toISOString(),
110
+ completedRunIds: ["run-003", "run-004"],
111
+ results: {},
112
+ totalPlanned: 0,
113
+ });
114
+ // Find shards
115
+ const shards = await FileStorage.findShards(testDir);
116
+ assert.strictEqual(shards.length, 2);
117
+ assert.ok(shards.includes(shard1));
118
+ assert.ok(shards.includes(shard2));
119
+ });
120
+ it("diagnostic-4: should merge shards without duplicates", async () => {
121
+ // Create main checkpoint
122
+ const result1 = {
123
+ run: {
124
+ runId: "run-001",
125
+ sut: "sut-1",
126
+ sutRole: "primary",
127
+ sutVersion: "1.0.0",
128
+ caseId: "case-001",
129
+ caseClass: "test-class",
130
+ seed: 42,
131
+ repetition: 0,
132
+ },
133
+ correctness: {
134
+ expectedExists: false,
135
+ producedOutput: true,
136
+ valid: true,
137
+ matchesExpected: null,
138
+ },
139
+ outputs: { summary: {} },
140
+ metrics: { numeric: { test: 1 } },
141
+ provenance: {
142
+ runtime: { platform: "linux", arch: "x64", nodeVersion: "v22.0.0" },
143
+ },
144
+ };
145
+ await checkpoint.saveIncremental(result1);
146
+ // Create worker shard with overlapping run
147
+ const workerStorage = new FileStorage(join(testDir, "checkpoint-worker-00.json"));
148
+ await workerStorage.save({
149
+ configHash: "test-hash",
150
+ createdAt: new Date().toISOString(),
151
+ updatedAt: new Date().toISOString(),
152
+ completedRunIds: ["run-001", "run-002"], // run-001 overlaps with main
153
+ results: {},
154
+ totalPlanned: 0,
155
+ });
156
+ // Merge
157
+ const shards = await FileStorage.findShards(testDir);
158
+ const merged = await checkpoint.mergeShards(shards);
159
+ // Verify no duplicates
160
+ const uniqueIds = new Set(merged.completedRunIds);
161
+ assert.strictEqual(uniqueIds.size, 2); // run-001, run-002 (no duplicates)
162
+ assert.strictEqual(merged.completedRunIds.length, 2);
163
+ });
164
+ it("diagnostic-5: config hash should include all executor config properties", async () => {
165
+ // This test verifies which properties are included in the hash
166
+ const config1 = {
167
+ continueOnError: true,
168
+ repetitions: 1,
169
+ seedBase: 42,
170
+ timeoutMs: 300_000,
171
+ collectProvenance: true,
172
+ };
173
+ const config2 = {
174
+ ...config1,
175
+ concurrency: 12, // Additional property
176
+ };
177
+ const hash1 = createHash("sha256")
178
+ .update(JSON.stringify(config1, Object.keys(config1).sort()))
179
+ .digest("hex");
180
+ const hash2 = createHash("sha256")
181
+ .update(JSON.stringify(config2, Object.keys(config2).sort()))
182
+ .digest("hex");
183
+ console.log("Hash without concurrency:", hash1);
184
+ console.log("Hash with concurrency:", hash2);
185
+ console.log("Match:", hash1 === hash2);
186
+ // They should be different because concurrency is different
187
+ assert.notStrictEqual(hash1, hash2);
188
+ });
189
+ });
190
+ /**
191
+ * Create a mock SUT for testing.
192
+ */
193
+ const createMockSut = () => ({
194
+ registration: {
195
+ id: "mock-sut-v1.0.0",
196
+ name: "Mock SUT",
197
+ version: "1.0.0",
198
+ role: "primary",
199
+ config: {},
200
+ tags: ["test"],
201
+ },
202
+ factory: () => ({
203
+ id: "mock-sut-v1.0.0",
204
+ config: {},
205
+ run: async () => ({ mockResult: true }),
206
+ }),
207
+ });
208
+ /**
209
+ * Create a mock case for testing.
210
+ * @param id
211
+ */
212
+ const createMockCase = (id) => ({
213
+ case: {
214
+ caseId: id,
215
+ name: `Mock Case ${id}`,
216
+ caseClass: "test",
217
+ inputs: { summary: { test: id } },
218
+ tags: ["test"],
219
+ version: "1.0.0",
220
+ },
221
+ getInput: async () => ({ mockInput: true }),
222
+ getInputs: () => ({ mockInputs: true }),
223
+ });
224
+ //# sourceMappingURL=checkpoint-merge-bug.diagnostic.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-merge-bug.diagnostic.test.js","sourceRoot":"","sources":["../../../src/executor/__tests__/checkpoint-merge-bug.diagnostic.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Diagnostic Unit Tests for Checkpoint Merge Bug
3
+ *
4
+ * Tests to reproduce the data loss bug where mergeShards() overwrites
5
+ * the main checkpoint instead of combining it with shard results.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=checkpoint-merge-bug.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-merge-bug.unit.test.d.ts","sourceRoot":"","sources":["../../../src/executor/__tests__/checkpoint-merge-bug.unit.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Diagnostic Unit Tests for Checkpoint Merge Bug
3
+ *
4
+ * Tests to reproduce the data loss bug where mergeShards() overwrites
5
+ * the main checkpoint instead of combining it with shard results.
6
+ */
7
+ import { randomBytes } from "node:crypto";
8
+ import { readFileSync, rmSync } from "node:fs";
9
+ import { tmpdir } from "node:os";
10
+ import { join } from "node:path";
11
+ import { afterEach, beforeEach, describe, it } from "node:test";
12
+ import assert from "node:assert/strict";
13
+ import { CheckpointManager } from "../checkpoint-manager.js";
14
+ import { FileStorage } from "../checkpoint-storage.js";
15
+ describe("Checkpoint Merge Bug Diagnostics", () => {
16
+ let testDir;
17
+ let mainCheckpoint;
18
+ let mainPath;
19
+ beforeEach(() => {
20
+ testDir = join(tmpdir(), `checkpoint-merge-test-${randomBytes(8).toString("hex")}`);
21
+ mainPath = join(testDir, "checkpoint.json");
22
+ mainCheckpoint = new CheckpointManager({ storage: new FileStorage(mainPath) });
23
+ });
24
+ /**
25
+ * Helper to read checkpoint data directly from file
26
+ * @param path
27
+ */
28
+ const readCheckpointFile = (path) => {
29
+ const data = JSON.parse(readFileSync(path, "utf-8"));
30
+ return data;
31
+ };
32
+ afterEach(() => {
33
+ rmSync(testDir, { recursive: true, force: true });
34
+ });
35
+ it("diagnostic-1: mergeShards should combine main checkpoint with shards", async () => {
36
+ // Setup: Create main checkpoint with 3 completed runs
37
+ const run1 = createMockResult("run-001", "sut-1", "case-1");
38
+ const run2 = createMockResult("run-002", "sut-1", "case-2");
39
+ const run3 = createMockResult("run-003", "sut-1", "case-3");
40
+ await mainCheckpoint.saveIncremental(run1);
41
+ await mainCheckpoint.saveIncremental(run2);
42
+ await mainCheckpoint.saveIncremental(run3);
43
+ const mainData = readCheckpointFile(mainPath);
44
+ assert.strictEqual(mainData.completedRunIds.length, 3);
45
+ // Create worker shard with 1 additional run
46
+ const shardPath = join(testDir, "checkpoint-worker-00.json");
47
+ const shardStorage = new FileStorage(shardPath);
48
+ await shardStorage.save({
49
+ configHash: "test-hash",
50
+ createdAt: new Date().toISOString(),
51
+ updatedAt: new Date().toISOString(),
52
+ completedRunIds: ["run-004"],
53
+ results: {
54
+ "run-004": createMockResult("run-004", "sut-1", "case-4"),
55
+ },
56
+ totalPlanned: 4,
57
+ });
58
+ // Load checkpoint to reset internal state
59
+ await mainCheckpoint.load();
60
+ // BUG: mergeShards will lose the 3 runs from main checkpoint!
61
+ const merged = await mainCheckpoint.mergeShards([shardPath]);
62
+ const mainAfterMerge = readCheckpointFile(mainPath);
63
+ console.log("Main checkpoint runs:", mainAfterMerge.completedRunIds.length);
64
+ console.log("Merged runs:", merged.completedRunIds.length);
65
+ console.log("Expected: 4 runs (3 from main + 1 from shard)");
66
+ // This should be 4, but will fail showing the bug
67
+ assert.strictEqual(merged.completedRunIds.length, 4);
68
+ });
69
+ it("diagnostic-2: demonstrates mergeShards creates new checkpoint instead of combining", async () => {
70
+ // Setup main checkpoint with data
71
+ await mainCheckpoint.saveIncremental(createMockResult("main-001", "sut-1", "case-1"));
72
+ const mainBeforeMerge = readCheckpointFile(mainPath);
73
+ console.log("Main checkpoint before merge:", mainBeforeMerge.completedRunIds.length);
74
+ // Create empty shard (simulating worker that completed no runs)
75
+ const shardPath = join(testDir, "checkpoint-worker-00.json");
76
+ const shardStorage = new FileStorage(shardPath);
77
+ await shardStorage.save({
78
+ configHash: "test-hash",
79
+ createdAt: new Date().toISOString(),
80
+ updatedAt: new Date().toISOString(),
81
+ completedRunIds: [],
82
+ results: {},
83
+ totalPlanned: 132,
84
+ });
85
+ await mainCheckpoint.load();
86
+ // Merge empty shard
87
+ await mainCheckpoint.mergeShards([shardPath]);
88
+ const mainAfterMerge = readCheckpointFile(mainPath);
89
+ console.log("Main checkpoint after merge:", mainAfterMerge.completedRunIds.length);
90
+ // BUG: The main checkpoint's run is lost!
91
+ assert.ok(mainAfterMerge.completedRunIds.length > 0);
92
+ });
93
+ it("diagnostic-3: shows mergeShards doesn't preserve main checkpoint data", async () => {
94
+ // Create main checkpoint
95
+ await mainCheckpoint.saveIncremental(createMockResult("main-001", "sut-1", "case-1"));
96
+ await mainCheckpoint.saveIncremental(createMockResult("main-002", "sut-2", "case-2"));
97
+ const mainDataBefore = readCheckpointFile(mainPath);
98
+ const mainRuns = mainDataBefore.completedRunIds;
99
+ console.log("Main checkpoint has runs:", mainRuns);
100
+ // Create worker shard
101
+ const shardPath = join(testDir, "checkpoint-worker-00.json");
102
+ const shardStorage = new FileStorage(shardPath);
103
+ await shardStorage.save({
104
+ configHash: "test-hash",
105
+ createdAt: new Date().toISOString(),
106
+ updatedAt: new Date().toISOString(),
107
+ completedRunIds: ["shard-001"],
108
+ results: {
109
+ "shard-001": createMockResult("shard-001", "sut-3", "case-3"),
110
+ },
111
+ totalPlanned: 132,
112
+ });
113
+ // Reload main checkpoint
114
+ await mainCheckpoint.load();
115
+ // Merge
116
+ const merged = await mainCheckpoint.mergeShards([shardPath]);
117
+ const mainDataAfter = readCheckpointFile(mainPath);
118
+ console.log("After merge:");
119
+ console.log(" Main checkpoint runs:", mainDataAfter.completedRunIds);
120
+ console.log(" Merged runs:", merged.completedRunIds);
121
+ console.log(" Expected: 3 runs (2 from main + 1 from shard)");
122
+ console.log(" Actual:", merged.completedRunIds.length, "runs");
123
+ // Should have both main runs AND shard run
124
+ const expectedRunIds = new Set([...mainRuns, "shard-001"]);
125
+ const actualRunIds = new Set(merged.completedRunIds);
126
+ console.log(" Missing runs:", [...expectedRunIds].filter((x) => !actualRunIds.has(x)));
127
+ // Check all expected runs are present
128
+ for (const runId of expectedRunIds) {
129
+ assert.ok(actualRunIds.has(runId), `Expected run ${runId} to be in merged results`);
130
+ }
131
+ // Check counts match
132
+ assert.strictEqual(actualRunIds.size, expectedRunIds.size);
133
+ });
134
+ });
135
+ /**
136
+ * Create a mock evaluation result for testing
137
+ * @param runId
138
+ * @param sut
139
+ * @param caseId
140
+ */
141
+ const createMockResult = (runId, sut, caseId) => ({
142
+ run: {
143
+ runId,
144
+ sut,
145
+ sutRole: "primary",
146
+ sutVersion: "1.0.0",
147
+ caseId,
148
+ caseClass: "test-class",
149
+ seed: 42,
150
+ repetition: 0,
151
+ },
152
+ correctness: {
153
+ expectedExists: false,
154
+ producedOutput: true,
155
+ valid: true,
156
+ matchesExpected: null,
157
+ },
158
+ outputs: { summary: {} },
159
+ metrics: { numeric: { test: 1 } },
160
+ provenance: {
161
+ runtime: { platform: "linux", arch: "x64", nodeVersion: "v22.0.0" },
162
+ },
163
+ });
164
+ //# sourceMappingURL=checkpoint-merge-bug.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-merge-bug.unit.test.js","sourceRoot":"","sources":["../../../src/executor/__tests__/checkpoint-merge-bug.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Unit tests for CheckpointStorage
3
+ *
4
+ * Tests FileStorage, GitStorage, FileSystem, and Lock implementations.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=checkpoint-storage.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-storage.unit.test.d.ts","sourceRoot":"","sources":["../../../src/executor/__tests__/checkpoint-storage.unit.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}