{% from 'runs/_execution.html' import execution_strip %} {% extends "base.html" %} {% block title %}{{ job.job_id }} — Nullius{% endblock %} {% block crumb %}/ {{ job.job_id }}{% endblock %} {% block head %} {% endblock %} {% block body %}

{{ job.job_id }}

{% if job.agent_label %}{{ job.agent_label }}{% if job.agent_version %} v{{ job.agent_version }}{% endif %}{% endif %} {{ job.model_name }} {{ job.dataset|dsname }} {% if control %}control {{ control.label }}{% endif %} {% if job.runner %}{{ job.runner }}{% if job.runner_commit %} {{ job.runner_commit }}{% endif %} {% else %}harbor {% if job.harbor_label %}{{ job.harbor_label }}{% else %}unknown{% endif %}{% endif %} {{ job.trials|length }}{% if job.n_planned and job.n_planned != job.trials|length %} of {{ job.n_planned }} planned{% endif %} trials {% if job.n_retries %}{{ job.n_retries }} retried{% endif %} {% if job.duration_min %}{{ job.duration_min|runtime }}{% endif %}
{% if execution and execution.plan.recipe %}New run like this {% else %}New run like this{% endif %} {% set controls = feasibility_controls(job) %}{% if controls %}Feasibility · {{ controls|join(' + ') }}{% endif %} {% if job.harbor_command %}{% endif %}
{% if execution %}{{ execution_strip(execution, csrf, own=own if execution.plan.steps()|length > 1 else none) }}{% endif %} {% if job.is_preparing and not live_board and not ended %} {# Launched, not started: Harbor has written the configuration and nothing else. There is no result record and no feed to fold yet, so this page waits for the feed and reloads itself when it appears. #}
Preparing — this run was launched and {{ job.runner or 'Harbor' }} has written its configuration; no trial has started yet. The live board appears here as soon as the first event lands. This page refreshes itself.
{% elif (job.is_running or job.is_preparing) and ended %} {# Harbor's record says trials are running; the runner that started it says the run ended. The runner is right: nothing will finish those trials. #}
This run was {{ ended[0] }} at {{ ended[1].strftime('%H:%M:%S') }}Z, before Harbor closed the job: {{ job.n_running_trials }} trial{{ '' if job.n_running_trials == 1 else 's' }} cut short, {{ job.n_pending_trials }} never started. The numbers on this page are what was recorded up to then.
{% elif job.is_running and not view %}
This run is still going — {{ job.n_running_trials }} trial{{ '' if job.n_running_trials == 1 else 's' }} running, {{ job.n_pending_trials }} pending. Every number on this page is partial.
{% endif %} {% if live_board and live_board.error %}
The live feed could not be read — {{ live_board.error }}. The sections below come from the trial results and are unaffected.
{% endif %} {% if view %} {# Two views of one page. Live: the job's events.jsonl folded every second while it runs, and kept once it ended as the record of how it ran. Results: the page rendered from the job's files when this page loaded. ?view= picks; without it, Live while the feed says the job is going. At job.end Live stops asking and says Results is ready; no reload. #}
{{ live_board.initial.state|capitalize }}
    All trials
    {% if job.is_running and not ended %}
    Results as of this page's load — the run is still going: {{ job.n_running_trials }} trial{{ '' if job.n_running_trials == 1 else 's' }} running, {{ job.n_pending_trials }} pending. Every number here is partial; Live follows it as it goes.
    {% endif %} {% endif %} {% if job.is_preparing and not live_board and not ended %} {% endif %} {#- The run page below its header: the scoreboard, the trials it scopes, and two disclosures. Board counts are whole-run and never change under a filter; the trial rows are rendered here, and job.js only filters, sorts and links them. Every lane and tally count is nullius.judge.lanes, which is reconcile's. -#} {% macro slots(jr, extra) -%} {%- for f in judgement.flag_ids %}{% if f in jr.flags %} {%- else %}{% endif %}{% endfor -%} {%- endmacro %} {% set vocab = job.vocab %} {% set lanes = judgement.lanes if judgement else none %} {% set show_judge = judgement and not control %} {% set show_ins = job.trials and not control %} {% set tq = task_quality_summary(job) if show_ins else none %} {% set task_labels = task_labels_for(job) %} {% set nlines = {} %}{% if lanes %}{% for r in lanes.rows %}{% set _ = nlines.update({r.outcome: r.lines|length}) %}{% endfor %}{% endif %} {% set big = namespace(tok=0, tot=0) %}{% for t in job.trials %}{% set big.tok = [big.tok, (t.n_input_tokens or 0) + (t.n_output_tokens or 0)]|max %}{% set big.tot = [big.tot, t.dur_total or 0]|max %}{% endfor %} {% set ANCHOR = {'disagree': 'reconcile-disagree', 'other': 'reconcile-other', 'agree': 'reconcile-agree', 'suggestion': 'reconcile-suggestions', 'gated': 'reconcile-gated', 'not_comparable': 'reconcile-not-comparable', 'not_judged': 'reconcile-not-judged'} %} {% set KEY = {'jog': '', 'straight': '', 'dotted': '', 'open': '', 'ring': ''} %} {% set STUB = {'not_judged': 'ring', 'gated': 'dotted', 'suggestion': 'open', 'not_comparable': 'open'} %} {% set GLYPH = {'agree': '', 'disagree': '', 'other': '', 'gated': '', 'suggestion': '', 'not_comparable': ''} %}
    {% if job.n_regressions %}
    {{ job.n_regressions }} trial{{ '' if job.n_regressions == 1 else 's' }} broke previously-passing tests. A patch that fails {{ vocab.held_term or vocab.held or 'the regression guard' }} is worse than one that changes nothing — it introduced a regression.
    {% endif %}
    {# the hero: the adjusted rate; a control's headline is its verdict, and its rates are shown as absence #} {% if control %}
    {{ control.control }} · {{ control.expected }}
    {{ control.n_behaved }}/{{ control.n }}
    raw rate
    —
    adjusted rate
    —
    {% elif job.scored_only %} {#- a benchmark that gives a score and no pass or fail: the mean score is the headline, and the rates are shown as absence #}
    Mean score
    {{ '%.2f'|format(job.mean_score) }}
    raw rate
    —
    infra
    {{ job.n_infra }}
    {% else %}
    Adjusted rate
    {% if job.has_verdict %} {% set rate = job.adjusted_solve_rate|pct %} {#- the column holds three characters at full size; "100%" is set smaller rather than cross into Outcomes #}
    {{ rate }}
    {% set ran = job.trials|length - job.n_infra %} {% else %}
    —
    {% endif %}
    {% if job.has_verdict and job.raw_solve_rate == job.adjusted_solve_rate %}

    raw = adjusted

    {% endif %}
    {% if not job.has_verdict or job.raw_solve_rate != job.adjusted_solve_rate %}
    raw rate
    {{ job.raw_solve_rate|pct }}
    {% endif %}
    infra
    {{ job.n_infra }}
    broke tests
    {{ job.n_regressions }}
    {% endif %} {# the record: the outcome bar, and its legend rows - each filters the trials and starts its own lanes #}
    Outcomes
    {% for k in ORDER %}{% if job.counts[k] %}{% endif %}{% endfor %}
    {% for k in ORDER %}{% if job.counts[k] %}{% set h = 45 + 30 * ((nlines.get(k) or 1) - 1) %} {{ job.counts[k] }}{{ LABELS[k] }}{% if k in INFRA %}infra{% endif %} {% endif %}{% endfor %}
    {{ job.trials|length }}Trials{% if job.n_planned and job.n_planned != job.trials|length %} of {{ job.n_planned }} planned{% endif %}
    {% if show_judge %} {# the judge: one advisory group. The lanes sit on the outcomes' row lines; the flags beside them #}
    {{ 'Trajectory judge' if job.runner else 'Judge' }} experimental judged {{ judgement.judged }}/{{ judgement.trials }} {% if judgement.truncation and judgement.truncation.truncated %}state truncated {{ judgement.truncation.truncated }}/{{ judgement.truncation.records }}{% endif %} {% if judgement.judged %}Classifier vs judge →{% endif %}
    {% if job.runner %}

    The outcomes are {{ job.runner }}'s own judge{% if job.runner_judge %}: {{ job.runner_judge }}{% endif %}. This one is Nullius's, asked on a click: it reads each conversation for a cause and flags, and changes no outcome.

    {% endif %}
    {% if lanes %}
    {% for r in lanes.rows %}
    {% for g in r.lines %} {% if g.lane == 'gutter' %} {% set tip = {'not_asked': r.label ~ ': never asked a failure cause, so nothing to reconcile.', 'not_judged': g.n ~ ' ' ~ r.label ~ ' not judged yet: no record.', 'gated': g.n ~ ' ' ~ r.label ~ ' read as ' ~ (g.cause or '') ~ ', below the ' ~ lanes.threshold ~ ' confidence gate: noise, counted apart and never ranked.', 'suggestion': g.n ~ ' ' ~ r.label ~ ' read as suggesting ' ~ (LABELS.get(g.suggests, g.suggests) or '') ~ ': no claim to test; experimental, never written back.', 'not_comparable': g.n ~ ' ' ~ r.label ~ ': no claim to test, and the pick names no label.'}[g.status] %}
    {% if STUB.get(g.status) %}{% endif %}{{ g.word }}{% if r.lines|length > 1 %}{{ g.n }}{% endif %}
    {% else %} {% set side = 'a' if g.lane == 'agree' else 'd' %} {% set tip = g.n ~ ' ' ~ r.label ~ ' read as ' ~ g.cause ~ ' · ' ~ g.status_label ~ '. Filters to ' ~ ('that trial.' if g.n == 1 else 'those trials.') %} {% endif %} {% endfor %}
    {% endfor %}
    {% for grp in lanes.tally %} {%- for s, label, n in grp['items'] %}{{ label }}{{ n }}{% if s in ('disagree', 'agree') and lanes.of %}/{{ lanes.of }}{% endif %}{% endfor %} {% endfor %}
    {% endif %} {% if judgement.flags %}
    {% set never = judgement.flag_ids|reject('in', judgement.flags|map('first')|list)|list %}
    Flags raisedof {{ judgement.judged }} judged
    {% for f, n in judgement.flags %}{% set num = judgement.flag_ids.index(f) + 1 %} {{ f }}{{ n }} {% endfor %}
    {% endif %}
    {% if (judgement.unjudged) or (judgement.llm.unjudged) or (tq and tq.unjudged) %}
    {# one button per judge: each judges apart, so a person asks for the one they want #} {% for lane, name, n, keyed in [('system-one', 'System One', judgement.unjudged, judgement.keyed), ('llm', 'LLM judge', judgement.llm.unjudged, judgement.llm.keyed)] if n %} {% if keyed %}
    {% else %}{{ name }} · set up{% endif %} {% endfor %} {% if tq and tq.unjudged and tq.keyed %}
    {% endif %}
    {% endif %}
    {% endif %}
    Run totals
    Tokens{{ (job.total_input_tokens + job.total_output_tokens)|tokens(job.kind) }}
    in · cached · out
    input{{ '{:,}'.format(job.total_input_tokens) }}cached (part of input){{ '{:,}'.format(job.total_cache_tokens) }}output{{ '{:,}'.format(job.total_output_tokens) }}
    Cost{{ job.total_cost_usd|usd(job.kind) }}
    {% if job.mean_score is not none %}
    Mean score{{ '%.2f'|format(job.mean_score) }}
    {% endif %} {% for g in job.score_by_group %}
    {{ job.parts_by|capitalize }} {{ g.group }}{{ '%.2f'|format(g.mean) }} {{ g.n }}
    {% endfor %} {% if job.duration_min %}
    Duration{{ job.duration_min|runtime }}
    {% endif %}
    {# the trials: one filter row names every active filter, whichever mark set it #}

    Trials

    {{ job.trials|length }}
    OutcomeAll▾
    {% for k in ORDER %}{% if job.counts[k] %}{{ LABELS[k] }}{{ job.counts[k] }}{% endif %}{% endfor %}
    {% if judgement and judgement.causes %}
    Judge causeAll▾
    {% for cause, n in judgement.causes %}{{ cause }}{{ n }}{% endfor %}
    {% endif %} {% if judgement and judgement.flags %}
    FlagAll▾
    {% for f, n in judgement.flags %}{{ f }}{{ n }}{% endfor %}
    {% endif %}

    {% set show_cause = show_judge %} {% set show_flags = show_judge and judgement.judged %} {% set n_judge = (1 if show_cause else 0) + (1 if show_flags else 0) + (1 if show_ins else 0) %}
    {% if show_cause %}{% endif %}{% if show_flags %}{% endif %}{% if show_ins %}{% endif %} {% if vocab.gained %}{% endif %}{% if vocab.held %}{% endif %} {% if n_judge %}{% endif %} {% if vocab.gained or vocab.held %}{% endif %} {% if show_cause %}{% endif %} {% if show_flags %}{% endif %} {% if show_ins %}{% endif %} {% if vocab.gained %}{% endif %} {% if vocab.held %}{% endif %} {% for t in job.trials %} {%- set jr = judgement.by_trial.get(t.trial_name) if judgement else none %} {%- set status = lanes.status.get(t.trial_name) if lanes else '' %} {%- set used = (t.n_input_tokens or 0) + (t.n_output_tokens or 0) %} {%- set url = url_for('trial', job_id=job.job_id, trial_name=t.trial_name) %} {% if show_cause %}{% endif %} {% if show_flags %}{% endif %} {% if show_ins %}{% endif %} {% if vocab.gained %}{% endif %} {% if vocab.held %}{% endif %} {% endfor %}
    Judge{% if tq %}instructions scored {{ tq.judged }}/{{ tq.tasks }}{% endif %}Tests Time
    Task OutcomeCause{% if show_flags %} · flags{% endif %}FlagsInstruction{{ vocab.gained_abbr or vocab.gained }}{{ vocab.held_abbr or vocab.held }}Tokens Total Env Agent Verify Open
    {{ task_labels[t.trial_name] }} {{ t.outcome_label }} {%- if t.score is not none %} {{ '%.2f'|format(t.score) }}{% endif %} {%- if t.n_rate_limited_retries %} 429 ×{{ t.n_rate_limited_retries }}{% endif -%} {%- if t.exception_type %} {%- if t.exception_message %}
    {{ t.exception_type }}{{ t.exception_message }}
    {%- else %}{{ t.exception_type }}{% endif %}{% endif %}
    {%- if t.outcome == 'resolved' %}not asked {%- elif jr and jr.cause %}{{ jr.cause }} {%- else %}not judged{% endif %} {%- if show_flags and jr %}{{ slots(jr, ' nf') }}{% endif %}{% if jr %}{{ slots(jr, '') }}{% endif %}{%- set q = task_quality_of(job, t) %}{% if q %}{{ '%.1f'|format(q.score) }}/{{ q.top }}{% else %}—{% endif %}{% if t.f2p_pass or t.f2p_fail %}{{ t.f2p_pass }}/{{ t.f2p_fail }}{% else %}—{% endif %} {%- if t.p2p_pass or t.p2p_fail -%} {{ t.p2p_pass }}/{{ t.p2p_fail }} {%- if t.is_regression %} ⚠{% endif -%} {%- else %}—{% endif -%} {{ used|tokens(job.kind) }} {{ t.dur_total|secs }} {{ t.dur_env|secs }} {{ t.dur_agent|secs }} {{ t.dur_verifier|secs }} →
    {# behind a click: what the run recorded about its install, and the page's one block of prose #}
    {% if job.harbor_command %}
    Configuration {% if job.harbor_command %}
    {{ job.harbor_command }}
    {% endif %}
    {% endif %}
    Definitionsoutcomes · rates · judge
    {% for k in ORDER %}{% if job.counts[k] %}
    {{ LABELS[k] }}{% if k in INFRA %} infra{% endif %}
    {{ DESCRIPTIONS[k] }}
    {% endif %}{% endfor %}
    Adjusted rate
    Solves divided by the trials that actually ran: it drops the outcomes marked infra, which failed before the agent could be judged. The raw rate is Harbor's mean over every trial, shown beside it only when the two differ. A run in which no trial carries a verdict shows —, never 0%.
    {% if not control %}
    Solved meter
    One unit per trial that ran, solves filled; an infra trial is a hollow unit after a gap. Past 12 trials the units become one bar. A hovered trial row lights its unit.
    {% endif %}
    Tokens · Total
    Under each trial's value a thin bar from zero, on one scale for the column: the largest trial fills its track. Total is the trial start to finish and includes overhead that Env, Agent and Verify do not.
    {% if show_judge %}
    Marks
    solid = recorded hollow ring = judge reading dotted = below the confidence gate
    experimental
    A judge model's reading of each transcript (cause, flags) or of each task's instruction text (Instruction). Shown beside the recorded outcomes, never replacing them; the rates count only the record.
    Lanes
    Each outcome row starts its own readings. A line runs straight into agrees when the recorded outcome allows the judge's cause, and jogs into disagrees when it does not. What is not a finding about the claim stays in the gutter: not asked (a resolved trial is never asked its cause), not judged, below gate (under {{ lanes.threshold if lanes else '0.5' }} confidence), and an Unknown outcome's reading. A cause filters to exactly its trials.
    Tally
    Under the lanes: the Classifier vs judge page's own counts and words. Disagree and Agree always show, over the comparable judged trials; the others only when non-zero. Each opens that page at its status.
    Flags
    One judgment per behaviour, asked of every judged trial. Each flag keeps a fixed number, its place in the question vocabulary. The board lists the flags raised, most raised first; each trial row keeps one slot per flag in number order, filled where the flag was raised.
    {% endif %} {% if show_ins %}
    Instruction
    A judge model's score of each task's instruction text alone, once per dataset and task. An unclear instruction caps every agent on that task. Experimental.
    {% endif %}
    {% if view %}
    {% endif %} {% endblock %} {% block scripts %} {% endblock %}