{% extends "base.html" %} {% from "_macros.html" import pass_rate_badge, score_badge, download_icon %} {% block title %}Trajectory · {{ run.run_id }} · SForge{% endblock %} {% block content %}
← runs / {{ run.run_id }} / trajectory {{ download_icon("/run/" ~ run.run_id ~ "/" ~ run.task ~ "/agent-output", "agent log", "Download raw agent_output.txt (the agent's full conversation log)") }} {{ download_icon("/run/" ~ run.run_id ~ "/" ~ run.task ~ "/download", "task .tar.gz", "Download entire task dir (logs + submissions + final archive) as .tar.gz") }}
{% if not trajectory or not display_exchanges %}
No agent_output.txt found (or empty) for this run.
{% else %} {# Build a lookup: after_idx -> [markers] so we can inline them between exchanges #} {% set markers_by_idx = {} %} {% for m in trajectory.markers %} {% set _ = markers_by_idx.setdefault(m.after_idx, []).append(m) %} {% endfor %}
{% for ex in display_exchanges %} {% include "_turn.html" %} {% set ms = markers_by_idx.get(ex.idx) %} {% if ms %} {% for m in ms %}
submission {{ m.round_label or "round ?" }} {% if m.score is not none %}{{ score_badge(m.score) }}{% elif m.pass_rate is not none %}{{ pass_rate_badge(m.pass_rate) }}{% endif %} {% if m.passed is not none and m.total is not none %} {{ m.passed }}/{{ m.total }} passed {% endif %} {% if m.best_so_far is not none %} best so far: {% if m.score is not none %}{{ "%.1f"|format(m.best_so_far) }}{% else %}{{ "%.1f"|format(m.best_so_far * 100) }}%{% endif %} {% endif %}
{% if m.feedback %}
stop-hook feedback
{{ m.feedback }}
{% endif %} {% set sub_label = marker_submissions.get(m.anchor_idx) %} {% if sub_label %}
code diff ({{ sub_label }})
Loading diff...
{% endif %}
{% endfor %} {% endif %} {% endfor %}
{% endif %} {% endblock %}