cyberine
UsageRun recipes

Durable worker transcripts — cyberine transcript

A loop worker's events.jsonl is telemetry, not a transcript: each entry's detail is a 120-character slice of the prompt, so when a fleet worker fails there was previously no way to see what it was actually told, what a tool returned, or where it went wrong. Every loop worker (LoopAgentAdapter) now records its own durable, incremental transcript — the full sequence of messages the model saw, redacted (src/core/redact.ts) and flushed to disk one round at a time so a killed worker still leaves a readable partial record up to its last completed round.

cyberine transcript <runId>                       # single worker in the run — prints it directly
cyberine transcript <runId> <stepId>__<agentId>    # pick one worker when a run has several

Transcripts live at .local/runs/<runId>/<stepId>__<agentId>.transcript.jsonl, one JSONL line per recorded round ({ at, seq, messages }). Recording is unconditional for any loop worker dispatched through WorkflowEngine (no env flag to enable it) — Task.transcriptSink, set by WorkflowEngine.runWorker, is the wiring point; a task dispatched outside the engine (Orchestrator.dispatch, a standalone script) simply has no sink and records nothing.

Known Limitations and Deferred Work (src/adapters/LoopAgentAdapter.ts's transcript flush, src/store/RunStore.ts's appendTranscript). The log is a passive RECORD only — resuming a worker's live message history FROM its transcript (making the log authoritative) is a deliberately separate, larger decision, not implemented here. There is no retention/cleanup: transcript files live exactly as long as their run directory does, with no independent sweep of their own (mirrors .output tail files' existing lifecycle). A worker that hits its historyCompressionBudget and compacts (see COMPACTION-SPILL, src/core/historyCompression.ts) still records every message it ever SAW in the transcript, even messages later dropped from the live in-memory history by compaction — the transcript is a append-only record of the conversation as it happened, not a mirror of the adapter's current working context.