One input stream, three shapes of the past — is branching undo a freestanding concept?

Following up on the concept-boundary conversations here: we built a small interactive exhibit arguing that “undo” is three concepts, not one concept with options — Undoing Undos.

Same input stream, three engines, each keeping a different shape of the past and therefore making a different promise:

  • Linear undo rewinds a timeline (replay-skip).
  • Compensating undo reverses effects on a timeline, using recorded compensating actions.
  • Branching undo keeps every timeline — undo-then-diverge preserves the abandoned branch, so the past is a tree and the promise is no state is ever lost.

That difference in shape and promise is why we think they don’t merge.

In our catalog, two of the three are grounded patterns with machine-checked models:

The third is only a registered candidate, and its routing is genuinely unresolved — so we’d like to run the freestanding test in public. Is branching undo:

(a) a freestanding concept,
(b) Undo History composed with a branch-point index, or
(c) not a record-level concept at all?

Our current hypothesis is (c): record-space wants a single authoritative timeline — that’s the event log’s total-order invariant, and why the catalog never needed branching — while the tree lives in draft-space (scenarios, explorations, agent backtracking) and collapses to lineage metadata when a branch promotes through the ordinary commit seam. Witnesses pointing that way: editor undo-trees, design-tool branching, sandbox environments, and AI agents forking working state.

We’re honestly unsure, and counterarguments would be more useful than agreement. Happy to be told the hypothesis is wrong.