@shapeshift-labs/frontier-swarm 0.5.10 → 0.5.11

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 (301) hide show
  1. package/benchmarks/package-bench-fixtures.mjs +95 -0
  2. package/benchmarks/package-bench-rows.mjs +190 -0
  3. package/benchmarks/package-bench-runtime.mjs +94 -0
  4. package/benchmarks/package-bench.mjs +20 -354
  5. package/dist/adaptive-load-decisions.d.ts +6 -0
  6. package/dist/adaptive-load-decisions.d.ts.map +1 -0
  7. package/dist/adaptive-load-decisions.js +130 -0
  8. package/dist/adaptive-load-decisions.js.map +1 -0
  9. package/dist/adaptive-load-limits.d.ts +8 -0
  10. package/dist/adaptive-load-limits.d.ts.map +1 -0
  11. package/dist/adaptive-load-limits.js +105 -0
  12. package/dist/adaptive-load-limits.js.map +1 -0
  13. package/dist/adaptive-load-observations.d.ts +16 -0
  14. package/dist/adaptive-load-observations.d.ts.map +1 -0
  15. package/dist/adaptive-load-observations.js +248 -0
  16. package/dist/adaptive-load-observations.js.map +1 -0
  17. package/dist/adaptive-load-types.d.ts +108 -0
  18. package/dist/adaptive-load-types.d.ts.map +1 -0
  19. package/dist/adaptive-load-types.js +3 -0
  20. package/dist/adaptive-load-types.js.map +1 -0
  21. package/dist/adaptive-load.d.ts +10 -0
  22. package/dist/adaptive-load.d.ts.map +1 -0
  23. package/dist/adaptive-load.js +87 -0
  24. package/dist/adaptive-load.js.map +1 -0
  25. package/dist/adaptive-types.d.ts +118 -0
  26. package/dist/adaptive-types.d.ts.map +1 -0
  27. package/dist/adaptive-types.js +2 -0
  28. package/dist/adaptive-types.js.map +1 -0
  29. package/dist/artifact-routing-runtime.d.ts +3 -0
  30. package/dist/artifact-routing-runtime.d.ts.map +1 -0
  31. package/dist/artifact-routing-runtime.js +72 -0
  32. package/dist/artifact-routing-runtime.js.map +1 -0
  33. package/dist/auto-review.d.ts +47 -0
  34. package/dist/auto-review.d.ts.map +1 -0
  35. package/dist/auto-review.js +69 -0
  36. package/dist/auto-review.js.map +1 -0
  37. package/dist/blackboard.d.ts +81 -0
  38. package/dist/blackboard.d.ts.map +1 -0
  39. package/dist/blackboard.js +60 -0
  40. package/dist/blackboard.js.map +1 -0
  41. package/dist/coercion.d.ts +12 -0
  42. package/dist/coercion.d.ts.map +1 -0
  43. package/dist/coercion.js +48 -0
  44. package/dist/coercion.js.map +1 -0
  45. package/dist/constants.d.ts +94 -0
  46. package/dist/constants.d.ts.map +1 -0
  47. package/dist/constants.js +94 -0
  48. package/dist/constants.js.map +1 -0
  49. package/dist/context-pack-runtime.d.ts +3 -0
  50. package/dist/context-pack-runtime.d.ts.map +1 -0
  51. package/dist/context-pack-runtime.js +77 -0
  52. package/dist/context-pack-runtime.js.map +1 -0
  53. package/dist/context-types.d.ts +188 -0
  54. package/dist/context-types.d.ts.map +1 -0
  55. package/dist/context-types.js +2 -0
  56. package/dist/context-types.js.map +1 -0
  57. package/dist/coordinator-dashboard-helpers.d.ts +14 -0
  58. package/dist/coordinator-dashboard-helpers.d.ts.map +1 -0
  59. package/dist/coordinator-dashboard-helpers.js +106 -0
  60. package/dist/coordinator-dashboard-helpers.js.map +1 -0
  61. package/dist/coordinator-dashboard-types.d.ts +161 -0
  62. package/dist/coordinator-dashboard-types.d.ts.map +1 -0
  63. package/dist/coordinator-dashboard-types.js +3 -0
  64. package/dist/coordinator-dashboard-types.js.map +1 -0
  65. package/dist/coordinator-dashboard.d.ts +4 -0
  66. package/dist/coordinator-dashboard.d.ts.map +1 -0
  67. package/dist/coordinator-dashboard.js +161 -0
  68. package/dist/coordinator-dashboard.js.map +1 -0
  69. package/dist/coordinator-scoring.d.ts +8 -0
  70. package/dist/coordinator-scoring.d.ts.map +1 -0
  71. package/dist/coordinator-scoring.js +134 -0
  72. package/dist/coordinator-scoring.js.map +1 -0
  73. package/dist/coordinator-types.d.ts +164 -0
  74. package/dist/coordinator-types.d.ts.map +1 -0
  75. package/dist/coordinator-types.js +2 -0
  76. package/dist/coordinator-types.js.map +1 -0
  77. package/dist/debug-runtime.d.ts +4 -0
  78. package/dist/debug-runtime.d.ts.map +1 -0
  79. package/dist/debug-runtime.js +93 -0
  80. package/dist/debug-runtime.js.map +1 -0
  81. package/dist/debug-types.d.ts +194 -0
  82. package/dist/debug-types.d.ts.map +1 -0
  83. package/dist/debug-types.js +2 -0
  84. package/dist/debug-types.js.map +1 -0
  85. package/dist/diagnostic-helpers.d.ts +5 -0
  86. package/dist/diagnostic-helpers.d.ts.map +1 -0
  87. package/dist/diagnostic-helpers.js +54 -0
  88. package/dist/diagnostic-helpers.js.map +1 -0
  89. package/dist/evidence-index-helpers.d.ts +10 -0
  90. package/dist/evidence-index-helpers.d.ts.map +1 -0
  91. package/dist/evidence-index-helpers.js +78 -0
  92. package/dist/evidence-index-helpers.js.map +1 -0
  93. package/dist/evidence-index.d.ts +4 -0
  94. package/dist/evidence-index.d.ts.map +1 -0
  95. package/dist/evidence-index.js +59 -0
  96. package/dist/evidence-index.js.map +1 -0
  97. package/dist/evidence-types.d.ts +151 -0
  98. package/dist/evidence-types.d.ts.map +1 -0
  99. package/dist/evidence-types.js +2 -0
  100. package/dist/evidence-types.js.map +1 -0
  101. package/dist/fixtures.d.ts +45 -0
  102. package/dist/fixtures.d.ts.map +1 -0
  103. package/dist/fixtures.js +39 -0
  104. package/dist/fixtures.js.map +1 -0
  105. package/dist/governance-types.d.ts +172 -0
  106. package/dist/governance-types.d.ts.map +1 -0
  107. package/dist/governance-types.js +2 -0
  108. package/dist/governance-types.js.map +1 -0
  109. package/dist/index.d.ts +35 -3122
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +34 -4821
  112. package/dist/index.js.map +1 -1
  113. package/dist/instrumentation-runtime.d.ts +6 -0
  114. package/dist/instrumentation-runtime.d.ts.map +1 -0
  115. package/dist/instrumentation-runtime.js +111 -0
  116. package/dist/instrumentation-runtime.js.map +1 -0
  117. package/dist/internal.d.ts +11 -0
  118. package/dist/internal.d.ts.map +1 -0
  119. package/dist/internal.js +49 -0
  120. package/dist/internal.js.map +1 -0
  121. package/dist/leases.d.ts +32 -0
  122. package/dist/leases.d.ts.map +1 -0
  123. package/dist/leases.js +36 -0
  124. package/dist/leases.js.map +1 -0
  125. package/dist/manifest-normalization.d.ts +8 -0
  126. package/dist/manifest-normalization.d.ts.map +1 -0
  127. package/dist/manifest-normalization.js +191 -0
  128. package/dist/manifest-normalization.js.map +1 -0
  129. package/dist/manifest-types.d.ts +227 -0
  130. package/dist/manifest-types.d.ts.map +1 -0
  131. package/dist/manifest-types.js +2 -0
  132. package/dist/manifest-types.js.map +1 -0
  133. package/dist/manifest.d.ts +7 -0
  134. package/dist/manifest.d.ts.map +1 -0
  135. package/dist/manifest.js +126 -0
  136. package/dist/manifest.js.map +1 -0
  137. package/dist/merge-admission.d.ts +3 -0
  138. package/dist/merge-admission.d.ts.map +1 -0
  139. package/dist/merge-admission.js +71 -0
  140. package/dist/merge-admission.js.map +1 -0
  141. package/dist/merge-bundles.d.ts +13 -0
  142. package/dist/merge-bundles.d.ts.map +1 -0
  143. package/dist/merge-bundles.js +144 -0
  144. package/dist/merge-bundles.js.map +1 -0
  145. package/dist/merge-classification.d.ts +6 -0
  146. package/dist/merge-classification.d.ts.map +1 -0
  147. package/dist/merge-classification.js +36 -0
  148. package/dist/merge-classification.js.map +1 -0
  149. package/dist/merge-index.d.ts +3 -0
  150. package/dist/merge-index.d.ts.map +1 -0
  151. package/dist/merge-index.js +130 -0
  152. package/dist/merge-index.js.map +1 -0
  153. package/dist/merge-plan-helpers.d.ts +11 -0
  154. package/dist/merge-plan-helpers.d.ts.map +1 -0
  155. package/dist/merge-plan-helpers.js +97 -0
  156. package/dist/merge-plan-helpers.js.map +1 -0
  157. package/dist/merge-plans-runtime.d.ts +8 -0
  158. package/dist/merge-plans-runtime.d.ts.map +1 -0
  159. package/dist/merge-plans-runtime.js +106 -0
  160. package/dist/merge-plans-runtime.js.map +1 -0
  161. package/dist/merge-review-types.d.ts +76 -0
  162. package/dist/merge-review-types.d.ts.map +1 -0
  163. package/dist/merge-review-types.js +2 -0
  164. package/dist/merge-review-types.js.map +1 -0
  165. package/dist/merge-review.d.ts +7 -0
  166. package/dist/merge-review.d.ts.map +1 -0
  167. package/dist/merge-review.js +142 -0
  168. package/dist/merge-review.js.map +1 -0
  169. package/dist/merge-types.d.ts +196 -0
  170. package/dist/merge-types.d.ts.map +1 -0
  171. package/dist/merge-types.js +2 -0
  172. package/dist/merge-types.js.map +1 -0
  173. package/dist/merge-wrappers.d.ts +5 -0
  174. package/dist/merge-wrappers.d.ts.map +1 -0
  175. package/dist/merge-wrappers.js +198 -0
  176. package/dist/merge-wrappers.js.map +1 -0
  177. package/dist/observability-types.d.ts +164 -0
  178. package/dist/observability-types.d.ts.map +1 -0
  179. package/dist/observability-types.js +2 -0
  180. package/dist/observability-types.js.map +1 -0
  181. package/dist/oracle-helpers.d.ts +6 -0
  182. package/dist/oracle-helpers.d.ts.map +1 -0
  183. package/dist/oracle-helpers.js +73 -0
  184. package/dist/oracle-helpers.js.map +1 -0
  185. package/dist/oracle-runtime.d.ts +5 -0
  186. package/dist/oracle-runtime.d.ts.map +1 -0
  187. package/dist/oracle-runtime.js +154 -0
  188. package/dist/oracle-runtime.js.map +1 -0
  189. package/dist/ownership-runtime.d.ts +6 -0
  190. package/dist/ownership-runtime.d.ts.map +1 -0
  191. package/dist/ownership-runtime.js +49 -0
  192. package/dist/ownership-runtime.js.map +1 -0
  193. package/dist/patch-stack-runtime.d.ts +4 -0
  194. package/dist/patch-stack-runtime.d.ts.map +1 -0
  195. package/dist/patch-stack-runtime.js +97 -0
  196. package/dist/patch-stack-runtime.js.map +1 -0
  197. package/dist/plan-helpers.d.ts +13 -0
  198. package/dist/plan-helpers.d.ts.map +1 -0
  199. package/dist/plan-helpers.js +236 -0
  200. package/dist/plan-helpers.js.map +1 -0
  201. package/dist/plan-selection.d.ts +7 -0
  202. package/dist/plan-selection.d.ts.map +1 -0
  203. package/dist/plan-selection.js +86 -0
  204. package/dist/plan-selection.js.map +1 -0
  205. package/dist/plan.d.ts +126 -0
  206. package/dist/plan.d.ts.map +1 -0
  207. package/dist/plan.js +67 -0
  208. package/dist/plan.js.map +1 -0
  209. package/dist/progress.d.ts +42 -0
  210. package/dist/progress.d.ts.map +1 -0
  211. package/dist/progress.js +31 -0
  212. package/dist/progress.js.map +1 -0
  213. package/dist/proof-runtime.d.ts +16 -0
  214. package/dist/proof-runtime.d.ts.map +1 -0
  215. package/dist/proof-runtime.js +143 -0
  216. package/dist/proof-runtime.js.map +1 -0
  217. package/dist/queue-overlays.d.ts +7 -0
  218. package/dist/queue-overlays.d.ts.map +1 -0
  219. package/dist/queue-overlays.js +184 -0
  220. package/dist/queue-overlays.js.map +1 -0
  221. package/dist/queue-types.d.ts +194 -0
  222. package/dist/queue-types.d.ts.map +1 -0
  223. package/dist/queue-types.js +2 -0
  224. package/dist/queue-types.js.map +1 -0
  225. package/dist/rebase-report.d.ts +3 -0
  226. package/dist/rebase-report.d.ts.map +1 -0
  227. package/dist/rebase-report.js +52 -0
  228. package/dist/rebase-report.js.map +1 -0
  229. package/dist/record-helpers.d.ts +15 -0
  230. package/dist/record-helpers.d.ts.map +1 -0
  231. package/dist/record-helpers.js +78 -0
  232. package/dist/record-helpers.js.map +1 -0
  233. package/dist/reference-oracle-runtime.d.ts +4 -0
  234. package/dist/reference-oracle-runtime.d.ts.map +1 -0
  235. package/dist/reference-oracle-runtime.js +89 -0
  236. package/dist/reference-oracle-runtime.js.map +1 -0
  237. package/dist/reference-types.d.ts +204 -0
  238. package/dist/reference-types.d.ts.map +1 -0
  239. package/dist/reference-types.js +2 -0
  240. package/dist/reference-types.js.map +1 -0
  241. package/dist/result-types.d.ts +75 -0
  242. package/dist/result-types.d.ts.map +1 -0
  243. package/dist/result-types.js +2 -0
  244. package/dist/result-types.js.map +1 -0
  245. package/dist/run-normalization.d.ts +9 -0
  246. package/dist/run-normalization.d.ts.map +1 -0
  247. package/dist/run-normalization.js +126 -0
  248. package/dist/run-normalization.js.map +1 -0
  249. package/dist/run-records.d.ts +8 -0
  250. package/dist/run-records.d.ts.map +1 -0
  251. package/dist/run-records.js +145 -0
  252. package/dist/run-records.js.map +1 -0
  253. package/dist/run-store-shards-runtime.d.ts +3 -0
  254. package/dist/run-store-shards-runtime.d.ts.map +1 -0
  255. package/dist/run-store-shards-runtime.js +54 -0
  256. package/dist/run-store-shards-runtime.js.map +1 -0
  257. package/dist/run-types.d.ts +112 -0
  258. package/dist/run-types.d.ts.map +1 -0
  259. package/dist/run-types.js +2 -0
  260. package/dist/run-types.js.map +1 -0
  261. package/dist/scheduler.d.ts +94 -0
  262. package/dist/scheduler.d.ts.map +1 -0
  263. package/dist/scheduler.js +213 -0
  264. package/dist/scheduler.js.map +1 -0
  265. package/dist/semantic-normalization.d.ts +3 -0
  266. package/dist/semantic-normalization.d.ts.map +1 -0
  267. package/dist/semantic-normalization.js +162 -0
  268. package/dist/semantic-normalization.js.map +1 -0
  269. package/dist/semantic-types.d.ts +229 -0
  270. package/dist/semantic-types.d.ts.map +1 -0
  271. package/dist/semantic-types.js +2 -0
  272. package/dist/semantic-types.js.map +1 -0
  273. package/dist/status-types.d.ts +28 -0
  274. package/dist/status-types.d.ts.map +1 -0
  275. package/dist/status-types.js +2 -0
  276. package/dist/status-types.js.map +1 -0
  277. package/dist/task-types.d.ts +165 -0
  278. package/dist/task-types.d.ts.map +1 -0
  279. package/dist/task-types.js +2 -0
  280. package/dist/task-types.js.map +1 -0
  281. package/dist/trace-helpers.d.ts +22 -0
  282. package/dist/trace-helpers.d.ts.map +1 -0
  283. package/dist/trace-helpers.js +181 -0
  284. package/dist/trace-helpers.js.map +1 -0
  285. package/dist/trace-runtime.d.ts +7 -0
  286. package/dist/trace-runtime.d.ts.map +1 -0
  287. package/dist/trace-runtime.js +196 -0
  288. package/dist/trace-runtime.js.map +1 -0
  289. package/dist/trace-types.d.ts +168 -0
  290. package/dist/trace-types.d.ts.map +1 -0
  291. package/dist/trace-types.js +2 -0
  292. package/dist/trace-types.js.map +1 -0
  293. package/dist/types.d.ts +19 -0
  294. package/dist/types.d.ts.map +1 -0
  295. package/dist/types.js +2 -0
  296. package/dist/types.js.map +1 -0
  297. package/dist/usage-governor.d.ts +41 -0
  298. package/dist/usage-governor.d.ts.map +1 -0
  299. package/dist/usage-governor.js +43 -0
  300. package/dist/usage-governor.js.map +1 -0
  301. package/package.json +3 -2
@@ -0,0 +1,95 @@
1
+ import {
2
+ createSwarmMergeBundle,
3
+ createSwarmTraceShard
4
+ } from '../dist/index.js';
5
+
6
+ export function makeBenchManifest() {
7
+ return {
8
+ compute: [
9
+ { id: 'deep', kind: 'codex', model: 'gpt-5.5', reasoningEffort: 'xhigh' },
10
+ { id: 'fast', kind: 'codex', model: 'gpt-5.4-mini', reasoningEffort: 'medium' }
11
+ ],
12
+ layers: [
13
+ { id: 'parent', childCompute: { implementation: 'deep', evidence: 'fast' } },
14
+ { id: 'implementation', parentId: 'parent' },
15
+ { id: 'evidence', parentId: 'parent' }
16
+ ],
17
+ lanes: [
18
+ { id: 'runtime', layer: 'implementation', allowedWrites: ['src/runtime/**'], evidencePrefix: 'evidence/runtime/' },
19
+ { id: 'tests', layer: 'evidence', allowedWrites: ['test/**'], evidencePrefix: 'evidence/tests/' }
20
+ ],
21
+ policy: { defaultCompute: 'fast' }
22
+ };
23
+ }
24
+
25
+ export function makeBenchTasks(count) {
26
+ const tasks = [];
27
+ for (let i = 0; i < count; i += 1) {
28
+ const lane = i % 3 === 0 ? 'tests' : 'runtime';
29
+ tasks.push({
30
+ id: 'task-' + i,
31
+ lane,
32
+ priority: i % 100,
33
+ targetRefs: [lane === 'tests' ? `test/file-${i}.mjs` : `src/runtime/file-${i}.ts`],
34
+ acceptance: ['task ' + i + ' passes']
35
+ });
36
+ }
37
+ return tasks;
38
+ }
39
+
40
+ export function makeBenchBundles(plan, count) {
41
+ const bundles = [];
42
+ for (let i = 0; i < Math.min(count, plan.jobs.length); i += 1) {
43
+ const job = plan.jobs[i];
44
+ bundles.push(createSwarmMergeBundle({
45
+ job,
46
+ result: {
47
+ jobId: job.id,
48
+ status: 'verified',
49
+ changedPaths: [job.task.targetRefs[0] ?? `src/runtime/file-${i}.ts`],
50
+ changedRegions: i % 2 === 0 ? [`region.${i}`] : [],
51
+ verification: [{ status: 0 }]
52
+ },
53
+ patchPath: `agent-runs/bench/${job.id}/changes.patch`
54
+ }));
55
+ }
56
+ return bundles;
57
+ }
58
+
59
+ export function makeBenchTraceBundles(plan, count, offset = 0) {
60
+ const bundles = [];
61
+ for (let i = 0; i < Math.min(count, plan.jobs.length); i += 1) {
62
+ const job = plan.jobs[(i + offset) % plan.jobs.length];
63
+ const region = `region.${i % 8}`;
64
+ const traceShard = createSwarmTraceShard({
65
+ jobId: job.id,
66
+ lane: job.lane,
67
+ subject: 'bench-trace',
68
+ rowWindows: [{ start: i * 10, end: i * 10 + 4, rowCount: 5, firstDivergenceAt: i % 5 === 0 ? i * 10 + 2 : undefined, deltaFields: ['state.value'] }],
69
+ hypotheses: [{ sourcePath: job.task.targetRefs[0], symbol: `benchSymbol${i}`, region, confidence: i % 5 === 0 ? 'high' : 'medium' }],
70
+ executableOwnershipRegions: [{
71
+ id: region,
72
+ sourcePath: job.task.targetRefs[0],
73
+ symbol: `benchSymbol${i}`,
74
+ selectors: [`${region}.*`],
75
+ affectedTests: ['node trace-gate.mjs'],
76
+ riskLevel: i % 5 === 0 ? 'medium' : 'low'
77
+ }],
78
+ focusedTests: ['node trace-gate.mjs'],
79
+ referenceEvidence: [{ path: `agent-runs/bench/${job.id}/reference-trace.jsonl`, kind: 'trace' }]
80
+ });
81
+ bundles.push(createSwarmMergeBundle({
82
+ job,
83
+ result: {
84
+ jobId: job.id,
85
+ status: 'verified',
86
+ changedPaths: [job.task.targetRefs[0] ?? `src/runtime/file-${i}.ts`],
87
+ changedRegions: [region],
88
+ verification: [{ status: 0 }]
89
+ },
90
+ patchPath: `agent-runs/bench/${job.id}/changes.patch`,
91
+ traceShards: [traceShard]
92
+ }));
93
+ }
94
+ return bundles;
95
+ }
@@ -0,0 +1,190 @@
1
+ import {
2
+ checkSwarmOwnership,
3
+ createSwarmAdaptiveLoadPlan,
4
+ createSwarmContextPack,
5
+ createSwarmHotspotReport,
6
+ createSwarmLanePlaybook,
7
+ createSwarmMergeAdmission,
8
+ createSwarmManifest,
9
+ createSwarmEventStream,
10
+ createSwarmLeases,
11
+ createSwarmMergeBundle,
12
+ createSwarmMergeIndex,
13
+ createSwarmOracleCorpus,
14
+ createSwarmPatchStackPlan,
15
+ createSwarmReplayBundle,
16
+ createSwarmParityOracle,
17
+ createSwarmDivergenceReport,
18
+ createSwarmWatchpointPlan,
19
+ createSwarmDebugHandoff,
20
+ createSwarmEvidenceIndex,
21
+ createSwarmBlackboard,
22
+ createSwarmBottleneckReport,
23
+ createSwarmFixtureCatalog,
24
+ createSwarmProgressModel,
25
+ createSwarmPlan,
26
+ createSwarmProof,
27
+ createSwarmQueueOverlay,
28
+ createSwarmQueueSnapshot,
29
+ createSwarmRun,
30
+ createSwarmRunCheckpoint,
31
+ createSwarmSchedule,
32
+ createSwarmTraceIndex,
33
+ decodeSwarmJsonl,
34
+ defineSwarmTasks,
35
+ encodeSwarmJsonl,
36
+ querySwarmTraceIndex,
37
+ routeSwarmEventToMailboxes,
38
+ resolveSwarmCompute,
39
+ validateSwarmManifest
40
+ } from '../dist/index.js';
41
+ import {
42
+ makeBenchBundles,
43
+ makeBenchManifest,
44
+ makeBenchTasks,
45
+ makeBenchTraceBundles
46
+ } from './package-bench-fixtures.mjs';
47
+
48
+ export function createPackageBenchRows({ taskCount, measure }) {
49
+ const manifest = createSwarmManifest(makeBenchManifest());
50
+ const tasks = defineSwarmTasks(makeBenchTasks(taskCount));
51
+ let plan = createSwarmPlan(manifest, tasks, { limit: 64 });
52
+ let run = createSwarmRun({ plan });
53
+ let jsonl = encodeSwarmJsonl([plan, run]);
54
+ let cursor = 0;
55
+ let schedule = createSwarmSchedule({ plan, maxReadyJobs: 128 });
56
+ let leases = createSwarmLeases({ schedule, workerId: 'bench-worker', now: 1000, leaseMs: 60000, count: 16 });
57
+ let eventStream = createSwarmEventStream({ runId: 'bench', root: 'agent-runs/bench/streams', lanes: manifest.lanes });
58
+ let bundles = makeBenchBundles(plan, 32);
59
+ let mergeIndex = createSwarmMergeIndex({ bundles });
60
+
61
+ return [
62
+ measure('create-plan-' + taskCount, 8, () => {
63
+ plan = createSwarmPlan(manifest, tasks, { limit: 64, selectors: ['task'] });
64
+ return plan.jobs.length;
65
+ }),
66
+ measure('validate-manifest', 32, () => validateSwarmManifest(manifest).issues.length),
67
+ measure('resolve-compute-' + taskCount, 64, () => resolveSwarmCompute(manifest, tasks[cursor++ % tasks.length]).id.length),
68
+ measure('ownership-check-' + taskCount, 64, () => checkSwarmOwnership(plan.jobs[cursor++ % plan.jobs.length], ['src/runtime/file.ts']).violations.length),
69
+ measure('create-run-' + taskCount, 16, () => {
70
+ run = createSwarmRun({ plan });
71
+ return run.jobs.length;
72
+ }),
73
+ measure('jsonl-encode', 16, () => {
74
+ jsonl = encodeSwarmJsonl([plan, run]);
75
+ return jsonl.length;
76
+ }),
77
+ measure('jsonl-decode', 16, () => decodeSwarmJsonl(jsonl).length),
78
+ measure('proof', 16, () => createSwarmProof(plan).hash.length),
79
+ measure('schedule-lease-' + taskCount, 8, () => {
80
+ schedule = createSwarmSchedule({ plan, maxReadyJobs: 128, maxComputeConcurrency: { fast: 64, deep: 32 } });
81
+ leases = createSwarmLeases({ schedule, workerId: 'bench-worker', now: 1000 + cursor++, leaseMs: 60000, count: 16 });
82
+ return schedule.ready.length + leases.length;
83
+ }),
84
+ measure('adaptive-load-' + taskCount, 8, () => createSwarmAdaptiveLoadPlan({
85
+ plan,
86
+ schedule,
87
+ mode: 'balanced',
88
+ maxLimits: { maxReadyJobs: 128 },
89
+ currentLimits: { maxReadyJobs: 64 },
90
+ observations: [
91
+ { kind: 'semantic-empty', jobId: plan.jobs[cursor % plan.jobs.length].id, lane: plan.jobs[cursor % plan.jobs.length].lane },
92
+ { kind: 'log-noise', lane: 'runtime', value: 200000 }
93
+ ],
94
+ generatedAt: 1500 + cursor++
95
+ }).summary.decisionCount),
96
+ measure('queue-snapshot-' + taskCount, 8, () => {
97
+ const snapshot = createSwarmQueueSnapshot({ plan, run, leases, generatedAt: 2000 + cursor++ });
98
+ return snapshot.summary.jobCount + snapshot.summary.leaseCount;
99
+ }),
100
+ measure('run-checkpoint-' + taskCount, 16, () => createSwarmRunCheckpoint({ run, sequence: cursor++ }).hash.length),
101
+ measure('merge-bundle-' + taskCount, 32, () => createSwarmMergeBundle({
102
+ job: plan.jobs[cursor % plan.jobs.length],
103
+ result: {
104
+ jobId: plan.jobs[cursor++ % plan.jobs.length].id,
105
+ status: 'completed',
106
+ changedPaths: ['src/runtime/file.ts'],
107
+ verification: [{ status: 0 }]
108
+ },
109
+ patchPath: 'agent-runs/bench/changes.patch'
110
+ }).id.length),
111
+ measure('queue-overlay-' + taskCount, 16, () => createSwarmQueueOverlay({ bundles, generatedAt: 3000 + cursor++ }).summary.entryCount),
112
+ measure('merge-index-' + taskCount, 8, () => {
113
+ bundles = makeBenchBundles(plan, 32);
114
+ mergeIndex = createSwarmMergeIndex({ bundles, generatedAt: 4000 + cursor++ });
115
+ return mergeIndex.summary.entryCount + mergeIndex.summary.conflictCount;
116
+ }),
117
+ measure('merge-admission-' + taskCount, 16, () => createSwarmMergeAdmission({ index: mergeIndex, maxReady: 8, maxChangedPaths: 16 }).summary.admittedCount),
118
+ measure('hotspot-report-' + taskCount, 16, () => createSwarmHotspotReport({ bundles, threshold: 3 }).summary.recommendationCount),
119
+ measure('context-pack-' + taskCount, 32, () => createSwarmContextPack({
120
+ job: plan.jobs[cursor % plan.jobs.length],
121
+ files: ['src/runtime/file.ts', 'test/runtime-smoke.mjs'],
122
+ apiMap: {
123
+ runtime: ['createRuntime', 'stepRuntime'],
124
+ tests: ['runtime smoke gate']
125
+ },
126
+ knownFailures: ['shared renderer gate is noisy on old snapshots'],
127
+ oracleCommands: [{ name: 'focused-gate', command: 'npm', args: ['test'], required: true }],
128
+ evidenceSchema: { type: 'object', required: ['ok', 'commands'] },
129
+ avoidInvestigating: ['unrelated route snapshots'],
130
+ playbookIds: ['runtime-playbook']
131
+ }).files.length),
132
+ measure('oracle-corpus-' + taskCount, 32, () => createSwarmOracleCorpus({
133
+ artifacts: [
134
+ { id: 'trace-runtime', path: 'oracles/runtime-trace.jsonl', kind: 'trace', tags: ['runtime', 'reference'], hash: 'fnv1a32:trace' },
135
+ { id: 'snapshot-routing', path: 'oracles/routing-snapshot.json', kind: 'snapshot', tags: ['routing', 'reference'] }
136
+ ]
137
+ }).summary.artifactCount),
138
+ measure('replay-debug-evidence-' + taskCount, 16, () => {
139
+ const replay = createSwarmReplayBundle({
140
+ commands: ['node replay.mjs'],
141
+ artifacts: [{ path: 'agent-runs/bench/trace.jsonl', kind: 'trace' }],
142
+ expectedEvidence: ['trace.jsonl']
143
+ });
144
+ const parity = createSwarmParityOracle({
145
+ comparators: [{ status: 'failed', expected: 1, actual: 2, operationIndex: cursor++ }]
146
+ });
147
+ const divergence = createSwarmDivergenceReport({
148
+ replayBundleIds: [replay.id],
149
+ observabilityPoints: [{ operationIndex: cursor, path: '/value' }],
150
+ expected: 1,
151
+ actual: 2
152
+ });
153
+ const watch = createSwarmWatchpointPlan({ watchpoints: [{ path: '/value', operator: 'changes' }] });
154
+ const handoff = createSwarmDebugHandoff({
155
+ replayBundleIds: [replay.id],
156
+ divergenceReportIds: [divergence.id],
157
+ watchpointPlanIds: [watch.id],
158
+ comparisons: parity.comparators
159
+ });
160
+ const evidence = createSwarmEvidenceIndex({ entries: [{ topic: 'bench', path: 'agent-runs/bench/evidence.json' }] });
161
+ const blackboard = createSwarmBlackboard({ entries: [{ topic: 'bench', text: 'divergence found', sourceIds: [divergence.id] }] });
162
+ const bottleneck = createSwarmBottleneckReport({ sources: [{ text: 'merge review bottleneck', changedPaths: ['src/runtime.ts'] }] });
163
+ const fixtures = createSwarmFixtureCatalog({ fixtures: [{ id: 'logged-in', tags: ['auth'] }] });
164
+ const progress = createSwarmProgressModel({ items: [{ id: 'bench', status: 'accepted' }] });
165
+ return handoff.commands.length + evidence.summary.entryCount + blackboard.summary.entryCount + bottleneck.summary.kindCount + fixtures.summary.fixtureCount + progress.summary.acceptedCount;
166
+ }),
167
+ measure('trace-index-' + taskCount, 16, () => {
168
+ const traceBundles = makeBenchTraceBundles(plan, 24, cursor++);
169
+ const traceIndex = createSwarmTraceIndex({ bundles: traceBundles, generatedAt: 7000 + cursor++ });
170
+ const query = querySwarmTraceIndex(traceIndex, { region: 'region.2', textIncludes: 'benchSymbol' });
171
+ return traceIndex.summary.shardCount + traceIndex.summary.executableOwnershipRegionCount + query.summary.shardCount;
172
+ }),
173
+ measure('lane-playbook-' + taskCount, 16, () => createSwarmLanePlaybook({
174
+ lane: 'runtime',
175
+ successfulBundles: bundles,
176
+ notes: ['prefer narrow patches with focused evidence'],
177
+ commands: [{ name: 'runtime-smoke', command: 'npm', args: ['test'], required: true }],
178
+ avoidInvestigating: ['generated fixtures unless task owns them'],
179
+ evidencePatterns: ['evidence.json', 'commands.md']
180
+ }).successfulJobIds.length),
181
+ measure('patch-stack-plan-' + taskCount, 16, () => createSwarmPatchStackPlan({
182
+ index: mergeIndex,
183
+ maxStackSize: 8
184
+ }).summary.stackCount),
185
+ measure('event-route-' + taskCount, 64, () => {
186
+ eventStream = createSwarmEventStream({ runId: 'bench', root: 'agent-runs/bench/streams', lanes: manifest.lanes });
187
+ return routeSwarmEventToMailboxes(eventStream, { type: 'agent.evidence', jobId: plan.jobs[cursor++ % plan.jobs.length].id, lane: 'runtime' }).length;
188
+ })
189
+ ];
190
+ }
@@ -0,0 +1,94 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { performance } from 'node:perf_hooks';
4
+ import { fileURLToPath } from 'node:url';
5
+
6
+ export function createPackageBenchPaths(metaUrl) {
7
+ const dirname = path.dirname(fileURLToPath(metaUrl));
8
+ const packageDir = path.resolve(dirname, '..');
9
+ return {
10
+ packageDir,
11
+ repoRoot: path.basename(path.dirname(packageDir)) === 'packages'
12
+ ? path.resolve(packageDir, '..', '..')
13
+ : packageDir
14
+ };
15
+ }
16
+
17
+ export function createMeasure(rounds) {
18
+ return function measure(fixture, operationsPerRound, fn) {
19
+ const samples = [];
20
+ let checksum = 0;
21
+ for (let round = 0; round < rounds; round += 1) {
22
+ const start = performance.now();
23
+ for (let op = 0; op < operationsPerRound; op += 1) checksum += Number(fn()) || 0;
24
+ const elapsed = performance.now() - start;
25
+ samples.push((elapsed * 1000) / operationsPerRound);
26
+ }
27
+ samples.sort((a, b) => a - b);
28
+ return {
29
+ fixture,
30
+ operationsPerRound,
31
+ medianUs: percentile(samples, 0.5),
32
+ p95Us: percentile(samples, 0.95),
33
+ checksum
34
+ };
35
+ };
36
+ }
37
+
38
+ export function parseArgs(argv) {
39
+ const out = {};
40
+ for (let i = 0; i < argv.length; i += 1) {
41
+ if (argv[i] === '--out') out.out = argv[++i];
42
+ else if (argv[i] === '--tasks') out.tasks = argv[++i];
43
+ else if (argv[i] === '--rounds') out.rounds = argv[++i];
44
+ }
45
+ return out;
46
+ }
47
+
48
+ export function readPositiveInt(value, fallback) {
49
+ const parsed = Number(value);
50
+ return Number.isFinite(parsed) && parsed > 0 ? Math.floor(parsed) : fallback;
51
+ }
52
+
53
+ export function resolveOutPath(repoRoot, out) {
54
+ return out ? path.resolve(repoRoot, out) : null;
55
+ }
56
+
57
+ export function readPackageVersion(packageDir) {
58
+ return JSON.parse(fs.readFileSync(path.join(packageDir, 'package.json'), 'utf8')).version;
59
+ }
60
+
61
+ export function writeBenchReport(report, outPath) {
62
+ if (!outPath) return;
63
+ fs.mkdirSync(path.dirname(outPath), { recursive: true });
64
+ fs.writeFileSync(outPath, JSON.stringify(report, null, 2) + '\n');
65
+ }
66
+
67
+ export function printBenchReport(report, { outPath, repoRoot }) {
68
+ console.log(report.package + ' package benchmark');
69
+ console.log('Node ' + report.node + ' on ' + report.platform + ', tasks=' + report.taskCount + ', rounds=' + report.rounds);
70
+ console.log('These are Frontier-only package measurements, not competitor comparisons.');
71
+ console.log('');
72
+ console.log(padRight('Fixture', 30) + padLeft('Median', 12) + padLeft('p95', 12));
73
+ for (const row of report.rows) {
74
+ console.log(padRight(row.fixture, 30) + padLeft(formatUs(row.medianUs), 12) + padLeft(formatUs(row.p95Us), 12));
75
+ }
76
+ if (outPath) console.log('\nwrote ' + path.relative(repoRoot, outPath));
77
+ }
78
+
79
+ export function formatUs(value) {
80
+ if (value >= 1000) return (value / 1000).toFixed(2) + 'ms';
81
+ return value.toFixed(2) + 'us';
82
+ }
83
+
84
+ function padRight(value, size) {
85
+ return String(value).padEnd(size);
86
+ }
87
+
88
+ function padLeft(value, size) {
89
+ return String(value).padStart(size);
90
+ }
91
+
92
+ function percentile(sorted, pct) {
93
+ return sorted[Math.min(sorted.length - 1, Math.floor(sorted.length * pct))];
94
+ }