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.
Opening a Trace
Section titled “Opening a Trace”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_TOKENas 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.
Watchpoint Toggle
Section titled “Watchpoint Toggle”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.
Event Console
Section titled “Event Console”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.
IPC Health Badge
Section titled “IPC Health Badge”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.