evidence-kind-taxonomy¶
A eval evidence entry's kind is a MEDIA/RENDER type — how the bytes are shown — kept orthogonal to the step-map axis. Structured machine data earns its own honest data kind, derived from content, rendered as a validatable data block instead of being flattened into a transcript.
An evidence entry's kind answers ONE question: how are these bytes shown? It is a media/render
taxonomy — image (a still), transcript (free-form text), video (a moving picture), data (a
structured machine export). That is a different question from what axis a step can anchor to, which
step-timeline derives from the kind and eval-core keeps as its own concern. The two were once
welded — a video meant "a screenshot WITH a time axis" — and this node holds them apart: kind is
render, axis is position, and the one seam between them is a per-kind map, never a conflation.
Structured data is evidence, and it deserves an honest kind. A benchmark's --export-json, an API
payload, a metrics dump is not a wall of terminal text — it is a machine artefact that can be parsed and
checked. Before, the only text channel was the transcript, so a JSON export was filed as one and rendered
as scrolling monospace, indistinguishable from a log — the "this is structured, validate it, show it as
data" truth had no way to be told. data is that truth. It renders as a labelled data block (pretty-printed
when it parses, shown raw with an invalid JSON marker when it doesn't — so a broken export is visibly
broken, never silently a paragraph), and its step-map axis is the record ordinal (index).
The kind follows the bytes, not the flag. An author still picks a filing flag by intent — a captured
result goes to --result — but whether that result is transcript or data is decided by what the bytes
are, sniffed from content. One predicate answers "is this a structured JSON blob?" and it is the SINGLE
source two places read: the blob route's MIME sniff (so the served content-type is application/json) and
the filing path (so the stored kind agrees). Because both derive from the same sniff, the kind recorded on
an entry and the type served for its bytes can never drift apart — and the dashboard's bare-hash renderer,
which already resolved a kind from the served content-type, now resolves data for free. No new flag an
agent must remember to reach for (a capability nobody is told to use decays into a dead enum); the honesty
is automatic.
The floor is preserved. image, transcript, and video render exactly as before through the one
shared evidence renderer; data is a fourth arm beside them, not a replacement. A legacy reading, a
pruned blob's miss sentinel, the self-contained proof export, the eval feed's kind chips — every home
that lists or shows evidence gains the new kind without losing the old ones. Adding a render kind is a
small, closed change: one entry in the taxonomy, one arm in each renderer, one row in the axis map.