Skip to content

Logs, errors and worker effort

Where Empryo shows errors, model calls and compactions, what the reasoning effort next to each worker's model means, and where the error log file lives.

Tools5 minutes to read
Copy & share
On this page9 sections

Empryo keeps three logs while it runs: errors, model calls and compactions. One viewer shows all three in the terminal UI and in the desktop app. Next to every worker's model you also see the reasoning effort its requests actually carry, so you can tell at a glance which helper ran on what.

Effort next to the modelLink to this section

Wherever a worker's model is shown, its reasoning effort is shown beside it as model · effort. The effort is the level the request actually carried after every default was applied: an explicit effort on the task, then the agent definition, then the router lane, then your config, then the model's own default. When the model has no effort control, or no level was sent, nothing is shown.

SurfaceWhere you see it
Terminal UISubagent rows under a dispatch, and the /subagents panels for live and background agents. Narrow terminals drop the effort before they drop the model.
Desktop appThe subagents drawer, agent detail, inline dispatch cards, the events tab, engine runs and the nodes of an orchestration graph
HeadlessThe role · model · effort progress line printed to stderr when each subagent starts, and the effort field on background-status, agent-activity and model-call events with --events

To change a worker's effort, set effort in its agent definition, on the task router lane, or with --effort for a headless run.

The model-call logLink to this section

Every model call Empryo makes is recorded with the model, the lane that made it, the effort, when it started, how long it took, tokens in and out (including cache reads and writes) and whether it succeeded. The lane says who made the call:

LaneWho made the call
mainA tab's own turn
subagentA blocking dispatch or explore worker
backgroundA detached background agent
councilA council seat
advisorAn advisor consult
orchestrationA node in an orchestration graph
reviewThe reviewer
goal-reviewThe goal-loop reviewer
marionetteThe Marionette pre-pass
web-searchThe web-search worker
compactionA compaction summary
namerThe tab and session namer
desloppifyThe post-dispatch desloppify pass
verifyThe post-dispatch verifier
embedAn embedding call
typesafeA TypeSafe classifier or pilot call
linkA consult started through agent_link
routineA routine pre-pass
otherAnything not named above

The same lane and effort are written to the usage ledger rows behind /usage, so spend can be broken down by who made the calls.

The log viewerLink to this section

Terminal UILink to this section

/errors

/logs does the same. The viewer has three tabs: Errors, Model calls and Compactions. Press Tab or a digit to switch.

KeyAction
/Search the current tab. Enter or Esc leaves the search box
fMove to the next filter
Change the selected filter's value
xClear the search and every filter
EnterOpen the selected row in a detail view. Esc goes back
Ctrl+YCopy the selected row, or the open detail
rModel calls tab only: start or stop recording
EscClose

Each tab has its own filters. Errors filter by source. Model calls filter by lane, model, effort, state and tab. Compactions filter by kind.

Model calls are recorded only while recording is on. It is off when Empryo starts and stopping it clears what was recorded, so leave it off unless you are looking into something. Errors and compactions are always recorded. /compact logs opens the same viewer on the Compactions tab.

Desktop appLink to this section

The Logs view lives in the context pane, with the same three sections: Errors, Model calls and Compactions. Each section has a search box, filters and a detail view per row. Open it from the command palette, by typing /errors or /logs in the composer, or by clicking the error indicator in the status bar.

Errors that used to be hiddenLink to this section

Failures inside Empryo that used to be swallowed are now reported: the code index and its language servers, tools, sessions, memory and the desktop app's main process all report unexpected failures to the same place. In the terminal UI they appear on the Errors tab, in the desktop app in the Logs view, and in headless runs on stderr.

Some of these are settings you wrote that are not in effect, such as a project config.json that cannot be parsed. Those are reported once per breakage and again only after the file is fixed and breaks again, not on every turn that reads it.

The durable error logLink to this section

Everything the Errors tab shows is also appended to a file, so a report about a freeze or a crash always has something to attach:

SystemPath
macOS and Linux~/.empryo/logs/errors.jsonl
Windows%LOCALAPPDATA%\Empryo\logs\errors.jsonl

One JSON object per line, with a timestamp, the surface that wrote it (tui, headless, desktop-bridge, hearth), the source and the message. The desktop app redacts keys and bearer tokens from provider errors before they are written. The file rotates to errors.jsonl.1 at 2 MB, a line that repeats within a second is written once, and a single session writes at most 2,000 lines.

Other debug toolsLink to this section

/diagnose runs a health check of the language servers, code parsing and semantic indexing for the current project. In the desktop app it has two tabs, Health and Setup, and an Export debug bundle button that collects logs and crash reports into your Downloads folder. The same export is in the command palette.

The desktop app also has a live-logs console that streams the app's own log as it runs. It exists only when the app is launched with --debug, --logs or EMPRYO_DEBUG=1, and with any of those it opens on the boot screen. A normal launch has no console and pays nothing for it.