Source:
docs/metrics.md.
Mainspring Metrics And Ledger
waves.jsonl is append-only JSONL. One row equals one completed wave.
Emitted Fields
Current wave_log.py rows may include:
ts, timestamp, wave, wave_id, mode, topology, team, team_name,
task_id, task_status_before, task_status_after, selected_lane, engine,
review_engine, pair, engines, model, review_model, models,
duration_s, duration_seconds, product_files_changed, changed_files,
tests, verdict, exit_code, failure_reason, failure_reason_class,
fallback_engine_used, retry_count, retry_used, blocked_reason, next_action, prompt_path,
prompt_sha256, git_head, git_status_before, prd_path, usage,
cost_usd, total_cost_usd, replayed_from, and replay_overrides.
Consumed Fields
Metrics, digest, routing, and replay readers also understand:
chapter_delta, competitor_delta, launch_delta, product_score,
product_score_delta, score_delta, codex_short_delta_pct,
claude_short_delta, gemini_short_delta_pct, cost_usd, total_cost_usd,
and usage.
Operator Queries
mainspring --metrics --days 7
mainspring --metrics --format json
mainspring replay show <wave-id> .mainspring/logs/waves.jsonl
Fields may be added without a schema bump. Removing or renaming a field requires a schema-version migration in the PRD.
failure_reason_class stores the canonical machine-readable reason, such as
review:gate_failed, routing:plugin_invisible, or routing:scope_blocked.
Older rows that contain only a bare prefix such as review are treated as
legacy data by readers.