Skip to main content

Runtime logs

Runtime logs are Loom's structured runtime record for loom run --local. They are designed for pointer-first diagnosis: start with a receipt, open a few small JSON documents, and land on the exact failing phase or step without scanning the whole run output.

What changed in the current runtime model

Loom now records runtime progress as phases, not just broad job or step markers.

That means the log tree can answer three different questions cleanly:

  • What failed?
  • Which phase did it fail in?
  • Was the runtime timeline itself valid?

How the pieces fit together

Use the receipt and manifests to find the right file first. Use the event streams only after you know which unit to inspect.

The files that matter most

FileWhy you open it
pipeline/summary.jsonConfirm pass or fail at the pipeline level
pipeline/manifest.jsonIdentify the first failing job and top-level artifact pointers
jobs/<job_id>/manifest.jsonBranch to either a failing step or a failing system section
jobs/<job_id>/user/execution/script/<NN>/events.jsonlRead the failing user-step evidence
jobs/<job_id>/system/<section>/events.jsonlRead provider, cache, artifact, or cleanup evidence
phase-report.jsonValidate phase coverage and ordering across the whole run

What phase-driven logs buy you

NeedBest artifact
Find the failing job quicklypipeline/manifest.json
Find the failing commandfailing_step_events_path in the job manifest
Understand provider or cache failuresystem_sections[].events_path in the job manifest
See whether cache or artifact work was skippedSection summary.json or the matching manifest entry
Check whether Loom emitted the expected phase boundariesphase-report.json

Runtime phases you can rely on

The current runtime contract uses a small set of stable phase identities:

ScopePhase codePractical meaning
runrun.bootstrapLoom captured run context and workspace attribution
pipelinepipeline.executeThe pipeline body
jobjob.provider_prepareProvider and pre-execution setup
jobjob.cache_restoreOptional restore work before execution
jobjob.artifact_restoreThe current artifact_extract section, normalized into an artifact phase
jobjob.executionUser execution envelope for the job
stepexecution.scriptOne script step
jobjob.cache_saveOptional post-execution cache write
jobjob.cleanupJob cleanup
runrun.finalizeFinal contract-artifact writeout

Not every job emits every optional phase. The point is that when the work happens, it is named consistently.

How to read an event stream

Every events.jsonl file is newline-delimited JSON. The current runtime contract uses three core event kinds:

EventWhat it means
phase_startA phase boundary opened
outputLoom captured output inside that phase
phase_finishA phase boundary closed, with status and duration_ms

Typical fields to watch:

FieldWhy it matters
scopeTells you whether the record is run, pipeline, job, section, or step scoped
phase_codeStable identity such as job.execution or job.cache_restore
phase_familyBroad family such as user, cache, or artifact
messageThe actual output line for output events
status, exit_codeThe outcome on phase_finish
metricsStructured skip or telemetry details on phase_finish

Skip behavior is explicit

Loom records skips as data, not silence.

Where to lookWhat you will see
System section summaries and manifest entriesstatus: "skipped" plus skip_reason and metrics.skipped: true when Loom explicitly skipped that work
Cache phasesMetrics such as hit, cache_name, cache_key, and skip_reason
Artifact phasesMetrics such as file_count, archive_path, and skip_reason
Jobs that never ranA skipped cleanup boundary rather than an absent job record

That makes it much easier to distinguish "not applicable", "skipped by policy", and "failed".

Fast triage path

For most failures, the shortest path is:

  1. Open the receipt and follow logs_dir.
  2. Open pipeline/summary.json.
  3. Open pipeline/manifest.json.
  4. Open the failing job's manifest.json.
  5. Read the pointed events.jsonl.
  6. Open phase-report.json only if you need coverage or ordering detail.

Sharing guidance

When you need help:

  • Share the receipt path first.
  • Then share one pointed events.jsonl path, not the whole log tree.
  • Include phase-report.json only if the issue is about missing or out-of-order phases.