Reading the logs
Where AutoDev writes what it did and why, the files it keeps, the events that explain a stop, and how the files are rotated.
events.jsonl #
events.jsonl is the append-only record of everything AutoDev did. It lives on the machine side, in ~/.autodev/<project>-<hash>/, where the folder is your project folder's name followed by a hash of its full path. Where state lives lists what else is in it.
Each line is one JSON object with these fields: ts, level (info, warn or error), type, message, and, when they apply, role, task and data. A task label is cut to 200 characters. The reason a run paused or stopped is one of these events, and the report reads the last of them to print its first line.
These are the types that explain a stop or a wait:
| Type | What it says |
|---|---|
loop.budget, loop.max, loop.stuck, loop.wait_expired | A ceiling: spend or runtime, iterations, no progress, or a wait that lasted too long. |
loop.infra_retry, loop.infra_giveup, thread.turn_failed | A turn that failed, the retry that follows, and the pause after 12 in a row. |
thread.no_post, thread.silent_participant, loop.silent_participant | A turn that ended without a post, and the pause after three. |
loop.accept_exhausted, loop.talk_exhausted, loop.no_team | A pause for review: the audit, a thread with no work in it, or no team. |
loop.gated, gate.requested, gate.approved, gate.denied, gate.auto_approved, loop.gate_failed | A gate, and what became of it. |
loop.awaiting_user, loop.completed, loop.stopped, loop.paused | The run gave the turn to you, finished, or was stopped or paused. |
step.error, loop.error, supervisor.restart, supervisor.giveup | A crash, the restart after it, and the point at which AutoDev stops restarting. |
failover.switched, failover.routed, failover.exhausted, provider.unreachable, provider.reachable | A limit, or an outage, and where the turn went. |
quota.record_failed | The quota ledger could not be written. The call still succeeded. |
serve.tunnel, serve.tunnel_failed, serve.tunnel_down, serve.port_taken | The phone server and its tunnel. |
The run stopped and why lists the messages of the ones that stop a run.
daemon.log #
logs/daemon.log, in the same folder, mirrors the events for a person to read. One line is one event:
<ts> [WARN] <type> (<role> · <task>): <message>
An info event has no level tag, and a warn or error event has [WARN] or [ERROR]. The (<role> · <task>) part is left out when the event has neither. What the detached process itself prints, an unhandled error included, is appended to the same file. To read the end of it in a terminal:
Get-Content <folder>\logs\daemon.log -Tail 50
Both files are rotated when events.jsonl passes 10 MiB. Each is renamed to the same name ending in .1, and the previous .1 is deleted, so one older generation is kept. A detached autodev serve, and the server the panel starts, write to their own logs/serve.log, which is not rotated.
The quota ledger is a different file, in ~/.autodev/, and it never rotates. Where the ledger lives describes it.
The VS Code output channel #
The extension writes its own notes to an Output channel named AutoDev. It records that the extension activated, and where it loaded its core from. It also records errors from its periodic refreshes, prefixed status tick: and fleet tick:, errors from moving state, prefixed migrate:, from the provider probe, prefixed probe:, and from pairing, prefixed pairing:. chrome disabled: could not load ... and FAILED to load the core mean the extension core could not load. That channel is the extension's log, and it is separate from the files above.
This page does not describe every message the extension writes there.