{% extends "base.html" %} {% block title %}{{ d.summary.run_id }} — AgentSwing{% endblock %} {% block subtitle %}← all runs  ·  {{ d.summary.target or '' }}{% endblock %} {% block content %}

{{ d.summary.run_id }} {% if d.summary.active %}running{% endif %}

{% if d.summary.active or not d.summary.judged %}

Progress

{% for e in d.events %}
{{ e.event }}{% if e.scenario %} — {{ e.scenario }}{% endif %}
{% endfor %}
{% endif %} {% if d.report %}
{{ d.report.summary.total }}
scenarios
{{ d.report.summary.passed }}
passed
{{ d.report.summary.failed }}
failed
{{ d.report.summary.errored }}
not tested
{{ '%.0f%%'|format(d.report.summary.pass_rate) if (d.report.summary.passed + d.report.summary.failed) else 'n/a' }}
pass rate
{{ '%.1f'|format(d.report.summary.mean_score) }}
mean score
{% if d.summary.errored %}

{{ d.summary.errored }} scenario{{ '' if d.summary.errored == 1 else 's' }} could not be tested. AgentSwing never reached the agent, so it makes no claim about it — these are configuration or infrastructure problems, not agent bugs.

{% endif %}

Issues, worst first

{% if not d.issues %}

None found.

{% else %} {% for i in d.issues %}
{{ i.severity.value }} {{ i.title }}

{{ i.scenario }} · {{ i.id }}

{% if i.description %}

{{ i.description }}

{% endif %} {% if i.evidence %}
Evidence
{{ i.evidence }}
{% endif %} {% if i.suggestion %}

What to try: {{ i.suggestion }}

{% endif %}
{% endfor %} {% endif %}

Scenarios

{% for r in d.results %}
{{ r.status.value }} {{ r.transcript.scenario }}

Goal: {{ r.transcript.persona.goal }}

Ended {{ r.transcript.termination.value|replace('_',' ') }} after {{ r.transcript.turns|length }} turn{{ '' if r.transcript.turns|length == 1 else 's' }}

{% if r.status.value == 'error' and r.transcript.error %}

Could not test: {{ r.transcript.error }}

{% if r.transcript.error_hint %}
{{ r.transcript.error_hint }}
{% endif %} {% endif %} {% if r.verdict and not r.verdict.errored %}

Score {{ '%.1f'|format(r.verdict.score) }}/10 · goal achieved: {{ 'yes' if r.verdict.goal_achieved else 'no' }} {%- if r.verdict.samples > 1 %} · {{ r.verdict.samples }} judgements, majority-voted{% endif %}

{% if r.verdict.unstable %}

Unstable verdict: {{ r.verdict.dissent }} of {{ r.verdict.samples }} judgements disagreed, scores ranged over {{ '%.1f'|format(r.verdict.score_spread) }} points. The goal is probably ambiguous.

{% endif %} {% if r.verdict.reasoning %}

{{ r.verdict.reasoning }}

{% endif %} {% endif %} {% if r.transcript.turns %}
Conversation ({{ r.transcript.turns|length }} turns) {% for t in r.transcript.turns %}
User

{{ t.user_message }}

Agent · {{ t.latency_ms }}ms

{{ t.agent_reply or '(no reply)' }}

{% for v in t.validations if not v.passed %}

✗ {{ v.name }}: {{ v.detail }}

{% endfor %}
{% endfor %}
{% endif %}
{% endfor %} {% elif d.transcripts %}

This run has {{ d.transcripts|length }} transcript{{ '' if d.transcripts|length == 1 else 's' }} but no verdicts yet. Score it without re-running the conversations:

agentswing judge {{ d.summary.run_id }}
{% for t in d.transcripts %}
{{ t.scenario }}

{{ t.termination.value|replace('_',' ') }} · {{ t.turns|length }} turns

Conversation {% for turn in t.turns %}
User

{{ turn.user_message }}

Agent · {{ turn.latency_ms }}ms

{{ turn.agent_reply or '(no reply)' }}

{% endfor %}
{% endfor %} {% else %}

Nothing recorded for this run yet.

{% endif %} {% endblock %} {% block scripts %} {% if d.summary.active %} {% endif %} {% endblock %}