Skip to content
Français

Follow a run and inspect failures

Choose live progress, stored journals or recovery tools for the information you need.

Every dispatch writes a journal. result.logReference points at the finished one; readJournal() returns its events.

import { createLocalTransport, dispatch } from "@elie-laloum/outpost";
import { repository, sandboxProvider, coder } from "./outpost.config.ts";

export const transporter = createLocalTransport({
  directory: ".outpost/storage",
});
export const result = await dispatch({
  repository,
  sandboxProvider,
  agent: coder,
  brief: { text: "Describe the repository without changing it." },
  logging: { transporter },
});
import { reportValue } from "./reporter.ts";
import { result, transporter } from "./record-journal.ts";
import { readJournal } from "@elie-laloum/outpost";

if (result.logReference) {
  const events = await readJournal({
    transporter,
    reference: result.logReference,
  });
  reportValue(events.length);
  // Example output: 12
}

Without logging, the journal goes to a local transport under <repository>/.outpost/storage. Record the run with the replay options and the same journal becomes a deterministic test.

WhatWhereKept when
Worktree.outpost/workspaces/The run failed, integration conflicted, or it is dirty
Remote transfer.outpost/recovery/Cloud changes could not be applied to your checkout
Conversation.outpost/conversations/ or the agent’s own storeAfter each turn and on failure
Workflow progress.outpost/storage/ or your transportAfter each finished task

A retained worktree is an ordinary Git worktree on its branch: open it, commit what you keep, merge the branch.

  • Sink delivery is bounded and may report loss. It is a stream of observations, not a durable state registry; usage accounting stays independent of it.
  • A journal shares the hub’s bounded queue. A transport that fails or falls behind can leave events out, and readJournal() then returns only what was written before the failure.
  • Journals hold prompts, agent messages and tool results, so they contain repository content. Store and share them like the code.
  • A replay reproduces a recorded run only. A prompt, baseline or tree that differs throws ReplayDivergence instead of inventing events.
  • Recovery is explicit. Outpost never discards a dirty or detached worktree as routine cleanup, and a cleanup timeout leaves resources pending.
  • Digests and lineage give integrity, not authentication: they prove a file is unchanged, not who produced it.

API: createObservationHub · ObservationHub · createOpenTelemetryObserver · readJournal · Logging · createReplayAgent · recoveryDetails · inspectRecovery.