baphuongna/pi-crew/event-log-tracing
Claude Code and agent skill by baphuongna/pi-crew
- community
Checking that the SKILL.md file is still in the repository.
Structured event logging for worker lifecycle, live agents, crash recovery. When NOT to use: high-level metrics dashboards (use observability-reliability); for runtime state inspection (use runtime-state-reader).
Install
npx vskill@latest install baphuongna/pi-crew/event-log-tracingSKILL.md
event-log-tracing
Every pi-crew run writes a persistent event log at .crew/state/runs/<runId>/events.jsonl. Events are the primary evidence for understanding what happened — especially when workers crash, agents get stuck, or runs become orphaned.
Event Format
Every event is a JSON object on one line:
Required fields: time, type, runId Optional fields: taskId, message, data, metadata Metadata auto-populated: seq (line number), provenance (who wrote it), fingerprint (for terminal events)
Event Taxonomy
Worker Lifecycle Events (from child-pi.ts via onLifecycleEvent callback)
| Event | When | Data | |
|---|---|---|---|
worker.spawned | Child process starts with a PID | {pid, cwd} | |
worker.spawn_error | Spawn failed (no PID, binary not found, permission denied) | {pid?, error} | |
worker.response_timeout | No stdout for responseTimeoutMs (default 5 min) | {pid, error} | |
worker.final_drain | Child finished but lingered — SIGTERM sent | {pid} | |
worker.hard_kill | Child still alive after hardKillMs — SIGKILL sent | {pid} | |
worker.exit | Process exited (before close) | {pid, exitCode} | |
worker.close | stdio fully closed | {pid, exitCode} |
Tracing worker crashes:
worker.spawnedfollowed byworker.exitwith non-zero code → worker crashedworker.spawnedfollowed immediately byworker.spawn_error→ spawn failedworker.spawnedfollowed byworker.response_timeout→ worker hungworker.spawnedfollowed byworker.final_drain→ worker lingered but completedworker.spawnedfollowed byworker.hard_kill→ worker had to be forcibly killed
Tracing "worker blinks":
- Widget shows agent appears and disappears within 1 frame
- Root cause:
worker.spawned+ very fastworker.exit(crash during spawn) - Look for
worker.spawn_errorwith error details (API key, model, binary) executeWorkers=false(scaffold mode) means noworker.spawnedat all — agent completes instantly
Live Agent Events (from live-agent-manager.ts)
| Event | When | Data | |
|---|---|---|---|
live_agent.registered | registerLiveAgent called | {agentId, role, agent, workspaceId, runId, taskId} | |
live_agent.terminated | terminateLiveAgent called | {agentId, status, role, workspaceId, runId, taskId} |
These track the full lifecycle from spawn to cleanup.
Run Lifecycle Events (from task-runner.ts, team-runner.ts)
| Event | When | Data | |
|---|---|---|---|
run.created | Run manifest created | {team, workflow} | |
run.running | Workflow execution begins | — | |
run.completed | All tasks done, no errors | — | |
run.failed | Run failed (fatal error, cancelled) | {reason?} | |
task.started | Task worker spawned | {role, agent, runtime, cwd} | |
task.progress | Progress event (activity, turns, tokens) | {eventType, activityState, toolCount, turns, tokens} | |
task.attention | Attention needed (no yield, completion guard, etc.) | {reason, activityState} | |
task.completed | Task finished successfully | — | |
task.failed | Task failed | {error?} | |
task.output_validation | Output format validation result | {valid, formatMatch, structurePreserved, issues} |
Task Parallel Events
| Event | When | Data | |
|---|---|---|---|
task.parallel_start | Parallel task batch launched | {tasks, concurrency} | |
task.parallel_end | All parallel tasks finished | {completed, failed, cancelled} |
Hook Events
| Event | When | Data | |
|---|---|---|---|
hook.executed | Hook ran (before_run_start, before_task_start, task_result, etc.) | {hookName, outcome} |
Mailbox Events
| Event | When | Data | |
|---|---|---|---|
mailbox.message_added | Steering/followup message added to mailbox | {taskId, direction, from, to} | |
agent.nudged | nudge-agent API called | {agentId} | |
agent.steered | Real-time steer delivered to live agent | {agentId} |
Reconciliation Events
| Event | When | Data | |
|---|---|---|---|
crew.run.reconciled_stale | reconcileStaleRun repaired a stale run | {verdict} | |
crew.run.orphan_cancelled | cancelOrphanedRuns cancelled a run | {ownerSessionId, cancelledTasks} |
appendEvent Pipeline
Key properties:
- Cross-process safe via lock directory (
.events.jsonl.lock/) - Stale lock detection (PID-based, 10s stale threshold)
- Sequence numbering for deduplication and ordering
- Terminal events (completed/failed/cancelled) get SHA-256 fingerprints
- Redacted secrets (API keys, tokens) via
redactSecrets()before writing - 50MB file size limit — logs
event-log.size-limiterror and stops appending
Reading Events
From the command line
From code (readEvents)
From code (readEventsCursor — incremental)
Common Trace Patterns
Pattern: Worker spawns and immediately crashes
Diagnosis: Check the error field in spawn_error. Common causes:
"API key not found"— missingPI_API_KEYorANTHROPIC_API_KEY"Model not available"— wrong model name"Binary not found"— pi binary not in PATH"Permission denied"— pi binary not executable
Pattern: Worker hangs and gets killed
Diagnosis: 5 minutes with no output. Worker was unresponsive and was killed.
Pattern: Normal completion
Pattern: Scaffold mode (no worker spawn)
Note: No worker.spawned event means the task ran in scaffold mode (executeWorkers=false).
Pattern: Orphaned run recovered
Diagnosis: The run's PID was dead. crash-recovery cancelled the tasks.
Pattern: Ghost run (PID dead, manifest still running)
Enforcement — Event Log Tracing Gate
Before interpreting events or debugging crashes, verify:
- [ ] Event format validated (required fields: time, type, runId present)
- [ ] runId correlation confirmed (all events have same runId for the trace)
- [ ] Terminal events have fingerprints (completed/failed/cancelled)
- [ ] Event sequence matches expected lifecycle pattern
- [ ] Corrupt JSONL handled (skip malformed lines, don't fail entire read)
- [ ] Secrets redacted in data fields before logging
If ANY answer is NO → Stop. Re-examine event source and format.
Anti-patterns
- `logInternalError` only logs in debug mode: Production errors are silent —
events.jsonlis the only durable evidence. Always emit events, never rely onconsole.error. - Event flooding:
task.progressevents can be noisy (up to every ~100ms per active task). UsereadEventsCursorwithlimitandsinceSeqfor UI rendering. - Missing runId correlation: Every event must have
runId. Never write events without it — it breaks correlation. - Unredacted secrets:
appendEventcallsredactSecrets()internally, but caller should avoid putting raw API keys indatafields. - Corrupt JSONL: On crash, the last line may be incomplete.
readEvents()skips unparseable lines silently.
Source patterns
src/runtime/child-pi.ts— ChildPiLifecycleEvent interface, 7 event typessrc/runtime/task-runner.ts— onLifecycleEvent callback, bridge to appendEventsrc/runtime/live-agent-manager.ts— live_agent.registered/terminatedsrc/state/event-log.ts— appendEvent, readEvents, readEventsCursor, scanSequencesrc/runtime/stale-reconciler.ts— crew.run.reconciled_stalesrc/runtime/crash-recovery.ts— crew.run.orphan_cancelledsrc/extension/register.ts— reconcileAllStaleRuns at session start
Verification
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/event-log-tracing/SKILL.md
Popularity
- Repository stars
- 58
- Repository forks
- 22
- 7-day trend score
- 0
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/baphuongna/pi-crew/event-log-tracing)