fix(live): Wiederverbindung sendet nie von selbst — Server-Stand oder Rückfrage (D89-Nachtrag 2)
Ein Fenster, das mit altem Text aufwachte, schickte ihn beim Wiederverbinden als Diff und überschrieb den aktuellen Plan (v660, v679). Jetzt entscheidet, ob seit dem letzten Abgleich hier gearbeitet wurde: nein → Server-Stand übernehmen (lokaler Text in die Sicherungen), ja → Konflikt-Band fragt. Regel headless in live.js (reconnectAction), Bandtext in neun Sprachen. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
2e408d956c
commit
28ff6844b0
@@ -19,6 +19,7 @@ reverse.
|
||||
|
||||
## 2026-09-04
|
||||
|
||||
- Fix: a shared document's reconnect no longer pushes whatever text the window holds — a phone waking up with yesterday's state overwrote the current plan twice; now the server state is taken when nothing was edited here, and the conflict bar asks when it was
|
||||
- A `mirror-docs` script runs a list of shared documents through `pull-doc --git-commit` and pushes once — as a 15-minute timer on the backend host it gives a shared plan a git history without anyone remembering to run it
|
||||
|
||||
## 2026-09-03
|
||||
|
||||
@@ -7815,6 +7815,58 @@ Entscheidungen: **D94** und `docs/rfc/002-mehrfenster.md`. Der Präsenz-Kanal
|
||||
(Herzschlag, Timeout, Notluke) und der modale Dialog sind ersatzlos
|
||||
ausgebaut; die drei anderen Netze (Sicherungen, Rettung, Wachhund) bleiben.
|
||||
|
||||
**Nachtrag 2 — die Wiederverbindung sendet nie von selbst (2026-09-04).**
|
||||
Der zweite Datenverlust am selben Dokument, diesmal nachgemessen bis zur
|
||||
Ursache: Version 679 (11:49 Uhr) kam von einem anderen Client (der PWA auf
|
||||
dem Telefon) und war byte-genau Version 667 — der letzte Stand, den das
|
||||
Telefon am Vortag gesehen hatte — plus drei Faltmarken. Die 16 Zeilen aus
|
||||
668 bis 671 waren weg; der Nutzer hat 671 per Rollback (v680) zurückgeholt.
|
||||
Dasselbe Muster wie v660 am Abend davor (byte-gleich mit v339).
|
||||
|
||||
**Der Mechanismus stand im D90-Nachtrag, als Rettung gemeint.** Die
|
||||
Wiederverbindung nach einer toten Sitzung holte den Server-Stand als
|
||||
Schattenkopie und schickte dann jeden abweichenden lokalen Text als Diff —
|
||||
„ungesendeter Text bleibt stehen, die keepMine-Semantik". Sie konnte nicht
|
||||
unterscheiden, ob der lokale Text **neuer** ist als der Server (ungesendete
|
||||
Arbeit) oder **älter** (ein Fenster, das lange geschlafen hat): In beiden
|
||||
Fällen ist er „anders", und die alte Fassung ging als Diff gegen den
|
||||
aktuellen Server hinaus, was einer Vollersetzung gleichkommt. Die Kette auf
|
||||
dem Telefon: Die PWA wacht auf, der erste Abruf scheitert (Funk noch aus),
|
||||
die Sitzung ist tot, der Editor zeigt den lokal gespeicherten Text vom
|
||||
Vortag. Ein Tipp auf ein Falt-Zeichen ändert ihn (Falten schreibt in den
|
||||
Text, D38-Nachtrag 2). Der Wachhund verbindet neu, sieht „lokal ≠ Server"
|
||||
und schickt.
|
||||
|
||||
**Entscheidend ist nicht der Vergleich der Texte, sondern ob hier gearbeitet
|
||||
wurde.** Zwei Zähler in app.js: einer zählt jede Textänderung an einem
|
||||
Server-Dokument — mit oder ohne Sitzung, denn das Falten auf einem toten
|
||||
Telefon ist genau der Fall —, der andere hält den Stand, den der Server
|
||||
zuletzt bestätigt hat oder den wir von ihm übernommen haben (gelungenes
|
||||
Senden, Laden, Volltext aus dem Feed, *Fremde übernehmen*). Ein Senden,
|
||||
während weiter getippt wird, bestätigt nur, was es getragen hat. Die Regel
|
||||
selbst steht headless in `live.js` (`reconnectAction`, D54-Nachtrag 3):
|
||||
Texte gleich → nichts zu entscheiden; nicht gearbeitet → der Server gilt,
|
||||
der lokale Text wandert in die lokalen Sicherungen; gearbeitet → das
|
||||
vorhandene Konflikt-Band fragt, mit eigenem Text („Dieses Fenster war
|
||||
getrennt und hat eigene Änderungen — der Stand auf dem Server weicht ab").
|
||||
Nichts geschieht stumm, und beide Stände existieren, bis ein Mensch
|
||||
entscheidet.
|
||||
|
||||
**Nachgemessen** im Browser gegen ein lokales Backend, das Telefon-Szenario
|
||||
nachgestellt: Server auf v2 gesetzt, Backend gestoppt, Seite geladen — Chip
|
||||
„getrennt", Editor zeigt den alten Spiegel (v1). Backend wieder da, nichts
|
||||
angefasst: nach ≤ 20 s zeigt der Editor v2, der Server steht **unverändert
|
||||
auf v2** (vorher hätte das Fenster hier v3 mit dem alten Text geschrieben).
|
||||
Zweiter Durchlauf mit einer getippten Zeile im getrennten Zustand: Das Band
|
||||
erscheint mit dem neuen Text, der Server bleibt auf v2, der lokale Text
|
||||
steht; *Eigene durchsetzen* schreibt v3 mit genau dieser Zeile. 669 Tests,
|
||||
davon 3 neue.
|
||||
|
||||
**Was bleibt:** Ein Fenster, das mit **ungesendeter** Arbeit ganz beendet
|
||||
wird (Android räumt die PWA ab), startet mit dem Server-Stand; die Arbeit
|
||||
liegt dann in den lokalen Sicherungen (Netz 3 aus dem Haupttext), nicht im
|
||||
Editor — unverändert seit D89.
|
||||
|
||||
## D90 — Die Dokumentart steht grau hinter dem Namens-Chip
|
||||
Nutzerwunsch, unmittelbar aus dem D89-Vorfall: Hinter der Brotkrume
|
||||
(„Werkbaum › Name", D81) soll erkennbar sein, was für ein Dokument vorn ist —
|
||||
|
||||
@@ -951,6 +951,13 @@ anderen, ohne neu zu laden.
|
||||
wandert er in die **lokalen Sicherungen**: Für Server-Dokumente sammelt der
|
||||
10-Minuten-Takt sie wieder, und das Uhr-Menü zeigt sie als eigenen Abschnitt
|
||||
unter den Server-Meilensteinen. Siehe D89.
|
||||
- **Eine tote Sitzung verbindet sich von selbst neu — und sendet dabei nie
|
||||
von selbst.** Wurde in diesem Fenster seit dem letzten gelungenen Abgleich
|
||||
nicht gearbeitet, gilt der Stand des Servers; der lokale Text ist dann nur
|
||||
ein alter Spiegel und wandert in die lokalen Sicherungen. Wurde gearbeitet,
|
||||
fragt das Konflikt-Band, wessen Fassung gelten soll. Ein Fenster, das mit
|
||||
dem Stand vom Vortag aufwacht, kann den Plan so nicht mehr überschreiben.
|
||||
Siehe D89-Nachtrag 2.
|
||||
|
||||
**Ein zweites Werkbaum-Fenster desselben Browsers** — Tab, Fenster oder PWA
|
||||
— kollidiert nur noch am **selben nicht geteilten Dokument**: Text, Name und
|
||||
|
||||
Reference in New Issue
Block a user