From 2540bbf0a722ae103f23812459858f9904ffb005 Mon Sep 17 00:00:00 2001 From: mhoennig Date: Wed, 26 Aug 2026 15:04:00 +0200 Subject: [PATCH] docs: Live-Editing-Konzept entschieden und eingearbeitet (D76) Die offenen Punkte der beiden Entwuerfe sind beantwortet und in beide Dokumente eingearbeitet. Die wichtigsten Aenderungen am Protokoll: - Der Server rebased selbst; 409 nur noch bei echter Ueberlappung. Reines Ablehnen fuehrt zu Starvation - ein Client mit hoeherer Latenz kommt bei fleissigen Mitschreibern womoeglich nie durch. - Der Feed arbeitet auf der Historie statt am Dokument, sonst koennte er ausgerechnet das Loeschen nicht melden, das er melden soll. - Historie in zwei Ebenen: kurzlebige Sync-Versionen und nutzersichtbare Meilensteine (nach Schreibpause und auf Knopfdruck, wie D54). - Pruefsumme als Pflichtfeld, clientId + seq gegen doppelt angewendete Patches, Volltext im Feed fuer zu alte Staende, eigener Aenderungstyp fuer den Rollback, Titel im Feed-Ereignis. - Zugriff ueber die unerratbare UUID; GET /documents bekommt ein Master-Passwort (Spring Security). Die Client-Instruktion war fuer ein anderes Frontend geschrieben: Sie nannte CodeMirror, TypeScript, jsdiff und MSW. Werkbaum hat eine rohe textarea, Vanilla JS und keine Laufzeit-Abhaengigkeiten - CodeMirror bleibt eine eigene Entscheidung (gemessen: 120 kB gzip Einstieg, danach nur 18 kB fuer alles Weitere). Zielumgebung vermessen: Apache 2.4.68 mit MPM event, 1024 Worker, Timeout 300 - Long Polling traegt dort. Offen bleiben fehlendes HTTP/2, nur Java 17 statt 21 und der ungeklaerte Weg vom Apache zum Backend. Co-Authored-By: Claude Opus 5 --- .../docs/client-live-editing-instructions.md | 362 ++++++++++++------ backend/docs/live-editing-proposal.md | 346 +++++++++++++---- docs/DECISIONS.md | 193 ++++++++++ 3 files changed, 702 insertions(+), 199 deletions(-) diff --git a/backend/docs/client-live-editing-instructions.md b/backend/docs/client-live-editing-instructions.md index 0416b00..9962472 100644 --- a/backend/docs/client-live-editing-instructions.md +++ b/backend/docs/client-live-editing-instructions.md @@ -1,33 +1,60 @@ # Aufgabe: Live-Editing-Client für den Werkbaum-Editor implementieren -Du arbeitest im Repository der Werkbaum-Web-App (PWA). Implementiere die -Client-Seite des Live-Editing-Protokolls gegen das Editor-Backend. Das -Protokoll ist HTTP-only (kein WebSocket): Änderungen werden als -zeilenbasierte Diffs per PATCH eingereicht, andere Clients erhalten sie über -einen Long-Polling-Feed. +Du arbeitest im **Werkbaum-Monorepo**, Teilprojekt `frontend/`. Implementiere +die Client-Seite des Live-Editing-Protokolls gegen das Editor-Backend +(`backend/`). Das Protokoll ist HTTP-only (kein WebSocket): Änderungen werden +als zeilenbasierte Diffs per PATCH eingereicht, andere Clients erhalten sie +über einen Long-Polling-Feed. -**Wichtiger Kontext:** Die beiden Live-Editing-Endpunkte (`PATCH …/content` -und `GET …/changes`) sind im Backend spezifiziert, aber ggf. noch nicht -deployt. Implementiere gegen den hier definierten Vertrag und baue einen -Mock-Server (oder MSW-Handler) für die Tests. Die CRUD-Endpunkte existieren -bereits. +**Wichtiger Kontext:** Die Live-Editing-Endpunkte sind spezifiziert +(`backend/docs/live-editing-proposal.md`, Entscheidungen in +`docs/DECISIONS.md` D76), aber noch nicht implementiert. Baue gegen den hier +definierten Vertrag; die CRUD-Endpunkte existieren bereits. + +## 0. Randbedingungen des Projekts — bitte zuerst lesen + +Diese Punkte sind nicht verhandelbar und bestimmen jede +Implementierungsentscheidung unten: + +- **Keine Laufzeit-Abhängigkeiten.** `frontend/package.json` hat ein leeres + `dependencies`; alles unter `devDependencies` (Vite, Vitest, jsdom) + verschwindet beim Bauen. D11/D19/D20 und CLAUDE.md: neue + Laufzeit-Abhängigkeiten nur nach Rückfrage. Also **kein jsdiff**, **kein + CodeMirror**, **kein MSW** — Diff und Test-Doubles werden selbst gebaut. +- **Vanilla JavaScript**, keine TypeScript-Dateien. Module liegen als + `frontend/src/*.js` (siehe `parser.js`, `model.js`, `render.js`, + `snapshots.js`, `autocomplete.js`). +- **Der Editor ist eine rohe `