{% extends "base.html" %} {% block title %}Run {{ run_id[:8] }} — Observability{% endblock %} {% block content %}
Run
{{ run_id[:8] }}
{{ task_type }} · prompt v{{ prompt_version }} · {{ timestamp|et('%Y-%m-%d %H:%M:%S') }} {{ tz_label }}
View Trace ▸
Run Health {{ termination_short }}
Error spans
{{ metrics.error_span_count }}
Tool failures
{{ metrics.tool_failure_count }}
Repeated agents
{% if metrics.flagged_loops %} {% for p in metrics.reentry_patterns %}{% if p.flagged %}{{ p.pattern }} {% endif %}{% endfor %} unexpected {% elif metrics.loop_reentry_count %} {{ metrics.loop_reentry_count }} requested {% else %}none{% endif %}
Busiest agent
{% if metrics.per_agent_token_share %} {% set busiest = metrics.per_agent_token_share|dictsort(by='value')|last %} {{ busiest[0] }} {{ "%.0f"|format(busiest[1]) }}% of tokens {% else %}—{% endif %}
Parallelism
{{ "%.2f"|format(metrics.parallelism_factor) }}× {% if metrics.parallelism_factor >= 1.5 %}parallel{% elif metrics.parallelism_factor > 1.1 %}some overlap{% else %}sequential{% endif %}
{% if metrics.unique_tools %}
Tools
{% for tool, freq in metrics.tool_frequency.items() %} {% endfor %}
ToolByCallsFail
{{ tool }} {% for agent, dist in metrics.tool_distribution_per_agent.items() %}{% if tool in dist %}{{ agent }}{% endif %}{% endfor %} {{ freq }} {{ metrics.tool_failure_count }}
{% endif %}
💡 Insights {% if ins_counts.critical %}{{ ins_counts.critical }} critical{% endif %} {% if ins_counts.warning %}{{ ins_counts.warning }} warning{% endif %} {% if ins_counts.improvement %}{{ ins_counts.improvement }} better{% endif %} {% if ins_counts.info %}{{ ins_counts.info }} info{% endif %}
{% for ins in insights %}
{{ ins.title }} {% if ins.agent %}{{ ins.agent }}{% endif %} {% if ins.kind == 'drift' %}vs baseline{% endif %}
{{ ins.evidence }}
{% if ins.details %} {% set d = ins.details %}
Usual path: {{ d.usual_steps }} steps · This run: {{ d.this_steps }} steps
View route diff
{% if d.added %}
+ {{ d.added|join(', ') }} — used this run, not in usual path
{% endif %} {% if d.removed %}
− {{ d.removed|join(', ') }} — in usual path, skipped this run
{% endif %}
{% endif %}
{{ ins.interpretation }}
{{ ins.category }}
{% endfor %} {% if not vreport %}
Showing single-run insights only (this is the baseline version). Version drift insights appear automatically on later prompt versions of this task type, comparing the whole version against the baseline.
{% elif not vreport.available %}
Showing single-run insights. Version drift needs ≥3 runs per version — {{ vreport.note }}
{% endif %}
{% for val, label, color in [ (metrics.total_turns, "Agent turns", "#0d6efd"), ("{:,}".format(metrics.total_input_tokens), "Input tokens", "#0d6efd"), ("{:,}".format(metrics.total_output_tokens), "Output tokens", "#6f42c1"), ("$%.4f"|format(metrics.total_cost_usd), "Cost", "#198754"), ("%.1fs"|format(metrics.total_wall_clock_ms/1000), "Total time", "#495057"), (metrics.total_tool_calls, "Tool calls", "#fd7e14"), ] %}
{{ val }}
{{ label }}
{% endfor %}
{% set pf = metrics.parallelism_factor %} {% set is_parallel = pf >= 1.5 %} {% set is_partial = pf > 1.1 and pf < 1.5 %}
Execution Timeline — each bar shows when an agent ran and how long it took Parallelism {{ "%.2f"|format(pf) }}× {% if is_parallel %} · parallel{% elif is_partial %} · partial overlap{% else %} · sequential{% endif %}
{% set bar_colors = ['#4361ee','#3a0ca3','#7209b7','#f72585','#4cc9f0','#480ca8','#b5179e'] %} {% for bar in timeline %} {% set color = bar_colors[bar.turn_index % 7] %}
{{ bar.agent }}
turn {{ bar.turn_index + 1 }}
{{ bar.duration_s }}s
{{ "{:,}".format(bar.input_tokens) }} in → {{ "{:,}".format(bar.output_tokens) }} out  ·  ${{ "%.4f"|format(bar.cost) }}
{% endfor %}
0s {{ "%.1f"|format(metrics.total_wall_clock_ms/1000) }}s
Agent Chain — hover a node or an arrow for details
normal finished (APPROVED) did not finish cleanly drifted vs baseline unexpected re-entry requested loop-back
{% if parallel_groups %}
⚡ Parallel Groups ({{ parallel_groups|length }}) {% if has_critical_path %} workflow critical path highlighted in graph above {% endif %}
{% for g in parallel_groups %}
Parallel Group #{{ loop.index }}
{{ g.parent_agent }} fans out to {{ g.branches|length }} branches {% if g.has_join %} → joins at {{ g.join_agent }} {% else %} (no join) {% endif %}
{{ "%.1f"|format(g.wall_clock_ms/1000) }}s
wall clock
{% if g.has_join %}{% endif %} {% set bb = g.bottleneck %} {% for b in g.branches|sort(attribute='duration_ms', reverse=true) %} {% if g.has_join %} {% endif %} {% endfor %}
Branch DurationWait at join
{{ b.root_agent }} {% if b.spans|length > 1 %}→ {{ b.spans|length - 1 }} more{% endif %} {{ "%.1f"|format(b.duration_ms/1000) }}s {% if b.branch_id == bb.branch_id %}—{% else %}+{{ "%.1f"|format((bb.duration_ms - b.duration_ms)/1000) }}s{% endif %} {% if b.branch_id == bb.branch_id %} ⏱ Bottleneck {% elif g.has_join %} waiting {% endif %}
Bottleneck branch: {{ g.bottleneck.root_agent }} ({{ "%.1f"|format(g.bottleneck.duration_ms/1000) }}s)
{% if g.has_join %}
Join wait: {% set max_wait = (g.wall_clock_ms - (g.branches|map(attribute='duration_ms')|min)) %} up to {{ "%.1f"|format(max_wait/1000) }}s (fastest branch waited)
{% endif %}
Efficiency: {{ "%.0f"|format(g.efficiency*100) }}%
{% endfor %}
{% endif %} {% endblock %} {% block scripts %} {% endblock %}