Skip to content

Journals & Replay

OmniLoop journals record the entire lifecycle of a training session. In v2, journals are not just a stack of telemetry frames; they interleave typed event records into the same stream, providing a unified timeline of data and control.

Every record in the journal carries the tick of the telemetry frame it belongs to.

Kind Payload (JSON) Written when
telemetry the state frame every published tick
mutation {"name", "old", "new", "source"} a parameter changes
control `{“event”: “freeze_on_exception” “watch_trip”
lifecycle `{“event”: “session_start” “session_end”, …}`
hash 8-byte LE FNV-1a 64 every hash_every ticks

TrainingLoop writes all of this automatically when initialized with a journal= path.

You can load and inspect journal data offline using the OmniLoop API:

from omniloop import load_events, JournalPlayer
# Iterate over events
for e in load_events("run.omni"):
print(e["tick"], e["kind"], e["event"])
# Sequential playback
player = JournalPlayer("run.omni")
rec = player.read_next_record()
# Example output:
# {"kind": "telemetry", "tick": 0, "mono_ns": ..., "wall_ns": ..., "payload": b"..."}

You can export the final mutated state of your parameters (a “tuned config”) either live or from a recorded journal:

# Live export during a run
loop.export_tuned_config("tuned.yaml")
# Offline export from a journal
from omniloop import export_tuned_config_from_journal
export_tuned_config_from_journal("run.omni", "tuned.yaml")