{% extends "base.html" %} {% block breadcrumbs %} › {{ opts.app_label }} › {{ opts.verbose_name_plural }}{% endblock %} {% block title %}{{ opts.label }} — {{ site_title }}{% endblock %} {% block content %}
{{ opts.kind }}
{{ opts.label }}
{% if opts.description %}— {{ opts.description }}{% endif %}
| Field | Type | Required | Detail |
|---|---|---|---|
| {{ f.name }}{% if f.target %} target{% endif %} | {{ f['class'] }} | {{ 'yes' if f.required else 'no' }} | {%- for k, v in f.items() if k not in ('name','class','kind','required','null','target') -%} {{ k }}={{ v | short(40) }}{% if not loop.last %}, {% endif %} {%- endfor -%} |
| No fields declared. | |||
All dates {% for p in periods %} · {{ p }} {% endfor %}
{% endif %} {% if preview_error %}Could not read the source: {{ preview_error }}
{% elif rows %} {% else %}No rows matched.
{% endif %}| Version | Rows | Schema | Content | Notes | Created |
|---|---|---|---|---|---|
| v{{ v.version }} | {{ v.row_count | number }} | {{ v.fingerprint }} | {{ (v.content_hash or '')[:12] }} | {{ v.notes | short(60) }} | {{ v.created_at.strftime('%Y-%m-%d %H:%M') }} |
Not materialised yet.
{% endif %}| Version | Stage | Metrics | Params | Created |
|---|---|---|---|---|
| v{{ v.version }} | {{ v.stage }} | {% for k, val in (v.metrics or {}).items() %}{{ k }}={{ val | number }} {% endfor %} | {{ v.params | short(80) }} | {{ v.created_at.strftime('%Y-%m-%d %H:%M') }} |
Not trained yet.
{% endif %}{{ drift.rows }} logged prediction{{ '' if drift.rows == 1 else 's' }} from the last {{ drift.days }} days, against what v{{ drift.version }} was trained on.
| Column | Kind | Rows | PSI | Verdict |
|---|---|---|---|---|
| {{ column.name }} | {{ column.kind }} | {{ column.count | number }} | {{ '%.4f' | format(column.psi) }} | {{ column.verdict }} |
Population stability index: below 0.1 stable, 0.1–0.25 moderate, above 0.25 significant.
What v{{ importances.version }} weighted most heavily{% if importances.total > importances.rows | length %} — top {{ importances.rows | length }} of {{ importances.total }}{% endif %}.{% if importances.signed %} A hollow bar is a weight that argues the other way.{% endif %}
| {{ row.name | short(48) }} | {{ row.value | number }} |
|---|
{{ eval_diff.left }} → {{ eval_diff.right }}, {{ eval_diff.cases }} shared case{{ '' if eval_diff.cases == 1 else 's' }}.
Nothing about the target changed — the difference is its own.
{% endif %} {% for side, cases in (('older', eval_diff.only_left), ('newer', eval_diff.only_right)) %} {% if cases %}{{ cases | length }} case{{ '' if cases | length == 1 else 's' }} only in the {{ side }} run — a suite that changed is not the same suite: {{ cases[:5] | join(', ') }}{% if cases | length > 5 %}…{% endif %}
{% endif %} {% endfor %} {% if eval_diff.changes %}| Case | Was | Now | Before | After | Expected |
|---|---|---|---|---|---|
| {{ row.case }} | {{ row.was }} | {{ row.now }} | {{ row.left | short(40) }} | {{ row.right | short(40) }} | {{ row.expected | short(30) }} |
| Run | Status | Summary | Started | Duration |
|---|---|---|---|---|
| {{ run.short_id }} | {{ run.status }} | {% for k, val in (run.summary or {}).items() %}{{ k }}={{ val | number }} {% endfor %} | {{ run.started_at.strftime('%Y-%m-%d %H:%M') }} | {{ run.duration_s | duration }} |
No runs yet.
{% endif %}An agent's behaviour is its declaration, so a version is the declaration rather than a file. Tools are recorded by name: the code behind them comes from whatever is imported when the agent runs.
| Version | Stage | Fingerprint | Tools | Recorded | |
|---|---|---|---|---|---|
| v{{ v.version }} | {{ v.stage }} | {{ v.fingerprint[:12] }} | {{ (v.tools or []) | join(', ') or '—' }} | {{ v.created_at.strftime('%Y-%m-%d %H:%M') }} | {% if agent_versions.current == v.version %}current{% endif %} |
The declaration has changed since the last recorded version — what is written down and what would run have parted company.
{% endif %}| Trace | Input | Output | Steps | Tokens | Status |
|---|---|---|---|---|---|
| {{ t.short_id }} | {{ t.input | short(50) }} | {{ t.output | short(50) }} | {{ t.steps }} | {{ t.total_tokens | number }} | {{ t.status }} |
This agent has not run yet.
{% endif %}