DOCS · REFERENCE · COMMANDS · BUILD

list-loops/synthex:list-loops

Build

Enumerate running and recent loops in the project. Read-only.

Invocation

Run from inside Claude Code in any project where Synthex is installed:

/synthex:list-loops

Some commands accept parameters; see the source-of-truth file linked below for the full parameter list and workflow.

Lifecycle phase

Build. Parallel-executed, peer-reviewed task delivery.

Source

The command's parameters, workflow, and sub-agent invocations are defined in markdown at bluminal/lumenai/blob/main/plugins/synthex/commands/list-loops.md.

Last modified:

What it does, end-to-end

list-loops/synthex:list-loops enumerates the loops tracked in <project>/.synthex/loops/ — running first, then recent terminal-status loops. Output is short, human-readable, and read-only. Loops moved to .synthex/loops/.archive/ are intentionally excluded; to inspect the archive, list the directory directly.

The command takes no arguments and never mutates any state file. If no .synthex/loops/ directory exists yet, it prints No loops in this project. and exits 0.

Output format

RUNNING (2):
  next-priority-3f2a   iter 5/20    started 2h ago    session abc12345
  team-implement-7e1d  iter 11/30   started 4h ago    session (none, resumable)

COMPLETED (3):
  refine-requirements-9b22  completed (promise)  iter 3/20    finished 1h ago
  loop-write-rfc-1a08       max-iterations       iter 20/20   finished 30m ago
  team-plan-4c66            cancelled            iter 6/15    finished 5m ago

Each block is omitted entirely when empty (no RUNNING (0): header).

Sort and truncation rules

  • RUNNING loops sort by last_updated descending (most-recently-touched first).
  • TERMINAL loops sort by exited_at descending (most-recently-finished first), capped at the 20 most-recent entries. If more exist, a final line names the truncation count: … and N more terminal loops (see .synthex/loops/.archive/).
  • Session column shows the first 8 characters of the loop's session_id; if the loop's session is no longer running (or session_id is null), it shows (none, resumable) to signal that you can --resume it from any session.

Common scenarios

"Did my loop survive my laptop crash?"

Re-open Claude Code in the project and run list-loops/synthex:list-loops. Any loop with status: running shows up under RUNNING. Resume it with <SlashCommand verb="loop" /> --resume <loop-id> (or --resume-last if you don't recall the name).

"Why isn't my loop terminating?"

Check the iter count. If it's incrementing as expected but the completion-promise hasn't fired, the issue is the workflow's emission logic — the iteration framework itself is fine. If iter is stuck at the same number across multiple list-loops checks, the iteration is hung; cancel it with cancel-loop/synthex:cancel-loop.

"What's still cluttering my archive?"

This command excludes .archive/ by design. To inspect the archive run a normal directory listing on .synthex/loops/.archive/ — entries are JSON state files named <loop-id>-<timestamp>.json.

What it does not do

  • Recurse into .archive/. Archived loops are historical; surfacing them in the active list would defeat the archive's purpose. Use a direct directory listing instead.
  • Mutate any state file. Read-only by contract.
  • Surface malformed state files as errors. The command best-effort-skips unparseable files and lists them in a final WARNINGS: block instead of aborting.

See also

  • Native looping — the full framework explainer.
  • loop/synthex:loop — start or resume a loop.
  • cancel-loop/synthex:cancel-loop — cancel a loop by id or --all.