fix(editor): „nur ansehen" gilt jetzt dem Dokument, nicht nur dem Textfeld — auch das Diagramm faltet dort nicht mehr

Nutzer-Einwand, folgerichtig aus dem Vorgänger-Commit: Wenn Falten eine
Änderung ist, muss der Nur-Ansehen-Modus auch das Diagramm stillstellen —
im haltenden Fenster natürlich weiter nicht.

Es war schlimmer als eine fehlende Sperre: `readonly` hielt gar nichts auf.
`replaceTextUndoable` fällt auf `src.value = neu` zurück, wenn `execCommand`
scheitert, und eine Zuweisung an `value` schreibt auch in ein
schreibgeschütztes Feld. Nachgemessen: Ein Klick auf das Falt-Zeichen im
Nur-Ansehen-Fenster setzte `- > Ast A (M)` in Textfeld UND Speicher — der
Modus war nur eine Beschriftung.

Gesperrt wird jetzt an der Schreibstelle: eine Zeile in
`replaceTextUndoable` weist jeden programmatischen Schreibzugriff ab
(Falten, Durchschalter, „aus Taiga übernehmen", früherer Stand,
ID-Kurzform). Dazu ruhen die Gesten selbst, damit nichts still ins Leere
geht — toggleFold und der Durchschalter kehren früh um, Falt-Zeichen und
Knopf treten zurück und nehmen keinen Klick an (body.viewonly), und im
Knoten-Fenster entfallen die Aktionen, die in die Zeile schreiben.
„Nach Taiga schreiben" bleibt: Es fasst den Plan nicht an. Ansicht bleibt
Ansicht — Zoom, Modus, Pfad, Export, Sprünge unverändert bedienbar.

Nachgemessen mit zwei Fenstern: Chip, Tastatur und Durchschalter lassen im
Nur-Ansehen-Fenster Text und Speicher unangetastet; im haltenden Fenster
faltet dieselbe Geste weiter; verlässt es das Dokument, wird das andere von
selbst wieder beschreibbar und faltbar. SPEC §9, D94-Nachtrag 3 und
CHANGELOG nachgezogen; 666 Tests grün.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-09-02 20:28:20 +02:00
co-authored by Claude Opus 5
parent 2a58951138
commit 2d78baf407
5 changed files with 84 additions and 8 deletions
+1
View File
@@ -25,6 +25,7 @@ reverse.
- 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
- "View only" really is view only now: while the document is held by another window, the diagram's fold marks stay put too — folding writes to the text and used to slip past the read-only text area; the window holding the document folds as before
- 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
+42
View File
@@ -9040,6 +9040,48 @@ 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.
**Nachtrag 3 — „nur ansehen" galt nur dem Textfeld; jetzt gilt es dem
Dokument (2026-09-02).** Folgerichtiger Nutzer-Einwand aus Nachtrag 2:
Wenn Falten eine Änderung ist, muss der Nur-Ansehen-Modus auch das
Diagramm stillstellen — „in dem ersten Fenster soll das natürlich weiter
funktionieren."
**Es war schlimmer als eine fehlende Sperre: `readonly` hielt gar nichts
auf.** `replaceTextUndoable` fällt auf `src.value = neu` zurück, wenn
`execCommand` scheitert (D14: „der richtige Zustand geht vor der
Rückgängig-Historie") — und eine Zuweisung an `value` schreibt auch in ein
schreibgeschütztes Feld. Nachgemessen im Nur-Ansehen-Fenster: Ein Klick
auf das Falt-Zeichen setzte `- > Ast A (M)` in Textfeld **und** Speicher.
Der Modus war also nur eine Beschriftung.
**Gesperrt wird jetzt an den Schreibstellen, nicht am Feld.** Eine Zeile
in `replaceTextUndoable` weist im Nur-Ansehen-Modus jeden programmatischen
Schreibzugriff ab — das deckt Falten, Falt-Durchschalter, „aus Taiga
übernehmen", das Laden eines früheren Stands und die ID-Kurzform in einem
Griff. Dazu ruhen die **Gesten** selbst, damit nichts still ins Leere
geht: `toggleFold` und der Durchschalter kehren früh um, die Falt-Zeichen
und der Knopf treten zurück und nehmen keinen Klick an (`body.viewonly`),
und im Knoten-Fenster entfallen die Aktionen, die in die Zeile schreiben —
Story/Task anlegen, Ticket verknüpfen, „übernehmen". **„Nach Taiga
schreiben" bleibt**: Es fasst den Plan nicht an.
**Alles, was nur die Ansicht ändert, bleibt bedienbar** — Zoom, Modus,
Pfad, der Faltzustand aus dem Text, Export, Sprünge. Der Modus sagt
„dieses Dokument nicht ändern", nicht „nichts tun".
**Nachgemessen** mit zwei Fenstern: Im Nur-Ansehen-Fenster lassen Chip,
Tastatur (←) und Durchschalter Text und Speicher unangetastet (5 Knoten
bleiben 5, `pointer-events: none`, Deckkraft 0,45); im haltenden Fenster
faltet dieselbe Geste unverändert und schreibt `> Ast A`; verlässt das
haltende Fenster das Dokument, wird das andere von selbst wieder
beschreibbar **und** faltbar (`> Ast B` geschrieben). Vorher, zur
Gegenprobe: derselbe Klick schrieb im Nur-Ansehen-Modus in den Speicher.
**Benannt, nicht behoben:** Menüwege, die in den Text schreiben (früheren
Stand laden, „Original wiederherstellen"), sind im Nur-Ansehen-Modus zwar
wirkungslos — die Sperre greift —, ihre Einträge stehen aber weiterhin da.
Sie auszugrauen ist der nächste kleine Schritt, wenn es jemanden stört.
**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`
+4 -2
View File
@@ -963,8 +963,10 @@ Verlustfall hält jedes Fenster, solange ein nicht-`live:`-Dokument vorn
ist, eine **Sperre** (Web Locks API) auf es — atomar, und sie fällt von
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
ansehen (**das ganze Dokument ist dann schreibgeschützt**: Textfeld wie
Diagramm — auch die Faltmarken lassen sich dort nicht umklappen, denn das
schriebe in den Text; es wird von selbst wieder beschreibbar, sobald das
andere Fenster loslässt) oder trotzdem hier bearbeiten — dann gewinnt
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