{% extends "mirrorwall/base.html" %} {% from "mirrorwall/components.html" import empty_state, kv_list, table %} {% block title %}Job {{ job.job_id }} — LoadCoach{% endblock %} {% block content %}
{{ job.job_id }}
{# The explanation links live in the list itself (M5C-6, closed by MirrorWall 0.2.1's href item shape): the value becomes a real anchor, label and value stay escaped text — never HTML through the escaper. #} {{ kv_list([ {"label": "State", "value": job.state ~ (" (" ~ job.state_reason ~ ")" if job.state_reason else "")}, {"label": "Class", "value": job["class"] ~ ", priority " ~ job.priority.base ~ " → " ~ job.priority.effective}, {"label": "Task profile", "value": job.task.id ~ " " ~ job.task.version}, {"label": "Source", "value": job.source}, {"label": "Idempotent", "value": job.idempotent}, {"label": "Model", "value": job.model.canonical_id or "not yet routed"}, {"label": "Served context", "value": (job.model.served_context ~ " tokens (" ~ job.model.served_context_source ~ ")") if job.model.served_context else "—"}, {"label": "Target GPU", "value": job.model.target_gpu_index if job.model.target_gpu_index is not none else "—"}, {"label": "Attempts", "value": job.attempt ~ " of at most " ~ job.max_attempts}, {"label": "Queue wait", "value": (job.timing.queue_wait_ms ~ " ms") if job.timing.queue_wait_ms is not none else "—"}, {"label": "Provider time", "value": (job.timing.provider_ms ~ " ms") if job.timing.provider_ms is not none else "—"}, {"label": "Overhead", "value": (job.timing.loadcoach_overhead_ms ~ " ms") if job.timing.loadcoach_overhead_ms is not none else "—"}, {"label": "Error", "value": (job.error.code ~ ": " ~ (job.error.message or "")) if job.error else "none"}, ] + ([{"label": "Explanation", "value": "decision " ~ job.routing.decision_id, "href": "/routing/" ~ job.routing.decision_id}] if job.routing.decision_id else []) + [{"label": "Explanation (JSON)", "value": "the stored document", "href": "/api/v1/jobs/" ~ job.job_id ~ "/explanation"}] ) }} {% if narrative %} {% include "routing/_narrative.html" %}Every candidate, every number, and the stored document
{% endif %} {% if job.retention.content_scrubbed_at %}Content removed by retention at {{ job.retention.content_scrubbed_at }} — the hashes, token counts, timings and the routing decision remain (spec §14). A database backup taken before the sweep keeps the text.
{% elif job.output.text %}{{ job.output.text }}
{% endif %}