Finish applied-effect undo for lineup images and stale entries (#200)

- Link details replay by what they changed. LineUpProvider.replayLinkDetails
  writes the edit onto the link as it is now and returns an inverse holding
  only the fields that took a new value and the images actually put in or
  taken out; null when nothing changed. A redo that removed nothing can no
  longer set up an undo that brings back an image a teammate removed, and an
  edit that also changed notes replays only the notes.
- History reconciliation follows each stack in replay order from the page as
  it is now and keeps a step only if what it acts on will be there when its
  turn comes (an undo step recovers a deleted target only through a deletion
  undo reaches first; a redo step only through an addition redo reaches
  first). It replaces the rule that any addition or deletion anywhere in
  history kept an edit alive.
- Undo and redo step past entries that change nothing, dropping them, so one
  keypress does something visible while anything is left.
- A clear no longer copies or filters the history before it: it is one step
  holding its deletions. Entries below it are only reached after it is
  undone, which restores their objects. Alternating clears grew history
  exponentially (150,039 retained entries after 20); they now grow linearly.
  History keeps the latest 200 steps.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
217c07af4eDara Adedeji committed on 9/27/2026, 12:27:50 AM· committed by GitHubparent37e59ca
5 files changedLine totals unavailable