Run

run evidence

run
20261022T064227Z-finboard-runtime-direct
app
finboard real-world catalogue status live
scenario
runtime-direct synthetic

One streamed request sent by the collector directly to the runtime Finboard ships, on loopback, with a synthetic prompt and the runtime's default system prompt. It exercises the runtime the app ships; it does not exercise Finboard's prompt assembly, capabilities or narration.

capture mode
lab
captured at
2026-10-22T06:42:27Z
model
qwen2.5:14b measured
quantization
Q4_K_M inferred
parameters
14.770033664 B inferred
architecture
qwen2 measured
licence
apache-2.0 measured
model digest
sha256:7cdf5a0187d5c58cc5d369b255592f7841d1c4696d45a8c8a9489440385b22f6 measured
runtime
Ollama measured
runtime version
0.30.11 measured
engine
llama.cpp b9781 (ggml Metal) inferred
backend
metal inferred
chip
Apple M5 Pro measured
memory
24 GB measured
OS
macOS 26.6.2 measured
run context
16 384 measured
trained context
32 768 measured

text retained false

sanitizer
scripts/sanitize_bundle.py
sanitizer version
1
record digest
sha256:db708560227d4f20fe5a2f22f67b30964038ef9a891eeefcb5151ccc45012d7e
  • measured
  • timing correlation
  • inferred
  • unknown

run evidence

Model behind the passes

qwen2.5:14b measured Q4_K_M inferred

What was captured

finboard / runtime-direct

One streamed request sent by the collector directly to the runtime Finboard ships, on loopback, with a synthetic prompt and the runtime's default system prompt. It exercises the runtime the app ships; it does not exercise Finboard's prompt assembly, capabilities or narration.

Request timing

hand-off to the runnerrunner's first encode → first tokenfirst token → generation done
  • hand-off to the runner
  • runner's first encode → first token
  • first token → generation done

first token 448.82 ms measured generation done 2602.1 ms measured

prompt tokens 47 measured
generated tokens 58 measured
cached prefix tokens 24 measured source runtime_log measured
TTFT 448.82 ms measured
decode rate 26.91 tok/s inferred generated tokens ÷ decode seconds

This is a guide through the recorded stack, not a measurement. Its arrows show the conceptual path a request takes; they do not assert a measured dependency or a timing join, and the moving dot shows direction, never speed. Every value in a step is read from the bundle with its label; open a step for its lens.

L0 Request

Request timing

The first token separates the wait to begin from the time spent generating. The timeline below uses the request clock; runtime counters and trace timings remain distinct.

hand-off to the runnerrunner's first encode → first tokenfirst token → generation done
  • hand-off to the runner
  • runner's first encode → first token
  • first token → generation done
segmentfromtoduration
hand-off to the runner0 ms measured253.615 ms timing correlationendpoints only
runner's first encode → first token253.615 ms timing correlation448.82 ms measured195.2 ms inferred first_token − runner_first_commit
first token → generation done448.82 ms measured2602.1 ms measured2153 ms inferred generation_done − first_token

prefill rate over the uncached prompt 119.4 tok/s inferred (prompt tokens − cached prefix tokens) ÷ prompt eval seconds

clock join

alignment residual
2.612 ms timing correlation
decode clusters on the trace
57 timing correlation
generated tokens by the runtime
58 timing correlation
token-count agreement
agrees (Δ = 0) inferred trace_clusters = runtime_generated_tokens − 1
Request metrics & cache source
prompt tokens 47 measured
generated tokens 58 measured
cached prefix tokens 24 measured source runtime_log measured
TTFT 448.82 ms measured
decode rate 26.91 tok/s inferred generated tokens ÷ decode seconds

counters, as reported by the runtime

prompt_eval_s0.192672 s measured
eval_s2.154999 s measured
load_s0.18716275 s measured
total_s2.550246292 s measured
done_reasonstop measured
How to read this lens

The request as the application saw it, on the request clock, whose origin is the request's start — so the first token's time is the time to first token. The bar splits the request into the hand-off to the runner, the runner's first encode to the first token, and the first token to the end of generation; a segment the bundle has no duration for shows its endpoints only. The prompt token counter is reported by the runtime and includes the cached prefix tokens served from the cache.

L1 Phases

Prefill and decode passes

Each column is a pass. Select one to carry it into the GPU timeline. Chunk-arrival ticks use the request clock; the alignment details explain the join.

How to read this lens

The rhythm of the passes: one prefill pass, then one decode pass per generated token, each drawn to its period. The streamed chunks sit on the request clock beneath them, and the clock join says how the trace clock was aligned to the request clock.

L2 Model anatomy

Read the model from its recorded tensors: the structure, projection dimensions and weight storage. Select a layer in the byte stack to explore its runtime block, or a tensor to inspect its evidence.

How to read this lens

Where one token's bytes are: each layer's weight tensors, by their size in the model file. The structure, the projection widths and the stack are drawings; every value they draw is shown with its label beside them, in their hover text, and in the tensor byte map and its source table, which hold the totals and the byte shares. The byte shares are shares of the model file, never shares of kernel time.

L3 Transformer block

Follow attention and the feed-forward network through one decoder layer. Select an operation group to inspect its recorded nodes, tensor shapes and kernels.

outside every block

  • 962 absent — outside every block
  • 963 absent — outside every block
How to read this lens

One layer's nodes in execution order, by op family, each with its kernel and, where it reads a weight tensor, that tensor's shape and type from the model file. Nodes that belong to no layer are listed on their own, with the bundle's reason.

The schematic is drawn only when the layer's recorded operations match a decoder block's pattern, read from each node's operation and the weight tensor it reads; a layer that does not match shows its recorded nodes instead. Each node card is one recorded node in encode order, its edge marking its family: a matrix multiplication, a normalization, or another operation.

L4 Runtime graph

Runtime graph nodes

Filter the graph by layer, operation, kernel or provenance. A node's kernel mapping may be inferred even when its name and operation were measured.

the runtime's own node index at the first subgraph boundary

nodenamefusedruntime index
94norm-4 measured2 measured0 inferred Σ max(1, fused) over the subgraph's earlier nodes
95ffn_gate-4 measured0 measured2 inferred Σ max(1, fused) over the subgraph's earlier nodes
96ffn_up-4 measured0 measured3 inferred Σ max(1, fused) over the subgraph's earlier nodes

nodes carrying a measured kernel 0 of 964 inferred nodes with a measured kernel, of pass_nodes

How to read this lens

Every node of the runtime graph and the kernel it maps to, with the label of that mapping. The runtime numbers its nodes inside each subgraph, counting fused ops; the page derives that index from the bundle's own node list.

L5 Kernels

Shader interval counts

Bars compare recorded shader-interval counts. They do not represent kernel duration or time share. Select a kernel to see its candidate nodes and intervals.

How to read this lens

The kernels the trace recorded, with the number of intervals the instrument counted for each over the whole run, and the graph nodes each kernel joins. A kernel no node names is reported as unjoined. The timeline is sparse, so the page shows no kernel share and no per-kernel sum.

L6 GPU timeline

CPU and GPU timeline

Select an encode interval, GPU segment or shader tick to inspect its associated evidence. Hatched regions are unrecorded shader time; missing GPU intervals keep their stated reason.

How to read this lens

The selected pass's command buffers: each one's CPU encode and its GPU execution, segment by segment, with the shader rows the timeline recorded drawn inside the buffer that holds them. The GPU time the timeline did not record is marked as not recorded.

The machine view

Derived from the bundle, beneath the lenses: the weight bytes one decode token streams, the mean decode period, and the effective weight bandwidth the two imply. Bytes are in decimal units, a gigabyte being a thousand million bytes. The page carries no published bandwidth of the hardware and no operation rate; the bundle carries neither.

  • 6405.549 ms measured · 4288.454 ms measured → 37.81 ms inferred (t0 of the last decode pass − t0 of the first) ÷ (decode passes − 1)
  • 7.905509376 GB measured · 0.6386688 GB measured → 8.544 GB inferred blocks + output weight bytes
  • 226.0 GB/s inferred DV-9 ÷ DV-3
  • 6.1710336 GB measured · 7.905509376 GB measured → 78.06 % FFN inferred ffn ÷ blocks; attention ÷ blocks (bytes of the model file)
  • 1.732509696 GB measured · 7.905509376 GB measured → 21.92 % attention inferred ffn ÷ blocks; attention ÷ blocks (bytes of the model file)
  • 8.982142976 GB measured · 0.43794432 GB measured · 0.6386688 GB measured → 0.00002048 GB inferred total bytes − (embed + Σ layer bytes + output)

Not measured by this instrument

This instrument records no hardware counters, no launch geometry, no per-dispatch timing and no kernel shares, so none appears on the page, as a value or as an absence. This is a statement about every lab capture on this instrument, not an entry of the run's absent list. What it does record is sparse: the shader timeline's coverage of the token under test and of the run is shown below. The reference capture's graph is the decode pass's and its prefill pass recorded no shader row, so no prefill-versus-decode kernel comparison is drawn.

  • coverage of the token under test 9.290 % inferred Σ shader-row durations ÷ Σ GPU time over the pass's compute buffers
  • coverage of the run 7.556 % inferred Σ shader-row durations ÷ Σ compute-buffer GPU time, over the passes carrying a row · passes carrying a row 12 of 58 passes inferred Σ shader-row durations ÷ Σ compute-buffer GPU time, over the passes carrying a row

The traversal

method

The traversal climbs from one interval on the GPU timeline through its token, its command buffer, its node set, its kernel and its candidate nodes, to their tensors, components and layers, and descends again from a component to the kernels and intervals it ran. Every hop reads a relation the bundle stores and carries that relation's own label. A terminal is a hop the bundle answers by ending the chain; a gap is a hop it does not supply. The table is the token under test, one row per interval.

pass 49 · kind decode timing correlation · token index 48 timing correlation · period 39.747 ms measured · GPU busy 3.344 ms measured · 13.025 ms measured · 0.945 ms measured · 20.458 ms measured · 0.005 ms measured → 37.78 ms inferred Σ GPU time over the pass's buffers; ÷ period · 95.04 % inferred Σ GPU time over the pass's buffers; ÷ period · coverage of the token under test 9.290 % inferred Σ shader-row durations ÷ Σ GPU time over the pass's compute buffers · 36 intervals
intervalH1 tokenH2 bufferH3 node setH4 kernelH5 candidatesH8 layersH7 componentsverdict
enc(49,0)48 timing correlation0x234d5d883 measured0…93 inferredeach node's kernel inferred94 inferred0…4 inferred
10 components · 47 read no weightattn_k.bias attn_k.weight attn_output.weight attn_q.bias attn_q.weight attn_v.bias attn_v.weight ffn_down.weight ffn_gate.weight ffn_up.weight 47 read no weight tensor of their layer
resolved
enc(49,1)48 timing correlation0x234d5d885 measured94…963 inferredeach node's kernel inferred870 inferred4…47 inferred
outside every block · 2962 absent — outside every block 963 absent — outside every block
10 components · 435 read no weightattn_k.bias attn_k.weight attn_output.weight attn_q.bias attn_q.weight attn_v.bias attn_v.weight ffn_down.weight ffn_gate.weight ffn_up.weight 435 read no weight tensor of their layer
resolved
enc(49,2)48 timing correlation0x234d5d887 measuredblit — the logits copy; no graph nodes measuredresolved
gpu(49,0,0)48 timing correlationthe buffer's own record measured0…93 inferredeach node's kernel inferred94 inferred0…4 inferred
10 components · 47 read no weightattn_k.bias attn_k.weight attn_output.weight attn_q.bias attn_q.weight attn_v.bias attn_v.weight ffn_down.weight ffn_gate.weight ffn_up.weight 47 read no weight tensor of their layer
resolved
gpu(49,1,0)48 timing correlationthe buffer's own record measured94…963 inferredeach node's kernel inferred870 inferred4…47 inferred
outside every block · 2962 absent — outside every block 963 absent — outside every block
10 components · 435 read no weightattn_k.bias attn_k.weight attn_output.weight attn_q.bias attn_q.weight attn_v.bias attn_v.weight ffn_down.weight ffn_gate.weight ffn_up.weight 435 read no weight tensor of their layer
resolved
gpu(49,1,1)48 timing correlationthe buffer's own record measured94…963 inferredeach node's kernel inferred870 inferred4…47 inferred
outside every block · 2962 absent — outside every block 963 absent — outside every block
10 components · 435 read no weightattn_k.bias attn_k.weight attn_output.weight attn_q.bias attn_q.weight attn_v.bias attn_v.weight ffn_down.weight ffn_gate.weight ffn_up.weight 435 read no weight tensor of their layer
resolved
gpu(49,1,2)48 timing correlationthe buffer's own record measured94…963 inferredeach node's kernel inferred870 inferred4…47 inferred
outside every block · 2962 absent — outside every block 963 absent — outside every block
10 components · 435 read no weightattn_k.bias attn_k.weight attn_output.weight attn_q.bias attn_q.weight attn_v.bias attn_v.weight ffn_down.weight ffn_gate.weight ffn_up.weight 435 read no weight tensor of their layer
resolved
gpu(49,2,0)48 timing correlationthe buffer's own record measuredblit — the logits copy; no graph nodes measuredresolved
row(49,0)48 timing correlationthrough its node set0…93 inferredkernel_swiglu_f32 measured4 inferred0…3 inferred
4 read no weight4 read no weight tensor of their layer
resolved
row(49,1)48 timing correlationthrough its node set0…93 inferredkernel_mul_mv_q6_K_f32 measured9 inferred0…4 inferred
2 componentsattn_v.weight ffn_down.weight
resolved
row(49,2)48 timing correlationthrough its node set0…93 inferredkernel_rms_norm_mul_f32_4 measured9 inferred0…4 inferred
9 read no weight9 read no weight tensor of their layer
resolved
row(49,3)48 timing correlationthrough its node set0…93 inferredkernel_rope_neox_f32 measured10 inferred0…4 inferred
10 read no weight10 read no weight tensor of their layer
resolved
row(49,4)48 timing correlationthrough its node set0…93 inferredkernel_set_rows_f16_i64 measured10 inferred0…4 inferred
10 read no weight10 read no weight tensor of their layer
resolved
row(49,5)48 timing correlationthrough its node set0…93 inferredkernel_flash_attn_ext_vec_f16_dk128_dv128 measured5 inferred0…4 inferred
5 read no weight5 read no weight tensor of their layer
resolved
row(49,6)48 timing correlationthrough its node set0…93 inferredkernel_flash_attn_ext_vec_reduce measured94 inferred unjoined — no node of the graph names this kernel0…4 inferred
10 components · 47 read no weightattn_k.bias attn_k.weight attn_output.weight attn_q.bias attn_q.weight attn_v.bias attn_v.weight ffn_down.weight ffn_gate.weight ffn_up.weight 47 read no weight tensor of their layer
resolved
row(49,7)48 timing correlationthrough its node set0…93 inferredkernel_mul_mv_q4_K_f32 measured23 inferred0…4 inferred
5 componentsattn_k.weight attn_output.weight attn_q.weight ffn_gate.weight ffn_up.weight
resolved
row(49,8)48 timing correlationthrough its node set0…93 inferredkernel_bin_fuse_f32_f32_f32_4 measured24 inferred0…4 inferred
3 components · 9 read no weightattn_k.bias attn_q.bias attn_v.bias 9 read no weight tensor of their layer
resolved
row(49,9)48 timing correlationthrough its node set94…963 inferredkernel_mul_mv_q6_K_f32 measured40 inferred4…47 inferred
outside every block · 1963 absent — outside every block
2 componentsattn_v.weight ffn_down.weight
resolved
row(49,10)48 timing correlationthrough its node set94…963 inferredkernel_swiglu_f32 measured44 inferred4…47 inferred
44 read no weight44 read no weight tensor of their layer
resolved
row(49,11)48 timing correlationthrough its node set94…963 inferredkernel_rope_neox_f32 measured86 inferred5…47 inferred
86 read no weight86 read no weight tensor of their layer
resolved
row(49,12)48 timing correlationthrough its node set94…963 inferredkernel_set_rows_f16_i64 measured86 inferred5…47 inferred
86 read no weight86 read no weight tensor of their layer
resolved
row(49,13)48 timing correlationthrough its node set94…963 inferredkernel_flash_attn_ext_vec_f16_dk128_dv128 measured43 inferred5…47 inferred
43 read no weight43 read no weight tensor of their layer
resolved
row(49,14)48 timing correlationthrough its node set94…963 inferredkernel_flash_attn_ext_vec_reduce measured870 inferred unjoined — no node of the graph names this kernel4…47 inferred
outside every block · 2962 absent — outside every block 963 absent — outside every block
10 components · 435 read no weightattn_k.bias attn_k.weight attn_output.weight attn_q.bias attn_q.weight attn_v.bias attn_v.weight ffn_down.weight ffn_gate.weight ffn_up.weight 435 read no weight tensor of their layer
resolved
row(49,15)48 timing correlationthrough its node set94…963 inferredkernel_bin_fuse_f32_f32_f32_4 measured216 inferred4…47 inferred
3 components · 87 read no weightattn_k.bias attn_q.bias attn_v.bias 87 read no weight tensor of their layer
resolved
row(49,16)48 timing correlationthrough its node set94…963 inferredkernel_rms_norm_mul_f32_4 measured88 inferred4…47 inferred
outside every block · 1962 absent — outside every block
87 read no weight87 read no weight tensor of their layer
resolved
row(49,17)48 timing correlationthrough its node set94…963 inferredkernel_mul_mv_q4_K_f32 measured265 inferred4…47 inferred
7 componentsattn_k.weight attn_output.weight attn_q.weight attn_v.weight ffn_down.weight ffn_gate.weight ffn_up.weight
resolved
row(49,18)48 timing correlationthrough its node set94…963 inferredkernel_rope_neox_f32 measured86 inferred5…47 inferred
86 read no weight86 read no weight tensor of their layer
resolved
row(49,19)48 timing correlationthrough its node set94…963 inferredkernel_set_rows_f16_i64 measured86 inferred5…47 inferred
86 read no weight86 read no weight tensor of their layer
resolved
row(49,20)48 timing correlationthrough its node set94…963 inferredkernel_flash_attn_ext_vec_f16_dk128_dv128 measured43 inferred5…47 inferred
43 read no weight43 read no weight tensor of their layer
resolved
row(49,21)48 timing correlationthrough its node set94…963 inferredkernel_flash_attn_ext_vec_reduce measured870 inferred unjoined — no node of the graph names this kernel4…47 inferred
outside every block · 2962 absent — outside every block 963 absent — outside every block
10 components · 435 read no weightattn_k.bias attn_k.weight attn_output.weight attn_q.bias attn_q.weight attn_v.bias attn_v.weight ffn_down.weight ffn_gate.weight ffn_up.weight 435 read no weight tensor of their layer
resolved
row(49,22)48 timing correlationthrough its node set94…963 inferredkernel_get_rows_f32 measured2 inferred47 inferred
2 read no weight2 read no weight tensor of their layer
resolved
row(49,23)48 timing correlationthrough its node set94…963 inferredkernel_mul_mv_q4_K_f32 measured265 inferred4…47 inferred
7 componentsattn_k.weight attn_output.weight attn_q.weight attn_v.weight ffn_down.weight ffn_gate.weight ffn_up.weight
resolved
row(49,24)48 timing correlationthrough its node set94…963 inferredkernel_swiglu_f32 measured44 inferred4…47 inferred
44 read no weight44 read no weight tensor of their layer
resolved
row(49,25)48 timing correlationthrough its node set94…963 inferredkernel_bin_fuse_f32_f32_f32_4 measured216 inferred4…47 inferred
3 components · 87 read no weightattn_k.bias attn_q.bias attn_v.bias 87 read no weight tensor of their layer
resolved
row(49,26)48 timing correlationthrough its node set94…963 inferredkernel_rms_norm_mul_f32_4 measured88 inferred4…47 inferred
outside every block · 1962 absent — outside every block
87 read no weight87 read no weight tensor of their layer
resolved
row(49,27)48 timing correlationthrough its node set94…963 inferredkernel_mul_mv_q6_K_f32 measured40 inferred4…47 inferred
outside every block · 1963 absent — outside every block
2 componentsattn_v.weight ffn_down.weight
resolved

The token passes when every interval of its pass resolves: no hop of any chain, for any candidate, is a gap.

the token passes · 58 of 58 passes of the run resolve every interval

run evidence

What this run does not carry

· 61

Everything this run could not measure, with the bundle's own reason. Entries that share a reason and a pointer pattern are grouped; open a group for its full list of pointers. The same reasons appear again in the lens where each value would have been.

/dimensions/quality · 1
  • absent — a lab Performance capture carries no Quality payload
/dimensions/security · 1
  • absent — a lab Performance capture runs no confinement probe
/dimensions/operability · 1
  • absent — no Operability payload schema yet
/dimensions/performance/graph/nodes/*/placement · 2
  • absent — outside every block
  • absent — outside every block
/dimensions/performance/run/passes/*/bufs/*/gpu_start_ms · 56
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval
  • absent — the instrument recorded no GPU interval