@smoothbricks/lmao 0.2.2 → 0.2.3

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 (276) hide show
  1. package/dist/allocator.wasm +0 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/lib/JsBufferStrategy.d.ts +4 -3
  6. package/dist/lib/JsBufferStrategy.d.ts.map +1 -1
  7. package/dist/lib/JsBufferStrategy.js +18 -11
  8. package/dist/lib/arrow/lease.d.ts +10 -0
  9. package/dist/lib/arrow/lease.d.ts.map +1 -0
  10. package/dist/lib/arrow/lease.js +33 -0
  11. package/dist/lib/arrow/utils.d.ts +3 -4
  12. package/dist/lib/arrow/utils.d.ts.map +1 -1
  13. package/dist/lib/arrow/utils.js +12 -13
  14. package/dist/lib/arrow/vocabularyDictionary.d.ts +21 -0
  15. package/dist/lib/arrow/vocabularyDictionary.d.ts.map +1 -0
  16. package/dist/lib/arrow/vocabularyDictionary.js +95 -0
  17. package/dist/lib/bufferStrategy.d.ts +3 -2
  18. package/dist/lib/bufferStrategy.d.ts.map +1 -1
  19. package/dist/lib/cloudflare/traceRows.d.ts.map +1 -1
  20. package/dist/lib/cloudflare/traceRows.js +3 -2
  21. package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -1
  22. package/dist/lib/codegen/evaluatorGenerator.js +12 -11
  23. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +44 -82
  24. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -1
  25. package/dist/lib/codegen/fixedPositionWriterGenerator.js +223 -162
  26. package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts +63 -0
  27. package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts.map +1 -0
  28. package/dist/lib/codegen/spanLoggerClosureMaterializer.js +447 -0
  29. package/dist/lib/codegen/spanLoggerGenerator.d.ts +36 -19
  30. package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -1
  31. package/dist/lib/codegen/spanLoggerGenerator.js +164 -158
  32. package/dist/lib/convertToArrow.d.ts +7 -2
  33. package/dist/lib/convertToArrow.d.ts.map +1 -1
  34. package/dist/lib/convertToArrow.js +499 -285
  35. package/dist/lib/defineOpContext.js +1 -1
  36. package/dist/lib/enumMetadata.d.ts +19 -0
  37. package/dist/lib/enumMetadata.d.ts.map +1 -0
  38. package/dist/lib/enumMetadata.js +86 -0
  39. package/dist/lib/flushScheduler.d.ts.map +1 -1
  40. package/dist/lib/flushScheduler.js +13 -4
  41. package/dist/lib/library.d.ts +16 -98
  42. package/dist/lib/library.d.ts.map +1 -1
  43. package/dist/lib/library.js +32 -525
  44. package/dist/lib/logBinding.d.ts +21 -27
  45. package/dist/lib/logBinding.d.ts.map +1 -1
  46. package/dist/lib/op.d.ts +30 -30
  47. package/dist/lib/op.d.ts.map +1 -1
  48. package/dist/lib/op.js +15 -22
  49. package/dist/lib/opContext/createOpGroup.d.ts +1 -1
  50. package/dist/lib/opContext/createOpGroup.d.ts.map +1 -1
  51. package/dist/lib/opContext/createOpGroup.js +22 -29
  52. package/dist/lib/opContext/defineOp.d.ts +4 -4
  53. package/dist/lib/opContext/defineOp.d.ts.map +1 -1
  54. package/dist/lib/opContext/defineOp.js +53 -10
  55. package/dist/lib/opContext/opGroupTypes.d.ts +2 -2
  56. package/dist/lib/opContext/opTypes.d.ts +1 -1
  57. package/dist/lib/opContext/opTypes.d.ts.map +1 -1
  58. package/dist/lib/opContext/spanContextTypes.d.ts +29 -14
  59. package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -1
  60. package/dist/lib/opContext/types.d.ts +4 -4
  61. package/dist/lib/opContext/types.d.ts.map +1 -1
  62. package/dist/lib/physicalLayoutPlan.d.ts +89 -0
  63. package/dist/lib/physicalLayoutPlan.d.ts.map +1 -0
  64. package/dist/lib/physicalLayoutPlan.js +442 -0
  65. package/dist/lib/resolveMessage.d.ts +9 -0
  66. package/dist/lib/resolveMessage.d.ts.map +1 -0
  67. package/dist/lib/resolveMessage.js +63 -0
  68. package/dist/lib/result.d.ts +5 -7
  69. package/dist/lib/result.d.ts.map +1 -1
  70. package/dist/lib/result.js +19 -26
  71. package/dist/lib/runtimeHint.d.ts +35 -0
  72. package/dist/lib/runtimeHint.d.ts.map +1 -0
  73. package/dist/lib/runtimeHint.js +79 -0
  74. package/dist/lib/schema/types.d.ts +1 -1
  75. package/dist/lib/schema/types.d.ts.map +1 -1
  76. package/dist/lib/span-buffer/aot/v1.d.ts +2 -0
  77. package/dist/lib/span-buffer/aot/v1.d.ts.map +1 -0
  78. package/dist/lib/span-buffer/aot/v1.js +24 -0
  79. package/dist/lib/spanBuffer.d.ts +33 -4
  80. package/dist/lib/spanBuffer.d.ts.map +1 -1
  81. package/dist/lib/spanBuffer.js +583 -91
  82. package/dist/lib/spanBufferStats.d.ts +1 -1
  83. package/dist/lib/spanBufferStats.d.ts.map +1 -1
  84. package/dist/lib/spanContext.d.ts +27 -51
  85. package/dist/lib/spanContext.d.ts.map +1 -1
  86. package/dist/lib/spanContext.js +822 -344
  87. package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -1
  88. package/dist/lib/sqlite/sqlite-common.js +20 -21
  89. package/dist/lib/testing/bun-harness.d.ts +8 -3
  90. package/dist/lib/testing/bun-harness.d.ts.map +1 -1
  91. package/dist/lib/testing/bun-harness.js +30 -18
  92. package/dist/lib/testing/extractFacts.d.ts +1 -1
  93. package/dist/lib/testing/extractFacts.d.ts.map +1 -1
  94. package/dist/lib/testing/extractFacts.js +55 -63
  95. package/dist/lib/testing/facts.d.ts +1 -1
  96. package/dist/lib/testing/facts.d.ts.map +1 -1
  97. package/dist/lib/testing/queryable-span.d.ts +1 -1
  98. package/dist/lib/testing/queryable-span.d.ts.map +1 -1
  99. package/dist/lib/testing/queryable-span.js +26 -28
  100. package/dist/lib/testing/span-query.d.ts.map +1 -1
  101. package/dist/lib/testing/span-query.js +19 -22
  102. package/dist/lib/testing/stdio-replay.d.ts.map +1 -1
  103. package/dist/lib/testing/stdio-replay.js +19 -8
  104. package/dist/lib/threadId.d.ts.map +1 -1
  105. package/dist/lib/threadId.js +6 -3
  106. package/dist/lib/traceRoot.d.ts +30 -8
  107. package/dist/lib/traceRoot.d.ts.map +1 -1
  108. package/dist/lib/traceRoot.es.d.ts +17 -15
  109. package/dist/lib/traceRoot.es.d.ts.map +1 -1
  110. package/dist/lib/traceRoot.es.js +68 -34
  111. package/dist/lib/traceRoot.js +11 -0
  112. package/dist/lib/traceRoot.node.d.ts +17 -19
  113. package/dist/lib/traceRoot.node.d.ts.map +1 -1
  114. package/dist/lib/traceRoot.node.js +66 -38
  115. package/dist/lib/traceTopology.d.ts +42 -0
  116. package/dist/lib/traceTopology.d.ts.map +1 -0
  117. package/dist/lib/traceTopology.js +260 -0
  118. package/dist/lib/tracer.d.ts +9 -5
  119. package/dist/lib/tracer.d.ts.map +1 -1
  120. package/dist/lib/tracer.js +65 -71
  121. package/dist/lib/tracers/ArrayQueueTracer.d.ts +1 -1
  122. package/dist/lib/tracers/ArrayQueueTracer.js +1 -1
  123. package/dist/lib/tracers/StdioTracer.d.ts.map +1 -1
  124. package/dist/lib/tracers/StdioTracer.js +15 -13
  125. package/dist/lib/tracers/TestTracer.d.ts +4 -6
  126. package/dist/lib/tracers/TestTracer.d.ts.map +1 -1
  127. package/dist/lib/tracers/TestTracer.js +6 -8
  128. package/dist/lib/types.d.ts +49 -32
  129. package/dist/lib/types.d.ts.map +1 -1
  130. package/dist/lib/vocabularyRegistry.d.ts +25 -0
  131. package/dist/lib/vocabularyRegistry.d.ts.map +1 -0
  132. package/dist/lib/vocabularyRegistry.js +372 -0
  133. package/dist/lib/wasm/WasmBufferStrategy.d.ts +6 -10
  134. package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -1
  135. package/dist/lib/wasm/WasmBufferStrategy.js +44 -37
  136. package/dist/lib/wasm/wasmAllocator.d.ts +27 -22
  137. package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -1
  138. package/dist/lib/wasm/wasmAllocator.js +66 -44
  139. package/dist/lib/wasm/wasmPhysicalLayout.d.ts +67 -0
  140. package/dist/lib/wasm/wasmPhysicalLayout.d.ts.map +1 -0
  141. package/dist/lib/wasm/wasmPhysicalLayout.js +179 -0
  142. package/dist/lib/wasm/wasmSpanBuffer.d.ts +79 -31
  143. package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -1
  144. package/dist/lib/wasm/wasmSpanBuffer.js +442 -272
  145. package/dist/lib/wasm/wasmTraceRoot.d.ts +24 -22
  146. package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -1
  147. package/dist/lib/wasm/wasmTraceRoot.js +110 -71
  148. package/dist/vocabulary/register/v1.d.ts +2 -0
  149. package/dist/vocabulary/register/v1.d.ts.map +1 -0
  150. package/dist/vocabulary/register/v1.js +1 -0
  151. package/dist/wasm.d.ts +5 -0
  152. package/dist/wasm.d.ts.map +1 -0
  153. package/dist/wasm.js +4 -0
  154. package/package.json +54 -6
  155. package/src/index.ts +1 -0
  156. package/src/lib/JsBufferStrategy.ts +27 -9
  157. package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +335 -37
  158. package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +97 -26
  159. package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +75 -15
  160. package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +30 -6
  161. package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +18 -21
  162. package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +5 -2
  163. package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +25 -7
  164. package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +3 -2
  165. package/src/lib/__tests__/buffer-overflow.test.ts +24 -18
  166. package/src/lib/__tests__/capability-span-context.test.ts +505 -0
  167. package/src/lib/__tests__/capacity-tuning.test.ts +5 -3
  168. package/src/lib/__tests__/eager-columns.test.ts +345 -0
  169. package/src/lib/__tests__/enum-metadata-aot.test.ts +153 -0
  170. package/src/lib/__tests__/enum-metadata.test.ts +177 -0
  171. package/src/lib/__tests__/fixtures/empty-vocabulary-runtime.fixture.ts +15 -0
  172. package/src/lib/__tests__/flushScheduler.test.ts +5 -1
  173. package/src/lib/__tests__/identity-view.property.test.ts +179 -0
  174. package/src/lib/__tests__/library.test.ts +19 -235
  175. package/src/lib/__tests__/message-buffer-families.test.ts +878 -0
  176. package/src/lib/__tests__/nested-library-tasks.test.ts +14 -15
  177. package/src/lib/__tests__/op-metadata.test.ts +1 -1
  178. package/src/lib/__tests__/op-type-safety.test.ts +5 -16
  179. package/src/lib/__tests__/physical-layout-plan.test.ts +333 -0
  180. package/src/lib/__tests__/remap-descriptor-integration.test.ts +381 -0
  181. package/src/lib/__tests__/root-context-construction.test.ts +414 -0
  182. package/src/lib/__tests__/span-auto-runtime.test.ts +386 -0
  183. package/src/lib/__tests__/span-buffer-segment-stats.test.ts +221 -0
  184. package/src/lib/__tests__/span-lifecycle.test.ts +53 -25
  185. package/src/lib/__tests__/spanbuffer-materializer-parity.test.ts +266 -0
  186. package/src/lib/__tests__/sync-async-trace.test.ts +24 -23
  187. package/src/lib/__tests__/tag-writer-aot.test.ts +214 -0
  188. package/src/lib/__tests__/test-helpers.ts +67 -12
  189. package/src/lib/__tests__/threadId.test.ts +62 -0
  190. package/src/lib/__tests__/timestamp.test.ts +221 -93
  191. package/src/lib/__tests__/traceTopology.property.test.ts +383 -0
  192. package/src/lib/__tests__/type-narrowing.test.ts +63 -0
  193. package/src/lib/__tests__/vocabulary-dense-decoding.test.ts +405 -0
  194. package/src/lib/__tests__/vocabularyRegistry.test.ts +313 -0
  195. package/src/lib/arrow/lease.ts +43 -0
  196. package/src/lib/arrow/utils.ts +10 -14
  197. package/src/lib/arrow/vocabularyDictionary.ts +123 -0
  198. package/src/lib/bufferStrategy.ts +9 -1
  199. package/src/lib/cloudflare/traceRows.ts +3 -2
  200. package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +21 -141
  201. package/src/lib/codegen/__tests__/fixedPositionWriter-parity.test.ts +273 -0
  202. package/src/lib/codegen/__tests__/fixedPositionWriter-uint64.test.ts +61 -34
  203. package/src/lib/codegen/__tests__/nullBitmap.test.ts +33 -37
  204. package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +34 -18
  205. package/src/lib/codegen/__tests__/spanLoggerMaterializerParity.test.ts +503 -0
  206. package/src/lib/codegen/evaluatorGenerator.ts +18 -13
  207. package/src/lib/codegen/fixedPositionWriterGenerator.ts +329 -245
  208. package/src/lib/codegen/spanLoggerClosureMaterializer.ts +598 -0
  209. package/src/lib/codegen/spanLoggerGenerator.ts +241 -177
  210. package/src/lib/convertToArrow.ts +598 -311
  211. package/src/lib/defineOpContext.ts +1 -1
  212. package/src/lib/enumMetadata.ts +121 -0
  213. package/src/lib/flushScheduler.ts +11 -5
  214. package/src/lib/library.ts +37 -595
  215. package/src/lib/logBinding.ts +21 -27
  216. package/src/lib/op.ts +75 -18
  217. package/src/lib/opContext/__tests__/retry.test.ts +27 -21
  218. package/src/lib/opContext/createOpGroup.ts +33 -31
  219. package/src/lib/opContext/defineOp.ts +88 -11
  220. package/src/lib/opContext/opGroupTypes.ts +2 -2
  221. package/src/lib/opContext/opTypes.ts +1 -1
  222. package/src/lib/opContext/spanContextTypes.ts +98 -17
  223. package/src/lib/opContext/types.ts +7 -3
  224. package/src/lib/physicalLayoutPlan.ts +598 -0
  225. package/src/lib/resolveMessage.ts +67 -0
  226. package/src/lib/result.ts +20 -33
  227. package/src/lib/runtimeHint.ts +98 -0
  228. package/src/lib/schema/__tests__/featureFlags.test.ts +2 -1
  229. package/src/lib/schema/builder.ts +1 -1
  230. package/src/lib/schema/types.ts +1 -1
  231. package/src/lib/span-buffer/aot/v1.ts +26 -0
  232. package/src/lib/spanBuffer.ts +658 -92
  233. package/src/lib/spanBufferStats.ts +1 -1
  234. package/src/lib/spanContext.ts +1350 -861
  235. package/src/lib/sqlite/sqlite-common.ts +20 -31
  236. package/src/lib/testing/__tests__/topology-traversal.test.ts +174 -0
  237. package/src/lib/testing/__tests__/vitest-harness.test.ts +2 -1
  238. package/src/lib/testing/bun-harness.ts +94 -43
  239. package/src/lib/testing/extractFacts.ts +64 -78
  240. package/src/lib/testing/facts.ts +1 -1
  241. package/src/lib/testing/queryable-span.ts +23 -30
  242. package/src/lib/testing/span-query.ts +16 -20
  243. package/src/lib/testing/stdio-replay.ts +25 -8
  244. package/src/lib/testing/vitest-harness.ts +1 -1
  245. package/src/lib/threadId.ts +6 -3
  246. package/src/lib/traceRoot.es.ts +77 -42
  247. package/src/lib/traceRoot.node.ts +75 -46
  248. package/src/lib/traceRoot.ts +41 -14
  249. package/src/lib/traceTopology.ts +279 -0
  250. package/src/lib/tracer.ts +109 -98
  251. package/src/lib/tracers/ArrayQueueTracer.ts +1 -1
  252. package/src/lib/tracers/StdioTracer.ts +15 -13
  253. package/src/lib/tracers/TestTracer.ts +6 -8
  254. package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +15 -10
  255. package/src/lib/tracers/__tests__/TestTracer.test.ts +23 -13
  256. package/src/lib/types.ts +64 -33
  257. package/src/lib/vocabularyRegistry.ts +439 -0
  258. package/src/lib/wasm/WasmBufferStrategy.ts +56 -48
  259. package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +215 -11
  260. package/src/lib/wasm/__tests__/allocatorFreeBlockClamp.test.ts +86 -0
  261. package/src/lib/wasm/__tests__/wasm-identity-view.test.ts +311 -0
  262. package/src/lib/wasm/__tests__/wasm-integration.test.ts +417 -44
  263. package/src/lib/wasm/__tests__/wasm-message-buffer-families.test.ts +588 -0
  264. package/src/lib/wasm/__tests__/wasmAllocator.test.ts +100 -668
  265. package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +419 -63
  266. package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +24 -29
  267. package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +2 -2
  268. package/src/lib/wasm/wasmAllocator.ts +131 -96
  269. package/src/lib/wasm/wasmPhysicalLayout.ts +309 -0
  270. package/src/lib/wasm/wasmSpanBuffer.ts +597 -341
  271. package/src/lib/wasm/wasmTraceRoot.ts +140 -78
  272. package/src/vocabulary/register/v1.ts +1 -0
  273. package/src/wasm.ts +19 -0
  274. package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +0 -319
  275. package/src/lib/__tests__/remapped-buffer-view.test.ts +0 -635
  276. package/src/lib/wasm/allocator.zig +0 -948
@@ -0,0 +1,878 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { createHash } from 'node:crypto';
3
+ import fc from 'fast-check';
4
+ import { convertSpanTreeToArrowTable } from '../convertToArrow.js';
5
+ import { defineOpContext } from '../defineOpContext.js';
6
+ import type { OpMetadata } from '../opContext/opTypes.js';
7
+ import { MAX_PACKED_MESSAGE_DENSE_INDEX, resolveEntryType, resolveMessage } from '../resolveMessage.js';
8
+ import {
9
+ type MessageLayoutFamily,
10
+ type MessagePhysicalLayout,
11
+ RUNTIME_HINT_ANALYZED_VALID,
12
+ RUNTIME_HINT_LOG,
13
+ RUNTIME_HINT_MESSAGE_LAYOUT_DYNAMIC_ONLY,
14
+ RUNTIME_HINT_MESSAGE_LAYOUT_MIXED,
15
+ RUNTIME_HINT_MESSAGE_LAYOUT_STATIC_ONLY,
16
+ RUNTIME_HINT_MESSAGE_PHYSICAL_PACKED,
17
+ RUNTIME_HINT_MESSAGE_PHYSICAL_SPECIALIZED,
18
+ RUNTIME_HINT_RESULT,
19
+ runtimeHintMessageLayoutFamily,
20
+ runtimeHintMessagePhysicalLayout,
21
+ } from '../runtimeHint.js';
22
+ import { S } from '../schema/builder.js';
23
+ import { defineLogSchema } from '../schema/defineLogSchema.js';
24
+ import {
25
+ ENTRY_TYPE_DEBUG,
26
+ ENTRY_TYPE_INFO,
27
+ ENTRY_TYPE_SPAN_EXCEPTION,
28
+ ENTRY_TYPE_SPAN_OK,
29
+ ENTRY_TYPE_SPAN_START,
30
+ } from '../schema/systemSchema.js';
31
+ import {
32
+ createChildSpanBuffer,
33
+ createOverflowBuffer,
34
+ createSpanBuffer,
35
+ getSpanBufferClass,
36
+ type SpanBufferConstructor,
37
+ } from '../spanBuffer.js';
38
+ import { extractFacts } from '../testing/extractFacts.js';
39
+ import type { AnySpanBuffer, SpanBuffer } from '../types.js';
40
+ import { getVocabularyGeneration, registerVocabularyFragment, type VocabularyFragment } from '../vocabularyRegistry.js';
41
+ import { createTestTraceRoot } from './test-helpers.js';
42
+
43
+ const CAPACITY = 8;
44
+ const encoder = new TextEncoder();
45
+ const schema = defineLogSchema({ marker: S.category() });
46
+ const context = defineOpContext({ logSchema: schema });
47
+ const runtimeSchema = context.logBinding.logSchema;
48
+
49
+ function encodeRecord(text: string): Uint8Array {
50
+ const textBytes = encoder.encode(text);
51
+ const record = new Uint8Array(4 + textBytes.length + 2);
52
+ new DataView(record.buffer).setUint32(0, textBytes.length, true);
53
+ record.set(textBytes, 4);
54
+ return record;
55
+ }
56
+
57
+ function fragmentHash(fragment: Omit<VocabularyFragment, 'contentHash'>): string {
58
+ const algorithm = encoder.encode(fragment.idAlgorithm);
59
+ const byteLength =
60
+ 1 +
61
+ 2 +
62
+ algorithm.length +
63
+ 4 +
64
+ fragment.ids.length * 4 +
65
+ 4 +
66
+ fragment.kindTags.length +
67
+ 4 +
68
+ fragment.utf8.length +
69
+ 4 +
70
+ fragment.offsets.length * 4;
71
+ const bytes = new Uint8Array(byteLength);
72
+ const view = new DataView(bytes.buffer);
73
+ let offset = 0;
74
+ bytes[offset++] = fragment.schemaVersion;
75
+ view.setUint16(offset, algorithm.length, true);
76
+ offset += 2;
77
+ bytes.set(algorithm, offset);
78
+ offset += algorithm.length;
79
+ view.setUint32(offset, fragment.ids.length, true);
80
+ offset += 4;
81
+ for (const id of fragment.ids) {
82
+ view.setUint32(offset, id, true);
83
+ offset += 4;
84
+ }
85
+ view.setUint32(offset, fragment.kindTags.length, true);
86
+ offset += 4;
87
+ bytes.set(fragment.kindTags, offset);
88
+ offset += fragment.kindTags.length;
89
+ view.setUint32(offset, fragment.utf8.length, true);
90
+ offset += 4;
91
+ bytes.set(fragment.utf8, offset);
92
+ offset += fragment.utf8.length;
93
+ view.setUint32(offset, fragment.offsets.length, true);
94
+ offset += 4;
95
+ for (const boundary of fragment.offsets) {
96
+ view.setInt32(offset, boundary, true);
97
+ offset += 4;
98
+ }
99
+ return createHash('sha256').update(bytes).digest('hex');
100
+ }
101
+
102
+ function makeFragment(text: string): VocabularyFragment {
103
+ const record = encodeRecord(text);
104
+ const digest = createHash('sha256').update(Uint8Array.of(1)).update(record).digest();
105
+ const fragment: Omit<VocabularyFragment, 'contentHash'> = {
106
+ schemaVersion: 1,
107
+ idAlgorithm: 'sha256-24-v1',
108
+ ids: new Uint32Array([(digest[0] << 16) | (digest[1] << 8) | digest[2]]),
109
+ kindTags: new Uint8Array([1]),
110
+ utf8: record,
111
+ offsets: new Int32Array([0, record.length]),
112
+ };
113
+ return { ...fragment, contentHash: fragmentHash(fragment) };
114
+ }
115
+
116
+ const FAMILY_VOCABULARY_TEXT = 'family local vocabulary literal';
117
+ const FAMILY_VOCABULARY_BINDING = registerVocabularyFragment(makeFragment(FAMILY_VOCABULARY_TEXT));
118
+ const FAMILY_DENSE_INDEX = FAMILY_VOCABULARY_BINDING[0];
119
+
120
+ function textAtFamilyBinding(): string {
121
+ const generation = getVocabularyGeneration();
122
+ const start = generation.offsets[FAMILY_DENSE_INDEX];
123
+ const end = generation.offsets[FAMILY_DENSE_INDEX + 1];
124
+ const record = generation.records.subarray(start, end);
125
+ const textLength = new DataView(record.buffer, record.byteOffset, record.byteLength).getUint32(0, true);
126
+ return new TextDecoder().decode(record.subarray(4, 4 + textLength));
127
+ }
128
+
129
+ function hint(familyBits: number, physicalBits = 0, capacity = CAPACITY): number {
130
+ return RUNTIME_HINT_ANALYZED_VALID | familyBits | physicalBits | RUNTIME_HINT_LOG | RUNTIME_HINT_RESULT | capacity;
131
+ }
132
+
133
+ const staticOp = context.defineOp('static-family', (ctx) => ctx.ok(null), undefined, {
134
+ runtimeHint: hint(RUNTIME_HINT_MESSAGE_LAYOUT_STATIC_ONLY),
135
+ localMessageDictionary: [FAMILY_DENSE_INDEX],
136
+ });
137
+ const dynamicOp = context.defineOp('dynamic-family', (ctx) => ctx.ok(null), undefined, {
138
+ runtimeHint: hint(RUNTIME_HINT_MESSAGE_LAYOUT_DYNAMIC_ONLY),
139
+ });
140
+ const mixedOp = context.defineOp('mixed-family', (ctx) => ctx.ok(null), undefined, {
141
+ runtimeHint: hint(RUNTIME_HINT_MESSAGE_LAYOUT_MIXED),
142
+ localMessageDictionary: [FAMILY_DENSE_INDEX],
143
+ });
144
+ const fallbackCurrentOp = context.defineOp('fallback-current-family', (ctx) => ctx.ok(null));
145
+ const specializedStaticOp = context.defineOp('specialized-static-family', (ctx) => ctx.ok(null), undefined, {
146
+ runtimeHint: hint(RUNTIME_HINT_MESSAGE_LAYOUT_STATIC_ONLY, RUNTIME_HINT_MESSAGE_PHYSICAL_SPECIALIZED),
147
+ });
148
+ const specializedDynamicOp = context.defineOp('specialized-dynamic-family', (ctx) => ctx.ok(null), undefined, {
149
+ runtimeHint: hint(RUNTIME_HINT_MESSAGE_LAYOUT_DYNAMIC_ONLY, RUNTIME_HINT_MESSAGE_PHYSICAL_SPECIALIZED),
150
+ });
151
+ const specializedMixedOp = context.defineOp('specialized-mixed-family', (ctx) => ctx.ok(null), undefined, {
152
+ runtimeHint: hint(RUNTIME_HINT_MESSAGE_LAYOUT_MIXED, RUNTIME_HINT_MESSAGE_PHYSICAL_SPECIALIZED),
153
+ });
154
+ const packedStaticOp = context.defineOp('packed-static-family', (ctx) => ctx.ok(null), undefined, {
155
+ runtimeHint: hint(RUNTIME_HINT_MESSAGE_LAYOUT_STATIC_ONLY, RUNTIME_HINT_MESSAGE_PHYSICAL_PACKED),
156
+ });
157
+ const packedDynamicOp = context.defineOp('packed-dynamic-family', (ctx) => ctx.ok(null), undefined, {
158
+ runtimeHint: hint(RUNTIME_HINT_MESSAGE_LAYOUT_DYNAMIC_ONLY, RUNTIME_HINT_MESSAGE_PHYSICAL_PACKED),
159
+ });
160
+ const packedMixedOp = context.defineOp('packed-mixed-family', (ctx) => ctx.ok(null), undefined, {
161
+ runtimeHint: hint(RUNTIME_HINT_MESSAGE_LAYOUT_MIXED, RUNTIME_HINT_MESSAGE_PHYSICAL_PACKED),
162
+ });
163
+
164
+ function createPlannedBuffer(
165
+ _family: MessageLayoutFamily,
166
+ SpanBufferClass: SpanBufferConstructor<typeof runtimeSchema>,
167
+ metadata: OpMetadata,
168
+ ): SpanBuffer<typeof runtimeSchema> {
169
+ SpanBufferClass.stats.capacity = CAPACITY;
170
+ return createSpanBuffer(runtimeSchema, createTestTraceRoot('family-layout'), metadata, CAPACITY, SpanBufferClass);
171
+ }
172
+
173
+ function expectFamilyShape(buffer: AnySpanBuffer, family: MessageLayoutFamily): void {
174
+ if (buffer._messageLayoutFamily !== family) {
175
+ throw new Error(`Expected ${family} buffer, received ${buffer._messageLayoutFamily}`);
176
+ }
177
+ if (family === 'static-only') {
178
+ expect('message_values' in buffer).toBe(false);
179
+ expect(Object.hasOwn(buffer, '_spanName')).toBe(true);
180
+ expect(Object.hasOwn(buffer, '_terminalMessage')).toBe(true);
181
+ expect(Array.isArray(buffer._spanName)).toBe(false);
182
+ expect(ArrayBuffer.isView(buffer._spanName)).toBe(false);
183
+ } else if (family === 'dynamic-only') {
184
+ expect(buffer.message_values).toBeInstanceOf(Array);
185
+ expect(Object.hasOwn(buffer, '_spanName')).toBe(true);
186
+ expect(Object.hasOwn(buffer, '_terminalMessage')).toBe(false);
187
+ } else {
188
+ expect(buffer.message_values).toBeInstanceOf(Array);
189
+ expect(Object.hasOwn(buffer, '_spanName')).toBe(false);
190
+ expect(Object.hasOwn(buffer, '_terminalMessage')).toBe(false);
191
+ }
192
+ }
193
+
194
+ function expectPhysicalShape(buffer: AnySpanBuffer, layout: MessagePhysicalLayout): void {
195
+ if (buffer._messagePhysicalLayout !== layout) {
196
+ throw new Error(`Expected ${layout} buffer, received ${buffer._messagePhysicalLayout}`);
197
+ }
198
+ const hasStaticMessages = buffer._messageLayoutFamily !== 'dynamic-only';
199
+ if (layout === 'packed') {
200
+ expect(buffer._rowHeaders).toBeInstanceOf(Uint32Array);
201
+ expect('entry_type' in buffer).toBe(false);
202
+ expect('_messageIds' in buffer).toBe(false);
203
+ expect('_logHeaders' in buffer).toBe(false);
204
+ expect('message_nulls' in buffer).toBe(false);
205
+ } else {
206
+ expect(buffer.entry_type).toBeInstanceOf(Uint8Array);
207
+ expect('_rowHeaders' in buffer).toBe(false);
208
+ if (layout === 'current' && hasStaticMessages) {
209
+ expect(buffer._messageIds).toBeInstanceOf(Uint16Array);
210
+ expect('_logHeaders' in buffer).toBe(false);
211
+ } else if (layout === 'specialized' && hasStaticMessages) {
212
+ expect('_messageIds' in buffer).toBe(false);
213
+ expect(buffer._logHeaders).toBeInstanceOf(Uint32Array);
214
+ } else {
215
+ expect('_messageIds' in buffer).toBe(false);
216
+ expect('_logHeaders' in buffer).toBe(false);
217
+ }
218
+ expect('message_nulls' in buffer).toBe(false);
219
+ }
220
+ }
221
+
222
+ function collectLogRows(root: AnySpanBuffer): Array<{ entryType: number; message: string | undefined }> {
223
+ const rows: Array<{ entryType: number; message: string | undefined }> = [];
224
+ let segment: AnySpanBuffer | undefined = root;
225
+ let first = true;
226
+ while (segment) {
227
+ for (let row = first ? 2 : 0; row < segment._writeIndex; row++) {
228
+ rows.push({ entryType: resolveEntryType(segment, row), message: resolveMessage(segment, row) });
229
+ }
230
+ first = false;
231
+ segment = segment._overflow;
232
+ }
233
+ return rows;
234
+ }
235
+
236
+ describe('specialized message buffer families', () => {
237
+ it('selects explicit families in immutable callsite plans and keeps missing metadata conservative', () => {
238
+ expect(runtimeHintMessageLayoutFamily(hint(RUNTIME_HINT_MESSAGE_LAYOUT_STATIC_ONLY))).toBe('static-only');
239
+ expect(runtimeHintMessageLayoutFamily(hint(RUNTIME_HINT_MESSAGE_LAYOUT_DYNAMIC_ONLY))).toBe('dynamic-only');
240
+ expect(runtimeHintMessageLayoutFamily(hint(RUNTIME_HINT_MESSAGE_LAYOUT_MIXED))).toBe('mixed');
241
+ expect(runtimeHintMessageLayoutFamily(0)).toBe('mixed');
242
+ expect(runtimeHintMessageLayoutFamily(RUNTIME_HINT_ANALYZED_VALID | RUNTIME_HINT_RESULT)).toBe('mixed');
243
+
244
+ expect(staticOp.callsitePlan.messageLayoutFamily).toBe('static-only');
245
+ expect(dynamicOp.callsitePlan.messageLayoutFamily).toBe('dynamic-only');
246
+ expect(mixedOp.callsitePlan.messageLayoutFamily).toBe('mixed');
247
+ expect(staticOp.callsitePlan.SpanBufferClass).toBe(getSpanBufferClass(runtimeSchema, 'static-only'));
248
+ expect(dynamicOp.callsitePlan.SpanBufferClass).toBe(getSpanBufferClass(runtimeSchema, 'dynamic-only'));
249
+ expect(mixedOp.callsitePlan.SpanBufferClass).toBe(getSpanBufferClass(runtimeSchema, 'mixed'));
250
+ expect(
251
+ new Set([
252
+ staticOp.callsitePlan.SpanBufferClass,
253
+ dynamicOp.callsitePlan.SpanBufferClass,
254
+ mixedOp.callsitePlan.SpanBufferClass,
255
+ ]).size,
256
+ ).toBe(3);
257
+ });
258
+
259
+ it('decodes physical bits conservatively and caches every family/physical constructor dimension', () => {
260
+ const packedHint = hint(RUNTIME_HINT_MESSAGE_LAYOUT_MIXED, RUNTIME_HINT_MESSAGE_PHYSICAL_PACKED, 64);
261
+ const specializedHint = hint(RUNTIME_HINT_MESSAGE_LAYOUT_MIXED, RUNTIME_HINT_MESSAGE_PHYSICAL_SPECIALIZED, 64);
262
+ expect(runtimeHintMessagePhysicalLayout(packedHint)).toBe('packed');
263
+ expect(runtimeHintMessagePhysicalLayout(specializedHint)).toBe('specialized');
264
+ expect(runtimeHintMessagePhysicalLayout(hint(RUNTIME_HINT_MESSAGE_LAYOUT_MIXED, 0, 64))).toBe('current');
265
+ expect(runtimeHintMessagePhysicalLayout(0)).toBe('current');
266
+ expect(runtimeHintMessagePhysicalLayout(packedHint | RUNTIME_HINT_MESSAGE_PHYSICAL_SPECIALIZED)).toBe('current');
267
+
268
+ const classes = [
269
+ getSpanBufferClass(runtimeSchema, 'static-only', 'current'),
270
+ getSpanBufferClass(runtimeSchema, 'static-only', 'specialized'),
271
+ getSpanBufferClass(runtimeSchema, 'static-only', 'packed'),
272
+ getSpanBufferClass(runtimeSchema, 'mixed', 'current'),
273
+ getSpanBufferClass(runtimeSchema, 'mixed', 'specialized'),
274
+ getSpanBufferClass(runtimeSchema, 'mixed', 'packed'),
275
+ getSpanBufferClass(runtimeSchema, 'dynamic-only', 'current'),
276
+ getSpanBufferClass(runtimeSchema, 'dynamic-only', 'specialized'),
277
+ getSpanBufferClass(runtimeSchema, 'dynamic-only', 'packed'),
278
+ ];
279
+ expect(new Set(classes).size).toBe(9);
280
+ expect(getSpanBufferClass(runtimeSchema, 'mixed', 'specialized')).toBe(classes[4]);
281
+ expect(getSpanBufferClass(runtimeSchema, 'mixed', 'packed')).toBe(classes[5]);
282
+ expect(specializedStaticOp.callsitePlan.messagePhysicalLayout).toBe('specialized');
283
+ expect(specializedDynamicOp.callsitePlan.messagePhysicalLayout).toBe('specialized');
284
+ expect(specializedMixedOp.callsitePlan.messagePhysicalLayout).toBe('specialized');
285
+ expect(packedStaticOp.callsitePlan.messagePhysicalLayout).toBe('packed');
286
+ expect(packedDynamicOp.callsitePlan.messagePhysicalLayout).toBe('packed');
287
+ expect(packedMixedOp.callsitePlan.messagePhysicalLayout).toBe('packed');
288
+ expect(specializedMixedOp.callsitePlan.arrowExposure.entryTypeStorage).toBe('borrowed-u8');
289
+ expect(packedMixedOp.callsitePlan.arrowExposure.entryTypeStorage).toBe('derived-row-headers');
290
+ });
291
+
292
+ it('packs low-8 entry types and dense-plus-one high-24 messages with exact lane omissions', () => {
293
+ const denseZeroText = textAtFamilyBinding();
294
+ const cases = [
295
+ { family: 'static-only' as const, op: packedStaticOp },
296
+ { family: 'dynamic-only' as const, op: packedDynamicOp },
297
+ { family: 'mixed' as const, op: packedMixedOp },
298
+ ];
299
+
300
+ for (const { family, op } of cases) {
301
+ const buffer = createPlannedBuffer(family, op.callsitePlan.SpanBufferClass, op.metadata);
302
+ expectFamilyShape(buffer, family);
303
+ expectPhysicalShape(buffer, 'packed');
304
+ if (buffer._rowHeaders === undefined) throw new Error('Expected packed row headers');
305
+ if (family === 'static-only') expect('message_values' in buffer).toBe(false);
306
+ else expect(buffer.message_values).toBeInstanceOf(Array);
307
+
308
+ op.callsitePlan.appenders.writeSpanStart(buffer, FAMILY_DENSE_INDEX);
309
+ expect(buffer._rowHeaders[0] & 0xff).toBe(ENTRY_TYPE_SPAN_START);
310
+ expect(buffer._rowHeaders[0] >>> 8).toBe(FAMILY_DENSE_INDEX + 1);
311
+ expect(buffer._rowHeaders[1] & 0xff).toBe(ENTRY_TYPE_SPAN_EXCEPTION);
312
+ expect(resolveEntryType(buffer, 0)).toBe(ENTRY_TYPE_SPAN_START);
313
+ expect(resolveMessage(buffer, 0)).toBe(denseZeroText);
314
+
315
+ if (family !== 'static-only') {
316
+ const nullRow = op.callsitePlan.appenders.writeLogEntry(buffer, ENTRY_TYPE_DEBUG);
317
+ expect(buffer._rowHeaders[nullRow]).toBe(ENTRY_TYPE_DEBUG);
318
+ expect(resolveMessage(buffer, nullRow)).toBeUndefined();
319
+ buffer.message(nullRow, `raw-${family}`);
320
+ expect(buffer._rowHeaders[nullRow] >>> 8).toBe(0);
321
+ expect(resolveMessage(buffer, nullRow)).toBe(`raw-${family}`);
322
+ }
323
+ }
324
+ });
325
+
326
+ it('accepts the maximum packed dense index, rejects the next index, and preserves topology', () => {
327
+ const root = createPlannedBuffer('mixed', packedMixedOp.callsitePlan.SpanBufferClass, packedMixedOp.metadata);
328
+ if (root._rowHeaders === undefined) throw new Error('Expected root packed row headers');
329
+ packedMixedOp.callsitePlan.appenders.writeSpanStart(root, MAX_PACKED_MESSAGE_DENSE_INDEX);
330
+ expect(root._rowHeaders[0] >>> 8).toBe(0x00ffffff);
331
+ expect(() => packedMixedOp.callsitePlan.appenders.writeSpanStart(root, MAX_PACKED_MESSAGE_DENSE_INDEX + 1)).toThrow(
332
+ '0xFFFFFE',
333
+ );
334
+
335
+ const child = createChildSpanBuffer(
336
+ root,
337
+ packedMixedOp.callsitePlan.SpanBufferClass,
338
+ packedMixedOp.metadata,
339
+ packedMixedOp.metadata,
340
+ CAPACITY,
341
+ );
342
+ const overflow = createOverflowBuffer(child);
343
+ for (const buffer of [root, child, overflow]) {
344
+ expect(buffer.constructor).toBe(packedMixedOp.callsitePlan.SpanBufferClass);
345
+ expectPhysicalShape(buffer, 'packed');
346
+ expectFamilyShape(buffer, 'mixed');
347
+ }
348
+ expect(child._parent).toBe(root);
349
+ expect(overflow._parent).toBe(root);
350
+ expect(overflow._identity).toBe(child._identity);
351
+ });
352
+
353
+ it('keeps packed lifecycle, facts, and semantic message resolution identical', () => {
354
+ const denseZeroText = textAtFamilyBinding();
355
+ const root = createPlannedBuffer('mixed', packedMixedOp.callsitePlan.SpanBufferClass, packedMixedOp.metadata);
356
+ const rootContext = new packedMixedOp.callsitePlan.SpanContextClass(
357
+ root,
358
+ runtimeSchema,
359
+ packedMixedOp.callsitePlan,
360
+ );
361
+ packedMixedOp.callsitePlan.appenders.writeSpanStart(root, 'packed root');
362
+ rootContext._spanLogger._infoTemplate(FAMILY_DENSE_INDEX);
363
+ rootContext._spanLogger.debug('packed raw');
364
+ packedMixedOp.callsitePlan.appenders.writeSpanEnd(root, ENTRY_TYPE_SPAN_OK);
365
+
366
+ expect(Array.from({ length: root._writeIndex }, (_, row) => resolveEntryType(root, row))).toEqual([
367
+ ENTRY_TYPE_SPAN_START,
368
+ ENTRY_TYPE_SPAN_OK,
369
+ ENTRY_TYPE_INFO,
370
+ ENTRY_TYPE_DEBUG,
371
+ ]);
372
+ expect(Array.from({ length: root._writeIndex }, (_, row) => resolveMessage(root, row))).toEqual([
373
+ 'packed root',
374
+ undefined,
375
+ denseZeroText,
376
+ 'packed raw',
377
+ ]);
378
+ expect(Array.from(extractFacts(root, { includeMetrics: false }))).toEqual([
379
+ 'span:packed root: started',
380
+ `log:info: ${denseZeroText}`,
381
+ 'log:debug: packed raw',
382
+ 'span:packed root: ok',
383
+ ]);
384
+ });
385
+
386
+ it('omits every unused capacity lane and exposes exact JS storage bytes for all family/mode pairs', () => {
387
+ const cases = [
388
+ { family: 'static-only' as const, mode: 'current' as const, op: staticOp },
389
+ { family: 'dynamic-only' as const, mode: 'current' as const, op: dynamicOp },
390
+ { family: 'mixed' as const, mode: 'current' as const, op: mixedOp },
391
+ { family: 'static-only' as const, mode: 'specialized' as const, op: specializedStaticOp },
392
+ { family: 'dynamic-only' as const, mode: 'specialized' as const, op: specializedDynamicOp },
393
+ { family: 'mixed' as const, mode: 'specialized' as const, op: specializedMixedOp },
394
+ { family: 'static-only' as const, mode: 'packed' as const, op: packedStaticOp },
395
+ { family: 'dynamic-only' as const, mode: 'packed' as const, op: packedDynamicOp },
396
+ { family: 'mixed' as const, mode: 'packed' as const, op: packedMixedOp },
397
+ ];
398
+ for (const { family, mode, op } of cases) {
399
+ const buffer = createPlannedBuffer(family, op.callsitePlan.SpanBufferClass, op.metadata);
400
+ expectFamilyShape(buffer, family);
401
+ expectPhysicalShape(buffer, mode);
402
+ const timestampAndEntryBytes = CAPACITY * 9;
403
+ let expectedSystemBytes: number;
404
+ if (mode === 'packed') {
405
+ expectedSystemBytes = (CAPACITY * 12 + 7) & ~7;
406
+ } else if (family === 'dynamic-only') {
407
+ expectedSystemBytes = (timestampAndEntryBytes + 7) & ~7;
408
+ } else if (mode === 'current') {
409
+ const messageIdOffset = (timestampAndEntryBytes + 1) & ~1;
410
+ expectedSystemBytes = (messageIdOffset + CAPACITY * Uint16Array.BYTES_PER_ELEMENT + 7) & ~7;
411
+ expect(buffer._messageIds?.byteLength).toBe(CAPACITY * Uint16Array.BYTES_PER_ELEMENT);
412
+ } else {
413
+ const denseOffset = (timestampAndEntryBytes + 3) & ~3;
414
+ expectedSystemBytes = (denseOffset + CAPACITY * Uint32Array.BYTES_PER_ELEMENT + 7) & ~7;
415
+ expect(buffer._logHeaders?.byteLength).toBe(CAPACITY * Uint32Array.BYTES_PER_ELEMENT);
416
+ }
417
+ expect(buffer._system.byteLength - buffer._identity.byteLength).toBe(expectedSystemBytes);
418
+ if (family !== 'static-only') expect(buffer.message_values?.length).toBe(CAPACITY);
419
+ }
420
+ });
421
+
422
+ it('keeps empty-dictionary current plans on ID zero with raw fallback and no validity sidecar', () => {
423
+ const root = createPlannedBuffer(
424
+ 'mixed',
425
+ fallbackCurrentOp.callsitePlan.SpanBufferClass,
426
+ fallbackCurrentOp.metadata,
427
+ );
428
+ expect(fallbackCurrentOp.callsitePlan.messagePhysicalLayout).toBe('current');
429
+ expect(fallbackCurrentOp.callsitePlan.localMessageDictionary).toEqual([]);
430
+ const rootContext = new fallbackCurrentOp.callsitePlan.SpanContextClass(
431
+ root,
432
+ runtimeSchema,
433
+ fallbackCurrentOp.callsitePlan,
434
+ );
435
+ fallbackCurrentOp.callsitePlan.appenders.writeSpanStart(root, 'fallback root');
436
+ expect(() => rootContext._spanLogger._infoTemplate(FAMILY_DENSE_INDEX)).not.toThrow();
437
+ const row = root._writeIndex - 1;
438
+ if (root._messageIds === undefined || root.message_values === undefined) {
439
+ throw new Error('Expected fallback current ID and raw lanes');
440
+ }
441
+ expect('message_nulls' in root).toBe(false);
442
+ expect(root._messageIds[row]).toBe(0);
443
+ expect(root.message_values[row]).toBe(textAtFamilyBinding());
444
+ expect(resolveMessage(root, row)).toBe(textAtFamilyBinding());
445
+ });
446
+
447
+ it('shares one frozen current-mode local dictionary across root, child, and overflow buffers', () => {
448
+ const root = createPlannedBuffer('mixed', mixedOp.callsitePlan.SpanBufferClass, mixedOp.metadata);
449
+ const child = createChildSpanBuffer(
450
+ root,
451
+ mixedOp.callsitePlan.SpanBufferClass,
452
+ mixedOp.metadata,
453
+ mixedOp.metadata,
454
+ CAPACITY,
455
+ );
456
+ const overflow = createOverflowBuffer(child);
457
+ const dictionary = mixedOp.callsitePlan.localMessageDictionary;
458
+ expect(dictionary).toEqual([FAMILY_DENSE_INDEX]);
459
+ expect(Object.isFrozen(dictionary)).toBe(true);
460
+ for (const buffer of [root, child, overflow]) {
461
+ const plan = buffer._opMetadata._physicalLayoutPlan;
462
+ if (!plan) throw new Error('Expected buffer physical layout plan');
463
+ expect(plan.localMessageDictionary).toBe(dictionary);
464
+ expect(Object.hasOwn(buffer, '_messageDictionary')).toBe(false);
465
+ expect('_messageDictionary' in buffer).toBe(false);
466
+ if (buffer.entry_type === undefined || buffer._messageIds === undefined) {
467
+ throw new Error('Expected current local-ID and entry-type lanes');
468
+ }
469
+ expect('message_nulls' in buffer).toBe(false);
470
+ buffer.entry_type[0] = ENTRY_TYPE_INFO;
471
+ buffer._messageIds[0] = 1;
472
+ buffer._writeIndex = 1;
473
+ expect(resolveMessage(buffer, 0)).toBe(textAtFamilyBinding());
474
+ }
475
+ });
476
+
477
+ it('uses zero as the specialized raw/null sentinel and dense-plus-one for every static identity', () => {
478
+ const buffer = createPlannedBuffer(
479
+ 'mixed',
480
+ specializedMixedOp.callsitePlan.SpanBufferClass,
481
+ specializedMixedOp.metadata,
482
+ );
483
+ expectPhysicalShape(buffer, 'specialized');
484
+ if (buffer.entry_type === undefined || buffer._logHeaders === undefined || buffer.message_values === undefined) {
485
+ throw new Error('Expected specialized entry, dense, and raw lanes');
486
+ }
487
+ expect('message_nulls' in buffer).toBe(false);
488
+ buffer.entry_type[0] = ENTRY_TYPE_INFO;
489
+ buffer._logHeaders[0] = FAMILY_DENSE_INDEX + 1;
490
+ buffer.entry_type[1] = ENTRY_TYPE_DEBUG;
491
+ buffer.message(1, '');
492
+ buffer.entry_type[2] = ENTRY_TYPE_DEBUG;
493
+ buffer.message(2, 'specialized raw');
494
+ buffer.entry_type[3] = ENTRY_TYPE_DEBUG;
495
+ buffer._logHeaders[4] = MAX_PACKED_MESSAGE_DENSE_INDEX + 1;
496
+ buffer._writeIndex = 5;
497
+
498
+ expect(resolveMessage(buffer, 0)).toBe(textAtFamilyBinding());
499
+ expect(resolveMessage(buffer, 1)).toBe('');
500
+ expect(resolveMessage(buffer, 2)).toBe('specialized raw');
501
+ expect(resolveMessage(buffer, 3)).toBeUndefined();
502
+ expect(buffer._logHeaders[4]).toBe(0x00ffffff);
503
+ });
504
+
505
+ it('keeps same-plan JS buffers isolated across stale raw to static, null, and fresh raw transitions', () => {
506
+ for (const { mode, op } of [
507
+ { mode: 'current' as const, op: mixedOp },
508
+ { mode: 'specialized' as const, op: specializedMixedOp },
509
+ ]) {
510
+ const staleRaw = createPlannedBuffer('mixed', op.callsitePlan.SpanBufferClass, op.metadata);
511
+ if (staleRaw.entry_type === undefined) throw new Error(`Expected ${mode} entry-type lane`);
512
+ staleRaw.entry_type[0] = ENTRY_TYPE_DEBUG;
513
+ staleRaw.message(0, 'stale raw');
514
+ expect(resolveMessage(staleRaw, 0)).toBe('stale raw');
515
+
516
+ const staticRow = createPlannedBuffer('mixed', op.callsitePlan.SpanBufferClass, op.metadata);
517
+ expect(staticRow.constructor).toBe(staleRaw.constructor);
518
+ if (staticRow.entry_type === undefined) throw new Error(`Expected ${mode} entry-type lane`);
519
+ staticRow.entry_type[0] = ENTRY_TYPE_INFO;
520
+ expect(staticRow.message_values?.[0]).toBeUndefined();
521
+ if (mode === 'current') {
522
+ if (staticRow._messageIds === undefined) throw new Error('Expected current local-ID lane');
523
+ staticRow._messageIds[0] = 1;
524
+ expect(staticRow._messageIds[0]).toBe(1);
525
+ } else {
526
+ if (staticRow._logHeaders === undefined) throw new Error('Expected specialized dense lane');
527
+ staticRow._logHeaders[0] = FAMILY_DENSE_INDEX + 1;
528
+ expect(staticRow._logHeaders[0]).toBe(FAMILY_DENSE_INDEX + 1);
529
+ }
530
+ expect(resolveMessage(staticRow, 0)).toBe(textAtFamilyBinding());
531
+
532
+ const nullRow = createPlannedBuffer('mixed', op.callsitePlan.SpanBufferClass, op.metadata);
533
+ if (nullRow.entry_type === undefined) throw new Error(`Expected ${mode} entry-type lane`);
534
+ nullRow.entry_type[0] = ENTRY_TYPE_DEBUG;
535
+ expect(nullRow.message_values?.[0]).toBeUndefined();
536
+ expect(resolveMessage(nullRow, 0)).toBeUndefined();
537
+ if (mode === 'current') expect(nullRow._messageIds?.[0]).toBe(0);
538
+ else expect(nullRow._logHeaders?.[0]).toBe(0);
539
+
540
+ const freshRaw = createPlannedBuffer('mixed', op.callsitePlan.SpanBufferClass, op.metadata);
541
+ if (freshRaw.entry_type === undefined) throw new Error(`Expected ${mode} entry-type lane`);
542
+ freshRaw.entry_type[0] = ENTRY_TYPE_DEBUG;
543
+ freshRaw.message(0, '');
544
+ expect(resolveMessage(freshRaw, 0)).toBe('');
545
+ if (mode === 'current') expect(freshRaw._messageIds?.[0]).toBe(0);
546
+ else expect(freshRaw._logHeaders?.[0]).toBe(0);
547
+ expect('message_nulls' in freshRaw).toBe(false);
548
+ }
549
+ });
550
+
551
+ it('starts every new JS root, child, and overflow identity lane at the zero null/raw sentinel', () => {
552
+ for (const { mode, op } of [
553
+ { mode: 'current' as const, op: mixedOp },
554
+ { mode: 'specialized' as const, op: specializedMixedOp },
555
+ ]) {
556
+ const root = createPlannedBuffer('mixed', op.callsitePlan.SpanBufferClass, op.metadata);
557
+ const child = createChildSpanBuffer(root, op.callsitePlan.SpanBufferClass, op.metadata, op.metadata, CAPACITY);
558
+ const overflow = createOverflowBuffer(child);
559
+
560
+ for (const [kind, buffer] of [
561
+ ['root', root],
562
+ ['child', child],
563
+ ['overflow', overflow],
564
+ ] as const) {
565
+ if (buffer.entry_type === undefined || buffer.message_values === undefined) {
566
+ throw new Error(`Expected ${mode} ${kind} entry-type and raw message lanes`);
567
+ }
568
+ const identityLane = mode === 'current' ? buffer._messageIds : buffer._logHeaders;
569
+ if (identityLane === undefined) throw new Error(`Expected ${mode} ${kind} identity lane`);
570
+
571
+ expect(identityLane.every((identity) => identity === 0)).toBe(true);
572
+ expect(buffer.message_values[0]).toBeUndefined();
573
+ buffer.entry_type[0] = ENTRY_TYPE_DEBUG;
574
+ expect(resolveMessage(buffer, 0)).toBeUndefined();
575
+
576
+ buffer.entry_type[1] = ENTRY_TYPE_DEBUG;
577
+ buffer.message(1, '');
578
+ expect(identityLane[1]).toBe(0);
579
+ expect(resolveMessage(buffer, 1)).toBe('');
580
+ }
581
+ }
582
+ });
583
+
584
+ it('zero-initializes every fresh physical lane across exact capacities, layouts, and allocation kinds', () => {
585
+ for (const capacity of [3, 8]) {
586
+ for (const { mode, op } of [
587
+ { mode: 'current' as const, op: mixedOp },
588
+ { mode: 'specialized' as const, op: specializedMixedOp },
589
+ { mode: 'packed' as const, op: packedMixedOp },
590
+ ]) {
591
+ const SpanBufferClass = op.callsitePlan.SpanBufferClass;
592
+ const root = createSpanBuffer(
593
+ runtimeSchema,
594
+ createTestTraceRoot(`zero-${mode}-${capacity}`),
595
+ op.metadata,
596
+ capacity,
597
+ SpanBufferClass,
598
+ );
599
+ const child = createChildSpanBuffer(root, SpanBufferClass, op.metadata, op.metadata, capacity);
600
+ const overflow = new SpanBufferClass(
601
+ capacity,
602
+ SpanBufferClass.stats,
603
+ child,
604
+ true,
605
+ child._callsiteMetadata,
606
+ child._opMetadata,
607
+ child._traceRoot,
608
+ child._vocabularyGeneration,
609
+ );
610
+
611
+ expect(child._identity).not.toBe(root._identity);
612
+ expect(overflow._identity).toBe(child._identity);
613
+ for (const [kind, buffer] of [
614
+ ['root', root],
615
+ ['child', child],
616
+ ['overflow', overflow],
617
+ ] as const) {
618
+ expect(buffer._capacity).toBe(capacity);
619
+ expect(buffer._writeIndex).toBe(0);
620
+ expect(buffer.constructor).toBe(SpanBufferClass);
621
+ expect(buffer._opMetadata).toBe(op.metadata);
622
+ expect(buffer.timestamp.every((value) => value === 0n)).toBe(true);
623
+
624
+ if (mode === 'packed') {
625
+ const rowHeaders = buffer._rowHeaders;
626
+ if (rowHeaders === undefined) throw new Error(`Expected ${kind} packed row headers`);
627
+ expect(rowHeaders.every((value) => value === 0)).toBe(true);
628
+ expect('entry_type' in buffer).toBe(false);
629
+ expect('_messageIds' in buffer).toBe(false);
630
+ expect('_logHeaders' in buffer).toBe(false);
631
+ } else {
632
+ const entryTypes = buffer.entry_type;
633
+ if (entryTypes === undefined) throw new Error(`Expected ${kind} ${mode} entry types`);
634
+ expect(entryTypes.every((value) => value === 0)).toBe(true);
635
+ expect('_rowHeaders' in buffer).toBe(false);
636
+ if (mode === 'current') {
637
+ const messageIds = buffer._messageIds;
638
+ if (messageIds === undefined) throw new Error(`Expected ${kind} current message IDs`);
639
+ expect(messageIds.every((value) => value === 0)).toBe(true);
640
+ expect('_logHeaders' in buffer).toBe(false);
641
+ } else {
642
+ const logHeaders = buffer._logHeaders;
643
+ if (logHeaders === undefined) throw new Error(`Expected ${kind} specialized log headers`);
644
+ expect(logHeaders.every((value) => value === 0)).toBe(true);
645
+ expect('_messageIds' in buffer).toBe(false);
646
+ }
647
+ }
648
+ }
649
+ }
650
+ }
651
+ });
652
+
653
+ it('derives Arrow null, raw, and static messages across current and specialized root, child, and overflow', () => {
654
+ const denseZeroText = textAtFamilyBinding();
655
+ for (const { mode, op } of [
656
+ { mode: 'current' as const, op: mixedOp },
657
+ { mode: 'specialized' as const, op: specializedMixedOp },
658
+ ]) {
659
+ const root = createPlannedBuffer('mixed', op.callsitePlan.SpanBufferClass, op.metadata);
660
+ const rootContext = new op.callsitePlan.SpanContextClass(root, runtimeSchema, op.callsitePlan);
661
+ op.callsitePlan.appenders.writeSpanStart(root, `${mode} root`);
662
+ rootContext._spanLogger._infoTemplate(FAMILY_DENSE_INDEX);
663
+ rootContext._spanLogger.debug(`${mode} root raw`);
664
+ op.callsitePlan.appenders.writeLogEntry(root, ENTRY_TYPE_DEBUG);
665
+ op.callsitePlan.appenders.writeSpanEnd(root, ENTRY_TYPE_SPAN_OK);
666
+
667
+ const child = createChildSpanBuffer(root, op.callsitePlan.SpanBufferClass, op.metadata, op.metadata, CAPACITY);
668
+ const childContext = new op.callsitePlan.SpanContextClass(child, runtimeSchema, op.callsitePlan);
669
+ op.callsitePlan.appenders.writeSpanStart(child, `${mode} child`);
670
+ childContext._spanLogger._infoTemplate(FAMILY_DENSE_INDEX);
671
+ childContext._spanLogger.debug(`${mode} child raw`);
672
+ op.callsitePlan.appenders.writeLogEntry(child, ENTRY_TYPE_DEBUG);
673
+ op.callsitePlan.appenders.writeSpanEnd(child, ENTRY_TYPE_SPAN_OK);
674
+
675
+ const overflow = createOverflowBuffer(child);
676
+ const overflowContext = new op.callsitePlan.SpanContextClass(overflow, runtimeSchema, op.callsitePlan);
677
+ overflowContext._spanLogger._infoTemplate(FAMILY_DENSE_INDEX);
678
+ overflowContext._spanLogger.debug(`${mode} overflow raw`);
679
+ op.callsitePlan.appenders.writeLogEntry(overflow, ENTRY_TYPE_DEBUG);
680
+
681
+ const table = convertSpanTreeToArrowTable(root);
682
+ const messages = table.getChild('message');
683
+ if (!messages) throw new Error('Expected Arrow message column');
684
+ expect(messages.nullCount).toBe(5);
685
+ expect(Array.from({ length: table.numRows }, (_, row) => messages.get(row))).toEqual([
686
+ `${mode} root`,
687
+ null,
688
+ denseZeroText,
689
+ `${mode} root raw`,
690
+ null,
691
+ `${mode} child`,
692
+ null,
693
+ denseZeroText,
694
+ `${mode} child raw`,
695
+ null,
696
+ denseZeroText,
697
+ `${mode} overflow raw`,
698
+ null,
699
+ ]);
700
+ expect('message_nulls' in root).toBe(false);
701
+ expect('message_nulls' in child).toBe(false);
702
+ expect('message_nulls' in overflow).toBe(false);
703
+ }
704
+ });
705
+
706
+ it('represents returned dense bindings, dynamic/static span names, null/raw rows, and terminal scalars', () => {
707
+ const denseZeroText = textAtFamilyBinding();
708
+ const cases = [
709
+ { family: 'static-only' as const, op: staticOp },
710
+ { family: 'dynamic-only' as const, op: dynamicOp },
711
+ { family: 'mixed' as const, op: mixedOp },
712
+ ];
713
+
714
+ for (const { family, op } of cases) {
715
+ const denseName = createPlannedBuffer(family, op.callsitePlan.SpanBufferClass, op.metadata);
716
+ op.callsitePlan.appenders.writeSpanStart(denseName, FAMILY_DENSE_INDEX);
717
+ expect(resolveEntryType(denseName, 0)).toBe(ENTRY_TYPE_SPAN_START);
718
+ expect(resolveMessage(denseName, 0)).toBe(denseZeroText);
719
+ expectPhysicalShape(denseName, 'current');
720
+ expect(Object.hasOwn(denseName, '_messageDictionary')).toBe(false);
721
+
722
+ const dynamicName = createPlannedBuffer(family, op.callsitePlan.SpanBufferClass, op.metadata);
723
+ op.callsitePlan.appenders.writeSpanStart(dynamicName, `raw ${family} span`);
724
+ expect(resolveMessage(dynamicName, 0)).toBe(`raw ${family} span`);
725
+ expect(resolveMessage(dynamicName, 1)).toBeUndefined();
726
+ dynamicName.message(1, `terminal ${family}`);
727
+ expect(resolveMessage(dynamicName, 1)).toBe(`terminal ${family}`);
728
+
729
+ if (family === 'static-only') {
730
+ expect(() => dynamicName.message(2, 'forbidden raw log')).toThrow('rows 0 and 1');
731
+ } else {
732
+ const nullRow = op.callsitePlan.appenders.writeLogEntry(dynamicName, ENTRY_TYPE_DEBUG);
733
+ expect(resolveMessage(dynamicName, nullRow)).toBeUndefined();
734
+ const rawRow = op.callsitePlan.appenders.writeLogEntry(dynamicName, ENTRY_TYPE_DEBUG);
735
+ dynamicName.message(rawRow, `raw ${family} log`);
736
+ expect(resolveMessage(dynamicName, rawRow)).toBe(`raw ${family} log`);
737
+ }
738
+ }
739
+ });
740
+
741
+ it('propagates the exact family constructor and omissions through child and overflow buffers', () => {
742
+ for (const { family, op } of [
743
+ { family: 'static-only' as const, op: staticOp },
744
+ { family: 'dynamic-only' as const, op: dynamicOp },
745
+ { family: 'mixed' as const, op: mixedOp },
746
+ ]) {
747
+ const root = createPlannedBuffer(family, op.callsitePlan.SpanBufferClass, op.metadata);
748
+ const child = createChildSpanBuffer(root, op.callsitePlan.SpanBufferClass, op.metadata, op.metadata, CAPACITY);
749
+ const overflow = createOverflowBuffer(child);
750
+ expect(child.constructor).toBe(op.callsitePlan.SpanBufferClass);
751
+ expect(overflow.constructor).toBe(op.callsitePlan.SpanBufferClass);
752
+ expect(child._parent).toBe(root);
753
+ expect(overflow._parent).toBe(root);
754
+ expect(overflow._identity).toBe(child._identity);
755
+ expectFamilyShape(child, family);
756
+ expectFamilyShape(overflow, family);
757
+ }
758
+ });
759
+
760
+ it('preserves decoded lifecycle and log facts across mixed-family parent/child rows', () => {
761
+ const denseZeroText = textAtFamilyBinding();
762
+ const root = createPlannedBuffer('mixed', mixedOp.callsitePlan.SpanBufferClass, mixedOp.metadata);
763
+ const rootContext = new mixedOp.callsitePlan.SpanContextClass(root, runtimeSchema, mixedOp.callsitePlan);
764
+ mixedOp.callsitePlan.appenders.writeSpanStart(root, 'mixed root');
765
+ const rootLogger = rootContext._spanLogger;
766
+ rootLogger._infoTemplate(FAMILY_DENSE_INDEX);
767
+ rootLogger.debug('root raw');
768
+ mixedOp.callsitePlan.appenders.writeSpanEnd(root, ENTRY_TYPE_SPAN_OK);
769
+
770
+ const child = createChildSpanBuffer(
771
+ root,
772
+ staticOp.callsitePlan.SpanBufferClass,
773
+ staticOp.metadata,
774
+ staticOp.metadata,
775
+ CAPACITY,
776
+ );
777
+ const childContext = new staticOp.callsitePlan.SpanContextClass(child, runtimeSchema, staticOp.callsitePlan);
778
+ staticOp.callsitePlan.appenders.writeSpanStart(child, FAMILY_DENSE_INDEX);
779
+ const childLogger = childContext._spanLogger;
780
+ childLogger._infoTemplate(FAMILY_DENSE_INDEX);
781
+ child.message(1, 'child boom');
782
+ staticOp.callsitePlan.appenders.writeSpanEnd(child, ENTRY_TYPE_SPAN_EXCEPTION);
783
+
784
+ expect(Array.from(extractFacts(root, { includeMetrics: false }))).toEqual([
785
+ 'span:mixed root: started',
786
+ `log:info: ${denseZeroText}`,
787
+ 'log:debug: root raw',
788
+ `span:${denseZeroText}: started`,
789
+ `log:info: ${denseZeroText}`,
790
+ `span:${denseZeroText}: exception(child boom)`,
791
+ 'span:mixed root: ok',
792
+ ]);
793
+ });
794
+
795
+ it('preserves overflow order, reserved-row formula, identities, and stats across plugin and physical modes', () => {
796
+ const denseZeroText = textAtFamilyBinding();
797
+ const cases: Array<{
798
+ name: string;
799
+ op: typeof mixedOp;
800
+ physicalLayout: MessagePhysicalLayout;
801
+ compiledTemplates: boolean;
802
+ }> = [
803
+ { name: 'plugin-off-current', op: fallbackCurrentOp, physicalLayout: 'current', compiledTemplates: false },
804
+ { name: 'plugin-on-current', op: mixedOp, physicalLayout: 'current', compiledTemplates: true },
805
+ {
806
+ name: 'plugin-on-specialized',
807
+ op: specializedMixedOp,
808
+ physicalLayout: 'specialized',
809
+ compiledTemplates: true,
810
+ },
811
+ { name: 'plugin-on-packed', op: packedMixedOp, physicalLayout: 'packed', compiledTemplates: true },
812
+ ];
813
+
814
+ fc.assert(
815
+ fc.property(
816
+ fc.array(
817
+ fc.oneof(
818
+ fc.constant({ kind: 'static' as const, text: denseZeroText }),
819
+ fc.record({ kind: fc.constant('dynamic' as const), text: fc.string({ minLength: 1, maxLength: 32 }) }),
820
+ ),
821
+ { minLength: CAPACITY, maxLength: 80 },
822
+ ),
823
+ (operations) => {
824
+ for (const testCase of cases) {
825
+ const stats = testCase.op.callsitePlan.SpanBufferClass.stats;
826
+ stats.capacity = CAPACITY;
827
+ stats.totalWrites = 0;
828
+ stats.spansCreated = 0;
829
+ const root = createPlannedBuffer('mixed', testCase.op.callsitePlan.SpanBufferClass, testCase.op.metadata);
830
+ const rootContext = new testCase.op.callsitePlan.SpanContextClass(
831
+ root,
832
+ runtimeSchema,
833
+ testCase.op.callsitePlan,
834
+ );
835
+ testCase.op.callsitePlan.appenders.writeSpanStart(root, `${testCase.name} root`);
836
+ const logger = rootContext._spanLogger;
837
+ for (const operation of operations) {
838
+ if (operation.kind === 'static') {
839
+ if (testCase.compiledTemplates) logger._infoTemplate(FAMILY_DENSE_INDEX);
840
+ else logger.info(operation.text);
841
+ } else {
842
+ logger.debug(operation.text);
843
+ }
844
+ }
845
+ testCase.op.callsitePlan.appenders.writeSpanEnd(root, ENTRY_TYPE_SPAN_OK);
846
+
847
+ const actual = collectLogRows(root);
848
+ expect(actual.map((row) => row.message)).toEqual(operations.map((operation) => operation.text));
849
+ expect(actual.map((row) => row.entryType)).toEqual(
850
+ operations.map((operation) => (operation.kind === 'static' ? ENTRY_TYPE_INFO : ENTRY_TYPE_DEBUG)),
851
+ );
852
+ expect(resolveEntryType(root, 1)).toBe(ENTRY_TYPE_SPAN_OK);
853
+
854
+ const segments: AnySpanBuffer[] = [];
855
+ for (let segment: AnySpanBuffer | undefined = root; segment; segment = segment._overflow) {
856
+ segments.push(segment);
857
+ expectFamilyShape(segment, 'mixed');
858
+ expectPhysicalShape(segment, testCase.physicalLayout);
859
+ expect(segment.span_id).toBe(root.span_id);
860
+ expect(segment.trace_id).toBe(root.trace_id);
861
+ expect(segment.parent_span_id).toBe(0);
862
+ }
863
+ expect(segments).toHaveLength(1 + Math.ceil((operations.length - (CAPACITY - 2)) / CAPACITY));
864
+ expect(segments[0]._writeIndex).toBe(CAPACITY);
865
+ let remaining = operations.length - (CAPACITY - 2);
866
+ for (let index = 1; index < segments.length; index++) {
867
+ expect(segments[index]._writeIndex).toBe(Math.min(remaining, CAPACITY));
868
+ remaining -= CAPACITY;
869
+ }
870
+ expect(stats.totalWrites).toBe(operations.length);
871
+ expect(stats.spansCreated).toBe(1);
872
+ }
873
+ },
874
+ ),
875
+ { numRuns: 30 },
876
+ );
877
+ });
878
+ });