Skip to content

Dashboard UI

A few dashboard surfaces aren’t tied to your telemetry schema — they’re always present and reflect the state of the connection and the loop itself.

File → Load Trace lists the .omni journals the server can already see: its working directory, an adjacent examples/, and any directory passed via OMNILOOP_TRACE_DIRS.

Above that list is Open .omni file…, which takes a journal from anywhere on disk — a file picker, or drop the file straight onto the zone. The trace is uploaded to the server, stored in a per-session directory under your system temp dir, and loaded through the same path as any other trace.

This is what makes the bug-report workflow work from the receiving end. A colleague’s omniloop_blackbox_<ts>.omni opens as-is; you don’t need shell access to move it somewhere the server was already looking.

  • Uploads never overwrite a journal you recorded yourself — they land only in the upload directory, even if the names collide.
  • The filename is reduced to a safe bare name, so nothing in it can steer the write elsewhere.
  • Uploads are capped at 512 MB, and require the same OMNILOOP_AUTH_TOKEN as every other HTTP endpoint when one is configured.
  • Re-uploading the same name replaces the older copy, so re-sending a corrected dump does what you expect.

Every numeric readout in the parameter panel has a small ◎/◉ toggle next to it. Clicking it arms (◉) or disarms (◎) a watchpoint that halts the loop the instant that variable goes non-finite (NaN/Inf), without writing any code. This is the UI equivalent of calling tracker.add_watchpoint(name, "non_finite") — clearing it from the dashboard clears the same watchpoint.

A collapsible panel (bottom of the dashboard) that keeps a rolling, reverse-chronological history of info, error, and watchpoint-trip events for the session. Click the header to expand or collapse it; a badge shows the pending count. Use Clear to empty the history. Unlike a transient toast/banner, nothing here is dropped if you’re not looking at the moment it fires.

A small “IPC” pill near the connection status. It reflects the health of the shared-memory channel between your instrumented process and the dashboard:

  • Unknown (gray) — the IPC stats endpoint isn’t reachable yet.
  • Healthy — no state, just the plain badge.
  • Unhealthy (red) — one or more of the underlying counters is non-zero.

Hovering shows the raw counters from tracker.stats():

Counter Meaning
telemetry_torn_reads Reads that raced a concurrent write and were retried
telemetry_skipped Telemetry frames the dashboard skipped (e.g. behind on rendering)
command_ring_full Mutation/command writes dropped because the ring buffer was full
command_corruption_errors Command records that failed integrity checks on read

A non-zero command_ring_full or command_corruption_errors usually means the dashboard is issuing mutations/commands faster than the instrumented process drains them — check for a stalled wait_if_halted()/tick() loop.