trails/openspec/specs/session-notes/spec.md
Ullrich Schäfer d6982db868
Update specs: session-notes, route-coloring, gpx-import
session-notes: Reflect CodeMirror 6 editor with character-level sync,
remote cursor awareness, dedicated undo manager, awareness isolation.

route-coloring: Added grade color mode, moved toggle to chart, added
surface/grade chart coloring, legends for all modes, contextual hover.

gpx-import: Added day break preservation (overnight waypoints survive
GPX roundtrip).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 03:24:54 +02:00

1.5 KiB

Purpose

Collaborative rich text notes in Planner sessions, powered by CodeMirror 6 with Yjs CRDT sync and real-time cursor awareness.

Requirements

Requirement: Collaborative session notes

Planner sessions SHALL have a shared text editor for participants to write notes, with character-level real-time sync.

Scenario: Write notes

  • WHEN a user types in the notes editor
  • THEN the text syncs character-by-character to all other participants via Yjs Y.Text

Scenario: Remote cursor awareness

  • WHEN multiple participants are editing notes
  • THEN each participant sees the others' cursor positions and selections highlighted in their assigned color with their name label

Scenario: Notes persist across reload

  • WHEN a participant reloads the session page
  • THEN the notes content is restored from the Yjs document
  • AND the editor displays the existing text immediately

Scenario: Notes persist across reconnect

  • WHEN a user leaves and rejoins a session
  • THEN the notes are still there (stored in Yjs doc and crash recovery)

Requirement: Editor implementation

The notes editor SHALL use CodeMirror 6 with y-codemirror.next for Yjs binding.

Scenario: Undo/redo

  • WHEN a user presses Ctrl+Z / Ctrl+Shift+Z in the notes editor
  • THEN undo/redo applies to notes only (separate Y.UndoManager from waypoint undo)

Scenario: Awareness field isolation

  • WHEN the notes editor sets cursor awareness state
  • THEN it does not conflict with map cursor awareness (uses separate awareness fields)