Isolated workspace
Every loom run --local execution creates an isolated workspace — a disposable, on-disk snapshot of your repository that serves as the execution context for all jobs in the run. This is what makes local runs behave like CI: your jobs run against a known, reproducible state rather than whatever happens to be on your machine.
If a run fails, the fastest debugging path is: copy the isolated workspace path from the output, cd into it, and inspect from there.
Why it exists
The isolated workspace solves the "works on my machine" problem for local runs:
- Reproducibility — jobs run against a consistent snapshot of your repo, not your live working tree with its accumulated local state.
- CI parity — the snapshot mimics what a CI system would check out, so failures you see locally are the same failures CI would catch.
- Safe experimentation — you can inspect, modify, and re-run inside the snapshot without affecting your main checkout.
What gets snapshotted
The snapshot is designed to reflect "what CI would see" while still including your uncommitted work:
| Source | Included? | Details |
|---|---|---|
HEAD commit | Yes | Loom clones the repo and checks out HEAD in detached mode |
| Modified tracked files | Yes | Dirty changes to tracked files are copied into the snapshot |
| Added/renamed tracked files | Yes | Staged additions and renames are applied |
| Deleted tracked files | Yes | Tracked deletions are removed from the snapshot |
| Untracked, non-ignored files | Yes | Files visible to git status (not in .gitignore) are copied |
| Gitignored files | No | Files matched by .gitignore are excluded |
| Symlinks | Preserved | Symlinks are copied as symlinks (targets are not dereferenced) |
| Non-regular files | No | Devices, sockets, and other special files are not supported |
Key takeaway: if your run behaves differently in the isolated workspace than in your checkout, ask: "Was I depending on a gitignored file?" That's the most common cause.
How to use it
1. Find the path
Local runs print the isolated workspace path near the start of output:
isolated workspace: /tmp/loom-run-local-1772666574190575000-3847261095
Copy this path. It's your entry point for all debugging.
2. Inspect the snapshot
The snapshot looks like a normal repo checkout with a .loom/.runtime/ directory for run artifacts:
/tmp/loom-run-local-<run_id>-*/
apps/
libs/
packages/
.git/ # real git clone (detached HEAD)
.loom/
.runtime/
logs/ # structured run logs
receipts/ # run receipt JSON
3. Check run artifacts
After the run completes, start debugging from .loom/.runtime/:
| Artifact | Path | What it tells you |
|---|---|---|
| Receipt | .loom/.runtime/receipts/<receipt>.json | Run metadata, status, pointers to logs |
| Pipeline summary | .loom/.runtime/logs/<run_id>/pipeline/summary.json | Overall pass/fail, job statuses |
| Job manifest | .loom/.runtime/logs/<run_id>/jobs/<job_id>/manifest.json | Pointers to the failing step's events |
| Step events | .loom/.runtime/logs/<run_id>/jobs/<job_id>/user/script/<NN>/events.jsonl | Detailed output for a specific step |
| Job artifacts | .loom/.runtime/logs/<run_id>/jobs/<job_id>/artifacts/ | Extracted files when artifacts: is configured |
For the full navigation flow, see Runtime logs and Receipts.
4. Reproduce failures
Before changing anything in your main checkout, try reproducing from inside the isolated workspace:
cd /tmp/loom-run-local-<run_id>-*
loom run --local --workflow .loom/workflow.yml
This ensures you're testing against the exact same snapshot context. Avoid "fixing" problems by accidentally relying on files outside the snapshot (local configs, untracked files, environment-specific state).