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.
Journal Records
Section titled “Journal Records”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.
Reading Back Data
Section titled “Reading Back Data”You can load and inspect journal data offline using the OmniLoop API:
from omniloop import load_events, JournalPlayer
# Iterate over eventsfor e in load_events("run.omni"): print(e["tick"], e["kind"], e["event"])
# Sequential playbackplayer = JournalPlayer("run.omni")rec = player.read_next_record()# Example output:# {"kind": "telemetry", "tick": 0, "mono_ns": ..., "wall_ns": ..., "payload": b"..."}Exporting Tuned Configurations
Section titled “Exporting Tuned Configurations”You can export the final mutated state of your parameters (a “tuned config”) either live or from a recorded journal:
# Live export during a runloop.export_tuned_config("tuned.yaml")
# Offline export from a journalfrom omniloop import export_tuned_config_from_journalexport_tuned_config_from_journal("run.omni", "tuned.yaml")