The semantic view-model over a [DiffResult] — the one seam every painter reads
(issue #21, design doc Amendment 2026-07-11).
DiffResult (+ the two Runs)
│
▼
amberfork-layout
│
▼
ViewModel
semantic rows (spine / fork / downstream), step summaries,
designed wording (confidence, verdict, absence), attribution
reading order, field-diff evidence
│
┌───────────┴───────────┐
▼ ▼
CLI painter (render.rs) web painter (ui/, Leptos)
columns · glyphs · ANSI SVG/DOM geometry
What lives here is exactly what every surface must agree on: which alignment move plays
which role, the one-line gist of a step, the wording rules the design locked — confidence
as conf 0.NN with the explicit marginal call at zero (notebook 005), the converged
verdict that only claims "identical" when the alignment earned it (issue #19), the
(no aligned step) absence — plus the attribution reading order (DR5) and the
field-level evidence at the fork.
What deliberately does NOT live here is any painter's own arithmetic: column widths, truncation, wrapping, gutter glyphs, and ANSI are the CLI painter's business; pixel geometry is the web painter's. This crate has zero terminal dependencies, and styling decisions never feed back into it.
For the web painter the view crosses a wire: [Document] is the serializable form the
server ships (issue #24) — the same [ViewModel] plus a [DOCUMENT_VERSION] stamp and
the payload envelope: building the document cuts every payload-derived slot at
[SLOT_TEXT_LIMIT] bytes with an explicit [SlotText::truncated] mark the UI must
render visibly.