Der Editor fuehrt ein Dokument des Backends: laden, nach 1,5 s Ruhe das Diff
schicken, ueber einen offenen Abruf fremde Aenderungen einspielen — ohne
Neuladen, mit mitwandernder Schreibmarke. Dazu CORS im Backend; ohne das
blockiert der Browser jeden Aufruf.
Zwei Fehler hat erst der Live-Test gegen das laufende Backend gefunden, beide
an der Naht zwischen Modul und Verdrahtung (D54-Nachtrag 3):
Der Konflikt entstand nie. Mit laufendem Feed zieht die Schattenkopie staendig
nach, die eigene Basis ist also nie veraltet — der Server haette nie 409
geantwortet, und die fremde Zeile waere stillschweigend ueberschrieben worden.
Der Client prueft die Ueberschneidung jetzt selbst gegen den ungesendeten
Text; den kennt der Server nicht.
Die Nummer begann nach jedem Neuladen wieder bei 1, waehrend die Kennung
blieb — der Server hielt die erste echte Aenderung fuer eine Wiederholung und
tat nichts. Beides liegt jetzt im sessionStorage: je Tab, ueberlebt Neuladen.
Je Tab ist zugleich die richtige Aussage, zwei Tabs sind zwei Schreiber.
Nachgemessen im Browser: fremde Aenderung erscheint ohne Neuladen, Getipptes
erreicht den Server, beide Konflikt-Knoepfe tun was sie sagen, und die
Schreibmarke steht nach zwei fremd eingefuegten Zeilen darueber unveraendert
bei Zeile+2, Spalte 8. 518 Frontend-Tests, 135 im Backend.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Die entscheidbare Haelfte des Live-Editing-Clients (D76), headless und
geprueft: ?live=-Adressen normalisieren, Zeilen-Diff berechnen und anwenden,
die Cursor-Zeile durch fremde Aenderungen mitfuehren, und die Regel, wann eine
Feed-Antwort ueberhaupt angewendet werden darf.
Zerlegen und Hashen liegen hier und nicht verstreut in app.js: Beide Seiten
muessen Text gleich in Zeilen zerlegen, sonst zeigen die Indizes auseinander.
Das Diff-Modell ist dasselbe wie im Backend (de.werkbaum.diff.LineDiff).
Die Cursor-Rechnung ist der Teil, ohne den "kein Neuladen" nichts wert waere:
Ohne sie spraenge die Schreibmarke bei jeder fremden Aenderung weiter oben im
Dokument.
518 Tests (31 neu). Gegenprobe: Feed-Basis nicht geprueft, Zeile im Eingriff
wie darunter behandelt, Protokoll nicht geprueft -> es faellt jeweils genau
die danach benannte.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>