Skip to content

Runs & statuses

A run is one execution of a pipeline for one issue (or task). It records the issue, the workspace and branch, every step’s status, output and logs, the cost and tokens, and links found in the output. Runs are listed on the Runs page and the Dashboard; see Runs in the app for the UI.

Field Meaning
Number Sequential across all pipelines (#1, #2, …). Available as {{run.number}} and $FACTORY_RUN_NUMBER.
Id Internal id (run_…). {{run.id}}, $FACTORY_RUN_ID.
Pipeline The pipeline name, plus a snapshot of its definition taken when the run was created.
Trigger Manual, or the trigger that started it (Linear, Jira, GitHub, Schedule, Webhook).
Issue Key, title, description, URL, labels, and provider-specific fields.
Workspace / branch Set once the workspace is prepared.
Cost / tokens Summed over every attempt of every step, for harnesses that report them (Claude Code, Codex, the API harnesses, the Simulator).
Links Pull requests, merge requests and previews detected in step output.
Error For failed runs, which steps failed and the first error.
Status UI label Meaning
queued Queued Created and waiting for a slot. Limited by Settings → Max concurrent runs (default 3) and the pipeline’s Max concurrent runs.
preparing Preparing The workspace is being prepared (worktree, clone, folder).
running Running Steps are executing.
awaiting_approval Needs approval At least one approval step is waiting and no step is running.
succeeded Succeeded Every step succeeded, was skipped, or failed with Continue on error.
failed Failed A step failed without Continue on error, workspace setup failed, or the app was closed mid-run.
cancelled Cancelled You cancelled it (while queued or active).
queued ─► preparing ─► running ⇄ awaiting_approval ─► succeeded
│ │ │ └► failed
│ └───────────┴──────────────────────────► failed / cancelled
└──────────────────────────────────────────────────► cancelled

succeeded, failed and cancelled are terminal. A terminal run can be retried, which puts it back to queued. queued, preparing, running and awaiting_approval count as active.

A run that was active when the app quit becomes Failed at the next launch, with the error “Interrupted: the app was closed while this run was in progress. Use Retry to resume.” Its running and waiting steps become Cancelled. Queued runs are simply queued again.

Status UI label Meaning
pending Pending Not started yet, or reset by a loop or retry.
running Running An agent or shell attempt is in progress (including backoff between retries).
awaiting_approval Needs approval An approval step is waiting for a decision.
succeeded Succeeded The step passed (exit code 0 / approved / verdict passed).
failed Failed All attempts failed, the verdict failed, or the approval was rejected, and no loop-back remains.
skipped Skipped The step didn’t run. See skip reasons below.
cancelled Cancelled The run was cancelled or interrupted while the step was pending, running or waiting.

A skipped step records why:

  • Condition: its Run only if template rendered falsy. The error reads Condition not met: <template>. Steps that depend on it still run.
  • Upstream: a dependency failed or was cancelled (without Continue on error), or was itself skipped for an upstream reason. The error reads “Skipped because an upstream step failed”. This propagates down the graph.

Each time a step executes, it records an attempt with its own log file, start and finish time, exit code, status and error. Two counters distinguish why a step ran again:

  • Attempt number increases on every execution: retries after failures, loop-backs and run retries all add attempts.
  • Iteration (the loop number) increases each time the step is reset by a feedback loop. It’s available in templates as {{loop.iteration}} (0 on the first pass).

On the run page, the step’s attempt selector shows entries like Attempt 3 (loop 1) · succeeded, and the Details tab lists all attempts.

  • Agent steps: the harness’s final answer. For structured formats (Claude Code stream-json, Codex JSON, Pi JSON) it’s the parsed result; for text output it’s the process’s stdout; for API harnesses it’s the response text.
  • Shell steps: stdout and stderr lines combined, trimmed.
  • Approval steps: the approver’s comment (empty if none).

Only the last 20,000 characters are kept as the step’s output. Longer output is prefixed with …[N earlier chars omitted]. The full stream is in the step’s logs. The output is what {{steps.<id>.output}} returns and what pass/fail patterns are matched against.

The Prompt / Command / Message tab shows the rendered input of the last attempt.

Jimothy scans step output for links and shows them as buttons in the run header:

Pattern Button label
https://github.com/<owner>/<repo>/pull/<n> PR #<n>
https://gitlab.<host>/…/-/merge_requests/<n> MR !<n>
https://bitbucket.org/<owner>/<repo>/pull-requests/<n> PR #<n>
https://<name>.vercel.app Preview

So a shell step that runs gh pr create (which prints the PR URL) automatically gives the run a PR button.

Each step records cost (USD) and tokens (input, output, cache read, cache write) when its harness reports them. They’re summed per step across attempts and per run across steps, and feed the Dashboard’s spend KPIs. Harnesses with plain text output don’t report cost or tokens.

A run can be deleted from its page once it’s no longer active (“Cancel the run before deleting it” otherwise). Deleting a run removes its record and logs, not its workspace. Deleting a pipeline keeps its existing runs.