Skip to main content
When an agent run fails, the goal is not only to see the error. The goal is to recreate the state that produced it. hiloop gives you the pieces:
  • run id;
  • lineage path;
  • sandbox id;
  • command stdout, stderr, and exit code;
  • image reference and digest;
  • workspace storage class and snapshot source when one was used;
  • telemetry events.

Collect identifiers

If you only have a run id, start with telemetry:

Inspect failure signals

Look for process output, logs, or failed network responses:
$RUN_ID / $LINEAGE_PATH here are hiloop-generated identifiers (a ULID and a dotted path of run ULIDs), so they contain no quotes and are safe to interpolate. When you embed a user-supplied string in --sql, single-quote-escape it (double any ') — or use the --run-id / --signal flags, which build the SELECT and quote values for you.
For process output:
Scope that to one lineage subtree by writing the same prefix predicate in --sql.

Ask the platform what happened

The sandbox’s run also carries the platform’s own record of the failure — runtime lifecycle events flow independently of workload capture. operation.failed names a stable error.code, and sandbox.state_changed / sandbox.preempted show whether the sandbox itself moved underneath the run:
The execution response is the source of truth for the sandbox command and exit status; the ambient run is its correlated, best-effort telemetry record.

Inspect the command’s outcome

There is no separate execution resource to fetch. hiloop sandbox exec returns the outcome directly, with stdout and stderr separated and the real exit code:
For a command wrapped locally by hiloop run, or run through a sandbox’s managed exec boundary, the captured exec signal carries the same ground truth after the fact:

Inspect sandbox state

Record:
  • state, and state_reason when the sandbox failed or was quarantined;
  • image (or snapshot_id) as resolved at admission;
  • storage_class;
  • resources, the compute shape resolved at admission;
  • metadata;
  • lineage_path.

Re-run with diagnostics

Run the smallest command that reproduces the failure:

Compare runs

Compare the failed run to a known-good run. Events unique to the failed run are an anti-join on signal, name, and attributes:
Then compare model calls by swapping a.signal = 'exec' for a.signal = 'llm'. See Compare two runs for the reverse difference.

Checklist

  • Same image digest.
  • Same source commit.
  • Same snapshot source when applicable.
  • Same command arguments.
  • Same environment variables, excluding rotated secrets.
  • Same model configuration unless you are testing model sensitivity.
  • Same input artifacts.
  • Same resource class unless you are testing resource sensitivity.