video-evidence¶
A recorded video is a third yatsu blobKind — evidence with a time axis. It folds onto the existing evidence engine; only the enum and one render arm grow.
A yatsu reading's evidence is a content-addressed blob distinguished by blobKind (yatsu-core) —
image | transcript. A video is a screenshot with a time axis: the same primitive, a third kind. For
a scenario whose loss is a temporal user loop (a UI surface), a recording of the loop is the truest
evidence — the author's choice per scenario, routed by its tag, not a forced default.
The whole point is that almost nothing is new. spex yatsu eval --video <clip> stores the bytes in the same
shared cache and appends one reading carrying blobKind: video; the MIME is sniffed from content (WebM /
MP4) so /api/yatsu/blob streams a playable type — and answers byte ranges, without which a browser
clamps every seek to 0; the eval tab (yatsu-eval-tab) and the session proof
(review-proof) grow one render arm — an inline <video> beside the image and transcript, lazy on
expand, with the same miss original file when the blob is pruned; spex yatsu show labels it. A clip is
heavier bytes, so yatsu-core's clean is the intended prune.
An optional refinement — anchoring named steps to moments in the clip so an annotation can land on a step — is step-timeline, a separate format built only when a real annotation workflow needs it. yatsu still runs nothing: it records a clip something else recorded, and the measuring hand stays a metadata tag.
A human who disagrees with this node's verdict simply files their own manual@1 reading — the existing
supersede-by-a-newer-reading path, not a new lifecycle. A finding that is not this node's clean fail — a
cross-cutting problem, or one belonging to another node — is instead a concern raised on the
responsible node (a local or forge issue through the unified Issue port — proposals's one Issue
type, whose typed evidence[] carries the hash), pointing at the
clip by its evidence hash; not a hedged verdict here. So video keeps yatsu's verdict binary and routes the
"needs another look" elsewhere it belongs.