Notes time travel text transitions
2026-09-25 — Behavior and isolation
Historical rendered text receives transient green addition highlights and red, struck-through deletion ghosts. Each transition compares the previous displayed version with the target, including backward steps and non-adjacent seeks. Fast scrubbing replaces stale transitions; playback pause freezes the active fade; speed sets the duration of subsequent transitions. Reduced motion shows static marks before cleanup. Text-identical formatting changes render without markers.
The historical RTC timeline remains a captured clone with no mutation transport. The diff operates on rendered text occurrences, not canonical source positions or RTC identities. Word segmentation preserves Unicode sequences; bounded comparison work and mark counts fall back to an undecorated target for large changes. DOM render callbacks are keyed to the selected version, preventing asynchronous stale Markdown renders from decorating a newer target. Explicit copy-code output omits accessibility-hidden ghosts. Source and live note state remain unchanged.
Situation inventory
- Forward, reverse, restart, arbitrary seek, undo and redo: compare displayed endpoints.
- Insertion, deletion, replacement, empty version: decorate the disposable target DOM.
- Repeated text and Unicode: align ordered occurrences using whole word segments.
- Markdown headings, emphasis, tables, links and code: retain target markup; ghosts are plain text.
- Formatting-only changes: no invented textual change highlight.
- Pause/resume: pause both CSS animation and cleanup timer; manual seeking starts a new transition.
- Rapid transitions/close/error: unmount cancels cleanup and superseded Markdown loads.
- Long documents/dense changes: bound work and show a fallback notice.
- Reduced motion: static green/red marks with timed removal, no fading.
- Scrolling: preserve the scroll container; never jump to a changed region automatically.
Verification and remote preview
Synthetic fixtures exercise the real history viewer without API calls or user note writes. Unit/component coverage includes exact DOM cleanup, repeated text, Unicode, reverse movement, pause, supersession, complete deletion, work limits, and code copying while ghosts exist. Existing capture tests assert that replay sends no writes and does not alter the live store. Browser inspection checks rendered Markdown and deletion fading separately from automated tests.
tests/notes-history-preview is a standalone synthetic browser harness. Its
remote draft preview contains no private notes, credentials or write transport.
The existing Tailscale service was stopped and was not enabled or reconfigured.
A hosted HTTPS preview avoids exposing the development server or changing auth.
The owning Notes guide and generated Notes skill describe the behavior. CLI commands and API/SDK procedures are unchanged. Commit, CI, merge, deployment, live verification, docs publication and skill publication are reported separately.
2026-09-25 — Production release
App PR #448 merged at
3bebfd27 and deployed to production as 6ab6cfa3c97ade000814b709.
All CI checks passed, including both browser-test shards. The feature is retained
in combined production commit b3211944676d6859dd22e234e19f88e94442a942,
Netlify deploy 6ab6d54a2ecf420008bff7a0, alongside agent activity and the SSR
packaging fix. The combined tree passed 2,402 local tests (five skipped),
TypeScript and build; production homepage, Notes, artifacts and search routes
returned HTTP 200. Synthetic visual verification remains distinct from authenticated
private-note acceptance. No live note content was mutated.