fix(i18n): die Zwei-Fenster-Warnung nennt die zuletzt gespeicherte Änderung, nicht den letzten Tastendruck

Nutzer-Rückfrage: „Was für ein letzter Tastendruck?" — die Formulierung
liest sich, als zähle nur Tippen. Tut es nicht: Umklappen im Diagramm
schreibt die Faltmarke in den Text (D38-Nachtrag 2) und damit in den
Speicher, nimmt also am selben Wettlauf teil. Nachgemessen mit zwei
Fenstern: A klappt zu, im Speicher steht `- > Ast A (M)`, B's Editor und
Diagramm bleiben unverändert — und B's nächster Tastendruck überschreibt
den Speicher, A's Faltung ist weg.

Beide Texte in allen neun Sprachen umformuliert (tabConflictWarn,
docLockText); der Dialogtext nennt das Falten ausdrücklich. SPEC §9 sagt
jetzt dazu, dass das andere Fenster nichts nachzieht und dass ein
Dokumentwechsel dort nicht mitwandert — `werkbaum-active` entscheidet erst
wieder, was ein Neustart öffnet (auch das eine Nutzer-Rückfrage,
nachgemessen). D94-Nachtrag 2 und CHANGELOG nachgezogen.

Benannt, nicht behoben: Wer „trotzdem hier bearbeiten" gewählt hat, behält
die Warnung, auch wenn das andere Fenster das Dokument längst verlassen
hat — dieser Ausweg fordert die Sperre bewusst nicht mehr an.

666 Tests grün; die neuen Texte im laufenden Editor nachgesehen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-09-02 20:21:29 +02:00
co-authored by Claude Opus 5
parent 7f4c2a3e6a
commit 2a58951138
4 changed files with 59 additions and 19 deletions
+1
View File
@@ -24,6 +24,7 @@ reverse.
- The modal "open more than once" dialog is gone; the one remaining loss case — the same non-shared document open in two windows — is found by a per-document lock, and the second window chooses: open another document, view only until the other window lets go, or edit anyway
- The other-window warning now names the document and says whether it is open in the app or in the browser — and stays silent when nothing collides
- Fix: in the "open in another window" dialog the list of other documents squeezed its buttons until the names ran into each other — picking one is a dropdown now, one line tall however many documents you have
- The two-window warning says "whichever change is saved last wins" now instead of "the last keystroke" — folding a branch in the diagram writes to the text too, so it joins the same race
- An MCP server for AI agents recorded as planned: it lives in the backend, runs the one JS parser through GraalJS, hands plans to Claude Code and other agents as resources and tools over streamable HTTP, and writes changes as conflict-safe line diffs — no new runtime, spelled out in an RFC before it is built
## 2026-08-28
+34
View File
@@ -9006,6 +9006,40 @@ Diagramm die Höhe hat), ist die Karte immer noch höher als der getönte
Grund, in dem sie steckt, und malt darüber hinaus. Lesbar bleibt sie; wen
es stört, deckelt `.lockdlg` mit `max-height`.
**Nachtrag 2 — „der letzte Tastendruck gewinnt" war zu eng gefasst
(2026-09-02).** Nutzer-Rückfrage beim Ausprobieren: „Man kann im Diagramm
auf- und zusammenklappen — das beeinflusst das andere Fenster nicht,
richtig? Und was für ein letzter Tastendruck?" Beides trifft einen
Formulierungsfehler, nicht einen Baufehler:
- **Falten IST eine Änderung.** Umklappen schreibt die Faltmarke in den
Text (D38-Nachtrag 2) und damit in den Speicher — es nimmt am selben
Wettlauf teil wie das Tippen. Nachgemessen: A klappt „Ast A" zu, im
Speicher steht `- > Ast A (M)`; B's Editor und Diagramm bleiben
unverändert (6 Knoten, keine Marke), und B's nächster Tastendruck
überschreibt den Speicher — **A's Faltung ist damit weg**. „Beeinflusst
das andere Fenster nicht" stimmt also für die Anzeige und nicht für den
gespeicherten Text.
- **Die Warnung sagte deshalb das Falsche.** „Der letzte Tastendruck
gewinnt" liest sich, als zähle nur Tippen. Sie heißt jetzt „die zuletzt
**gespeicherte Änderung** gewinnt" (englisch „whichever change is saved
last wins"), in allen neun Sprachen; der Dialogtext nennt das Falten
ausdrücklich mit. SPEC §9 nachgezogen.
- **Der Dokumentwechsel wandert nicht mit** (dieselbe Rückfrage): Ein
anderes Dokument zu wählen ändert nur das eigene Fenster. Der geteilte
Schlüssel `werkbaum-active` wird zwar überschrieben, aber kein Fenster
reagiert darauf — er entscheidet erst wieder, was ein **Neustart**
öffnet (§3, „letzter Schreiber gewinnt, harmlos"). Nachgemessen: A
wechselt auf „Zweites", B bleibt auf „Falt-Probe".
**Dabei aufgefallen, benannt und noch nicht behoben:** Wer „trotzdem hier
bearbeiten" gewählt hat, behält die Warnung, auch wenn das andere Fenster
das Dokument längst verlassen hat — dieser Ausweg fordert die Sperre
bewusst nicht mehr an (`lockGen++`), also erfährt er vom Loslassen nichts.
Sauber wäre, auch dort im Hintergrund zu warten (`waitInBackground`) und
die Warnung zu räumen, sobald die Sperre ankommt — dieselbe Mechanik wie
bei „nur ansehen", nur ohne den Schreibschutz.
**Offen bleibt die Handarbeit** (RFC §10): installierte PWA neben einem Tab,
Firefox, Safari, ein Browser ohne Locks-API. Werkzeuggrenzen wie gehabt —
die Browser-Fläche war verborgen, getippt wurde per `value` + `input`
+6 -1
View File
@@ -965,7 +965,12 @@ selbst, wenn das Fenster schließt. Bekommt das zweite Fenster sie nicht,
zeigt es einen Dialog mit drei Auswegen: anderes Dokument öffnen, hier nur
ansehen (Textfeld schreibgeschützt, wird von selbst beschreibbar, sobald
das andere Fenster loslässt) oder trotzdem hier bearbeiten — dann gewinnt
der letzte Tastendruck, und die Warnung nennt das Dokument.
die **zuletzt gespeicherte Änderung**, und die Warnung nennt das Dokument.
Änderung heißt dabei nicht nur Tippen: Auch das Falten im Diagramm schreibt
in den Text (§9, `>`/`<`) und nimmt an diesem Wettlauf teil. Das andere
Fenster zieht dabei nichts nach — es zeigt weiter seine eigene Fassung —,
und auch das aktive Dokument wechselt dort nicht mit; der gemerkte
Dokumentwähler entscheidet erst wieder, was ein **Neustart** öffnet.
`live:`-Dokumente werden nie gesperrt: Zwei Fenster sind zwei Live-Clients,
der Server führt zusammen. Ohne Web Locks (file://, alte Browser) bleibt
der storage-Rückfall: ein fremder Schreibzugriff am eigenen aktiven