Skip to main content

A Complete Chronological Record

Every event that fires in Wolffish is logged to a daily markdown file. This gives you a complete chronological record of everything that happened — inputs, classifications, LLM calls, tool executions, safety decisions, memory operations, and more.

Location

One file per day. Today’s log is always at:

How It Works

The corpus event bus wraps every emit() call with logging. Events are buffered for 2 seconds before flushing to disk — not quite real-time, but close enough for debugging. The daily logs are also indexed by cortex (as the corpus source), so within the retention window you don’t have to grep by hand — Wolffish itself can find events via memory_search, and so can you by just asking it.
Raw event logs are purged after 7 days by design — they are the forensic layer, not the memory layer. What matters longer than a week persists elsewhere: episodes and weekly summaries are kept forever, and automation runs are recorded durably in brain/brainstem/run-history.md (also indexed), which outlives the purge. If you need raw logs longer, copy them out of the corpus/ directory.

Event Types

The system emits dozens of event types. Here are the most useful for debugging:

Log Format

Each entry is a timestamp heading followed by the event name and its full payload as one JSON line:

Tracing a Task

Tool and task events share a taskId. To follow one task through the log, grep for its ID:
Entries are written in chronological order, so a plain read of the file around a timestamp reconstructs the whole turn: message in → context built → LLM response → tool calls → task result. For a richer per-step transcript of the same task, open brain/motor/tasks/TASK-1747.md.

Common Debugging Scenarios

Read the events around the message’s timestamp:
  1. message.received — did the message arrive at all?
  2. context.built — did context assembly succeed (sectionsIncluded should list capabilities)?
  3. tool.called — did the model request the tool?
If the model didn’t produce a tool call, the issue is in the context (check the debug snapshot — was the capability in the <capabilities> index?). If it did but nothing happened next, check for a safety.blocked event.

Live Monitoring

Watch the log in real time during development:
Combine with grep --line-buffered to filter for specific event types in real time: