{% extends "base.html" %} {% block title %}Run {{ run_id[:8] }} — Observability{% endblock %} {% block content %}
Task
{{ task_text }}
{{ task_type }} · prompt v{{ prompt_version }} · {{ timestamp|et('%Y-%m-%d %H:%M:%S') }} {{ tz_label }}
💡 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 %} {# Border tier mirrors the efficiency number's colour (Bootstrap text-success/warning/danger) #} {% set eff_color = '#28a745' if g.efficiency >= 0.85 else ('#ffc107' if g.efficiency >= 0.6 else '#dc3545') %}
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 %}
{% if has_baseline %}
Anomalies vs Average (single-run variance, not drift) vs avg of {{ report.baseline_run_count }} prior run(s)
One run differing from the average is variance, not drift. A true drift would require many runs shifting in the same direction (see Version Drift below).
{% for v in report.verdicts %} {% endfor %}
What we checkThis runNormal rangeVerdict
{{ v.name|replace('_', ' ') }} {% if v.name == 'agent_sequence' %} {% set seq = v.current %} {% if seq|length > 2 %} {{ seq[0] }} → … → {{ seq[-1] }} {% else %} {{ seq|join(' → ') }} {% endif %} {% else %}{{ v.current }}{% endif %} {{ v.note }} {% if v.drifted %}{{ v.label|replace('_', ' ') }}{% else %}within range{% endif %}
{% if report.per_agent_verdicts %}
Per-Agent Anomalies · this run vs the agent's usual behaviour
{% for agent, verdicts in report.per_agent_verdicts.items() %} {% set drifted = verdicts|selectattr('drifted')|list %}
{{ agent }} {% if drifted %}{% for v in drifted %}{{ v.label|replace('_', ' ') }}{% endfor %} {% else %}normal{% endif %}
{% for v in verdicts %} {% endfor %}
signalthis runavg of priorΔ%verdict
{{ v.signal|replace('_', ' ') }} {{ v.current }} {{ v.baseline }} {{ "%+.1f"|format(v.delta_pct) }}% {% if v.drifted %}outside range{% else %}in range{% endif %}
{% endfor %}
{% endif %} {% else %}
Anomalies vs Average
First run for this task type — anomaly checks need at least one prior run for comparison.
{% endif %} {% if vreport and vreport.available %}
Version Drift · v{{ vreport.target_version }} vs v{{ vreport.base_version }} {% if vreport.mode == 'paired' %}🎯 paired on {{ vreport.paired_questions }} question(s){% else %}~ task-type avg{% endif %} · {% if vreport.confidence == 'confident' %}confident{% else %}low confidence{% endif %}
Comparing {{ vreport.target_runs }} run(s) of v{{ vreport.target_version }} against {{ vreport.base_runs }} run(s) of v{{ vreport.base_version }}. {% if vreport.mode == 'approximate' %} Absolute tokens/cost are hidden — questions differ, so only normalized signals are compared. {% endif %}
{% for v in vreport.overall %} {% endfor %}
Overallv{{ vreport.base_version }}v{{ vreport.target_version }}ΔConsistencyVerdict
{{ v.signal }} {% if v.signal == 'typical route' %}{{ v.base|join(' → ') }}{% else %}{{ v.base }}{% endif %} {% if v.signal == 'typical route' %}{{ v.target|join(' → ') }}{% else %}{{ v.target }}{% endif %} {% if v.signal != 'typical route' %}{{ "%+.1f"|format(v.delta_pct) }}{% if v.signal not in ['avg turns'] %}%{% endif %}{% else %}—{% endif %} {{ "%.0f"|format(v.consistency*100) }}% {% if v.status == 'drift' %}Drift {% elif v.status == 'potential' %}Potential {% else %}stable{% endif %}
Per-Agent · v{{ vreport.target_version }} vs v{{ vreport.base_version }}
{% for agent, verdicts in vreport.per_agent.items() %} {% set confirmed = verdicts|selectattr('status','equalto','drift')|list %} {% set potential = verdicts|selectattr('status','equalto','potential')|list %} {% set border_cls = 'border-start border-danger border-3' if confirmed else ('border-start border-warning border-3' if potential else '') %}
{{ agent }} {% for v in confirmed %}Drift: {{ v.label }}{% endfor %} {% for v in potential %}Potential: {{ v.label }}{% endfor %} {% if not confirmed and not potential %}no change{% endif %}
{% for v in verdicts %} {% endfor %}
{{ v.signal }} v{{ vreport.base_version }}: {{ v.base }} v{{ vreport.target_version }}: {{ v.target }} {{ "%+.1f"|format(v.delta_pct) }}% {{ "%.0f"|format(v.consistency*100) }}% {% if v.status == 'drift' %}Drift {% elif v.status == 'potential' %}Potential {% else %}stable{% endif %}
{% endfor %}
{% else %}
Version Drift
{% if not vreport %} This run is on the baseline version (v{{ base_version }}). Version drift appears on later prompt versions, comparing the whole version against this baseline. {% else %} Not enough data yet. {{ vreport.note }} {% endif %}
{% 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 %}
Run Health
Outcome{{ 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 re-entry) {% elif metrics.loop_reentry_count %} {{ metrics.loop_reentry_count }} (requested) {% else %}none{% endif %}
Busiest agent{{ "%.0f"|format(metrics.token_concentration*100) }}% of all tokens
Wall-clock {{ "%.1f"|format(metrics.total_wall_clock_ms/1000) }}s · sum of agent time {{ "%.1f"|format(metrics.sum_of_span_durations/1000) }}s
Parallelism factor {{ "%.2f"|format(metrics.parallelism_factor) }}× {% if metrics.parallelism_factor >= 1.5 %} — agents ran in parallel {% elif metrics.parallelism_factor > 1.1 %} — some overlap {% else %} — sequential {% endif %}
Parallel groups (DAG) {% if parallel_groups %} {{ parallel_groups|length }} {% else %} none {% endif %}
{% endblock %} {% block scripts %} {% endblock %}