Table of Contents

Enum TraceEventKind

Namespace
Typhon.Profiler
Assembly
Typhon.Profiler.dll

Discriminant for a trace record. Every record starts with a 12-byte common header whose third byte carries this value; the kind determines how the bytes after the header are interpreted (span header or minimal instant header, then per-kind typed payload).

public enum TraceEventKind : byte
Extension Methods

Fields

BTreeDelete = 41

B+Tree delete. No payload.

BTreeInsert = 40

B+Tree insert. No payload — kind is the only data.

BTreeNodeMerge = 43

B+Tree node merge. No payload.

BTreeNodeSplit = 42

B+Tree node split. No payload.

CheckpointCollect = 84

Checkpoint phase: collect dirty page indices.

CheckpointCycle = 83

Full checkpoint cycle. Required: targetLsn: i64, reason: u8 (CheckpointReason). Optional: dirtyPageCount: i32.

CheckpointFsync = 86

Checkpoint phase: fsync data file.

CheckpointRecycle = 88

Checkpoint phase: recycle WAL segments below checkpoint LSN. Optional: recycledCount: i32.

CheckpointTransition = 87

Checkpoint phase: transition UoW entries from WalDurable to Committed. Optional: transitionedCount: i32.

CheckpointWrite = 85

Checkpoint phase: write dirty pages to data file. Optional: writtenCount: i32.

ClusterMigration = 60

Cluster migration between spatial cells. Required: archetypeId: u16, migrationCount: i32.

ConcurrencyAccessControlContention = 95

AccessControl contention marker — flag-set instant, fires when a thread enters a wait. Payload: empty.

ConcurrencyAccessControlExclusiveAcquire = 92

AccessControl exclusive (writer) acquire success. Payload: threadId: u16, hadToWait: u8, elapsedUs: u16.

ConcurrencyAccessControlExclusiveRelease = 93

AccessControl exclusive (writer) release. Payload: threadId: u16.

ConcurrencyAccessControlPromotion = 94

AccessControl shared→exclusive promotion (or exclusive→shared demotion via variant byte). Payload: elapsedUs: u16, variant: u8 (0=promote, 1=demote).

ConcurrencyAccessControlSharedAcquire = 90

AccessControl shared (reader) acquire success. Payload: threadId: u16, hadToWait: u8, elapsedUs: u16.

ConcurrencyAccessControlSharedRelease = 91

AccessControl shared (reader) release. Payload: threadId: u16.

ConcurrencyAccessControlSmallContention = 100

AccessControlSmall contention marker. Payload: empty.

ConcurrencyAccessControlSmallExclusiveAcquire = 98

AccessControlSmall exclusive acquire. Payload: threadId: u16.

ConcurrencyAccessControlSmallExclusiveRelease = 99

AccessControlSmall exclusive release. Payload: threadId: u16.

ConcurrencyAccessControlSmallSharedAcquire = 96

AccessControlSmall shared acquire. Payload: threadId: u16.

ConcurrencyAccessControlSmallSharedRelease = 97

AccessControlSmall shared release. Payload: threadId: u16.

ConcurrencyAdaptiveWaiterYieldOrSleep = 112

AdaptiveWaiter Wait() call yielded or slept (transition only — NOT per-spin). Payload: spinCountBefore: u16, kind: u8 (1=yield, 2=sleep).

ConcurrencyEpochAdvance = 108

GlobalEpoch advance (Interlocked.Increment in ExitScope/ExitScopeUnordered). Payload: newEpoch: u32.

ConcurrencyEpochRefresh = 109

RefreshScope — bump epoch mid-scope to release retired memory while staying pinned. Payload: oldEpoch: u32, newEpoch: u32.

ConcurrencyEpochScopeEnter = 106

EpochGuard scope enter (PinCurrentThread). Payload: currentEpoch: u32, depthBefore: u8, isDormantToActive: u8.

ConcurrencyEpochScopeExit = 107

EpochGuard scope exit (Dispose). Payload: newEpoch: u32, isOutermost: u8.

ConcurrencyEpochSlotClaim = 110

EpochThreadRegistry slot claim. Payload: slotIndex: u16, threadId: u16, activeCount: u16.

ConcurrencyEpochSlotReclaim = 111

EpochThreadRegistry dead-thread slot reclaim. Payload: slotIndex: u16, oldOwner: u16, newOwner: u16.

ConcurrencyOlcLatchMarkObsolete = 115

OlcLatch.MarkObsolete — node retired, future readers will fail validation. Payload: version: u32.

ConcurrencyOlcLatchValidationFail = 116

OlcLatch.ValidateVersion failed — version mismatch detected on optimistic re-read. Payload: expectedVersion: u32, actualVersion: u32.

ConcurrencyOlcLatchWriteLockAttempt = 113

OlcLatch.TryWriteLock failed (raced or write-locked). Payload: versionBefore: u32, success: u8 (always 0 on emit).

ConcurrencyOlcLatchWriteUnlock = 114

OlcLatch.WriteUnlock — version bumped from oldVersion to newVersion. Payload: oldVersion: u32, newVersion: u32.

ConcurrencyResourceAccessing = 101

ResourceAccessControl Accessing-mode acquire (try or wait). Payload: success: u8, accessingCount: u8, elapsedUs: u16.

ConcurrencyResourceContention = 105

ResourceAccessControl contention marker. Payload: empty.

ConcurrencyResourceDestroy = 103

ResourceAccessControl Destroy-mode acquire. Payload: success: u8, elapsedUs: u16.

ConcurrencyResourceModify = 102

ResourceAccessControl Modify-mode acquire (try or wait). Payload: success: u8, threadId: u16, elapsedUs: u16.

ConcurrencyResourceModifyPromotion = 104

ResourceAccessControl Modify promotion slow path (wait for accessors to drain). Payload: elapsedUs: u16.

DataIndexBTreeBulkInsert = 184

BTree multi-value bulk-insert span. Payload: bufferId: i32, entryCount: i32.

DataIndexBTreeNodeCow = 186

BTree node CoW (PreDirtyForWrite triggered). Payload: srcChunkId: i32, dstChunkId: i32.

DataIndexBTreeRangeScan = 181

BTree range-scan span (covers the whole enumeration). Payload: resultCount: i32, restartCount: u8.

DataIndexBTreeRangeScanRevalidate = 182

BTree range-scan OLC revalidate instant (per restart). Payload: restartCount: u8.

DataIndexBTreeRebalanceFallback = 183

BTree pessimistic fallback after OLC failure. Payload: reason: u8 (0=LeafFull, 1=OlcFail).

DataIndexBTreeRoot = 185

BTree root operation (Init or Split, merged via op variant). Payload: op: u8 (0=Init, 1=Split), rootChunkId: i32, height: u8.

DataIndexBTreeSearch = 180

BTree FindLeaf slow-path instant (b-link hop / OLC restart). Payload: retryReason: u8, restartCount: u8.

DataMvccChainWalk = 178

MVCC chain-walk slow path (only emitted when full walk runs, not the single-entry fast path). Payload: tsn: i64, chainLen: u8, visibility: u8.

DataMvccVersionCleanup = 179

MVCC version-cleanup span. Payload: pk: i64, entriesFreed: u16.

DataTransactionCleanup = 177

Transaction Cleanup span — wraps deferred-cleanup batch enqueue. Payload: tsn: i64, entityCount: i32.

DataTransactionConflict = 176

Transaction Conflict instant — fired only when an actual conflict is detected during commit. Payload: tsn: i64, pk: i64, componentTypeId: i32, conflictType: u8.

DataTransactionInit = 173

Transaction Init / snapshot acquire span. Payload: tsn: i64, uowId: u16.

DataTransactionPrepare = 174

Transaction PrepareForMutation span (high-freq; default-suppressed). Payload: tsn: i64.

DataTransactionValidate = 175

Transaction Validate span — wraps the commit-loop validation pass. Payload: tsn: i64, entryCount: i32.

DurabilityCheckpointBackpressure = 223

Checkpoint staging-exhaustion backpressure span. Payload: waitMs: u32, exhausted: u8.

DurabilityCheckpointSleep = 224

Checkpoint between-cycle sleep span. Payload: sleepMs: u32, wakeReason: u8.

DurabilityCheckpointWriteBatch = 222

Checkpoint write-batch span. Payload: writeBatchSize: i32, stagingAllocated: i32.

DurabilityRecoveryDiscover = 226

Recovery discover/enumerate WAL segments. Payload: segCount: i32, totalBytes: i64, firstSegId: i32.

DurabilityRecoveryFpi = 229

Recovery FPI torn-page repair span. Payload: fpiCount: i32, repairedCount: i32, mismatches: i32.

DurabilityRecoveryRecord = 228

Recovery per-record decode/apply (extreme-freq, deny-listed). Payload: chunkType: u8, lsn: i64, size: i32.

DurabilityRecoveryRedo = 230

Recovery redo replay span. Payload: recordsReplayed: i32, uowsReplayed: i32, durUs: u32.

DurabilityRecoverySegment = 227

Recovery per-segment scan. Payload: segId: i32, recCount: i32, bytes: i64, truncated: u8.

DurabilityRecoveryStart = 225

Recovery start instant. Payload: checkpointLsn: i64, reason: u8.

DurabilityRecoveryTickFence = 232

Recovery TickFence replay span. Payload: tickFenceCount: i32, entries: i32, tickNumber: i64.

DurabilityRecoveryUndo = 231

Recovery undo (voided UoWs) span. Payload: voidedUowCount: i32.

DurabilityUowDeadline = 234

UoW deadline check instant. Payload: deadline: i64, remaining: i64, expired: u8.

DurabilityUowState = 233

UoW state transition instant. Payload: from: u8, to: u8, uowId: u16, reason: u8.

DurabilityWalBackpressure = 221

WAL commit-buffer-full backpressure span. Payload: waitUs: u32, producerThread: i32.

DurabilityWalBuffer = 219

WAL staging-buffer copy span. Payload: bytesAligned: i32, pad: i32.

DurabilityWalFrame = 220

WAL per-frame CRC instant (extreme-freq, deny-listed). Payload: frameCount: u16, crcStart: u32.

DurabilityWalGroupCommit = 217

WAL group-commit boundary instant. Payload: triggerMs: u16, producerThread: i32.

DurabilityWalOsWrite = 215

WAL flush phase 2: OS write + fsync. Payload: bytesAligned: i32, frameCount: i32, highLsn: i64.

DurabilityWalQueue = 218

WAL drain decision instant. Payload: drainAttempt: u8, dataLen: i32, waitReason: u8.

DurabilityWalQueueDrain = 214

WAL flush phase 1: drain coalesce. Payload: bytesAligned: i32, frameCount: i32.

DurabilityWalSignal = 216

WAL flush phase 3: LSN advance + signal. Payload: highLsn: i64.

EcsDestroy = 31

Entity destroy. Required: entityId: u64. Optional: cascadeCount: i32, tsn: i64.

EcsQueryAny = 34

Query any. Required: archetypeTypeId: u16. Optional: found: bool, scanMode: u8.

EcsQueryConstraintEnabled = 202

EcsQuery Enabled/Disabled constraint add. Payload: typeId: u16, enableBit: u8.

EcsQueryConstruct = 199

EcsQuery construct (archetype resolution). Payload: targetArchId: u16, polymorphic: u8, maskSize: u8.

EcsQueryCount = 33

Query count. Required: archetypeTypeId: u16. Optional: resultCount: i32, scanMode: u8.

EcsQueryExecute = 32

Query execute. Required: archetypeTypeId: u16. Optional: resultCount: i32, scanMode: u8.

EcsQueryMaskAnd = 200

EcsQuery mask AND. Payload: bitsBefore: u16, bitsAfter: u16, opType: u8.

EcsQuerySpatialAttach = 203

EcsQuery spatial predicate attach. Payload: spatialType: u8, queryBox: 4xf32 (x1, y1, x2, y2).

EcsQuerySubtreeExpand = 201

EcsQuery subtree expand. Payload: subtreeCount: u16, rootId: u16.

EcsSpawn = 30

Entity spawn. Required: archetypeId: u16. Optional: entityId: u64, tsn: i64.

EcsViewDeltaBufferOverflow = 206

View delta-buffer overflow (operationally critical — never default-suppressed). Payload: currentTsn: i64, tailTsn: i64, marginPagesLost: u16.

EcsViewDeltaCacheMiss = 213

View delta-cache miss (entity re-eval). Payload: pk: i64, reason: u8.

EcsViewIncrementalDrain = 205

View IncrementalDrain. Payload: deltaCount: i32, overflow: u8.

EcsViewProcessEntry = 207

View single-branch entry process (instant, high-freq, default-suppressed). Payload: pk: i64, fieldIdx: u16, pass: u8.

EcsViewProcessEntryOr = 208

View OR-mode entry process (instant, high-freq, default-suppressed). Payload: pk: i64, branchCount: u8, bitmapDelta: u32.

EcsViewRefresh = 35

View refresh. Required: archetypeTypeId: u16. Optional: mode: u8, resultCount: i32, deltaCount: i32.

EcsViewRefreshFull = 209

View Refresh-from-overflow (Pull). Payload: oldCount: i32, newCount: i32, requeryNs: u32.

EcsViewRefreshFullOr = 210

View RefreshFullOr. Payload: oldCount: i32, newCount: i32, branchCount: u8.

EcsViewRefreshPull = 204

View RefreshPull (full re-query branch). Payload: queryNs: u32, archetypeMaskBits: u16.

EcsViewRegistryDeregister = 212

ViewRegistry Deregister. Payload: viewId: u16, fieldIdx: u16, regCount: u16.

EcsViewRegistryRegister = 211

ViewRegistry Register. Payload: viewId: u16, fieldIdx: u16, regCount: u16.

GcEnd = 8

.NET runtime GC boundary — a garbage collection has ended. Payload: u8 generation, u32 count, i64 pauseDurationTicks, u64 promotedBytes, five u64 per-generation size-after values (Gen0/Gen1/Gen2/LOH/POH), u64 totalCommittedBytes. Sizes are snapshotted by the ingestion thread via GetGCMemoryInfo() on the GCEnd_V1 event.

GcStart = 7

.NET runtime GC boundary — a garbage collection has started. Payload: u8 generation, u8 reason (GcReason), u8 type (GcType), u32 count. Emitted by the profiler's GC ingestion thread on observing GCStart_V2. Only produced when TelemetryConfig.ProfilerGcTracingActive is set at class load.

GcSuspension = 75

.NET runtime Execution-Engine suspension window. Opened on GCSuspendEEBegin_V1 (ETW id 9), closed on GCRestartEEEnd_V1 (ETW id 3). Payload: u8 reason (GcSuspendReason), u8 optMask (reserved). ParentSpanId is always 0 (process-level, not caller-attributed). No Activity capture.

Instant = 6

Generic instant marker. Payload: nameId: i32 (interned), payload: i32.

MemoryAlignmentWaste = 172

Alignment-induced waste on an allocation (only emitted when waste > 0). Payload: size: i32, alignment: i32, wastePctHundredths: u16.

MemoryAllocEvent = 9

Discrete unmanaged-memory allocation or free event. Every PinnedMemoryBlock construct/dispose emits one of these when TelemetryConfig.ProfilerMemoryAllocationsActive is set. Payload: u8 direction (MemoryAllocDirection), u16 sourceTag (MemoryAllocSource), u64 sizeBytes, u64 totalAfterBytes. Wire size: 31 B.

NamedSpan = 246

User-defined span with inline UTF-8 null-terminated name. Used for dynamic-string call sites (tests, demo code). Payload: null-terminated UTF-8 bytes.

Was 200 until 2026-05-10, which collided with EcsQueryMaskAnd. The collision was latent in production because EcsQueryMaskAnd is default-suppressed, but unsuppressing it would have made the two kinds indistinguishable on the wire. Reassigned to 246 (next free slot above SchedulerSystemArchetype). Wire format bumped to v8 in CurrentVersion to signal the change.

PageCacheAllocatePage = 53

Page cache allocate page. Required: filePageIndex: i32.

PageCacheBackpressure = 59

Page cache backpressure wait — clock-sweep retry loop couldn't find a free page. Required: retryCount: i32, dirtyCount: i32, epochCount: i32. Suppressed by default alongside other PageCache.* kinds.

PageCacheDiskRead = 51

Page cache disk read. Required: filePageIndex: i32.

PageCacheDiskReadCompleted = 56

Completion marker for an async PageCacheDiskRead. Required: filePageIndex: i32. The record carries the original DiskRead span's SpanId as its own SpanId (same value — the viewer uses this to correlate kickoff → completion) and a StartTimestamp equal to the original's StartTimestamp, so the record's durationTicks field is the full async tail: completionTimestamp - beginTimestamp. Emitted from the thread-pool worker that completes the RandomAccess.ReadAsync.

Suppressed by default alongside the other PageCache.* kinds. Opt in with TyphonEvent.UnsuppressKind(PageCacheDiskReadCompleted) (must ALSO have PageCacheDiskRead unsuppressed, otherwise there's no kickoff span to correlate with and the completion is skipped at the call site). Reuses PageCacheEventCodec wire shape verbatim — decoder needs only a match-arm entry.

PageCacheDiskWrite = 52

Page cache disk write. Required: filePageIndex: i32. Optional: pageCount: i32.

PageCacheDiskWriteCompleted = 57

Completion marker for an async PageCacheDiskWrite. Required: filePageIndex: i32. Same correlation pattern as PageCacheDiskReadCompleted — record's SpanId matches the original DiskWrite span, durationTicks is the full async tail including the OS write completion.

PageCacheFetch = 50

Page cache fetch. Required: filePageIndex: i32.

PageCacheFlush = 54

Page cache flush. Required: pageCount: i32.

PageCacheFlushCompleted = 58

Completion marker for an async PageCacheFlush. Required: pageCount: i32 (stored in the primary filePageIndex slot per Flush convention). Record's durationTicks covers the full flush tail: max(WriteAsync completions) + fsync. The delta between this record's duration and the max of the enclosed PageCacheDiskWriteCompleted events is pure fsync cost.

PageEvicted = 55

A cached page was displaced by PageCacheAllocatePage to make room for a new page being fetched. Required: filePageIndex: i32 (the displaced page's file index, NOT the incoming page).

Emitted as a zero-duration span (start == end). Parents under the enclosing PageCacheAllocatePage span via TLS, so the viewer renders eviction events as instant markers nested inside the AllocatePage bar — "allocation ran for 12 µs and kicked out page N." Reuses the PageCacheEventCodec wire shape (common header + span extension + 4 B filePageIndex + 1 B optMask), so no new codec is needed. Suppressed by default alongside the other PageCache.* kinds.

PerTickSnapshot = 76

Per-tick gauge snapshot — packed bundle of (gaugeId, value) pairs emitted once per tick by the scheduler thread at end-of-tick. Instant-style record: no span header extension, no duration semantics. Common header + fixed prefix (u32 tickNumber, u16 fieldCount, u32 flags) then repeated {u16 gaugeId; u8 valueKind; [4 or 8 B] value} entries. Gated on TelemetryConfig.ProfilerGaugesActive. See GaugeId for the wire-stable gauge ID registry.

Although this kind's numeric value is ≥ 10, it is not a span record. IsSpan(TraceEventKind) explicitly excludes it so the consumer never tries to read the 25-byte span header extension after the common header.

PhaseEnd = 3

Tick phase ended. Payload: phase: u8.

PhaseStart = 2

Tick phase started. Payload: phase: u8 (TickPhase enum).

QueryArgs = 248

Per-execution arguments payload emitted immediately after each QueryPlan when the query carries at least one evaluator (skipped when EvaluatorCount == 0). Payload: evaluatorCount: u16, thresholds[evaluatorCount]: i64 (widened threshold constants matching FieldEvaluator.Threshold).

QueryCount = 198

Count-only path. Payload: resultCount: i32.

QueryDefinitionDescribe = 247

One-shot definition descriptor emitted on first observation of a View/EcsQuery identity within a profiling session. Payload (variable-length): kind: u8 (0=View, 1=EcsQuery), localId: u32, targetComponentType: u16, primaryIndexFieldIdx: i16, sortFieldIdx: i16, sortDescending: u8, definitionSourceFileId: u16, definitionSourceLine: i32, definitionSourceMethodId: u16, evaluatorCount: u16, evaluators[evaluatorCount]: { fieldIdx: u16, op: u8, reserved: u8 }, fieldDependencyCount: u16, fieldDependencies[fieldDependencyCount]: u16.

QueryEstimate = 190

Selectivity estimate. Payload: fieldIdx: u16, cardinality: i64.

QueryExecuteFilter = 195

Filter pass (post-primary). Payload: filterCount: u8, rejectedCount: i32.

QueryExecuteIndexScan = 193

B+Tree range-scan dispatch. Payload: primaryFieldIdx: u16, mode: u8 (0=Single, 1=Multi).

QueryExecuteIterate = 194

Index iteration (chunk-grain). Payload: chunkCount: i32, entryCount: i32.

QueryExecutePagination = 196

Pagination (Skip/Take). Payload: skip: i32, take: i32, earlyTerm: u8.

QueryExecuteStorageMode = 197

Storage-mode dispatch instant. Payload: mode: u8 (0=SV, 1=Versioned, 2=Transient).

QueryParse = 187

Query expression parse. Payload: predicateCount: u16, branchCount: u8.

QueryParseDnf = 188

Query DNF normalization. Payload: inBranches: u16, outBranches: u16.

QueryPlan = 189

Query plan build. Payload: evaluatorCount: u8, indexFieldIdx: u16, rangeMin: i64, rangeMax: i64.

QueryPlanPrimarySelect = 191

Primary stream selection (instant). Payload: candidates: u8, winnerIdx: u8, reason: u8.

QueryPlanSort = 192

Predicate ordering / sort by cardinality. Payload: evaluatorCount: u8, sortNs: u32.

QueueTickEnd = 244

Per-(tick, queue) rollup emitted at end-of-tick. Captures queue-depth telemetry that's local to the engine's EventQueueBase accumulators (peak depth, end-of-tick depth, overflow count, produced/consumed counts). Folded by IncrementalCacheBuilder into the v12 QueueTickSummaries section for the Workbench Data API queue/<name> tracks (#311). Payload: tick: u32, queueId: u16, peakDepth: u32, endOfTickDepth: u32, overflowCount: u32, produced: u32, consumed: u32 = 26 bytes after the common header.

RuntimePhaseSpan = 243

Tick lifecycle phase span — covers the full duration of one TickPhase region inside TyphonRuntime.OnTickEndInternal (SystemDispatch, WriteTickFence, UoWFlush, OutputPhase, TierIndexRebuild, DormancySweep). Replaces the previous PhaseStart+PhaseEnd instant pair on the producer side: a real span is opened at the top of InspectorPhase and disposed at the bottom, so child spans (PageCacheFlush, BTreeInsert, etc.) attach via parentSpanId for proper hierarchy. Payload: phase: u8 (TickPhase enum).

RuntimePhaseUoWCreate = 161

UoW create (per tick, OnTickStart). Payload: tick: i64.

RuntimePhaseUoWFlush = 162

UoW flush (per tick, OnTickEnd). Payload: tick: i64, changeCount: i32.

RuntimeSubscriptionDeltaBuild = 236

Delta-builder span. Payload: viewId: u16, added: i32, removed: i32, modified: i32.

RuntimeSubscriptionDeltaDirtyBitmapSupplement = 240

Dirty-bitmap supplement span (when ring overflows). Payload: modifiedFromRing: i32, supplementCount: i32, unionSize: i32.

RuntimeSubscriptionDeltaSerialize = 237

Per-client delta serialize span (high-freq, deny-listed). Payload: clientId: u32, viewId: u16, bytes: i32, format: u8.

RuntimeSubscriptionOutputCleanup = 239

Dead-client cleanup span. Payload: deadCount: i32, deregCount: i32.

RuntimeSubscriptionOutputExecute = 164

Subscription output phase (per tick). Payload: tick: i64, level: u8, clientCount: u16, viewsRefreshed: u16, deltasPushed: u32, overflowCount: u16.

RuntimeSubscriptionSubscriber = 235

Per-subscriber invocation span (high-freq, deny-listed). Payload: subscriberId: u32, viewId: u16, deltaCount: i32.

RuntimeSubscriptionTransitionBeginSync = 238

Subscription transition (BeginSync) span. Payload: clientId: u32, viewId: u16, entitySnapshot: i32.

RuntimeTransactionLifecycle = 163

Per-system Transaction lifecycle span. Payload: sysIdx: u16, txDurUs: u32, success: u8.

SchedulerChunk = 10

Scheduler chunk executed on a worker. Payload: systemIdx: u16, chunkIdx: u16, totalChunks: u16, entitiesProcessed: i32.

SchedulerDependencyFanOut = 155

Dependency fan-out span over OnSystemComplete successor loop. Payload: completingSysIdx: u16, succCount: u16, skippedCount: u16.

SchedulerDependencyReady = 154

Successor mark-ready (only when depsLeft → 0). Payload: fromSysIdx: u16, toSysIdx: u16, fanOut: u16, predRemain: u16.

SchedulerDispense = 153

Successful chunk-grab CAS. Payload: sysIdx: u16, chunkIdx: i32, workerId: u8.

SchedulerGraphBuild = 159

DAG build at startup. Payload: sysCount: u16, edgeCount: u16, topoLen: u16.

SchedulerGraphRebuild = 160

DAG rebuild (dynamic system registration — design stub, no producer in Phase 4). Payload: oldSysCount: u16, newSysCount: u16, reason: u8.

SchedulerMetronomeWait = 241

Metronome wait between ticks (TickDriver thread, Sleep→Yield→Spin phases). Span covers the entire gap from the moment ExecuteCallbacks returned (or timer started) until the next tick fires. Payload: scheduledTimestamp: i64, multiplier: u8, intentClass: u8, phaseFlags: u8 (11 B).

intentClass: 0=CatchUp (target already past), 1=Throttled (mult>1), 2=Headroom (mult==1 normal idle).

phaseFlags bits: 0x1=Sleep entered, 0x2=Yield entered, 0x4=Spin entered.

SchedulerOverloadDetector = 242

Per-tick OverloadDetector state snapshot (instant on TickDriver). Carries the full state used to drive escalation/deescalation decisions so an offline trace can audit why the engine throttled. Payload: tick: i64, overrunRatio: f32, consecutiveOverrun: u16, consecutiveUnderrun: u16, consecutiveQueueGrowth: u16, queueDepth: i32, level: u8, multiplier: u8 (24 B).

SchedulerOverloadLevelChange = 156

Overload level transition (only on change). Payload: prevLvl: u8, newLvl: u8, ratio: f32, queueDepth: i32, oldMul: u8, newMul: u8.

SchedulerOverloadSystemShed = 157

Per-system shed/throttle decision (when overload level > Normal). Payload: sysIdx: u16, level: u8, divisor: u16, decision: u8 (0=shouldRunFalse, 1=throttled, 2=shed).

SchedulerOverloadTickMultiplier = 158

Tick multiplier applied (per tick). Payload: tick: i64, multiplier: u8, intervalTicks: u8.

SchedulerSystemArchetype = 245

Per-(system, archetype) entity-touch rollup emitted at parallel-query completion. Captures the cross-dimension that SchedulerChunk (per-system) and EcsQueryExecute (per-archetype) leave separate. Feeds the Workbench Data Flow module's archetype/, system-archetype/, and component-family/* track families. Payload: systemIndex: u16, archetypeId: u16, entityCount: i32, chunkCount: i32 = 12 bytes after the span header. Gated by TelemetryConfig.SchedulerArchetypeTouchesActive.

SchedulerSystemCompletion = 147

System completion (RecordSystemDone). Payload: sysIdx: u16, reason: u8 (0=ok, 1..N=SkipReason), durationUs: u32.

SchedulerSystemQueueWait = 148

Ready → first-grab latency (queue wait). Payload: sysIdx: u16, queueWaitUs: u32.

SchedulerSystemSingleThreaded = 149

Single-threaded system execution span. Payload: sysIdx: u16, isParallelQuery: u8, chunkCount: u16.

SchedulerSystemStartExecution = 146

System first chunk dispatched — execution boundary (after CAS, before work). Payload: sysIdx: u16.

SchedulerWorkerBetweenTick = 152

Worker between-tick wait (kernel wait span). Payload: workerId: u8, waitUs: u32, wakeReason: u8 (0=signal, 1=shutdown).

SchedulerWorkerIdle = 150

Worker idle span (per spin spell). Payload: workerId: u8, spinCount: u16, idleUs: u32.

SchedulerWorkerWake = 151

Worker wake from kernel signal. Payload: workerId: u8, delayUs: u32.

SpatialCellIndexAdd = 130

CellSpatialIndex.Add — append cluster to cell's SoA. Payload: cellKey: i32, slot: i32, clusterChunkId: i32, capacity: i32.

SpatialCellIndexRemove = 132

CellSpatialIndex.RemoveAt — swap-with-last. Payload: cellKey: i32, slot: i32, swappedClusterId: i32.

SpatialCellIndexUpdate = 131

CellSpatialIndex.UpdateAt — in-place AABB rewrite at slot. Payload: cellKey: i32, slot: i32.

SpatialClusterAabbRefresh = 250

Per-tick span around RecomputeDirtyClusterAabbs. Fires once per archetype per tick — the existing SpatialCellIndexUpdate instant fires per per-cell index UpdateAt, but doesn't show the cost of the full pass (occupancy scan + bit-exact compare for unchanged clusters). Required payload: archetypeId: u16, clusterScanned: i32, aabbChanged: i32. Gated on SpatialCellIndexUpdateActive.

SpatialClusterMigrationDetect = 133

Cluster migration detected (cell crossing observed, queued for execute). Payload: archetypeId: u16, clusterChunkId: i32, oldCellKey: i32, newCellKey: i32.

SpatialClusterMigrationDetectScan = 249

Per-tick span around DetectClusterMigrations. Fires once per archetype per tick whenever the spatial path runs, regardless of whether any entity actually crossed a cell — the existing SpatialClusterMigrationDetect instant only fires per detected crossing, so it's silent for workloads where ants/units move within hysteresis every tick (e.g. AntHill). Required payload: archetypeId: u16, scanSlotCount: i32 (slots iterated), migrationsQueued: i32, hysteresisAbsorbed: i32. Gated on SpatialClusterMigrationDetectActive.

SpatialClusterMigrationHysteresis = 135

Cluster migration hysteresis absorb — crossing detected but absorbed by margin (no migration queued). Payload: archetypeId: u16, clusterChunkId: i32, escapeDistSq: f32.

SpatialClusterMigrationQueue = 134

Cluster migration queue append. Payload: archetypeId: u16, clusterChunkId: i32, queueLen: u16.

SpatialGridCellTierChange = 127

Cell tier change (only emits when SetCellTier actually flips the tier byte). Payload: cellKey: i32, oldTier: u8, newTier: u8.

SpatialGridClusterCellAssign = 129

Cluster-cell assignment (cluster claimed in a particular cell). Payload: clusterChunkId: i32, cellKey: i32, archetypeId: u16.

SpatialGridOccupancyChange = 128

Cell occupancy change (Increment/Decrement merged via signed delta). Payload: cellKey: i32, delta: i8, occBefore: u16, occAfter: u16.

SpatialMaintainAabbValidate = 140

Degenerate AABB validation failure. Payload: entityPK: i64, componentTypeId: u16, opcode: u8 (0=insert, 1=update, 2=remove).

SpatialMaintainBackPointerWrite = 141

Spatial back-pointer write (componentChunkId → leafChunkId+slotIndex). Payload: componentChunkId: i32, leafChunkId: i32, slotIndex: u16.

SpatialMaintainInsert = 138

Maintain.InsertSpatial — wraps RTree.Insert + back-pointer + occupancy. Payload: entityPK: i64, componentTypeId: u16, didDegenerate: u8.

SpatialMaintainUpdateSlowPath = 139

Maintain.UpdateSpatial slow-path — escape detected, remove + reinsert. Payload: entityPK: i64, componentTypeId: u16, escapeDistSq: f32.

SpatialQueryAabb = 117

AABB query iterator pass. Payload: nodesVisited: u16, leavesEntered: u16, resultCount: u16, restartCount: u8, categoryMask: u32.

SpatialQueryCount = 122

Count query (CountInAABB / CountInRadius merged via variant byte). Payload: variant: u8 (0=AABB, 1=Radius), nodesVisited: u16, resultCount: i32.

SpatialQueryFrustum = 120

Frustum query iterator pass. Payload: nodesVisited: u16, resultCount: u16, planeCount: u8, restartCount: u8.

SpatialQueryKnn = 121

KNN query (full call covering all radius-expansion iterations). Payload: k: u16, iterCount: u8, finalRadius: f32, resultCount: u16.

SpatialQueryRadius = 118

Radius (sphere) query iterator pass. Payload: nodesVisited: u16, resultCount: u16, radius: f32, restartCount: u8.

SpatialQueryRay = 119

Ray query iterator pass. Payload: nodesVisited: u16, resultCount: u16, maxDist: f32, restartCount: u8.

SpatialRTreeBulkLoad = 126

RTree bulk-load (init-time). Payload: entityCount: i32, leafCount: i32.

SpatialRTreeInsert = 123

RTree insert (descent + leaf write or split fallout). Payload: entityId: i64, depth: u8, didSplit: u8, restartCount: u8.

SpatialRTreeNodeSplit = 125

RTree node split (sub-event of Insert when leaf is full). Payload: depth: u8, splitAxis: u8, leftCount: u8, rightCount: u8.

SpatialRTreeRemove = 124

RTree remove (leaf modify, possibly cascade up). Payload: entityId: i64, leafCollapse: u8.

SpatialTierIndexRebuild = 136

TierClusterIndex rebuild span. Payload: archetypeId: u16, clusterCount: i32, oldVersion: i32, newVersion: i32.

SpatialTierIndexVersionSkip = 137

TierClusterIndex version-skip — rebuild bypassed because version unchanged. Payload: archetypeId: u16, version: i32, reason: u8.

SpatialTriggerCacheInvalidate = 145

Trigger static-tree cache invalidate (mutation observed bumps cached version). Payload: regionId: u16, oldVersion: i32, newVersion: i32.

SpatialTriggerEval = 143

Trigger region eval span. Payload: regionId: u16, occupantCount: u16, enterCount: u16, leaveCount: u16.

SpatialTriggerOccupantDiff = 144

Trigger occupant XOR-diff stats (NO bitmap). Payload: regionId: u16, prevCount: u16, currCount: u16, enterCount: u16, leaveCount: u16.

SpatialTriggerRegion = 142

Trigger region create/destroy (merged via op variant). Payload: op: u8 (0=create, 1=destroy), regionId: u16, categoryMask: u32.

StatisticsRebuild = 89

Statistics rebuild for a ComponentTable. Required: entityCount: i32, mutationCount: i32, samplingInterval: i32.

StorageChunkSegmentGrow = 169

ChunkBasedSegment.Grow. Payload: stride: i32, oldCap: i32, newCap: i32.

StorageFileHandle = 170

File handle Open/Close (merged via op variant). Payload: op: u8 (0=open, 1=close), filePathId: i32, modeOrReason: u8.

StorageOccupancyMapGrow = 171

OccupancyMap L3 grow path. Payload: oldCap: i32, newCap: i32.

StoragePageCacheDirtyWalk = 165

Dirty-walk during checkpoint (collect dirty page indices). Payload: rangeStart: i32, rangeLen: i32, dirtyMs: i32.

StorageSegmentCreate = 166

LogicalSegment.Create. Payload: segmentId: i32, pageCount: i32.

StorageSegmentGrow = 167

LogicalSegment.Grow. Payload: segmentId: i32, oldLen: i32, newLen: i32.

StorageSegmentLoad = 168

LogicalSegment.Load. Payload: segmentId: i32, pageCount: i32.

SystemReady = 4

A system became ready (all predecessors completed). Payload: systemIdx: u16, predecessorCount: u16.

SystemSkipped = 5

A system was skipped. Payload: systemIdx: u16, skipReason: u8.

ThreadContextSwitch = 254

OS thread context-switch — closes one ON-CPU slice for a Typhon-registered thread. Instant-style record produced by EtwSchedulingPump. Payload: u8 targetSlotIdx (slot to re-attribute to, NOT the producer slot), u8 processorNumber, u8 waitReason (ThreadWaitReason), u8 threadState (post-switch System.Diagnostics.ThreadState), u8 gettingIdle (1 = CPU went to System Idle next), u32 durationQpc (QPC ticks the slice held the CPU, capped at uint.MaxValue ≈ 7 min), u32 readyTimeQpc (QPC ticks on the ready queue before this slice; 0 = unknown, uint.MaxValue = saturated). Common-header timestamp = the slice's START QPC tick. Gated on RuntimeThreadSchedulingActive.

ThreadInfo = 77

Per-slot thread identity — emitted once when a producer thread claims its slot. Carries the managed thread ID and a UTF-8 thread name so the viewer can label lanes with something meaningful ("DagScheduler", "TyphonProfilerConsumer", pool worker name, ...) instead of just the numeric slot index. Wire layout after the 12-byte common header: i32 managedThreadId, u16 nameByteCount, byte[nameByteCount] nameUtf8. Instant-style (no span-header extension); see IsSpan(TraceEventKind).

TickEnd = 1

Scheduler tick ended. Payload: overloadLevel: u8, tickMultiplier: u8.

TickStart = 0

Scheduler tick started (empty payload). Emitted at the top of each DagScheduler.RunTick.

TransactionCommit = 20

Transaction commit. Required: tsn: i64. Optional: componentCount: i32, conflictDetected: bool.

TransactionCommitComponent = 22

Per-component commit sub-span. Required: tsn: i64, componentTypeId: i32.

TransactionPersist = 23

WAL serialization inside Transaction.Commit. Required: tsn: i64. Optional: walLsn: i64.

TransactionRollback = 21

Transaction rollback. Required: tsn: i64. Optional: componentCount: i32.

WalFlush = 80

WAL writer drain-write-signal cycle. Required: batchByteCount: i32, frameCount: i32, highLsn: i64.

WalSegmentRotate = 81

WAL segment rotation. Required: newSegmentIndex: i32.

WalWait = 82

Thread blocked waiting for WAL durability. Required: targetLsn: i64. Emitted on the calling thread, not the WAL writer.

WriteTickFenceCluster = 61

Per-tick span around the per-archetype body inside WriteClusterTickFence. Covers both the has-dirty branch (snapshot + occupancy mask + shadow + spatial + WAL serialize + dormancy sweep) and the clean branch (dormancy sweep + optional spatial AABB refresh on local occupancy bitmap). Required payload: archetypeId: u16. Optional payload: dirtyClusterCount: i32, entryCount: i32, hasShadow: u8, hasSpatial: u8, walPublished: u8. Gated on RuntimeWriteTickFenceClusterActive.

WriteTickFenceClusterShadow = 62

Per-tick span around ProcessClusterShadowEntries for one cluster-eligible archetype. Drains per-index shadow buffers for cluster-backed B+Tree indexes. Required payload: archetypeId: u16, dirtyClusterCount: i32. Optional payload: totalShadowEntries: i32. Gated on RuntimeWriteTickFenceClusterShadowActive.

WriteTickFenceClusterSpatial = 63

Per-tick span around the cluster spatial-maintenance block: DetectClusterMigrations + ExecuteMigrations + RecomputeDirtyClusterAabbs for one archetype with a Dynamic spatial slot. Parent of the fine-grained spans SpatialClusterMigrationDetectScan + SpatialClusterAabbRefresh + ClusterMigration. Required payload: archetypeId: u16, dirtyClusterCount: i32. Optional: migrationsExecuted: i32. Gated on RuntimeWriteTickFenceClusterSpatialActive.

WriteTickFenceShadow = 252

Per-tick span around ProcessShadowEntries for one ComponentTable (deferred index maintenance for non-Versioned indexed fields with shadow buffers). Required payload: componentTypeId: u16, indexedFieldCount: i32. Optional payload: totalShadowEntries: i32 (sum of buffer counts across all indexed fields). Gated on RuntimeWriteTickFenceShadowActive.

WriteTickFenceSpatial = 253

Per-tick span around ProcessSpatialEntries for one ComponentTable (R-Tree position update for dirty entities). Required payload: componentTypeId: u16, dirtyEntryCount: i32. Optional payload: escapedCount: i32 (entities whose new position escaped their fat AABB and got reinserted). Gated on RuntimeWriteTickFenceSpatialActive.

WriteTickFenceTable = 251

Per-tick span around the per-ComponentTable body inside WriteTickFenceCore (WAL serialize + shadow + spatial + archive). Fires once per dirty SV/Transient table per tick. Required payload: componentTypeId: u16, dirtyEntryCount: i32. Optional payload: walPublished: u8 (0/1), hasShadow: u8 (0/1), hasSpatial: u8 (0/1). Gated on RuntimeWriteTickFenceTableActive.

Remarks

Wire stability: numeric values are part of the .typhon-trace file format. Never renumber or reuse an ID — append new entries only. Gaps in numbering are intentional so related categories can grow contiguously without renumbering existing kinds.

Span vs instant: kinds < 10 are instant events — they carry only the 12-byte common header plus optional minimal payload, no span extension (no duration, no spanId, no parent linkage). Kinds ≥ 10 are span events — they include the 25-byte span header extension plus an optional 16-byte trace context and per-kind typed payload. Use IsSpan(TraceEventKind) for the range check.