← Alle Beiträge

Plainva 0.6.6: der Alarm, der nichts bedeutete

15. August 2026

Ein Telefon in der Tasche lässt keine Zeitgeber laufen. Der Satz ist offensichtlich, sobald man ihn liest, und er war die Ursache für das Ärgerlichste an 0.6.5: ein rotes Warndreieck für einen Sync, mit dem nichts war.

Zwanzig Minuten nichts, zweimal

Plainvas Sync-Worker hat einen Wächter. Er merkt, wenn ein Zyklus nicht mehr antwortet — eine Anfrage, die nie zurückkommt, ein Netz, das mitten im Transfer verschwindet — und bricht ihn ab, statt den ganzen Sync für immer dort stehen zu lassen. Gemessen hat er das auf der Wanduhr: Zeitpunkt der letzten Aktivität, verglichen mit jetzt, und jenseits von fünfzehn Minuten für tot erklärt.

Auf einem Rechner ist das richtig. Auf einem Telefon ist es ein Kategorienfehler. Sperrt man den Schirm, setzt das Betriebssystem die App aus: kein Zeitgeber läuft, kein Code wird ausgeführt, nichts bewegt sich. Zwanzig Minuten später entsperrt man, der erste Wächter-Tick feuert und rechnet — letzte Aktivität vor zwanzig Minuten. Was auf der Wanduhr nicht davon zu unterscheiden ist, dass zwanzig Minuten lang niemand geantwortet hat. Also brach er einen völlig gesunden Zyklus ab und setzte ein rotes Dreieck auf den Schirm.

Der Fix ist klein: der Abstand zwischen zwei Ticks sagt dem Wächter, wie lange er nicht lief, und diese Zeit zählt nicht gegen den Zyklus. Ihn zu finden hieß aber zu akzeptieren, dass die Uhr das falsche Instrument ist. Was der Wächter wissen will, ist nicht „wie viel Zeit ist vergangen”, sondern „wie viel Zeit ist vergangen, in der ich etwas hätte bemerken können”.

Drei Sätze, die über sich selbst logen

Wenn ich schon dort war, habe ich die drei Stellen gelesen, die einen Sync-Fehler erheben — und zwei davon sagten das eine und taten das andere.

„Scheint zu hängen, wird abgebrochen, wenn er weiter nicht antwortet” — das ist eine Warnung vor einem möglichen Problem, erhoben als endgültiger Fehler. „Antwortete nicht und wurde abgebrochen; wird erneut versucht” — das ist ein fehlgeschlagener Versuch von mehreren, erhoben als endgültiger Fehler. „N Dateien konnten nicht geholt werden; sie werden im nächsten Zyklus erneut versucht” — die Stelle behält den Cursor genau deshalb, damit sie es kann, und erhob einen endgültigen Fehler.

Plainva hat für so etwas längst eine Regel: ein vorübergehender Fehlschlag meldet sich als „wird erneut versucht”, und erst der dritte in Folge wird rot. Alle drei folgen ihr jetzt.

Nichts davon war schwer. Was ausgesprochen gehört, ist der Preis, es falsch zu haben: ein Dreieck, das erscheint, wenn nichts ist, ist ein Dreieck, das niemand liest. Bis es etwas bedeutet, ist es zu Hintergrundrauschen antrainiert. Das ist kein kosmetisches Problem — es ist der Ausfall des einen Kanals, den die App hat, um „hier braucht es Dich” zu sagen.

Der Hinweis, der jeden Morgen grüßte

Derselbe Release hatte davon noch einen. Veröffentlichte ein älteres Plainva auf einem anderen Gerät noch zurückgelassene Kontendaten, sagte ein Hinweis das. Er hatte recht. Er sagte es auch bei jedem einzelnen App-Start, weil die Bremse dahinter in einer Modul-Map lag — die hält für eine Sitzung, und ein Telefon startet viele Sitzungen am Tag.

Und die Bedingung räumte sich nie selbst auf. Ein Eintrag, den niemand entfernt, wird im nächsten Zyklus wieder gefunden, und im nächsten, für immer.

Es brauchte also zwei Hälften, weil jede allein weiterhin falsch wäre. Ein Befund, der einen Menschen zum Handeln braucht, merkt sich jetzt über Neustarts hinweg, dass er gesagt wurde — ein sterbender Prozess ist nicht der Mensch. Und das Telefon bekam die Aktion, die den Zustand beendet; die gab es bis dahin nur am Rechner, und genau deshalb war die Warnung auf einem Telefon bauartbedingt dauerhaft. Man konnte sie dort lesen und nie etwas dagegen tun.

Vorübergehende Meldungen behalten das alte, sitzungsweite Verhalten mit Absicht. Ein Netzwerkfehler ist es wert, nach einem Neustart erneut gesagt zu werden. Die beiden sind verschiedene Dinge und sind jetzt verschiedene Funktionen.

Wo eine Warnung geholfen hätte

Einer ist noch in diesem Release, und er ist der, der wirklich etwas gekostet hat.

Benenne eine Notiz um. Bearbeite sie später. Statt zusammenzuführen behielt der Sync Deine lokale Fassung als .CONFLICT-Kopie und ersetzte die Notiz durch die des Servers.

Die Ursache ist ein Gedanke, den ich nie aufgeschrieben hatte. sync_state — die Tabelle mit der gemeinsamen Basis, die ein Drei-Wege-Merge braucht — ist pfad-gekeyt, genau wie der Datei-Index. Ein Umbenennen schrieb Index und Sync-Warteschlange um und ließ sync_state unter dem alten Namen liegen. Die umbenannte Notiz sah damit brandneu aus: eingetragen mit lokalem Inhalt und ganz ohne Basis. Fast-Forward und Drei-Wege-Merge verlangen beide diese Basis, also fiel der Code in seinen „keine verlässliche Basis”-Zweig, und der tut das Sichere: lokale Fassung als Kopie bewahren, Serverstand übernehmen.

Dieser Zweig ist richtig. Er wurde aus dem falschen Grund erreicht.

Verloren ging nichts — die .CONFLICT-Datei neben der Notiz enthält Deine Fassung wörtlich, und Plainva führt die beiden nebeneinander zusammen. Aber der Sync sagte nichts über das Warum, weil aus seiner eigenen Sicht nichts Ungewöhnliches passiert war. Er sah eine neue Datei ohne Geschichte. Es gab keine Warnung zu erheben.

Dieselbe Form hatte ein Geschwister, das niemand gemeldet hatte: der Index löschte Zeilen über sha256(Pfad) — genau den Wert, den eine Zeile verliert, wenn ihr Ordner umbenannt wird. Eine gelöschte Notiz konnte dadurch im Baum und in der Suche stehen bleiben, während sie von der Platte weg war — und in die andere Richtung konnte das De-Indizieren eines alten Pfads eine Notiz entfernen, die es noch gab. Alles, was am Pfad hängt, wandert jetzt mit dem Pfad.

Der Rest

Die Einstellungen am Telefon folgen einer Grammatik. Ein Feld stand bisher lose auf der Seite und zog seine eigene linke Kante, direkt neben den Karten der Fläche daneben. Es gibt jetzt zwei Kanten — die der Seite und die der Zeile — und einen Rhythmus je Seite statt eines Stapels von Einzelabständen. Neunzehn Flächen.

Zwei Funktionsbefunde kamen dabei heraus, beide lagen offen sichtbar da. Der Stift an einem Mail-Konto änderte eine Überschrift vierhundert Zeilen unter dem Falz, antippen sah also aus, als sei nichts passiert; er öffnet jetzt ein Blatt. Und der Besprechungs-Ordner war ein nacktes Textfeld, in das man einen Vault-Pfad tippen musste, während die vier Ordner einen Bildschirm weiter einen Browser hatten — weil es keine geteilte Ordner-Zeile gab, an der man sich hätte bedienen können. Jetzt gibt es sie.

Der mobile Kalender sagt, welcher Tag ist. Das Zeitraster beantwortete „um welche Uhrzeit” und überließ „an welchem Datum” der Beschriftung darüber. Bei einer Spalte liest sich das gut; bei dreien nebeneinander heißt es zählen. Und ein ganztägiger Termin hatte in dieser Ansicht überhaupt keinen Platz — das Raster positioniert zeitgebundene Blöcke, ein Ganztags-Termin war dort schlicht unsichtbar.

Ein gelöschtes Kalenderkonto bleibt gelöscht. Die Kontenliste reist als ein Feld im geteilten Profil, also veröffentlicht ein Gerät mit älterer Version sein Konto weiter, und der nächste Zyklus legt es wieder an. Der Grabstein ist bewusst lokal: ein Konto für alle Geräte zu entfernen ist ein größeres Versprechen, und es braucht die Zustimmung der anderen Geräte.

„Zuletzt geöffnet” und Lesezeichen bleiben stehen in der Desktop-Seitenleiste. Sie lagen im Dateien-Zweig und verschwanden beim Umschalten auf Tags oder Datenbanken — und der Umschalter selbst saß darüber, weit weg von dem Baum, den er umschaltet. Beide sind darüber gewandert.

macOS verlangt jetzt 13.3 (Ventura), korrigiert von 12. Das ist keine Verschärfung, sondern ein Eingeständnis: auf macOS zeichnet eine App ihr Fenster mit einem System-Bestandteil, der mit OS-Updates zieht und nicht mit Safari — ein Mac mit taufrischem Safari kann also trotzdem unter der Grenze liegen. Bis zu diesem Release versprach der Installer ein System, auf dem Plainva nicht startet.

Herunterladen

Plainva 0.6.6 liegt auf der Release-Seite für Windows, macOS und Linux; die Desktop-App aktualisiert sich selbst. Android-Tester bekommen sie über den internen Track, iOS über TestFlight.