{% from 'runs/_runtime.html' import what_ran %} {% extends "base.html" %} {% block title %}Compare {{ jobs|length }} runs — Nullius{% endblock %} {% block head %}{% endblock %} {% block crumb %}/ compare{% endblock %} {% block body %} {% macro comparison_columns() %} {% for j in jobs %}{% endfor %} {% endmacro %}

Comparing {{ jobs|length }} runs

Choose runs

{{ n_shared }} task{{ '' if n_shared == 1 else 's' }} run by every side· {{ n_differing }} where they disagree

{% if cohort == 'matched' %}

{{ n_shared }} matched task{{ '' if n_shared == 1 else 's' }}. Rates, cost and tokens include every attempt on those tasks. The full run’s wall time is omitted.

{% else %}

These numbers describe each full run, including tasks the other runs did not cover. Switch to matched tasks to compare the same recorded task IDs.

{% endif %} {% if not comparison.datasets_known %}

A run has no recorded dataset identity. Its task names are kept separate because their identity cannot be verified.

{% elif not comparison.datasets_match %}

The recorded datasets differ. Matching requires exact dataset names and versions; identical task names from different datasets are kept separate.

{% endif %} {% if cohort == 'matched' and not n_shared %}

No shared cohort is available. Choose runs with overlapping coverage or return to whole runs.

{% endif %} {% if comparison.repeated_trials|sum %}

Some tasks have repeated attempts. All attempts count in the summaries; each task row and its detail show the last indexed attempt, not necessarily the latest by timestamp.

{% endif %}

Adjusted rate excludes only rate limits, API errors and setup errors. Unknown outcomes stay in its denominator. Controls are never ranked.

Side by side

{% if n_agents > 1 %}
Order columns: Group by agent Alternate agents
{% endif %}
{{ comparison_columns() }} {% for j in jobs %} {% set selection = selections[loop.index0] %} {% endfor %} {% macro row(label, values, hint='') %} {% for v in values %}{% endfor %} {% endmacro %} {% for j in jobs %} {% endfor %} {{ row('Model', jobs|map(attribute='model_name')|list) }} {% for j in jobs %}{% endfor %} {% if jobs|selectattr('runner')|list %} {% for j in jobs %}{% endfor %} {% endif %} {% for j in jobs %} {% endfor %} {% for r in summary %} {% for v in r.cells %}{% endfor %} {% endfor %} {% for j in jobs %} {% endfor %}
{{ j.agent_label or '—' }} {%- if j.is_control %} control{% endif %} {{ j.job_id }} {{ selection.workspace_label }} {% if cohort == 'matched' %}{{ comparison.excluded_trials[loop.index0] }} of {{ selection.job.trials|length }} trials outside this cohort{% endif %}
{{ label }}{{ v }}
Agent{{ j.agent_label or '—' }} {%- if j.is_control %} control{% endif %} {%- if j.reasoning_effort %} · effort {{ j.reasoning_effort }}{% endif %}
Dataset{{ j.dataset|dsname }}
Runner{% if j.runner %}{{ what_ran(j) }}{% else %}—{% endif %}
Outcome mix {%- for k in ORDER %}{% if j.counts[k] %}{% endif %}{% endfor -%}
{{ r.label }}{{ v }}
Rerun{% if j.harbor_command %}{% else %}—{% endif %}

Task by task

Tasks where the runs disagree are listed first. A blank cell means that run didn't include the task.

{% if judgement %}
Judgement experimental · {{ judgement.judged }} of {{ judgement.pairs }} matched pair{{ '' if judgement.pairs == 1 else 's' }} judged{% if judgement.unjudged %}, {{ judgement.unjudged }} not judged{% endif %}{% if judgement.earlier %} ({{ judgement.earlier }} under an earlier vocabulary){% endif %} {% if judgement.unjudged and judgement.keyed %}
{% elif judgement.unjudged %}System One not configured — set its key in Settings{% endif %}
{% endif %}
{{ comparison_columns() }} {% for j in jobs %} {% endfor %} {% if judgement %}{% endif %} {% for taskrow in tasks %} {% set task_index = loop.index0 %} {% set row = taskrow.trials %} {% set outcomes = row|select|map(attribute='outcome')|list %} {% for t in row %} {% endfor %} {% if judgement %}{% endif %} {# detail rows: the same metrics for each side, so differences line up #} {% else %}{% endfor %}
Task {{ j.agent_label or j.job_id }} {%- if j.is_control %} control{% endif %} Better of two
{# One glyph, rotated by CSS on aria-expanded. #} {{ taskrow.task }}
{% if not comparison.datasets_match or not comparison.datasets_known %}{{ 'Dataset not recorded' if taskrow.dataset.startswith('[unidentified:') else taskrow.dataset|dsname }}{% endif %}
{% if t %}
{{ t.outcome_label }} {% if t.score is not none %}{{ '%.2f'|format(t.score) }}{% endif %} {% if t.f2p_pass or t.f2p_fail %} {{ t.f2p_pass }}/{{ t.f2p_pass + t.f2p_fail }} {{ t.vocab.gained_abbr or t.vocab.gained }} {% endif %} {% if t.is_regression %}⚠{% endif %}
Total time{{ t.dur_total|secs }} {% set used_tokens = (t.n_input_tokens or 0) + (t.n_output_tokens or 0) %} Tokens{{ used_tokens|tokens(jobs[loop.index0].kind) }}
{% if taskrow.attempts[loop.index0] > 1 %}{{ taskrow.attempts[loop.index0] }} attempts · last indexed shown{% endif %} {% else %} — {% endif %}
{% set jr = judgement.rows.get(taskrow.task) %} {% if jr and jr.earlier %}{{ {'A': jobs[0].agent_label or 'A', 'B': jobs[1].agent_label or 'B', 'same': 'same'}[jr.choice] if jr.choice in ('A', 'B', 'same') else jr.choice }} {{ '%.0f'|format((jr.p or 0) * 100) }}% earlier vocabulary {% elif jr %} {% if jr.verdict == 'same' %}tie {% elif jr.verdict %}{{ (jobs[0] if jr.verdict == 'A' else jobs[1]).agent_label or jr.verdict }} {% else %}one side judged{% endif %}
{% for side, j in ((jr.a, jobs[0]), (jr.b, jobs[1])) %} {{ 'A' if loop.first else 'B' }} {% if side %}{{ '%.1f'|format(side.score) }}/{{ side.top }}{% if side.confidence is not none %} {{ '%.0f'|format(side.confidence * 100) }}%{% endif %} {% else %}not judged{% endif %} {% endfor %}
{% else %}not judged{% endif %}
No tasks in this comparison cohort.
{% endblock %}