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
How It Works
Thecorpus 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.
Event logs are auto-cleaned after 7 days. If you need to preserve logs for longer, copy them out of the
corpus/ directory or adjust the retention in config.json.Event Types
The system emits 30+ event types. Here are the most useful for debugging:| Event | When It Fires |
|---|---|
input.received | User sends a message |
input.classified | Message intent is determined |
context.built | Prefrontal finishes assembling context |
llm.request | Request sent to LLM provider |
llm.response | LLM returns a response |
llm.stream.start | Streaming begins |
llm.stream.end | Streaming completes |
tool.called | LLM requests a tool call |
tool.completed | Tool execution succeeds |
tool.failed | Tool execution fails |
safety.allowed | Amygdala allows an operation |
safety.blocked | Amygdala blocks an operation |
safety.approved | User approves a blocked operation |
safety.denied | User denies a blocked operation |
task.created | Motor begins a new task |
task.step | A task step completes |
task.completed | Task finishes successfully |
task.failed | Task fails after retries |
memory.saved | Hippocampus saves an episode |
memory.retrieved | Hippocampus retrieves fragments |
capability.loaded | Cerebellum loads a capability |
capability.error | Capability fails to load |
health.warning | Hypothalamus detects an issue |
health.critical | System health is degraded |
Log Format
Each entry looks like this:Tracing a Message
Every event includes aturnId. To follow one message through the entire pipeline, grep for its turn ID:
Common Debugging Scenarios
- Why wasn't the tool called?
- Why was it blocked?
- Did memory save?
Search the log for the turn ID and look for:
input.classified— was the intent recognized astool_use?context.built— was the capability’s skill included?llm.response— did the model output atoolCallscount > 0?
safety.blocked event.