loom logs
Read one recorded run from the repository root or any of its subdirectories:
Use loom runs to discover saved IDs first, then choose
the run to inspect explicitly.
loom logs <run_id>
loom logs <run_id> --state
loom logs <run_id> --tail 30
loom logs <run_id> --json
loom logs <run_id> --all --json
loom logs <run_id> --job build --step build:script --command script-01
loom logs <run_id> --job build --stream stderr --tail 10
loom logs <run_id> --job build --level error --tail 10
The default prints source lines with time, job, step, command and stream context. Adjacent output chunks from the same context, level and stream are joined into lines; every line gets a prefix, including blank lines and final fragments. A line uses its first chunk's time. A context, level or stream change, or a structured message, ends any pending fragment before printing the next event.
--state prints state transitions, including recorded errors as quoted text with
escaped newlines. --json prints each complete raw record as JSON, preserving
message chunks. --tail N selects the last N records before rendering; zero
shows all matching records. Exact --job, --step and --command ID filters
work with both state and events. Events also accept exact --level and
--stream filters. All supplied filters must match and apply before --tail.
Raw stdout and stderr output is recorded at info level; structured command and
job failure summaries use error level and have no stream. Use --stream stderr
to read stderr output or --level error to read failure summaries. Combining both
filters requires a record to match both and does not select either category.
Event level and stream filters cannot be combined with --state.
--all explicitly requests every matching event and reports matched,
returned and complete record counts on stderr. Its stdout keeps the usual
text or JSONL format. It cannot be combined with --tail or --state.
Completeness covers complete records available during this read; a live run can
append more afterward.
Successful artifact publication records an artifact archive created message
for its producer, with format, path, size_bytes, sha256 and
decoded_size_bytes. The digest covers the original compressed archive bytes;
size_bytes is their count, and decoded_size_bytes counts the complete tar
stream, including headers, padding and end records. Read all producer events:
loom logs <run_id> --job <producer-job-id> --all --json
These values come from the publication writer after publication and temporary
source cleanup succeed. Known secrets can mask digest or path text. The recorded
message keeps the original publication identity when stored archive bytes later
change; artifact inspection describes the currently
opened file. MCP exposes the same canonical messages through
loom_read_events with all: true.
If stderr does not explain a command failure, read the command scope across all streams. Tools such as nested task runners may put their diagnostics on stdout.
The command locates the repository root before opening recorded files.
It reads only .loom/.runtime/runs/<run_id>/state.jsonl or
events.jsonl. It does not execute a workflow. Run IDs cannot contain path
separators. Escaping symlinks and nonregular files are rejected.
An unfinished final JSON record is ignored, so interrupted runs remain readable. A malformed complete record returns an error. See Runtime logs for record fields, or MCP tools for structured tool responses.