Rio
adr/0028-compare-view.mdRaw Markdown · GitHub ↗

ADR-0028: A core line diff and a read-only compare view

  • Status: Accepted
  • Date: 2026-06-29
  • Deciders: jka
  • Decision: D28

Context

The layout reserved space for side-by-side diffs (ADR-0013, ADR-0014), and the agent's proposed edits needed a better review surface than an inline diff in a narrow chat column.

Decision

  • Core: diff.lines {a, b} returns the operations that turn text A into text B, each {tag equal|delete|insert, a, b} with 1-based line numbers (0 where a side has no line). It is a classic LCS diff in rio-core/diff.tcl, splitting lines exactly like the document model.
  • GUI: a compare view of two read-only panes with a shared scrollbar, shown in place of the editor while comparing. Filler rows keep equal lines level. Each line carries a - or + marker in addition to its colour, so the diff reads even where tag backgrounds render poorly.
  • Agent: agent.proposal {turn} returns a pending proposal's full original and proposed text on demand; the agent.propose event stays small. A proposal larger than a threshold opens in the compare view automatically; smaller ones stay inline. A Compare button opens any proposal, and a setting disables the automatic opening.

Consequences

  • The diff computation is shared with any future frontend.
  • The compare view is its own read-only surface rather than an editor group. Folding it into the editor groups of ADR-0033 is a possible later simplification.
  • The unified-diff fallback for narrow displays is not built.
  • The O(n·m) algorithm is fine for source files; large files are out of scope, as elsewhere.