/settings — Einstellungen
Hinweis: Rahmen: 00-rahmen.md. Code:
packages/plugins/src/settings/· Nachweiseverify:settings,verify:rechte(Teil 11, Konten),verify:einstellungen,verify:zugaenge,verify:meldungen.
Wofür
Der Maschinenraum: Hebel, Ventile. Anpassen geschieht hier — und an Ort und Stelle gibt es einen Sprung hierher, der die richtige Zeile öffnet (Grundsatz 37).
Die stillste Seite (Lautstärke 1).
Weg und Rahmen
| Route | /settings, Abschnitt über ?a=darstellung|zeit|lernen|bereiche|konto|einrichtung|zugaenge|daten|fremd, aufgeklappte Gruppe über ?g=<Kennung> |
| Merkmal | keines |
| Zimmer | Maschinenraum · Lautstärke 1 · #8f8a99 |
| Plugin | Gerüst — abschaltbar: false, kein server/ |
Was man sieht
Der Abschnitt steht in der Adresse (F09, seit 21.09.2026). Bis dahin hielt dieser Schirm als einziger seine Kategorie in einem eigenen Zustand und las ?a= gar nicht — der eine Verweis, den es gab, zeigte auf ?a=darstellung und landete richtig, weil das der Anfangswert war. Jetzt zeigt /settings?a=zugaenge die Zugangsdaten, und ein unbekannter Wert zeigt wie überall sonst den ersten Abschnitt statt eines leeren Schirms. Welche Abschnitte es gibt, hängt am Konto; kommt das Recht erst mit access nach, wird der Abschnitt aus der Adresse nachgeholt.
Auch eine Gruppe oder ein Teil kann in der Adresse stehen (Gruppe seit dem 23.09.2026, N143; Teil seit dem 19.10.2026, OE-261019-zweite-ebene-als). ?g= mit der Kennung einer Faltgruppe öffnet den Schirm mit dieser Gruppe aufgeklappt und rollt zu ihr; gelesen wird das einmal beim Öffnen (sprungAusAdresse in settings/shared/adressgruppe.ts), eine unbekannte Kennung wird übergangen. ?g= mit der Kennung eines Teils ist dagegen die laufende Adresse des Teilschirms: Solange sie dasteht, steht der Teil als eigener Schirm an der Stelle der Gruppen. /settings?a=konto&g=passwortwechsel ist der Verweis aus dem Hinweis auf ein häufiges Passwort (docs/seiten/anmeldung.md, D30) und landet genau im Passwortwechsel; die Suche verweist ebenso auf Teile (einstellungsadresse).
Seit WI15 (I09) zählt jede Gruppe und jeder Anker des Suchverzeichnisses, nicht nur die, die beim Öffnen zu sind: Eine offene Gruppe wie „Modellverbrauch“ klappt nichts auf, aber der Schirm rollt zu ihr. So kommt der Sprung aus dem Steckbrief im Wiki (docs/seiten/wiki.md, „Einstellungen im Steckbrief“) bei jeder Gruppe an. Welche Gruppe zu welchem Bereich gehört, trägt der Eintrag im Suchverzeichnis als bereich, ein einzelner Schalter der Gruppe als schalter.
Abschnitte, jeder mit seinem Zeichen links — Christians Wunsch vom 11.09.: „Einstellungskategorien mit Icons links (wie in jedem normalen Programm)."
| Abschnitt | Inhalt |
|---|---|
| Darstellung | Szene (fest oder je Tageszeit, seit N132), Eigene Szene (Erweitert, E04; zugeklappt wie die Szene, seit E27 — vorher stand sie nach „Alles“ offen und entzog sich „Alles zuklappen“), Abo-Theme (nur ab zwei wählbaren Stufen, N132), Rang am Namen (nur ab zwei Rängen, E22), Himmel, Wetter, Dichte, Sprache, Region (Erweitert, VA-261010-sprache-region), Inhaltsbreite, Tabellenumbruch, wo ein Editor aufklappt |
| Zeit und Anfang | Zeitzone, Wochenanfang (die Wahl der Startseite, „Wo Denotato aufgeht“, entfiel am 09.10.2026; siehe „Die neue Navigation“), was im Tagesbriefing steht (erweitert, BE44), darin seit dem 24.09.2026 Roller oder Bahn im Briefing (BE18); seit dem 03.10.2026 die Gruppe Benachrichtigungen (L02, N311; nicht in der Gerätesicht). Die Auswahl der Zeitzone zeigt seit dem 09.10.2026 (VA-261009-zeitzonen-standorte) hinter der festen Kurzliste die Zonen aller sichtbaren Standorte der Hochschulen (etwa Europe/Paris, Europe/Warsaw), ohne Doppelte und ohne ausgeblendete Standorte; sie kommen mit der Hochschulliste, die jedes Konto ohnehin holt. Seit dem 09.10.2026 (VA-261009-standortzonen-tragen) nennt jede dieser Zonen die Standorte, aus denen sie kommt, hinter dem Zonennamen (etwa „Europe/London · ESCP London“; höchstens drei, danach „…“); trägt ein Standort eine Zone der Kurzliste, steht er auch dort dabei. Der Wert der Option bleibt der Zonenname. Antwortet die Liste nicht, bleibt die Kurzliste ohne Standortnamen |
| Lernen (mit Karteikarten, Stundenplan oder Begleiter) | Modellverbrauch zeigt mit aktivem Begleiter den gemeinsamen Verbrauchsring: die knappste Grenze des Kontos; auf Klick ein schwebendes Fach mit Tageszählern, Monatsbetrag und Rücksetzung (KI07). Ob die Gruppe erscheint, fragt seit dem 26.09.2026 dieselbe Bereichslage wie Leiste und Server — Begleiter an und Studium verfügbar. Darunter, unter derselben Bedingung, Tagebuch und Gedächtnis im Begleiter (KI53, N503, Adresse ?a=lernen&g=einwilligung): der Wortlaut der Einwilligung nach Art. 9 Abs. 2 lit. a DSGVO, der Stand mit Datum („Eingewilligt am …“, „Abgelehnt am …“, „Widerrufen am …“, „Noch nicht entschieden.“) und ein Knopf, der ihn umkehrt — „Widerrufen“ oder „Einwilligen“. Der Widerruf gilt ab der nächsten Anfrage an den Begleiter; die Gruppe kommt über den Anschluss des Begleiters (Einwilligungseinstellung), Einzelheiten in begleiter.md, „Einwilligung für Tagebuch und Gedächtnis“. Seit dem 14.10.2026 (E-261013-begleiter-weniger) folgen die Schalter, die bis dahin im Seitenfach des Begleiters standen, über seinen Anschluss; seit dem 16.10.2026 (OE-261011-einstellungen) als eine Gruppe Begleiter (g=begleiter, ab Werk zugeklappt): oben die Stufe Ruhig · Ausgewogen · Eigenständig, darunter zugeklappt „Einzeln einstellen“ mit Schreiben ohne Nachfrage (Auto-Modus und „Immer erlaubt“), Von selbst melden (ein Haken je Anlass) und Karten vom Begleiter; Abschnitt „Der Begleiter als eine Stufe“. Der Knopf „Einstellungen des Begleiters“ im Seitenfach öffnet die Gruppe. Daneben stehen Karten pro Tag (nur mit FLASHCARDS; bis RL20 „Tagesmaß“, N449) und seit dem 24.09.2026 Lernzeiten des Stundenplans (nur mit STUNDENPLAN, W22) — der Schalter der Lernvorschläge und das Wochenziel (Stufen 5, 10, 15, 25 h, N244; W22, Schritt 2). Die erweiterte Sicht zeigt darunter die Probe, einen Satz, was die Werte zusammen ergeben: ohne Ziel wie in W22, Schritt 1, mit Ziel je Lerntag Tagessoll, Blocklänge und Pause, dazu, was ein Tag mit freier Zeit am Stück fasst, wenn das unter „Höchstens am Tag“ bleibt, und eine Warnung, wenn das Ziel größer ist, als die Lerntage fassen; Dauern darin brechen nicht um (geschütztes Leerzeichen). Mit Ziel stehen zwischen Wochenziel und Probe die Lerntage als sieben gleich breite Knöpfe (unter 22rem Breite in zwei Reihen). Unter der Probe zwei Unterüberschriften (Guide §15.1): Der Tag — höchstens am Tag, Tagesbeginn, Ohne Termin ab (nur mit Ziel, N249), Tagesende — und Die Blöcke — kürzester Block, mit Ziel dazu Blocklänge, Pause und Abstand. Einzelheiten in stundenplan.md, „Lernblöcke als Vorschlag“ und „Die Woche nach dem Wochenziel“ |
| Bereiche | Jeder gewährte Bereich an/aus (vom 07. bis 09.10.2026 stand darüber der Schalter „Neue Navigation“; Abschnitt „Die neue Navigation“), Farbe, Zeichen. Fünfzehn gibt es am 27.09.2026: Studium · Karteikarten · Dokumente · Personen · Leben und Kalender · Aufgaben · Fortschritt · Persönlichkeiten · Tagebuch · Gedächtnis · Moodle · Stundenplan · Verwaltung · Wiki · Lern-Timer (seit N328, NB06: Knopf im Lerndurchgang, Leiste, Schnellaktion und der Kasten „Lernzeit" im Studium; an für neue Konten). Die Liste steht in SWITCHABLE_FEATURES; die Zahl ist datiert, weil sie mit jedem Bereich wandert. Gegliedert nach den Räumen des Kontos (seit NV05, N432, 30.09.2026): je Raum ein Kopf mit Zeichen, Name und Raumschalter, darunter die Karten seiner Bereiche; ein Bereich in zwei Räumen (der Kalender) steht in beiden mit demselben Schalter; was in keinem Raum steht, folgt unter „Ohne Raum“. Davor steht je eigener Raum, dessen Kennung wie ein Weg heißt, ein Hinweis „Der Raum „…“ fehlt: Seine Kennung „…“ heißt wie ein Weg in Denotato.“ (NV14, N461). Einzelheiten im Abschnitt „Der Schalter eines Raums“. Jeder trägt einen Titel und einen Satz dazu, was das Umlegen anrichtet — und dass die Daten bleiben; die Texte stehen in shared/src/config/bereichstexte.ts. Folgt ein Bereich einem anderen (N446, LX24), steht darunter ein zweiter Satz aus der Kopplung der Instanz (plugins.folgen): beim Folger „Geht mit … an und aus; einzeln umlegen geht trotzdem.“, beim führenden „Schaltet … mit an und aus.“ — genannt wird nur, was dem Konto gewährt ist. Was dem Konto nicht gewährt ist, steht hier gar nicht, auch nicht ausgegraut Darunter die Gruppe „Im Hintergrund" (seit N363, D33): Schlaf und Rückblick, die keine eigene Seite und kein Merkmal haben, sondern dem Briefing und dem MCP-Zugang zuliefern. Ihr Schalter ist die Einstellung plugin.<id>.aktiv, geschrieben in die Nutzerschicht; ausgeschaltet antworten ihre Wege auf dem Server mit 403. Titel aus der Deklaration des Plugins, der Satz steht in HINTERGRUND in SettingsMenu.tsx. Eingebaut sind beide aus, für diese Instanz setzt Wanderung 175 die Vorgabe an |
| Konto | Der Anzeigename (BE34), die E-Mail-Adresse (anzeigen, bestätigen lassen, wechseln — D02), die Post-Wahl (D25) und das Passwort ändern (D05). Darunter, seit dem 21.09.2026, die Zwei-Faktor-Anmeldung (D07). Darunter, seit dem 13.10.2026, Anmeldung (Google und Apple, D-261008-google-apple; ?a=konto&g=anmeldung), nicht für Gäste; Abschnitt „Anmeldung über Google und Apple“. Seit dem 30.09.2026 vor der Post die Gruppe Hochschule (VA14, Musterbogen C2; ?a=konto&g=hochschule): ein Auswahlfeld mit jeder sichtbaren Hochschule als „Name (Stadt)“ und „Keine davon“, gespeichert sofort beim Wählen (EINRICHTUNG_WAEHLEN). Darunter ein Satz, was die Wahl bringt — „Als Vorgabe im Briefing: Wetter für …, die Mensa …, die Lernplattform. Was du selbst wählst, geht vor.“; bei „Keine davon“: „Ohne Hochschule wählst du Ort und Mensa im Briefing selbst, unter „Ort und Mensen“.“ Seit dem 04.10.2026 (VA13) folgt bei einer gewählten Hochschule ein zweiter Satz mit ihren Vorlesungszeiten — „Vorlesungszeit: Wintersemester 2026/27 vom … bis …. Eine Veranstaltung ohne eigenes Ende endet im Kalender dort; eigene Semester im Studium gehen vor.“ — oder, ohne hinterlegte Zeiten, „Vorlesungszeiten sind nicht hinterlegt. Eine Veranstaltung ohne eigenes Ende steht im Kalender bis auf Weiteres.“ Seit dem 08.10.2026 (VA-261008-standorte) folgt bei einer Hochschule mit mehr als einem sichtbaren Standort ein zweites Auswahlfeld „Standort“ (ein ausgeblendeter, den das Konto trägt, bleibt darin); Ort, Mensen und Vorlesungszeiten im Satz sind dann die des Standorts, und Briefing und Kalender folgen ihm. Mit nur einem Standort fragt die Seite nicht. Liegt der gewählte Standort in einer anderen Zeitzone als das Konto, steht einmal nach der Wahl der Satz „Campus Paris liegt in der Zeitzone Europe/Paris, deine Uhrzeiten stehen in Europe/Berlin. Sollen sie der Zone des Standorts folgen?“ mit „Zone übernehmen“ (setzt Zeit › Zeitzone) und „Meine Zone behalten“; gemerkt wird das Angebot nicht. Dieselbe Wahl fragt die Übersicht einmal (dashboard.md); gepflegt werden die Hochschulen unter /admin?a=hochschulen (verwaltung.md). Seit dem 14.10.2026 (KN-261014-erststart-pflege) folgt auf die Hochschule die Gruppe Studium (?a=konto&g=studium): die Felder Studiengang und Fachsemester (1 bis 30) mit Speichern, das erst mit einer gültigen Änderung greift, und darunter „Wofür nimmst du Denotato vor allem?“ mit den fünf Kästchen der Erststart-Karte, jedes sofort gespeichert. Es sind dieselben Antworten wie auf der Karte (konto.studiengang, konto.wofuer); die Karte verweist bei diesen Fragen hierher. „Wofür“ legt hier keine Bereiche um |
| Einrichtung | Seit dem 15.10.2026 (KN-261015-einrichtung-gesamt, Musterbogen docs/gestaltung/musterboegen/einrichtung-gesamt.html): die ganze Einrichtung als Liste von sieben Abschnitten in aufbauender Folge — Studium im Groben · Zugänge · Stundenplan · Semester und Module · Kalender · Lernen · Alltag. Abschnitte, deren Bereiche alle aus sind, fallen weg (Stundenplan ohne STUNDENPLAN, Module ohne STUDY, Kalender ohne EVENTS, Lernen ohne Karteikarten, Studium und Stundenplan). Darüber „2 von 7 eingerichtet. Die Folge ist ein Vorschlag; jeder Abschnitt lässt sich jederzeit öffnen.“ Je Zeile Nummer, Name, eine Marke (eingerichtet, später, als Nächstes, offen), der Stand in Worten aus den Daten („12 Veranstaltungen“, „Noch nichts“), was der Abschnitt umfasst, und beim nächsten der Satz, was er aus den vorigen nimmt. Rechts „Weiter“ (beim nächsten, Hauptknopf), „Öffnen“ (offen) oder „Ändern“ (eingerichtet) — jeder führt in den bestehenden Ablauf seines Bereichs: Erststart-Karte bzw. Konto › Studium, Zugangsdaten, /stundenplan, /study?a=modules, /calendar/einrichten, Lernen, Zeit und Anfang. Nicht eingerichtete Abschnitte tragen „Später“ / „Doch jetzt“; das schreibt konto.einrichtung_spaeter und schiebt nur die Empfehlung weiter. Eingerichtet heißt aus den Daten, nicht per Merker: Grob ohne offene Erststart-Frage, Zugänge mit einer Verbindung, Stundenplan mit einer Veranstaltung, Module mit einem Modul, Kalender mit Tagesrhythmus oder Kalenderverbindung, Lernen mit Wochenziel oder Lernkarten, Alltag mit Mitteilungen oder zweitem Faktor. Der Stand kommt von EINRICHTUNG_STAND (MCP einrichtung_stand); das Briefing nennt den nächsten Abschnitt (dashboard.md) |
| Zugangsdaten | Zwei Überschriften, zwei Kachelwände (21.09.2026). Nach draußen: alles, was das Konto verbunden hat — Google-Kalender (Knopf), Moodle, Notion und iCloud (Formular), jedes .ics-Abonnement (nur Auskunft, A24). Nach innen: die eigenen Zugriffsschlüssel und die eigene MCP-Adresse (17.09.2026), dahinter seit dem 24.09.2026 der eigene .ics-Strom als eine Kachel (nur Auskunft, N205) |
| Deine Daten | Speichernutzung (D13) · Papierkorb · Alles Eigene als JSON herunterladen (Grundsatz 53) · Einzelne Listen als CSV oder Markdown (Q04) · Nutzungsprotokoll (DS-261006-schalter-hinweis) · Meine Nutzung (DS-261006-eigene-nutzung) · Einen Export zurückspielen (BE36) · Konto löschen |
Seit dem 24.09.2026 nicht mehr hier (A41, N253): Die fünf Abschnitte Neue Konten · Vorgaben setzen · Für alle · Rollen · Konten stehen im Reiter „Admin“ (/admin, docs/seiten/verwaltung.md), seit D47 (29.09.2026) mit Impressum als sechstem. Die Einstellungen sind das, was ein Konto für sich selbst stellt | |
| Als jemand anderes (nur Entwickler) | Impersonation |
Privatsphäre (E-261021-freunde-chats-einbinden, 27.10.2026; Seite Freigaben seit E-261021-freunde-freigaben-apple). Eine Kategorie mit dem Schloss (gesperrt) und der Kennung privacy, in der Reihenfolge nach Konto; darin die Gruppe „Freigaben“ (/settings?a=privacy&g=sharing). Oben die Vorschau „So sieht dich …“ mit dem Wechsel zwischen einem Freund und einem Konto ohne Freundschaft: eine Karte wie ein Profil mit Bild, Name und dem, was dieser Leser wirklich sieht, aus derselben Regel wie für echte Leser. Darunter drei Teilzeilen mit Zeichen und Kurzfassung — Zeit (Uhr), Status (Punkt), Lernen (Kappe) —, jede öffnet ihre Unterseite (Teilinhalt sharing-time, sharing-status, sharing-learning): oben die Stufe der Kategorie als Auswahl („Niemand“, „Ausgewählte Freunde“ mit den Freunden zum Anhaken, „Alle Freunde“, „Alle mit Konto“), ohne Stufe der Satz „Noch keine Stufe · jeder Punkt mit eigener Vorgabe“; darunter „Genauer“ je Gegenstand eine eigene Stufe oder „wie die Kategorie“ und, bei Stundenplan und Kalender, die Tiefe. Eine gedämpfte Zeile „Orte“ mit „Später“; am Ende Wünsche und der eigene Name bei „besorge ich“, die keiner Kategorie folgen. Jede Änderung gilt sofort und zählt als Antwort auf die Frage aus dem Erststart („Wer darf was von dir sehen?“, „Alles an“ oder „Selbst wählen“). Die Gruppe kommt aus dem Anschluss freunde (Bauteile SharingPreview, SharingCategory, SharingWishes, geladen erst beim Zeichnen; Kurzfassung über useSharingSummary) und steht im Suchverzeichnis mit dem Bereich friends, die drei Unterseiten als eigene Einträge. Ist der Bereich Freunde aus oder fehlt der Anschluss, fehlen die Gruppe und, solange keine andere Gruppe darunter steht, auch die Kategorie. Der Freunde-Schirm sagt die Kurzfassung in einer Zeile und verweist mit „Ändern“ hierher; Einstellungen stehen nicht auf Schirmen (2026-10-22-einstellungen-nicht-in-schirmen). Die alte Adresse g=friends springt nicht mehr zur Gruppe.
Ganz unten steht die Fassung (23.09.2026, N191). Unter „Einstellungen zurücksetzen", also unter jedem Abschnitt gleich, eine stille Zeile in der dritten Vordergrundfarbe: „Denotato 0.0.0.1437 · a1b2c3d4", beide Zahlen in Mono mit Tabellenziffern. Trägt der laufende Commit noch keine Marke, steht „· vorläufig" dazwischen (englisch „provisional"). Sie steht als Letztes, weil sie niemand bedient. Die Zahl kommt aus POST /api/fassung (client/Fassungsangabe.tsx, sechs jsdom-Tests); kennt der Server keine Fassung — kein Git im Betrieb —, steht nichts da und kein Fehlersatz. Am Telefon rollt das Seitenende seither über die Schnellaktionsreihe hinaus: Vorher lag die letzte Zeile jeder Seite unter der Reihe und der Eule, weil die Rollfläche in GeneralMenu.tsx die Reihe nicht einrechnete. Seit F79 auch auf Tablet und Desktop über Eule und Rückmeldeknopf: Auf dem Tablet lag die Zeile halb unter der Eule; die Rollfläche rechnet jetzt auf jedem Gerät die Höhe der Figur ein (FIGURHOEHE, 00-rahmen.md).
„Für dich gibt es derzeit keinen Bereich umzuschalten." steht unter „Bereiche“, wenn dem Konto kein schaltbarer Bereich gewährt ist. Bis zum 07.10.2026 hieß der Satz „… nichts umzuschalten“; geändert wurde er, als der Schalter „Neue Navigation“ darüber stand. Der ist seit dem 09.10.2026 fort, der Satz blieb.
Die Meldungseinstellungen haben zwei Modi, Normal und Entwickler, und einen Regler „Wie viel gemeldet wird“ (im Entwicklermodus „Wie tief berichtet wird“) mit fünf Stufen, 0 bis 4. Bestätigungen erscheinen auf keiner Stufe (2026-10-08-keine-erfolgsmeldungen), außer denen einer unsichtbaren Wirkung wie dem Kopieren, die ab Stufe 1 kommen (NV-261007-seitenleiste-schliff, Schritt 8). Stufe 1 und 2 zeigen darum dasselbe; der Hinweis unter dem Regler sagt das. Ab Stufe 3 kommen Hinweise und Warnungen dazu, auf Stufe 4 Fehler beim Lesen. Der Entwicklermodus setzt unter einen Fehler Pfad und Kennung, ab Stufe 3 die Dauer. Die Probe zeigt die leiseste Art, die die Stufe noch durchlässt: auf Stufe 1 und 2 einen Fehler, ab 3 einen Hinweis, auf 0 nichts. Ihre Fehlerkarte trägt seit dem 08.10.2026 keinen Knopf „melden“: Ein Druck darauf hätte einen Fehlerbericht über einen Fehler abgeschickt, den es nicht gab. Namen und Hinweise der Stufen sind mit satz() markiert und haben seit dem 08.10.2026 eine englische Seite; nur der Name der Entwicklerstufe 1, „Fehler“, bleibt auf Englisch deutsch, weil dasselbe Wort eine Meldung in de.json ist und kein Satz beide Wege gehen darf (verify:uebersetzung, Prüfung 4).
Unter „Konto" stehen die persönlichen Zugangs- und Postangaben. Ganz oben der Anzeigename — ein Feld, ein Knopf, kein Passwort: Er ist die Beschriftung und nicht die Kennung, und wer ihn ändert, sperrt niemanden aus. Ein Passwortfeld davor wäre keine Sicherheit, sondern eine Gewöhnung. Änderbar einmal in der Woche, damit jemand in einer Freigabe nicht täglich ein anderer ist; der erste Wechsel ist immer frei, weil ein neues Konto sonst eine Woche auf einen Namen wartet, den es nie selbst gesetzt hat. Was zurückkommt, ist der abgelegte Name (ohne Leerzeichen am Rand), nicht der eingetippte.
Hat eine Gruppe zwei oder mehr Teile, steht jeder Teil als Teilzeile mit Kurzfassung da (Christians Wahl im Musterbogen, OE-261019-zweite-ebene-als). Der Stand der Kurzfassungen lädt beim Aufklappen der Gruppe und nach der Rückkehr aus einem Teil. Ein Tipp auf die Zeile öffnet den Teil als eigenen Schirm mit „Zurück“, großem Titel und eigener Adresse ?g=<anker>; der Fokus liegt dann auf dem Titel. „Zurück“ geht im Verlauf zurück, ein Wechsel der Kategorie verlässt den Teil. Heute tragen nur die drei Konto-Gruppen Teile; welche Teile es gibt, folgt aus dem Suchverzeichnis.
Darunter folgt die Reihenfolge der Abhängigkeit. Erst die E-Mail-Adresse: was dasteht, ob sie bestätigt ist, „Mail noch einmal schicken", und ein Feld für eine neue Adresse — die erst nach dem Klick im Link gilt, damit ein Tippfehler folgenlos bleibt. Danach folgt Post: Jede bekannte Sorte nennt Titel und Zweck und lässt sich mit An / Aus wählen; dieselbe Wahl schreibt auch der signierte Abmeldelink. Solange es noch keine Sorte gibt (N287), erklärt der Abschnitt, dass Denotato ausschließlich Vorgangs-Mails zum Konto verschickt und diese nicht abbestellbar sind. Darunter steht Passwort ändern. Wer sein Passwort vergisst, kommt über die Adresse zurück; ist sie falsch, hilft kein Passwortwechsel mehr.
Solange die Adresse nicht bestätigt ist, steht das dort — und der Satz dazu, was das bedeutet: „Solange diese Adresse nicht bestätigt ist, schickt Denotato keinen Rücksetzlink dorthin."
Unter „Deine Daten" stehen sieben Abschnitte, und ihre Reihenfolge ist die Botschaft. Ganz oben seit dem 21.09.2026 (D13) Speicher — ein Balken und ein Satz mit den zwei Zahlen (belegt, erlaubt), aufgeklappt und ohne eigenen Aufklappzustand, weil ein Blick genügen soll, nicht ein Klick. Darunter der Papierkorb (seit dem 19.09.2026, B07), darunter „Alles Eigene herunterladen" (aufgeklappt), darunter „Einen Export zurückspielen" (zugeklappt, seit dem 21.09.2026 — BE36), darunter „Nutzungsprotokoll" (zugeklappt, seit dem 07.10.2026), darunter „Meine Nutzung" (zugeklappt, seit dem 07.10.2026), darunter „Konto löschen" (zugeklappt, seit dem 18.09.2026 — D04).
Zurückholen und Löschen sehen verschieden aus (seit dem 09.10.2026, ES-261009-akzentfarbe-fester): „Zurückholen" ist der gefüllte Hauptknopf in der Anwendungsfarbe, „Endgültig löschen" ein Umrissknopf mit Rand in status.danger; erst das Ja der Rückfrage ist rot gefüllt. Vorher trugen beide dasselbe Violett.
Kalenderkategorien liegen seit dem 24.09.2026 im Papierkorb (F87, N223). Weggetan werden sie nur im Kalender, weil das Wegtun ihre Einträge an die Vorgabe umhängt; hier stehen sie dreißig Tage mit „Zurückholen" und „Jetzt endgültig löschen". Zwei Fälle lehnt der Papierkorb mit einem Satz ab (409): „Zurückholen geht nicht: Etwas Vorhandenes trägt schon denselben Namen. Benenne es um und versuch es noch einmal" — eine lebende Kategorie heißt schon so —, und „Endgültig löschen geht noch nicht: Es hängt noch etwas daran. Es bleibt im Papierkorb, bis es frei ist" — ein Eintrag hängt noch an ihr, oder eine andere Kategorie sammelt in sie. Das Leeren und die Frist lassen eine solche Kategorie liegen, statt abzubrechen. Zurückgeholt schreibt sie erst wieder nach draußen, wenn jemand sie im Kalender freigibt (N225).
Der Speicher-Abschnitt liest POST /api/files/usage (verschlüsselt wie FILES_LIST) und zeigt einen Balken plus einen Satz — „{belegt} von {erlaubt} belegt ({prozent} %)". Belegt heißt seit dem 11.10.2026 (LX25, 2026-10-11-textinhalt-zaehlt-zum-speicher): die Dateien der Ablage und der Inhalt der eigenen Dokumente und LaTeX-Texte, auch was im Papierkorb liegt; die Bereiche melden ihn über ANSCHLUESSE.speicher. Gesperrt wird damit nur das Hochladen — ein Text wird über der Grenze weiter gespeichert, damit nichts Getipptes verloren geht. Ab 80 % steht ein zweiter, wärmerer Satz darunter, der zum Aufräumen auffordert, bevor ein Hochladen abgelehnt wird — die Grenze selbst ist ein globaler Wert (die Umgebungsvariable FILE_STORAGE_QUOTA_BYTES, 2 GiB in der Voreinstellung), noch nicht nach Kontoart gestuft (das ist D19, noch offen). Ein Hochladen über die Grenze schlägt serverseitig fehl, bevor etwas auf die Platte geschrieben wird, mit storage_quota_exceeded_error und einem details-Satz, der beide Zahlen nennt.
„Alles Eigene herunterladen" hat seit dem 21.09.2026 einen zweiten Teil (Q04): unter dem großen Knopf steht die Überschrift „Einzeln mitnehmen" und darunter eine Liste mit sieben Zeilen — Seiten, Gedächtnis, Tagebuch, Ereignisse, Personen, Schlaf, Einstellungen. Je Zeile der Titel, ein Satz darüber, was drinsteht, und zwei kleine Knöpfe: CSV und Markdown. Es ist kein zweiter Abschnitt, sondern derselbe: Wer mitnehmen will, findet beides an einer Stelle, und der große Weg steht oben, weil er der vollständige ist.
Warum zwei Formate und nicht eins. Das Programm, in dem die meisten Menschen Daten ansehen, ist eine Tabellenkalkulation — dafür CSV, mit Byte-Order-Mark, damit Excel unter Windows „Gedächtnis" nicht als Zeichensalat öffnet. Für Tagebucheinträge ist eine Tabelle das falsche Möbel: Ein Absatz von zweihundert Wörtern in einer Zelle ist formal richtig und praktisch unlesbar — dafür Markdown, ein Abschnitt je Eintrag, kurze Felder als Stichpunkte, lange als Absätze. Kein JSON, das gibt es schon, als Ganzes, und es ist genau das Format, dessen Unlesbarkeit dieser Weg behebt.
Was im Papierkorb liegt, kommt mit und trägt eine Spalte Gelöscht — bei den fünf Listen, die einen Papierkorb haben; Schlaf und Einstellungen haben keinen. Eine Datei, aus der etwas fehlt, ohne es zu sagen, wäre die schlechtere Auskunft. Was nicht mitkommt, steht ebenso fest: die PIN einer Person geht in keine Datei, auch nicht in die eigene, und keine Liste nimmt eine Spalte mit, die der große Export auslässt. Die Umwandlung passiert im Browser, nicht auf dem Server — der Endpunkt gibt Zeilen zurück, die Datei entsteht daneben, mit demselben Formatierer, den verify:teilexport prüft. Spaltenköpfe, Ja/Nein, Titel und Kopftext der Datei stehen in der Sprache des Kontos; das CSV-Trennzeichen kommt seit dem 10.10.2026 aus der wirksamen Region (VA-261010-csv-trenner): ohne Wahl Semikolon bei deutscher und Komma bei englischer Sprache, mit gewählter Region deren Zeichen. Ein Wert, der das Zeichen der Datei enthält, steht in Anführungszeichen.
Die Reihenfolge ist die der Umkehrbarkeit: zurücknehmen, mitnehmen, wiederbringen, gehen. Wer hier landet, weil er etwas versehentlich weggetan hat, soll es finden, bevor er an „Konto löschen" vorbeikommt. Im Papierkorb steht jede Zeile mit Art, Name und Restfrist an der Zeile — „noch 3 Tage" an einem Gegenstand ist eine Aufforderung, „alles wird nach dreißig Tagen gelöscht" eine Hausordnung, die niemand auf sich bezieht. Die letzten sieben Tage stehen in Warngelb, nicht in Rot: Es ist nichts kaputt, es läuft nur etwas ab. Wer geht, soll vorher mitnehmen können, was ihm gehört; andersherum stünde der unwiderrufliche Schritt oben. Der Löschabschnitt zählt auf, was verschwindet, bevor jemand etwas eintippt — ein Warnfenster liest niemand, eine Liste, die schon dasteht, schon. Bestätigt wird mit dem Passwort, und zwar nicht gegen den Angemeldeten, sondern gegen die Anmeldung: Ein offener Reiter an einem fremden Rechner soll kein Konto löschen können. Steht eine Löschung an, zeigt derselbe Abschnitt einen roten Kasten mit dem Datum, den verbleibenden Tagen, dem Knopf „Doch nicht löschen" — und dem Satz „Warst du das nicht, dann war jemand an deinem Konto."
Vor dem Passwort fragt der Abschnitt seit dem 28.09.2026, was mit Blöcken auf Seiten anderer geschieht (D43, N284). „Und was du auf Seiten anderer geschrieben hast?" — zwei Wahlzeilen, die erste vorgewählt: „Konto löschen" („Es bleibt dort und gehört dann dem Eigentümer der Seite.") und „Alle Daten löschen" („Es wird mitgelöscht; auf den Seiten der anderen fehlt es danach."). Der Knopf trägt den Namen der Wahl. Die Wahl geht mit dem Löschantrag in auth.users.loeschung_alle_daten, weil gelöscht erst nach der Frist wird; der rote Kasten nennt sie („Gewählt: …"), die Bestätigungsmail ebenso, und „Doch nicht löschen" setzt sie auf die Vorgabe zurück. Die Zeilen sind Radioknöpfe in einem fieldset, die gewählte mit dem Rand in handlung.default, unter grobem Zeiger so hoch wie die Zielfläche (44 px, Marke layout.zielflaeche). Der Löschbericht des Zeitgebers zählt die übergebenen Blöcke eigens; verify:blockuebergang prüft beide Wege.
Die Passwortfelder hinter der Anmeldung sind gebremst (D31, N313). Passwortwechsel, Adresswechsel, Kontolöschung und zweiter Faktor fragen das Passwort erneut und zählen die Versuche in einem Eimer je Konto: fünf in einer Viertelstunde. Ist er voll, steht unter dem Feld „Zu viele Versuche. Bitte in einer Viertelstunde noch einmal." — der Satz aus der Sprachdatei, auf allen vier Schirmen gleich (die ersten drei mit jsdom-Nachweis). Der falsche Versuch, der den Eimer füllt, beendet die Sitzung: Die Antwort meldet sie als abgelaufen, und die Oberfläche geht zur Anmeldung. Wer eine offene Sitzung vorfindet, hat damit fünf Versuche am Passwort und dann keine Sitzung mehr.
Ein Konto ohne Passwort bestätigt mit einem Code per Mail (14.10.2026, D-261013-passwortnachfrage-ohne). Wer sein Konto über Google oder Apple angelegt hat, hat kein Passwort. An der Stelle des Passwortfelds steht dann auf allen sechs Schirmen dasselbe Feld (Bestaetigung.tsx): der Satz „Dein Konto hat kein Passwort. Zum Bestätigen schicken wir dir einen Code an deine Adresse.“ und „Code per Mail schicken“. Danach ein Feld „Code aus der Mail“ mit „Code bestätigen“ und „Neuen Code schicken“; Enter im Codefeld bestätigt den Code, nicht die Änderung. Ist der Code richtig, steht „Bestätigt. Fünf Minuten lang fragen wir nicht noch einmal.“ mit Haken, und der Knopf der Änderung geht auf. Nach fünf Minuten fragt das Feld wieder. Ein falscher Code zählt im selben Eimer wie ein falsches Passwort. Der Code geht an die bestätigte Adresse und gilt zehn Minuten; drei Mails je Viertelstunde. Warum ein Code und nicht der Anbieter: im Kopf von packages/plugins/src/auth/server/nachfragecode.ts. Nach dem ersten Passwort unter „Passwort ändern“ fragt das Feld nach dem Passwort.
Zugangsdaten: zwei Überschriften und Kacheln (21.09.2026)
Christian: „Mach mal den Zugangsdaten-Screen weg von der unübersichtlichen Scroll-Liste zu was strukturierterem mit Überschriften und Kategorien sowie Kacheln." Und dazu der Maßstab: „Mach vor allem alles leichter bedienbar ohne, dass man 3 Jahre Erfahrung mit dem Tool braucht, aber behalte natürlich alle Features."
Bis dahin standen hier drei Bausteine hintereinander, ohne eine einzige Überschrift dazwischen — zehn bis fünfzehn gleich aussehende Kästen über volle Breite. Wer nicht wusste, dass ab dem achten die Zugriffsschlüssel anfangen, merkte es nicht.
Zwei Kategorien, und die Einteilung ist die Richtung:
| Überschrift | Was darin steht | Der Satz darunter |
|---|---|---|
| Nach draußen | Google Kalender · CalDAV-Kalender · Moodle · Notion · jedes .ics-Abo | „Dienste, die dir gehören und bei denen Denotato für dich nachsieht." |
| Nach innen | die MCP-Adresse, das Anlegefach, jeder Zugriffsschlüssel · der eigene .ics-Strom (ab 24.09.2026) | „Womit ein anderes Programm an dieses Konto kommt." |
Eingeteilt wird nicht nach der Technik (OAuth, Merkmal, Abo, Schlüssel). Die Technik beantwortet eine Frage, die niemand stellt, und sie steht ohnehin auf der Kachel, weil dort der passende Knopf erscheint. Die Richtung ist die Frage, die jemand wirklich hat: holt Denotato etwas bei mir, oder holt jemand etwas bei Denotato?
Eine Kachel trägt: ein Zeichen, den Namen (h4), den Zustandssatz mit einem farbigen Punkt davor, zwei Erklärsätze — wofür der Dienst da ist und was passiert, wenn man ihn verbindet —, dann die Auskünfte (Konto beim Dienst, letzter Fehlschlag, Wachzeile, Befund), und unten, durch eine Linie abgesetzt, das Stellwerk mit allem, was man ändern kann.
Der Punkt und das Zeichen in der Zustandszeile sagen, wie es steht (bis zum 10.10.2026 dazu ein Streifen links; ES-261009-farbige-seitenstreifen, E11). Vier Töne, dieselben in allen drei Wänden: grün verbunden · grau nicht eingerichtet · gelb läuft bald ab, war nicht erreichbar, Bereich fehlt · rot abgelehnt oder abgelaufen. Wer sechs Kacheln vor sich hat, sucht das Rote und liest den Rest nicht — in einer Liste aus sechs gleichen Kästen musste man jede Zeile lesen.
Und seit dem 22.09.2026 steht darüber, was sie heißen. Unter jeder der beiden Überschriften läuft eine Legende: der Punkt in seiner Farbe, daneben das Wort. Nach draußen — grün verbunden · grau nicht eingerichtet · gelb läuft bald ab oder klemmt · rot abgelehnt oder abgelaufen. Nach innen dieselben Punkte, andere Wörter — grün gültig · gelb abgelaufen · grau zurückgezogen; ein Schlüssel ist nicht „verbunden". Und nicht widerrufen, obwohl der Knopf an der Zeile so heißt: Eine Legende erklärt Farben, und wer darin wörtlich die Aufschrift eines Knopfes liest, hält sie für eine Handlung und sucht, wo man klickt. Die Legende ist eine ul mit aria-label, nicht ein Satz mit Farbnamen darin: Wer die Farben nicht unterscheidet, bekommt die Wörter trotzdem, und wer sie sieht, muss nicht raten, wofür grau steht. Fehlt die legende-Angabe, steht keine Liste da — der Baustein erfindet nichts.
Die Kacheln sind Karton, nicht Glas (Guide §5). Alle drei Bausteine benutzten colors.glass.background ohne backdrop-filter — also durchscheinendes Nichts. Seit der Grund eine Szene trägt (N53), stünde der Name eines Dienstes damit auf einem Sternfeld.
Die Gestalt steht einmal in settings/client/Zugangskacheln.tsx und wird von allen drei Abschnitten geteilt; vorher hatte jeder seine eigenen Karten-, Kopf-, Namens- und Hinweis-Definitionen — dreimal derselbe Quelltext, dreimal leicht anders.
Die Zugangskacheln bleiben Kacheln (geprüft am 10.10.2026, ES-261010-restliche-kartenraster): Jede trägt Zustand — verbunden, abgelaufen, fehlt — und Bedienung — Verbinden, Prüfen, Trennen —, das ist der Fall, für den Guide §15.1 eine Kachel vorsieht.
Ganz oben unter „Zugangsdaten" stehen seit dem 18.09.2026 die Verbindungen (W08, V5) — und das ist der Weg, den ein Nutzer nehmen soll. Je Dienst eine Kachel: Name, ein Satz wofür, ein Satz was dann, der Zustandssatz, bei einer bestehenden Verbindung das Konto beim Dienst und der letzte Fehlschlag, darunter ein Knopf — „Verbinden" oder „Trennen". Die Abos stehen hinten (21.09.2026): erst das, woran man hier etwas tun kann, dann das, was nur Auskunft gibt.
Google Drive hat seit dem 15.10.2026 eine eigene Kachel (KN-261015-google-drive), neben dem Kalender und mit derselben Anwendung bei Google, aber mit eigener Zustimmung: „Verbinden“ fragt nur nach dem Bereich drive.file — Denotato sieht danach nur Dateien, die man unter „Material › Aus Google Drive“ selbst wählt. „Trennen“ löscht das Merkmal hier und zieht bei Google nichts zurück, denn Googles Widerruf nähme der ganzen Anwendung die Erlaubnis, also auch dem Kalender; wer Drive dort ganz lösen will, tut es unter myaccount.google.com › Sicherheit › Drittanbieter-Apps. Abgelehnt wird die Zustimmung, wenn auf Googles Seite der Haken bei Drive fehlt.
Der Microsoft-Kalender hat seit dem 15.10.2026 eine Kachel (KN-261015-microsoft-kalender) — aber nur, wenn der Betreiber die Anwendung eingetragen hat (MICROSOFT_CLIENT_ID, MICROSOFT_CLIENT_SECRET, MICROSOFT_REDIRECT_URI, nach C-261015-microsoft-herausgeber); vorher steht sie nicht da. „Verbinden“ führt zu Microsoft, dort wählt man das Konto (privat oder von Arbeit und Hochschule) und lässt Calendars.Read zu. Denotato liest danach die Kalender des Kontos und spiegelt sie; welche eingelesen werden, schaltet man im Kalender unter den fremden Kalendern, der Standardkalender ist gleich an. Zurückgeschrieben wird nichts. „Trennen“ löscht Merkmal und Spiegel hier; einen Widerruf einzelner Merkmale bietet Microsoft nicht an, ganz lösen lässt sich die Erlaubnis unter account.microsoft.com › Datenschutz › Apps und Dienste. Der Kalender selbst zeigt die Zeile nicht unter seinen Schreibwegen, denn Denotato schreibt dort nicht hin.
Microsoft To Do hat seit dem 16.10.2026 eine Kachel (KN-261015-microsoft-todo), unter derselben Bedingung wie der Microsoft-Kalender, aber mit eigener Zustimmung: Wer nur den Kalender verbindet, wird nicht nach Tasks.ReadWrite gefragt. Nach dem Zulassen legt Denotato jede Liste als Hauptaufgabe in den To-Dos an und ihre offenen Aufgaben darunter; was dort geschieht, steht in tasks.md. „Trennen“ löscht das Merkmal und die Zuordnung zu To Do; die angelegten Aufgaben bleiben.
Zotero hat seit dem 16.10.2026 eine Kachel (KN-261015-zotero), verbindbar, sobald der Betreiber die Anwendung eingetragen hat (ZOTERO_CLIENT_KEY, ZOTERO_CLIENT_SECRET, ZOTERO_REDIRECT_URI, nach C-261016-zotero-anwendung). „Verbinden“ führt zu Zotero; dort meldet man sich an und klickt „Accept Defaults“. Denotato fragt nur das Lesen der eigenen Bibliothek mit Notizen an, kein Schreiben, keine Gruppen. Zotero spricht OAuth 1.0a: Das Anfragemerkmal und sein Geheimnis warten verschlüsselt am Merkzettel (Migration 336), der Rückruf muss genau dieses Merkmal zurückbringen. Wer auf Zotero das Lesen der Bibliothek abwählt, landet mit „bereich-fehlt“ wieder hier, und der Schlüssel wird gleich zurückgezogen. „Trennen“ löscht den Schlüssel hier und zieht ihn bei Zotero zurück (DELETE /keys/current).
Eine Karte je Dienst — seit dem 21.09.2026 (A22). Bis dahin standen für drei Dienste sechs Karten auf diesem Schirm: jeder Dienst einmal hier und einmal unter den Merkmalen darunter, weil weder der eine noch der andere Abschnitt die art aus dem Register auseinanderhielt. Und die zweite Karte trug bei Moodle und Notion einen Knopf „Verbinden", der nichts tat — er leitete eine OAuth-Zustimmung ein, die es für ein abgetipptes Merkmal nicht gibt, und bekam dafür jedes Mal connection_wrong_kind. Jetzt zeigt dieser Abschnitt, was nicht merkmal ist, und der Abschnitt darunter zeigt, was es ist.
Und derselbe Zustandssatz überall (A22). Er steht seit dem 21.09.2026 einmal im Quelltext (shared/handlers/verbindungen/zustand.ts) und lautet verbunden seit 18.09.2026 · verbunden seit 18.09.2026, läuft ab am 31.12.2026 · nicht eingerichtet. Dieselben drei Sätze zeigt der Abschnitt „Zugangsdaten" darunter und das Kalenderfach für die Abonnements; vorher sagte jede Stelle etwas anderes, und wer zwei davon las, hielt es für zwei verschiedene Dinge.
Abonnierte Kalender stehen mit in dieser Liste (A24). Jedes .ics-Abo ist eine eigene Zeile — Name, Adresse, derselbe Zustandssatz, und bei einem gescheiterten Abruf „Zuletzt nicht erreicht: …" in Gelb statt in Rot (ein fremder Kalender, der schweigt, ist der Normalfall und kein Schaden). Einen Knopf hat die Zeile hier nicht, sondern den Weg „Ändern im Kalender": Eingetragen und gekündigt wird ein Abonnement weiterhin auf /calendar, wo die Frage entsteht. Zusammengeführt ist die Auskunft, nicht die Bedienung.
Der eigene .ics-Strom steht unter „Nach innen“ (24.09.2026, W08 V9, N205). Die Gegenrichtung — nicht Denotato holt, sondern ein Kalenderprogramm abonniert Denotato — ist eine Kachel „Kalender nach draußen“ hinter den Schlüsseln, mit dem gemeinsamen Zustandssatz: „verbunden seit …“ ab der gültigen Adresse (nach einem Erneuern ab dem Erneuern), sonst „nicht eingerichtet“. Die Adresse zeigt die Kachel nie, und einen Knopf hat sie nicht; der Weg heißt „Einrichten im Kalender“, solange es keine Adresse gibt, sonst „Ändern im Kalender“, je mit dem gezeichneten Winkel weiter dahinter (seit 10.10.2026 statt eines Pfeils aus der Schrift, ES-261009-gezeichnete-zeichen). Dass sie unter „Nach innen“ steht, obwohl der Kalender seinen Abschnitt „Nach draußen“ nennt, ist kein Widerspruch: Dieser Schirm fragt, wer bei wem holt, und beim Strom holt ein fremdes Programm bei Denotato. Ohne Kalenderbereich fehlt die Kachel ganz. Baustein: VerbindungsEinstellungen mit richtung="innen".
Apple Erinnerungen wird per Knopf verbunden (24.09.2026, BE31, N291). Seit dem 07.10.2026 ruht die Kachel (2026-10-07-ohne-apple-erinnerungen): apple-erinnerungen bleibt auf gebaut: false und ist nicht zu sehen; der Absatz beschreibt den Code, der liegen bleibt, und gilt genauso für den Schlaf (apple-schlaf, BE30). Die vierte Art kurzbefehl hat keine Zustimmungsseite und kein Formular. Die Kachel zeigt im Stellwerk zuerst „Kurzbefehl laden“ (ein Link auf /kurzbefehle/Denotato Erinnerungen.shortcut, die Datei heißt wie der Kurzbefehl) und „Verbinden“. Der Knopf holt beim Server die Adresse shortcuts://x-callback-url/run-shortcut?… mit dem Schlüssel und hängt den Rückweg auf diese Seite an: x-success → ?verbunden=kurzbefehl, x-cancel → ?fehler=abgelehnt, x-error → ?fehler=kurzbefehl; liesRueckweg macht daraus den Satz oben und räumt result und errorMessage mit weg. Außerhalb von iPhone, iPad und Mac steht vor den Knöpfen „Das geht nur auf dem iPhone oder iPad. Öffne diese Seite dort.“ Verbunden heißt: Das Gerät hat sich gemeldet — erst dann steht „verbunden seit …“ da, und die Kachel nennt den einen Schritt, den kein Link abnimmt (die Automation beim Schließen der Erinnerungen und täglich), mit „Kurzbefehle öffnen“ (shortcuts://) und „Trennen“ (schließt den Eingang). Solange die signierte Vorlage fehlt, trägt der Eintrag gebaut: false und die Kachel fehlt ganz. Nachweis: VerbindungsEinstellungen.test.tsx, Abschnitt „ein Kurzbefehl statt einer Anleitung“.
Gezeigt wird nur, was im Register shared/config/verbindungen.ts als gebaut steht und wofür das Konto den Bereich hat. Wer den Kalender nicht hat, sieht die Karte nicht; das ist dieselbe Antwort wie für einen Bereich, den es nie gab.
Mit einer Ausnahme seit dem 24.09.2026 (B17, Durchsicht): Eine Verbindung, die schon besteht, bleibt stehen, auch wenn ihr Bereich ruht — abgeschaltet oder nicht mehr gewährt. Das betrifft heute die Kachel Google Kalender. Bis dahin fiel sie mit dem Bereich weg, und das Merkmal war unerreichbar: Die Liste darunter zeigt oauth2 nicht, und der Server weist dort ein Entfernen ab; die Zugangswache schrieb bei einer Ablehnung trotzdem „erst Trennen, dann Verbinden". Die ruhende Kachel zeigt nur „Trennen" und verschwindet damit; „Verbinden" bietet sie nie an. Ein .ics-Abonnement bleibt bei der alten Regel — es wird im Kalender bedient, und der ruht dann. Es ist dieselbe Regel wie für die Merkmals-Karten im nächsten Absatz, nur eine Wand weiter oben.
Und „verbunden" heißt seit demselben Tag, was der Kalenderbericht sagt. Die Kachel liest den Zustand aus anbieterlage, derselben Stelle wie /calendar und heute (F60). Ein Merkmal, das noch in der alten Spalte auf den Umzug wartet (ohne CREDENTIAL_KEY, oder zwischen Start und erstem Umzug), zählt dabei als verbunden; vorher hieß ein solches Konto hier „nicht eingerichtet", und der Knopf daneben scheiterte.
Dieselbe Regel gilt seit dem 20.09.2026 auch für die Merkmals-Karten darunter (F06). Bis dahin bot der Schirm alle drei Dienste jedem Konto an, ohne zu fragen, ob es den Bereich hat. Ben Thiemann hat daraufhin ein Moodle-Merkmal hinterlegt, ersetzt und mit einem Ablaufdatum versehen — und es konnte nichts davon wirken, weil seinem Konto der Bereich moodle fehlte. Keine Zeile sagte ihm das; er hat den Fehler bei sich gesucht.
Jetzt gilt:
| Bereich | Merkmal hinterlegt | Was der Schirm tut |
|---|---|---|
| gewährt | egal | die Karte wie bisher |
| fehlt | nein | die Karte steht nicht da |
| fehlt | ja | die Karte steht da, mit einem gelb umrandeten Kasten: „Dein Konto hat den Bereich … nicht", was das heißt, und dass es nicht an der Eingabe lag |
Der dritte Fall ist der Grund, warum nicht einfach versteckt wird: Ein hinterlegtes Geheimnis unsichtbar zu machen hieße, es auch unlöschbar zu machen. Entfernen geht deshalb auch ohne Bereich.
Kommt man von einer Zustimmung zurück (?verbunden=1 oder ?fehler=…), steht der passende Satz über der Liste, und der Parameter verschwindet aus der Adresszeile — sonst zeigte jedes Neuladen dieselbe Meldung. Sieben Fehlerwörter haben je einen eigenen Satz; ein unbekanntes fällt auf „Das hat nicht geklappt" zurück statt auf eine leere Zeile.
Darunter stehen die zwei anderen Richtungen (17.09.2026). Die Zugänge nach draußen — was Denotato bei Moodle, Notion und Google anmeldet. Jeder Dienst hat seit dem 18.09.2026 zwei Zustände und nicht mehr drei: hinterlegt oder nicht. Seit dem 21.09.2026 stehen sie im gemeinsamen Zustandssatz (A22) — verbunden seit 18.09.2026 bzw. nicht eingerichtet, dahinter weiterhin die vier Zeichen zur Wiedererkennung (…abcd). Der dritte Zustand hieß „läuft über den Server" und ist mit BE08 weggefallen — wer nichts hinterlegt hatte, bekam das Merkmal aus der Umgebung und damit die Kurse desjenigen, dem es gehört. Der Hinweis über der Liste sagt das jetzt ebenso: „Wer nichts einträgt, kann den Dienst nicht benutzen — er sieht dann keine fremden Daten, sondern gar keine." Seit BE23 (18.09.2026) steht bei jedem Dienst auch, wie lange es noch gut geht. Neben den Feldern ein Datumsfeld „gültig bis" — freiwillig, denn kein Dienst nennt sein Ablaufdatum von sich aus; Moodle hält es in external_tokens.validuntil und gibt es über keinen Web-Service heraus. Wer es einträgt, bekommt vierzehn Tage, drei Tage und am Tag davor eine Mail; sie und die Mail über ein abgelehntes Merkmal führen direkt zu /settings?a=zugaenge. Darunter eine Zeile der Wache: „Gilt bis 09.11.2026 — noch 52 Tage", „Kein Ablaufdatum hinterlegt" oder rot „Moodle nimmt dieses Merkmal seit dem … nicht mehr an", dazu „Zuletzt bei Moodle nachgefragt am …". Der Knopf „Datum merken" erscheint nur, wenn das Feld vom gespeicherten Stand abweicht — er setzt das Datum, ohne dass das Merkmal noch einmal eingetippt werden muss (es kommt ja nie wieder heraus). Seit dem 09.10.2026 (VA-261009-tagesangaben) schreibt jede Tagesangabe in Sprache und Zone des Kontos — die Wachzeile („Gilt bis 09.11.2026", englisch „Valid until 11/09/2026"), das Exportdatum im Haken von „Einen Export zurückspielen" und der Löschtag in „Konto löschen"; ein Zeitstempel zählt dabei mit dem Tag der Kontozone und nicht mit dem UTC-Tag.
Das Formular klappt weg, sobald etwas hinterlegt ist (21.09.2026). Wo noch nichts liegt, stehen die Felder offen — dort ist das Eintragen der ganze Zweck der Kachel, und ein Knopf davor wäre ein Klick, der nichts entscheidet. Wo etwas liegt, steht „Neu eintragen", und darüber der Satz, warum das Feld leer ist: „Die Felder sind leer, weil das Hinterlegte nie wieder herauskommt — auch nicht für dich. Was du hier einträgst, ersetzt es." Daneben „Abbrechen", das die Felder auch leert — ein abgebrochener Versuch soll nichts im Formularspeicher des Browsers hinterlassen. Der Grund für das Zuklappen ist nicht der Platz: Ein Passwortfeld, das bei einem laufenden Zugang offen dasteht, sieht aus, als müsse man etwas eintragen. Muss man nicht — man prüft, verlängert oder entfernt.
Jedes Feld hat eine Beschriftung und einen Satz darunter, was hineingehört (21.09.2026). Beides steht im Register (shared/config/verbindungen.ts) als label und hinweis — und der hinweis war seit dem ersten Tag da und wurde nie angezeigt. Der Schirm hatte stattdessen die Beschriftung als placeholder, und ein placeholder verschwindet beim ersten Zeichen: Wer drei Felder ausfüllt und beim dritten nachsehen will, was ins erste gehörte, sieht dort seinen eigenen Text.
Die Sätze sagen jetzt zuerst, was der Wert nicht ist:
| Feld | Der Satz beginnt mit |
|---|---|
| Moodle · Web-Service-Merkmal | „Nicht dein Moodle-Passwort." |
| Notion · Integrations-Merkmal | „Nicht dein Notion-Passwort." |
| iCloud · App-spezifisches Passwort | „Nicht dein Apple-Passwort." Seit dem 15.10.2026 (KN-261015-kalender-ausnahme) steht unter dem Feld der Nebenknopf „App-Passwort bei Apple erzeugen“, der Apples Seite in einem neuen Tab öffnet; die Adresse steht im Register am Feld (tiefenlink in verbindungen.ts), so zeigen Zugangsdaten und Kalender dieselbe |
Der dritte ist der Grund für die Regel. Ein Feld namens appPasswort ohne diesen Satz ist eine Falle: Wer sein Apple-Passwort einträgt, hat es einer fremden Anwendung gegeben und merkt es nie. Auch die drei Felder des Altwegs google (clientId, clientSecret, refreshToken) haben jetzt Sätze — er ist der unverständlichste von allen, weil zwei seiner Werte der Instanz gehören und nicht dem Konto (B17).
Die Kachel „CalDAV-Kalender" spricht jeden CalDAV-Server (10.10.2026, VA-261010-caldav-jeder-server): Neben Benutzername und App-Passwort steht das freiwillige Feld CalDAV-Server — leer heißt iCloud wie bisher; eine eingetragene https-Adresse nimmt der Server nur an, wenn ein Admin ihren Host in der Hostfreigabe freigegeben hat, sonst sagt die Kachel das mit dem Host im Satz und der Host liegt als Vorschlag in der Verwaltung. Ist ein Server hinterlegt, steht auf der Kachel „Verbunden mit {rechner}."
Die Kachel „Postfach verbinden“ (15.10.2026, KN-261015-postfach-kachel, Wahl A1/A3/A5 in docs/kontext/entscheidungen/2026-10-15-anschluesse-gewaehlt.md) steht als erste unter „Nach draußen“ und ersetzt die Kacheln „Eigenes Postfach“ und „Postfach (iCloud oder IMAP)“. Christian am 14.10.2026: „Normale Menschen wollen nicht Adresse und Passwort eingeben, sondern auswählen, bei welchem Provider, sich dort anmelden und auf verbinden klicken.“ Die Kachel zeigt oben die verbundenen Postfächer mit „Trennen“ und darunter die Anbieter als Knöpfe; erst die Wahl öffnet den Weg:
- Denotato-Postfach steht zuerst und nimmt bis KN-261015-postfach-token Adresse und Postfachpasswort (Regeln unten).
- Gmail, Google Workspace: kein Feld. Der Satz sagt vorher, dass Google eine Warnung zeigt (Denotato ist von Google nicht geprüft) und die Erlaubnis nach sieben Tagen ablaufen kann; „Bei Google anmelden“ schickt zur Zustimmung (
gmail.readonly). Ist die Erlaubnis abgelaufen, steht am Postfach „Neu verbinden“ — ein Klick. - iCloud, GMX, WEB.DE, T-Online, Hochschule: die benannte Ausnahme. Die Schritte beim Anbieter, ein Knopf mit dem Tiefenlink auf dessen Seite, der KI-Guide der Eule für Rückfragen, dann Mailadresse und App-Passwort. Der Server kommt aus der Liste (
@shared/config/postfachanbieter.ts); nur „Hochschule, anderer Server“ fragt nach ihm. Abweichung vom „einen Feld“ der Wahl: Die Mailadresse ist ein zweites Feld, weil die Oberfläche das Konto beim Anbieter nicht kennt; der Browser füllt es (autocomplete=email). Nach dem Speichern meldet sich die Kachel gleich an und sagt, wenn der Anbieter ablehnt.
Ein Anbieter, dessen Weg diese Instanz nicht bietet (keine Google-Zugangsdaten, Bereich nicht gewährt), steht nicht in der Liste. Microsoft fehlt bis C-261015-microsoft-herausgeber. Welche Anbieter es gibt und was ihr Guide weiß, steht in postfachanbieter.ts; die Kacheln „Verbindungen“ und „Zugänge“ blenden Registereinträge mit postfach: true aus.
Der Weg „Denotato-Postfach" (früher Kachel „Eigenes Postfach") (14.10.2026, BE-261011-postfaecher-denotato) nimmt eine Adresse unter einer Domäne dieser Instanz, etwa name@denotato.com, und das Postfachpasswort — ohne Serverfeld: Der Server ist imap.<Domäne>:993, und angenommen wird die Adresse nur, wenn ein Admin genau diesen Host in der Hostfreigabe als eigenen Postserver gekennzeichnet hat (hostfreigabe_setzen mit eigenePost; imap.denotato.com:993 ist es seit migration 317). Sonst sagt die Kachel „Postfächer unter {domaene} verbindet Denotato nicht …“, und gespeichert wird nichts. Nach dem Speichern prüft die Kachel den Zugang wie jeden anderen (anmelden, den Posteingang lesend öffnen). Was sie freischaltet, steht nicht auf dem Schirm, sondern im Connector: post_suchen, post_offen (seit 15.10.2026, BE27: welche Mail noch auf eine Antwort wartet) und post_entwurf.
Eine Adresse wird geprüft, bevor sie gespeichert wird (23.09.2026, D28). Bis dahin nahm „Zugang hinterlegen" als Moodle-Adresse jede Zeichenkette an, und der erste Abruf schickte das Merkmal dorthin — auch an 127.0.0.1, an einen Rechner im Netz des Servers oder an die Auskunftsdienste der Cloud. Jetzt weist der Server eine Adresse ab, die nicht mit https:// beginnt, ein ? oder # trägt, einen Namen oder ein Passwort vor dem @ hat, auf localhost oder eine nicht-öffentliche Nummer zeigt oder selbst eine IPv6-Nummer ist. Der Grund steht als ganzer Satz über den Kacheln — am selben Platz wie jede andere Absage dieses Abschnitts —, vorn die Beschriftung des Feldes: „Adresse deines Moodle: 127.0.0.1 zeigt nicht ins oeffentliche Netz." Gespeichert wird dann nichts, auch das Merkmal nicht.
Geprüft wird hier nur die Form — was ohne Nachschlagen feststeht. Ob ein Name erst beim Nachschlagen nach drinnen zeigt, entscheidet sich beim Abruf mit festgenagelter Nummer (B24), und dort heißt es dann auf /moodle „Denotato hat die Moodle-Anfrage abgebrochen — das Ziel ist nicht erlaubt. … zeigt nicht ins oeffentliche Netz — Denotato schickt dein Merkmal nicht dorthin." Welches Feld eine Adresse ist, sagt das Register (adresse: true in shared/config/verbindungen.ts), nicht der Controller; heute trägt das nur Moodles url. Die Regel selbst — nur https: — steht an einer Stelle: DIENSTSCHEMATA in backend/src/sync/dienstadresse.ts.
Der Moodle-Schlüssel der eigenen Hochschule (07.10.2026, VA15, Schritte 2 und 6). Die Kachel Moodle fragt beim Laden mit, welche Hochschule das Konto gewählt hat (einrichtung_meine), und deren Antwort trägt seit VA15 das Feld moodle:
moodle | Wann | Was die Kachel zeigt |
|---|---|---|
schluesselseite mit adresse | Ein Admin hat in der Verwaltung den Vermerk „Schlüsselseite“ gesetzt, weil Konten dort selbst Schlüssel erzeugen dürfen | Im offenen Formular direkt über dem Feld „Web-Service-Merkmal“ der Knopf „Schlüssel in Moodle holen“ — er öffnet user/managetoken.php der Lernplattform in einem neuen Tab — mit einem Satz, dass der Schlüssel von dort in das Feld darunter gehört. Dass Moodle ihn ab 4.3 nur nach „Zurücksetzen“ zeigt, sagt der Hinweis unter dem Feld |
anmeldung mit wurzel | Kein Vermerk, aber die Auskunft lässt die Anmeldung im Browser zu (typeoflogin 2 oder 3 oder ein OAuth2-Anbieter) | An derselben Stelle der Knopf „Bei Moodle anmelden“ und das Feld „Link aus Moodle“ (Weg C, Abschnitt darunter) |
kein_weg | Die Vorab-Auskunft der Hochschule sagt, dass Webdienste oder der Dienst der Moodle-App abgeschaltet sind | Vor dem Formular der Satz „Deine Hochschule hat den Dienst der Moodle-App abgeschaltet. Ohne ihn gibt Moodle keinen Schlüssel heraus, und Denotato kann dein Moodle nicht lesen. Einschalten kann ihn nur deine Hochschule.“ — wer es trotzdem versucht, darf das |
null | Keine Hochschule gewählt, keine Moodle-Plattform oder kein Vermerk | Die Kachel wie bisher |
kein_weg geht dem Vermerk vor: Eine Seite, die keinen Schlüssel herausgeben kann, wird nicht empfohlen. Die Regel ist rein und steht in shared/src/handlers/einrichtungen/moodleauskunft.ts (schluesselhinweis); der Knopf nimmt nur Adressen mit https://, ohne Namen und Passwort, und mit dem festen Pfad /user/managetoken.php.
Die Adresse ist vorgetragen (14.10.2026, KN-261013-einrichtung-bauen). Betreibt die gewählte Hochschule eine Lernplattform der Art moodle, steht deren Wurzel schon im Feld „Adresse deines Moodle“, ohne Schrägstrich am Ende; ohne solche Plattform nimmt die Kachel die wurzel des Hinweises anmeldung. Die Vorgabe ist nur ein Vorschlag: Wer das Feld ändert oder leert, behält seine Eingabe, und „Verbinden“ schickt, was im Feld steht. Ohne Hochschule bleibt das Feld leer wie bisher.
Die Anmeldung im Browser (07.10.2026, VA15, Schritt 3; Wahl in docs/kontext/entscheidungen/2026-10-07-moodle-schluessel-link-kopieren.md). „Bei Moodle anmelden“ öffnet in einem neuen Tab <wurzel>/admin/tool/mobile/launch.php mit service=moodle_mobile_app, einem passport aus 128 Bit Zufall, der nur in diesem Schirm lebt, und confirmed=1. Nach der Anmeldung springt Moodle von Haus aus fest auf moodlemobile://token=…, was eine Web-App nicht erreicht; mit confirmed=1 bleibt am Desktop eine Seite mit diesem Link stehen. Der Kasten — eine eigene Fläche direkt über dem Merkmal, damit Satz, Knopf und Feld als ein Schritt zu lesen sind — sagt in drei nummerierten Schritten Wort für Wort, was zu tun ist: anmelden; auf der Seite, die stehen bleibt, „Click here if the app does not open automatically.“ mit der rechten Maustaste anklicken (am Telefon lange drücken) und „Link kopieren“ wählen; hier einfügen. Der Satz des Registers unter dem Merkmal, der zur Schlüsselseite schickt, entfällt auf diesem Weg.
Beim Einfügen liest die Kachel den Link sofort, ohne Knopf:
| Ergebnis | Was die Kachel tut |
|---|---|
| Schlüssel | trägt ihn in „Web-Service-Merkmal“ ein, die Wurzel in „Adresse deines Moodle“, wenn dort nichts steht, leert das Feld „Link aus Moodle“ (der Link trägt den Schlüssel im Klartext) und sagt „Schlüssel übernommen — er steht im Feld darunter.“ Gespeichert ist noch nichts; das tut „Verbinden“ |
| fremd | siteid ist nicht md5(wwwroot + passport) — der Link stammt aus einer anderen Anmeldung (etwa vor dem Neuladen) oder einem anderen Moodle: „Dieser Link stammt nicht aus der Anmeldung, die Denotato gerade geöffnet hat. …“ |
| unlesbar | „Das ist kein Link aus Moodle. …; er beginnt mit moodlemobile://token=.“ |
„Gültig bis“ wird beim Schlüssel vorbelegt (VA-261007-moodle-schluessel, Auswahl vom 08.10.2026), weil Moodle das Ablaufdatum über keinen Web-Service herausgibt und ohne Datum keine Vorwarnung kommt: Ein neuer Schlüssel bekommt heute plus zwölf Wochen, Moodles Vorgabe ($CFG->tokenduration), dazu „„Gültig bis“ steht auf zwölf Wochen ab heute — länger gilt ein Moodle-Schlüssel von Haus aus nicht. Das genaue Datum zeigt Moodle unter Profil › Einstellungen › Sicherheitsschlüssel.“ Menüwege im Fließtext trennt der Winkel ›, kein Pfeil (seit 10.10.2026, ebenso in den Hinweisen zu Moodle- und Apple-Schlüssel). Tragen die letzten vier Zeichen dieselbe Endung wie der hinterlegte Schlüssel und stand schon ein Datum da, bleibt es: „Moodle hat denselben Schlüssel zurückgegeben; „Gültig bis“ bleibt, wie es war.“ Ist der Schlüssel in Wahrheit älter, kommt die Vorwarnung zu spät; das fängt die tägliche Gegenprobe ab. Die Regel ist ablaufvorgabe in moodleanmeldung.ts.
Ein mitgeliefertes privatetoken verwirft die Kachel, ohne es zu speichern oder zu senden. Das Passwort sieht Denotato auf diesem Weg nie. Hat das Konto schon einen gültigen Schlüssel der Moodle-App, gibt Moodle denselben zurück — das Telefon bleibt angemeldet. Die Regel steht rein in shared/src/handlers/einrichtungen/moodleanmeldung.ts, MD5 von Grund auf in shared/src/utils/md5.ts (Web Crypto kennt es nicht; es schützt nichts, es ist Moodles Prüfsumme).
Hinterlegen heißt jetzt auch prüfen, wo es eine Probe gibt: Der Knopf heißt bei Moodle, Notion und iCloud beim ersten Mal „Verbinden“ wie bei Google (bis 13.10.2026 „Hinterlegen und prüfen“, KN-261013-anschluss-einheitlich), danach „Ersetzen und prüfen“ und fragt nach dem Speichern sofort beim Dienst nach, ob der Schlüssel trägt. Wer einen frisch kopierten Schlüssel einträgt, will genau das wissen; der getrennte Knopf „Prüfen“ bleibt für später.
Das Ablaufdatum steht immer da, auch bei zugeklapptem Formular. Es ist kein Geheimnis, es ist die Angabe, die man am häufigsten nachträgt, und sie geht ohne das Merkmal.
Der Anlass stand im Journal des Servers: denotato-kalender.service scheiterte seit dem 17.09.2026 halbstündlich mit „Token has been expired or revoked", zweiundvierzig Mal, ohne dass es jemand erfuhr. Einmal täglich (denotato-zugangswache.timer, 08:20) fragt Denotato deshalb bei Moodle nach, ob das hinterlegte Merkmal noch trägt — und seit dem 24.09.2026 (B17) auch bei Google, dessen Merkmal seitdem ebenfalls bei den Zugängen liegt.
Darunter die Zugriffsschlüssel nach innen: womit ein Programm an dieses Konto kommt. Jede Zeile nennt Namen, Anlegedatum, „zuletzt benutzt", Ablauf und Zustand (gültig · abgelaufen · zurückgezogen mit Datum); darüber steht die eigene MCP-Adresse https://denotato.com/mcp/<kontoname> mit einem Kopierknopf, und daneben „N von 25 offen".
Auch die Schlüssel stehen seit dem 21.09.2026 als Wand und nicht mehr untereinander. Fünfundzwanzig sind erlaubt; untereinander waren das fünfundzwanzig gleich aussehende Kästen, und die Frage, wegen der jemand herkommt — „welcher läuft noch, und welchen kann ich einziehen?" — beantwortete erst das Durchlesen. Widerrufen ist dabei grau und nicht rot: Es ist kein Schaden, sondern das Ergebnis eines Knopfes, den jemand absichtlich gedrückt hat. Abgelaufen ist gelb — das hat niemand entschieden, es ist eingetreten.
Die MCP-Adresse und „Neuen Schlüssel anlegen" bleiben volle Tafeln. Es gibt von jedem genau eines, sie stehen nicht nebeneinander und man vergleicht sie mit nichts. Eine Kachelwand ist zum Überfliegen da; diese beiden sind Handgriffe.
Im Anlegefach steht seit dem 22.09.2026 eine Frist (vorher offener Punkt 14). Neben dem Namensfeld sitzt ein Auswahlfeld „Gültig" mit sechs Möglichkeiten — ohne Ende (die Vorgabe), 30 Tage, 90 Tage, 180 Tage, ein Jahr, zwei Jahre. Die Route nahm gueltigTage (1 bis 730) von Anfang an entgegen; angeboten hat es der Schirm nicht, und deshalb galt jeder Schlüssel für immer. Der Satz darunter sagt, was eine Frist bedeutet: Abgelaufen ist ein Schlüssel nicht weg, sondern ungültig, und die Zeile bleibt als Auskunft stehen. Tauschen übernimmt die Frist nicht — es schickt weiterhin null (offener Punkt 70).
Und bei 25 von 25 ist der Knopf zu (vorher Punkt 16). Vorher drückte man ihn und bekam eine Absage vom Server; jetzt ist „Anlegen" gesperrt, sobald so viele gültige Schlüssel offen sind, wie hoechstzahl erlaubt, und darunter steht, was zu tun ist: „25 von 25 sind offen — mehr nimmt der Server nicht an. Widerrufe einen, der nicht mehr gebraucht wird; widerrufene und abgelaufene zählen nicht mit." Die Zahl kommt vom Server (AUTH_SCHLUESSEL_JE_KONTO), nicht aus dem Schirm — eine hier eingetragene 25 wäre die zweite Wahrheit, die beim ersten Ändern falsch wird.
An der MCP-Adresse steht jetzt auch, wie man sie einträgt (vorher Punkt 48). Zwei Sätze neben Adresse und Authorization: Bearer …: In claude.ai geht das unter Add custom connector — Adresse eintragen und No sign-in wählen, Denotato prüft den Schlüssel selbst. Wer stattdessen Sign in now nimmt, sucht einen Anmeldedienst, den Denotato nicht betreibt, und bekommt „Couldn't register with … sign-in service" zu lesen — eine Meldung, die auf den Anmeldeweg zeigt statt auf die Einstellung. Ben ist am 21.09.2026 genau daran hängengeblieben (F13).
Ein Schlüssel steht genau einmal da. Nach dem Anlegen oder Tauschen erscheint er in einem grün umrandeten Kasten mit „Jetzt kopieren" — und der Kasten geht erst weg, wenn man Habe ihn drückt, nicht von selbst. Eine Einblendung, die nach fünf Sekunden verschwindet, ist genau dann weg, wenn jemand nach dem Fenster greift, in das er ihn einfügen wollte.
Noch nicht gebaut: der Wunschknopf (15.10.2026, KN-261015-ideenablage)
Christian am 15.10.2026 zu den Anschlüssen, die er im Musterbogen B auf „später“ gestellt hat: „Als Button anbieten der ausdrücklich markiert, dass er nur da ist um die Bitte nach dem Feature abzuschicken mit Bestätigung und mandatory Kurzkommentar.“
Unter Nach draußen steht eine dritte Überschrift Noch nicht gebaut mit dem Satz „Diese Knöpfe verbinden nichts. Sie sagen uns, welcher Anschluss als Nächstes gebraucht wird.“ Darunter je zurückgestelltem Anschluss eine Kachel (OneDrive, OneNote, Todoist, GitHub, Dropbox, Canvas, Stud.IP): Zeichen, Name, Zustand „Noch nicht gebaut“ in Grau, die Kurzbeschreibung und ein zweitrangiger Knopf Nur Wunsch abschicken. Er öffnet das Pflichtfeld „Wofür brauchst du ihn?“ (mindestens zehn Zeichen); erst Wunsch bestätigen schickt ab, Abbrechen schließt ohne Folge. Danach steht „Wunsch abgeschickt. Danke!“ auf der Kachel.
Der Wunsch ist eine gewöhnliche Rückmeldung der Art feature mit dem Text „Wunsch: Anschluss <Name>. <Kommentar>“ und dem Umstand anschlusswunsch=<id>; daraus zählt die Ideenablage der Verwaltung (verwaltung.md, Ideen). Die Liste steht in packages/shared/src/config/anschlussideen.ts, nicht im Verbindungsregister: Eine Idee hat keine Hosts, Tabellen oder Werkzeuge, die verify:verbindungen prüfen könnte. Code: packages/plugins/src/settings/client/Anschlusswuensche.tsx.
Zugangsfelder am iPad (14.10.2026, F-261013-ipad-eingabefelder)
Rückmeldung vom 13.10.2026 auf einem iPad (1194 × 802): „Probleme am iPad mit den inputfeldern“. Die Felder unter Zugänge nehmen Benutzernamen, Adressen und Schlüssel auf; iPadOS schrieb den ersten Buchstaben groß und ersetzte vermeintliche Tippfehler. Seitdem schalten alle Felder der Kacheln (Feldeingabe) Großschreibung, Autokorrektur und Rechtschreibprüfung ab, wie das Anmeldefenster. „Gültig bis“ trägt unter Safari kein Systemaussehen mehr und steht wie die Felder darüber.
Die Zwei-Faktor-Anmeldung (21.09.2026, D07)
Steht unter „Konto", direkt unter dem Passwort und über den Zugangsdaten. Die Reihenfolge ist die Sache selbst: Der zweite Faktor gehört zu dem, womit man hereinkommt, nicht zu dem, was man von draußen verbunden hat.
Der Kasten hat vier Zustände, und man sieht immer nur einen davon:
| Zustand | Was dasteht |
|---|---|
| aus | ein Satz, was ein zweiter Faktor ist, ein Passwortfeld und „Zweiten Faktor einrichten" |
| angefangen | das Geheimnis in Vierergruppen zum Abtippen, darunter „In der Authenticator-App öffnen" (ein otpauth://-Verweis), ein Feld „Erster Code" und „Einschalten" |
| frisch scharf | die zehn Wiederherstellungscodes, einmal, mit dem Satz „Schreib diese Codes ab, bevor du weitergehst." und dem Knopf „Abgeschrieben" |
| scharf | „Der zweite Faktor ist eingeschaltet. Noch N Wiederherstellungscodes offen.", ein Passwortfeld und „Abschalten" |
Das Passwort steht vor dem Einrichten, nicht nur vor dem Abschalten. Wer einen fremden, offenen Browser findet, soll nicht in zwei Klicks einen zweiten Faktor einschalten können, den nur er kennt — das wäre keine Sicherung, sondern eine Übernahme.
Scharf wird der Riegel erst mit dem ersten Code. Zwischen „Einrichten" und „Einschalten" liegt ein Zustand, in dem das Geheimnis zwar besteht, die Anmeldung aber noch nichts davon verlangt. Ohne ihn hätte man sich aus dem eigenen Konto aussperren können, indem man das Geheimnis falsch abtippt.
Das Geheimnis verschwindet in dem Augenblick, in dem es scharf ist — es noch stehen zu lassen hieße, es länger auf dem Schirm zu halten, als irgendjemand es braucht. Dasselbe gilt für die zehn Codes: „Abgeschrieben" ist der einzige Weg, sie loszuwerden, und danach gibt es sie nirgends mehr im Klartext, auch nicht auf dem Server (dort liegen nur Abdrücke).
Abschalten nimmt die Wiederherstellungscodes mit. Ein Satz Codes, der einen Riegel öffnet, den es nicht mehr gibt, ist kein Ersatzschlüssel, sondern ein herumliegender.
Was der Schirm nicht zeigt: kein QR-Bild (Grundsatz 17 — dafür käme eine Abhängigkeit ins Haus, und der Verweis tut dasselbe auf dem Gerät, auf dem die App liegt), keine Erneuerung der Codes ohne Abschalten und wieder Einschalten, und keine Warnung, wenn nur noch einer oder zwei offen sind.
Der Rest des Weges — der Code bei der Anmeldung, die Wartemarke, die Frist, die Bremse — steht in anmeldung.md und nicht hier.
Anmeldung über Google und Apple (13.10.2026, D-261008-google-apple)
Steht unter „Konto“ unter der Zwei-Faktor-Anmeldung, als Gruppe „Anmeldung“ — so heißt sie auch in der Mail, die nach einer neuen Verknüpfung hinausgeht („Einstellungen → Konto → Anmeldung“). Gästen fehlt die Gruppe: Ein Gast hat kein Passwort, mit dem er bestätigen könnte, und eine Anmeldung über Google oder Apple aus der Gastsitzung beendet die Gastsitzung, statt sie zu verknüpfen.
| Was dasteht | Wann |
|---|---|
| je verknüpftem Anbieter eine Zeile: Zeichen, „Google · adresse@…“, darunter „verknüpft am …“ und „zuletzt angemeldet …“ oder „noch nie darüber angemeldet“, rechts „Lösen“ | immer, wenn eine Verknüpfung besteht; Apples Weiterleitungsadresse steht als „private Apple-Adresse“, nicht als Adresse |
| „Noch kein Anbieter verknüpft. Danach kommst du auch über ihn in dein Konto.“ | ohne Verknüpfung |
| „Die Anmeldung über Google oder Apple ist nicht eingerichtet.“ | ohne Verknüpfung und ohne eingerichteten Anbieter |
| „Weiter mit Google“, „Mit Apple fortfahren“ in den Farben der Anbieter | je eingerichtetem Anbieter, der noch nicht verknüpft ist — eine Verknüpfung je Anbieter und Konto |
Beide Änderungen verlangen das Passwort (ohne Passwort den Code per Mail, Abschnitt zu D31 oben), aus demselben Grund wie das Abschalten des zweiten Faktors: Ein offener Reiter an einem fremden Rechner soll keinen Weg ins Konto hinzufügen oder wegnehmen. Ein Klick auf „Lösen“ oder einen Anbieterknopf öffnet darunter ein Passwortfeld mit einem Satz, was folgt, „Lösen“ oder „Weiter“ und „Abbrechen“. Das Passwort verlässt das Feld nach jedem Versuch.
Lösen schickt Kennung und Passwort; danach lädt die Liste neu, und der Satz zu OIDC_IDENTITY_REMOVED steht mit Haken darunter. Den letzten Weg ins Konto lehnt der Server ab (OIDC_LAST_WAY_IN_ERROR); der Satz bleibt mit Warnzeichen stehen.
Verknüpfen startet einen Ablauf mit dem Zweck link und schickt den Browser zum Anbieter; zurück kommt er über /login/extern (anmeldung.md) und landet wieder hier, mit OIDC_IDENTITY_LINKED als Meldung. Bricht man beim Anbieter ab, geht es ebenfalls hierher zurück.
Gebaut in ExternalIdentitiesSettings.tsx; Knöpfe und Anbieterzeichen teilt die Gruppe mit der Anmeldeseite (ExternalLoginButtons.tsx).
Der Umzug nach darstellung (21.09.2026, A04)
Die Farben und Zeichen der Skills und der Interessengebiete lagen in vier eigenen Schlüsseln: skill.colors, skill.icons, interest.colors, interest.icons — vier flache Zuordnungen Kennung → Zeichenkette. Sie liegen jetzt unter einem Schlüssel darstellung, bei skills und gebiete, neben bereiche und werte (docs/gestaltung/einstellungen.md §3).
Am Schirm ändert das nichts — dieselben Farbfelder, dieselben Zeichen, derselbe Knopf „zurücksetzen". Darunter ändert es das Zurücksetzen: Wer eine Skillfarbe zurücknimmt, schreibt skills.<id>.farbe = null in den einen Schlüssel; vorher hieß das Löschen eines Eintrags aus vieren, und „alles zurück" hieß, vier Zeilen zu löschen. Jetzt räumt eine gelöschte Zeile alle Bereiche, Skills, Gebiete und Auswahlwerte zugleich ab — das ist, was „Alles zurücksetzen" seit dem 20.09.2026 tut.
Erste Stufe. migration77.sql trägt den Altbestand zusätzlich unter darstellung ein und lässt die vier alten Zeilen stehen; beide Seiten bleiben lesbar, und ein Rücksprung auf den Stand von gestern verliert nichts. Gelesen wird über mitAltbestand (@shared/handlers/einstellungen/darstellungUmzug): der Altbestand liegt unten, darstellung gewinnt Feld für Feld — und ein ausdrücklich gespeichertes null gewinnt auch, sonst käme eine zurückgesetzte Farbe aus dem Altbestand wieder hoch. Geschrieben wird nur noch darstellung. Die zweite Stufe — die vier aus PREFERENCES nehmen, die Zeilen räumen — ist A28.
Zweite Stufe (A28, 24.09.2026). Die vier sind aus PREFERENCES gefallen, die API weist sie mit setting_unknown_error ab, und die Hooks lesen nur noch darstellung; mitAltbestand liegt in archiv/2026-09-24-darstellung-altbestand/. migration127.sql wiederholt den Umzug aus 77 wörtlich und löscht danach die alten Zeilen.
Nachgewiesen wird das in verify:einstellungen: die Prüfungen fahren Migration 127 gegen ein Konto mit Altbestand, sehen nach, dass Farbe und Zeichen derselben Kennung zusammenfinden, dass Skills und Gebiete getrennt bleiben, dass ein ungültiger Farbwert draußen bleibt, dass ein schon gesetztes darstellung gewinnt, dass danach keine der vier alten Zeilen mehr dasteht und dass ein zweiter Lauf die Zeile nicht mehr anrührt (Grundsatz 62). Dazu vier Prüfungen, dass die API jeden der vier alten Schlüssel als unbekannt abweist.
Das Suchfeld und das Rütteln (21.09.2026)
Ganz oben, über der Stufenwahl, steht ein Suchfeld — eine Lupe, ein Feld, ein Kreuz zum Leeren. Es steht dort und nicht unter der Stufenwahl, weil es sie überholen darf: Wer nach Inhaltsbreite sucht und auf Stufe „einfach" steht, findet sie trotzdem, und der Sprung hebt die Stufe mit. Andersherum wäre die Suche ein Feld, das verschweigt, was es weiß.
Getippt wird ohne Enter. Ab dem ersten Zeichen klappt eine Liste mit höchstens acht Treffern auf — Glas, weil sie schwebt (Guide §5). Je Zeile der Titel der Gruppe, darunter Kategorie · der Satz, der auch am Schirm danebensteht; liegt die Gruppe über der eingestellten Stufe, steht dort zusätzlich, dass der Sprung sie holt. Pfeil hoch und runter gehen durch die Liste und laufen am Ende um, Enter springt, Escape leert das Feld. Ein Klick tut dasselbe wie Enter.
Ein Sprung heißt: Kategorie wechseln, Gruppe aufklappen, Feld leeren — und seit dem 22.09.2026 auch: hinrollen (vorher offener Punkt 63). Jede Faltgruppe trägt dafür ein data-sprungziel mit ihrer Kennung; nach dem Sprung sucht der Schirm es und ruft scrollIntoView({ block: 'center' }) darauf. Weich, außer das Gerät sagt prefers-reduced-motion: reduce — dann hart (Guide §11.4). Gezählt wird mit: Springt jemand zweimal hintereinander auf dieselbe Gruppe, rollt es auch beim zweiten Mal, weil nicht das Ziel, sondern ein Zähler daneben den Effekt auslöst. Den Fokus zeigt die ganze Zeile mit Rand und einem Ring außen, wie jedes Feld aus ui/Input; das Eingabefeld darin zeichnet keinen zweiten (15.10.2026, E-261013-restfunde-blick). verify:schalter hält seither fest, dass es zu jedem Sprung des Verzeichnisses auf dem Schirm wirklich ein Ziel gibt — ein Treffer, nach dem der Schirm sich sichtbar bewegt und nichts zeigt, wäre schlimmer als keiner.
Die Stufenwahl selbst ist jetzt zu finden (vorher Punkt 65). Stufe, erweitert, entwickler, verborgen, Umfang führen auf einen Eintrag „Umfang", und der Sprung rollt zur Stufenwahl über den Kategorien. Er gehört zu keiner Kategorie: Im Verzeichnis steht kategorie: null, auf der Trefferzeile steht als Ort „Ganz oben", und der Sprung lässt die offene Kategorie stehen, statt jemanden aus dem Abschnitt zu werfen, in dem er gerade war. Ihm eine Kategorie anzudichten hieße, in einen Abschnitt zu schicken, in dem die Stufenwahl nicht steht.
Gesucht wird über Titel, Kategorie, den Hinweissatz und eine Reihe zusätzlicher Wörter je Eintrag; mehrere Wörter in der Frage müssen alle sitzen, und ein Wortanfang zählt mehr als ein Treffer mitten im Wort. Groß und klein ist egal, Umlaute und „ß" ebenso — größe, groesse und GROSSE finden dasselbe.
Woher die Suche weiß, was es gibt: aus settings/shared/einstellungssuche.ts, einem Verzeichnis von Einträgen (Kategorie, Gruppe, Titel, Hinweis, Stufe, Suchwörter). Das ist eine zweite Quelle neben dem Schirm, und zwei Listen, die dasselbe meinen, laufen auseinander — deshalb misst verify:schalter sie in Teil 8 gegeneinander: jede Gruppe des Schirms steht im Verzeichnis, das Verzeichnis erfindet keine, beide nennen sie beim selben Namen, schicken zur selben Kategorie, stehen unter derselben Stufe und haben ein Sprungziel, das es gibt. Die Kategorien, die das Feld anbietet, kommen dagegen vom Schirm und hängen damit am Konto: Wer Lernen nicht hat, findet es auch nicht.
Das Rütteln. Der Schalter „Kurzes Rütteln bei Rückmeldungen" hatte bis zum 21.09.2026 keine Wirkung — er kam an, das Theme las ihn, und navigator.vibrate kam im ganzen Baum nicht vor. Jetzt gibt es components/bewegung/haptik.ts (bis zum 07.10.2026 im Plugin) mit zwei Mustern (Guide §11.6: kurz beim Erledigen und beim Stempel, doppelt bei einem Fehler, nie beim Navigieren), und der Schirm benutzt sie an zwei Stellen: „An" rüttelt beim Umlegen selbst, und daneben steht ein dritter Knopf „Probieren", der nur dann etwas tut, wenn der Schalter an ist und das Gerät es kann.
Darunter steht immer genau ein Satz, und er sagt die Wahrheit über dieses Gerät: „Dieses Gerät kann nicht rütteln …", wenn navigator.vibrate fehlt (jeder Rechner ohne Berührung, und Safari auf dem iPhone bis heute); „Der Stoß ging nicht hinaus …", wenn die Probe abgelehnt wurde — dann ist die Vibration meist im Gerät selbst abgeschaltet; sonst „Bis jetzt rüttelt Denotato nur hier am Schalter …". Das ist der Stand und keine Entschuldigung: Außerhalb dieses Schirms rüttelt Denotato nicht (offener Punkt 60).
Szene, Tageszeit und Abo-Theme (22.09.2026, N132)
Christian am 22.09.2026: „Du solltest doch Icons und visuelles Farbcues machen für schnellere Erkennung. Erlaube außerdem Nutzern mit höheren Abos zwischen den Abo-Themes aller drunterliegenden zu wechseln. (Das gilt auch für Admin und Dev). Außerdem soll Theme auch von der Tageszeit abhängig gemacht werden können (Default an)…" Daraus sind in der Kategorie „Darstellung" zwei Gruppen geworden, und eine dritte hat ihren Satz geändert.
Die Gruppe „Szene" (SzenenEinstellungen.tsx) beginnt mit dem Schalter „Nach Tageszeit" — An / Aus, vorgegeben An (theme.folgtTageszeit). Darunter steht in einer Zeile, woher die Grenzen kommen: „Grenzen nach Sonnenstand am eigenen Ort", wenn das Konto einen Ort mit Sonnenzeiten hat, sonst „Feste Uhrzeiten — ohne Sonnenstand" — ohne Ort, solange das Wetter nicht geladen ist, und am Polarkreis an Tagen ohne Auf- oder Untergang. „Kein Ort hinterlegt" stand hier zuerst und war in den beiden letzten Fällen falsch.
- An zeigt eine Liste mit vier Zeilen — Morgens, Tagsüber, Abends, Nachts. Jede Zeile trägt den Namen des Abschnitts, die Uhrzeit, ab der er heute gilt („ab 06:20"), und rechts eine Auswahl mit den zwölf Szenen. Die Zeile, in der der Tag gerade steht, trägt eine Kante in der Anwendungsfarbe, einen leichten Glasgrund und das Wort jetzt — ein Farbzeichen zum Wiederfinden, nicht nur ein Wort zum Lesen. Fällt ein Abschnitt heute aus (eine Nacht, die im Juni in Reykjavík zu kurz ist, oder ein Tag im Dezember in Oslo), steht dort „entfällt heute". Die Vorgaben: Dämmerung, Sonnentag, Herbstabend, Nacht (
theme.szeneMorgen,…Tag,…Abend,…Nacht). - Aus zeigt die zwölf Szenen als Knöpfe, wie vor N132; sie schreiben
theme.szene.
Die Grenzen der Abschnitte. Mit Ort: Morgen vierzig Minuten vor Sonnenaufgang, Tag eine Stunde nach Aufgang, Abend eine Stunde vor Untergang, Nacht vierzig Minuten nach Untergang. Die Abstände sind eine Ableitung (bürgerliche Dämmerung plus Rand), keine Entscheidung Christians; sie stehen als Konstanten in theme/tageszeit.ts. Ohne Ort, und am Polarkreis ohne Aufgang oder Untergang, gelten feste Uhrzeiten — 5, 10, 17 und 21 Uhr, dieselben wie in tageszeitVon().
Die Handwahl. Wer in der Leiste oder über die Schnellsuche eine Szene wählt, während die Tageszeit gilt, bekommt sie bis zum nächsten Abschnittswechsel — so hat Christian es festgelegt. Sie liegt am Gerät (denotato.geraet, Schlüssel theme.szene mit szeneBis), nicht im Konto. Solange sie gilt, steht unter der Gruppe „Handwahl {Szene} bis {Uhrzeit}" und ein Knopf „Handwahl aufheben" (bis zum 26.09.2026 „Zurücknehmen", auf Englisch fälschlich „Undo" — I07, N308); sonst sähe jemand vier eingestellte Szenen und eine fünfte auf dem Schirm, und nichts sagte ihm, warum. Wer den Schalter umlegt, nimmt eine Handwahl mit zurück; ein Druck auf den Knopf, der schon gilt, lässt sie stehen.
Die Gruppe „Abo-Theme" (AboThemeEinstellungen.tsx) steht nur da, wo es mehr als eine Stufe zu wählen gibt — für Admin und Dev, und seit dem 24.09.2026 für Premium, das jetzt am Konto steht (KI01, N231; gesetzt unter Admin → Konten). Sie zeigt ein Muster je wählbarer Stufe, von Frei bis zur eigenen: einen kleinen Knopf in der Fläche der Stufe („Aa" auf Violett, auf Goldtopas im Treppenschliff, auf Rubin im Kissen oder auf einem Diamanten als Brillant — seit E21, N339, N340), daneben den Namen der Stufe und darunter einen Punkt in ihrer Anwendungsfarbe mit dem Namen der Farbe: Violett, Gold, Himbeer, Diamantblau (bis zum 27.09.2026 Amethyst und Saphir). Die eigene Stufe trägt „· eigene Stufe"; die gewählte einen Ring in der Anwendungsfarbe und aria-pressed. Stufen über der eigenen stehen nicht da, auch nicht ausgegraut (Plan E12). Ein Klick auf die eigene Stufe speichert auto, auf eine darunter ihren Namen (theme.abo). Beim Impersonieren sind die Muster nicht zu drücken, und darunter steht „Beim Impersonieren: Stufe des Zielkontos" — der Knopf zeigt dann immer die Stufe des Kontos, als das gearbeitet wird.
Der Rang am Namen (27.09.2026, E22, N353). Ein Rang ist eine Rolle mit Material (gesetzt unter Admin → Rollen, vergeben über die Gruppe unter Admin → Konten). Im Kopf der Seite steht hinter „Angemeldet als …" das Abzeichen des gezeigten Rangs — Material am Rand, der Name der Rolle auf der Tafel (Rangabzeichen); ohne Rang steht dort nichts. Im Kontowechsel fehlt die ganze Zeile (Anmeldezeile.tsx, E33, 13.10.2026): Das Band darüber nennt Zielkonto, dessen Rang und wer angemeldet ist. Trägt ein Konto mehr als einen, gibt es unter Darstellung die Gruppe „Rang am Namen" (RangEinstellungen.tsx, zwischen Abo-Theme und Himmel): je Rang sein Abzeichen als Knopf, der gezeigte mit Ring und aria-pressed. Der erste nimmt die Wahl zurück (null), jeder andere schreibt seinen Schlüssel nach rang.gezeigt. Geordnet wird nach Material — vorn der Onyx der Gründer —, bei gleichem Material nach Namen; ohne Wahl steht der erste da. Beim Impersonieren stehen hier die Ränge des Zielkontos, nicht zu drücken, mit „Beim Impersonieren: Ränge des Zielkontos". Mit einem Rang oder keinem fehlt die Gruppe, und die Suche nimmt sie über ohneGruppen heraus wie das Abo-Theme.
Die Suche kennt beides. Der Eintrag „Szene" findet sich jetzt auch unter Tageszeit, Morgen, Abend, Sonnenaufgang, Sonnenuntergang, automatisch; „Abo-Theme" unter Abo, Stufe, Rolle, Premium, Admin, Entwickler, Gold, Topas, Rubin, Himbeer, Diamant, Diamantblau, Violett, Knopf, Akzent, Farbe, Edelstein; „Rang am Namen" unter Rang, Abzeichen, Material und den Namen der Ränge. Für ein Konto ohne Wahl nimmt der Schirm „Abo-Theme" aus der Suche (ohneGruppen), damit kein Treffer in eine Gruppe führt, die nicht dasteht.
Eigene Szene (01.10.2026, E04, N471)
Unter Darstellung, Stufe Erweitert, steht nach „Szene" die Gruppe „Eigene Szene" (EigeneSzeneEinstellungen.tsx, Anker eigen). Sie schreibt theme.eigen — Elternszene, Grundton, Himmelstöne — und fehlt am Gerät, weil der Schlüssel nur die Nutzerschicht kennt.
- „Abgeleitet von": eine Auswahl aus den zwölf Szenen. Ohne gespeicherten Wert beginnt sie bei der Szene, die gerade gilt.
- „Grundton": der Knopf „Wie die Elternszene" (
null), die zehn Farbfelder ausFARBAUSWAHLund ein Feld „Grundton als Hexwert". Ein Wert, der noch keine Farbe ist, bekommt den Satz „Das ist noch keine Farbe: sechs Stellen nach der Raute, etwa #ffc400."; gespeichert wird dann nichts. - „Himmel": je Tageszeit (Morgens, Tagsüber, Abends, Nachts) die Töne der Elternszene als Farbwähler des Systems, jeder benannt „Himmelston {n}, {Abschnitt}". Wer einen ändert, setzt alle Töne dieser Tageszeit; „Wie die Elternszene" daneben nimmt nur sie zurück. Die Felder stehen 8 px auseinander wie die des Grundtons (15.10.2026, E-261013-restfunde-blick).
- „Vorschau": vier Felder, je Tageszeit der abgeleitete Himmel, der in den Grund ausläuft, darauf der Name in der Textfarbe auf einem kleinen Schild im Grund der Szene. Direkt auf dem Himmel war er nicht zu lesen, wo Himmel und Szene gegeneinander stehen — nachts bei einer hellen Szene, morgens bei einer dunklen (E27).
Alles, was in der Gruppe bedient wird — Auswahl, Knöpfe, Hexfeld, Farbfelder —, ist mit Zeiger 32 Pixel hoch und bei Berührung so hoch wie die Zielfläche (44, §16.1). Himmelsfelder und Vorschau tragen den Rand in schwach, damit ein Nachtton auf dunklem Grund nicht verschwindet (§17, 13.10.2026).
Gedämpft wird, nicht abgewiesen (Guide §3.4, §4.3). Reißt der Grundton eine Schwelle aus §17, steht darunter „Mit diesem Grundton wäre Text schwer zu lesen; er steht deshalb bei {anteil} %."; beim Himmel entsprechend „… er steht deshalb bei {anteil} % der eigenen Töne." Der Himmel wird zuerst gedämpft, der Grundton danach über dem gedämpften Himmel gemessen.
Gespeichert wird nach einer Pause von 400 ms, nicht bei jeder Zwischenfarbe eines Farbwählers. Scheitert es, steht „Nicht gespeichert" da. Ist die eigene Szene gespeichert, gilt aber nicht und folgt die Szene nicht der Tageszeit, steht unten „Eigene Szene wählen"; er schreibt theme.szene = "eigen". Gibt es eine eigene Szene, bieten sie auch die Gruppe „Szene" (als dreizehnter Knopf und in jeder Auswahl je Tageszeit) und der Kontoknopf an.
Die Suche findet die Gruppe unter eigenes Theme, Farbe, Grundton, Himmel, Himmelsfarbe, Farbwähler, Hintergrund, Ton, selbst gestalten und anpassen.
„Kontrast" steht in „Himmel, Dichte, Bewegung, Zeichen" zwischen Bewegung und Zeichen (RL19, N431): System folgen (Vorgabe), Normal, Mehr. Bei System folgen sagt der Satz darunter, ob das System gerade „Mehr Kontrast" meldet; sonst, was Mehr tut — Fließtext in voller Deckung, kräftige Ränder, deckendes Glas, stärkerer Fokusring. Die Wahl liegt beim Nutzer und am Gerät (kontrast.stufe), die Suche findet sie unter Kontrast, Barrierefreiheit und Lesbarkeit.
„Wie viel sich bewegt“ (E24, N347, N465, 01.10.2026): Die Vorgabe für alle ist Mittel, gesetzt mit Wanderung 206; eingebaut bleibt Voll. Die Stufe dämpft auch die Atmosphäre im Tempo. Hat weder das Konto noch das Gerät selbst gewählt und meldet das System „Bewegung reduzieren“, ist Aus gedrückt, und ein Satz darunter sagt es: „Steht still, weil das System weniger Bewegung wünscht — eine Wahl hier geht vor.“ Eine eigene Wahl am Konto gilt seitdem auch gegen das System; bis dahin galt das nur für eine Wahl auf dem Gerät.
Der Wetterschalter in „Himmel, Dichte, Bewegung, Zeichen" heißt jetzt „Wetter auf der Szene". Bis zum 22.09.2026 hieß er „Szene folgt dem Wetter" und sollte die Szene austauschen — bei Gewitter die Szene Gewitter. Das tat er nie: Die Bedingung prüfte geraet.szene === undefined, und die Geräteschicht kennt nur null. Christian hat das Ersetzen mit N132 ohnehin zurückgenommen: „Wetter legt sich zusätzlich noch auf die Szene sodass sowohl Tageszeit als auch Wetter wirken. Bei Gewitter darf der Tag natürlich ruhig dunkler werden." Der Satz darunter sagt jetzt, was sich ändert und was bleibt: „Wolken, Regen, Gewitter dunkeln Himmel und Grund · Schnee hellt auf · Szene, Tageszeit und Text bleiben".
Die Verwaltung: Rollen statt Gruppen (23.09.2026, A29, N175, N186)
Hinweis: Seit A41 (24.09.2026, N253) im Reiter „Admin“, nicht mehr in den Einstellungen; die Datei heißt
admin/client/Verwaltungsabschnitte.tsx. Der Abschnitt bleibt hier stehen, weil er erklärt, warum die Rollen so arbeiten; der Schirm ist in verwaltung.md beschrieben.
Die Kategorie Verwaltung sieht nur, wer settings.global_default hat. Sie hat fünf Faltabschnitte: Neue Konten, Vorgaben setzen, Für alle, Rollen und — seit dem 24.09.2026 — Konten. Bis zum 23.09.2026 hieß Rollen noch Gruppen und las die Gruppenschicht, die seit A29, Stufe 1, nichts mehr bewirkt.
Konten (Verwaltungsabschnitte.tsx, Konten; KI01, N231). Einen Hinweis im Kopf trägt der Abschnitt seit RL20 nicht mehr. Darin der Titel „Welche Stufe ein Konto hat" mit dem Satz, dass Rechte vor der Mitgliedschaft gehen: Wer Admin- oder Entwicklerrechte trägt, steht auf dieser Stufe, gleich was am Konto steht. Darunter je Konto eine Zeile — das Profilbild des Kontos mit seinem gezeigten Rang (28 px, seit dem 28.09.2026, E22, N367), Anzeigename und Anmeldename, ein kleiner Knopf in der Fläche der wirksamen Stufe (Spalte „wirksam") und eine Auswahl der Mitgliedschaft mit drei Einträgen, Frei, Lite und Premium (Lite seit dem 08.10.2026, D19, Entscheidung 2026-10-08-stufen-im-rechtebaum). Ein Konto auf Lite zeigt in der Spalte „wirksam" den Knopf von Frei, bis Lite eine eigene Farbe bekommt. Admin und Dev stehen dort nicht: Sie folgen aus den Rechten (settings.global_default, dev.impersonate) und werden nicht gesetzt. Sortiert ist nach dem Anmeldenamen. Gelesen wird über RECHTE_KONTEN (eine Abfrage für alle Konten), geschrieben über RECHTE_KONTO_STUFE; beide Wege gehören dem Bereich rights und antworten ohne settings.global_default mit 404. Die Antwort des Schreibens ersetzt die Zeile; betrifft sie das eigene Konto, liest der Schirm access neu, damit Knopf und Abo-Theme sofort folgen. Scheitert das Lesen, steht „Die Konten ließen sich nicht lesen." da, scheitert das Setzen, „Die Stufe wurde nicht gespeichert.". Während des Schreibens sind alle Auswahlen des Abschnitts gesperrt; der Riegel läuft über useBusyLock und geht auch auf, wenn die Anfrage wirft (F28b). Ein Protokoll gibt es nicht; die Spur ist updated_at und updated_by_id an der Kontozeile — beim Kontowechsel die Person, die wirklich angemeldet ist, nicht das übernommene Konto. Der Abschnitt steht hier, bis der Reiter „Admin" steht (A41). Elf jsdom-Tests in Verwaltungsabschnitte.test.tsx; gegen die API prüft verify:rechte, Teil 11. Die wirksame Stufe zeigt dieselbe Knopfprobe wie das Abo-Theme (Knopfprobe aus AboThemeEinstellungen.tsx).
Ränge vergeben (27.09.2026, E22, N353). Gibt es Rollen mit Material, steht unter jeder Kontozeile eine Rangreihe: je Rang, dessen Rolle aus einer Gruppe kommt, ein Knopf, nach Material geordnet. Einen Rang, den das Konto trägt, zeigt sein Abzeichen; einen, den es nicht trägt, ein gestrichelter Umriss mit dem Namen. Ein Klick nimmt das Konto in die Gruppe auf oder entlässt es daraus (GRUPPEN_AUFNEHMEN, GRUPPEN_ENTLASSEN) — vergeben wird ein Rang wie jede Rolle, über die Mitgliedschaft; der Vorleser hört „{Rang} vergeben" oder „{Rang} nehmen". Scheitert es, steht „Der Rang wurde nicht gespeichert." da. Betrifft es das eigene Konto, liest der Schirm access neu, damit das Abzeichen am eigenen Namen sofort folgt. Über der Liste steht der Hinweis, dass ein Rang über die Mitgliedschaft in seiner Gruppe kommt, nur wenn es Ränge gibt. Die Ränge eines Kontos kommen mit RECHTE_KONTEN (raenge, geordnet wie überall nach ordneRaenge).
Rollen (Verwaltungsabschnitte.tsx, Rollen und Rollenkarte). Oben der Titel „Was für eine Rolle gilt" mit dem Satz, wo eine Rollenvorgabe liegt: über der Vorgabe für alle, unter dem eigenen Wert; bei zwei Rollen mit demselben Schlüssel gilt die zuletzt gesetzte. Darunter je Rolle ihr Name, die Zahl der Mitglieder (Mitglieder ihrer Gruppe eingerechnet), jede Vorgabe als Zeile mit Schlüssel, Kurzwert und „Vorgabe zurücknehmen", und als letzte Zeile eine Auswahl der Einstellung samt „meinen Wert für diese Rolle". Gelesen wird über PREFERENCE_ROLES, geschrieben über PREFERENCE_ROLE; erst nach dem Schreiben wird neu gelesen. Gibt es keine Rolle, steht dort „Es gibt noch keine Rolle. Eine Rolle entsteht, wenn eine Gruppe angelegt wird."; scheitert das Lesen, „Die Rollen ließen sich nicht lesen."
Material je Rolle (27.09.2026, E22, N353). Jede Rollenkarte trägt eine Auswahl Material — „kein Rang" oder eines der neun Materialien (RANGMATERIALIEN in @shared/config/raenge) — und daneben die Vorschau des Abzeichens, oder „Diese Rolle ist kein Rang.". Geschrieben wird über RECHTE_ROLLE_MATERIAL (Bereich rights, nur mit settings.global_default), danach neu gelesen. Scheitert es, steht „Das Material wurde nicht gespeichert." da. Die neun vorgeschlagenen Ränge legt Wanderung 174 als Gruppe und Rolle ohne Rechte an; die Datenbank prüft das Material gegen dieselbe Liste. Eine Rolle ohne Material ist kein Rang und zeigt kein Abzeichen (verify:rechte, Teil 14). Gelesen wird der Rang auch über MCP (zugang, gruppen_liste, konten_stufen); gesetzt wird er nur hier.
Jede Gruppe hat ihre Rolle (N186). Eine neue Gruppe bringt ihre Rolle beim Anlegen gleich mit — derselbe Schlüssel, derselbe Name, in derselben Transaktion (rights/server/gruppen.ts, legeGruppeAn; ebenso seedCapabilities.ts). Ist der Schlüssel als Rolle schon vergeben, entsteht auch keine Gruppe. Gruppen, die vorher ohne Rolle dastanden, holt Wanderung 103 nach. Bis dahin entstand die Rolle erst, wenn jemand der Gruppe zum ersten Mal etwas vorgab — über den Weg group, der mit Stufe 1 fiel.
Die Auswahlen sind das SelectField der Bausteine, in Rollen wie in Vorgaben setzen. Bis zum 23.09.2026 waren es rohe <select>, deren aufgeklappte Liste der Browser zeichnet — im dunklen Modus weiß auf weiß. Solange nichts gewählt ist, steht „Einstellung wählen …" im Knopf; der Knopf daneben bleibt bis zur Wahl zu. Dass der Platzhalter auch erscheint, verlangte eine Reparatur am SelectField selbst: Es packte '' immer in seinen Stellvertreter, und Radix zeigt den Platzhalter nur bei ''. Bis zum 23.09.2026 stand deshalb jede Auswahl ohne leeren Eintrag als leeres Kästchen mit Pfeil da — gefunden mit /ansehen. Am Telefon kürzt die Auswahl ihren Platzhalter (Punkt 92).
Woher ein Wert kommt (24.09.2026, A03, N196)
Eine Zeile ohne Zusatz steht auf der eingebauten Vorgabe. Weicht ein Wert davon ab, steht leise neben der Beschriftung, wer ihn gesetzt hat: „Vorgabe für alle" (die Instanz), „von Rolle Tutoren" (eine Rolle) oder „von dir · zurücksetzen" (das Konto selbst). Nur beim letzten steht ein Knopf, und er nimmt genau diesen einen Wert zurück. Das ist Christians Wahl vom 24.09.2026 (N196, „Nur Abweichungen"). Regeln, Aussehen und Ausnahmen stehen in docs/gestaltung/einstellungen.md §6; der Baustein ist client/Herkunftsmarke.tsx mit dreizehn jsdom-Tests daneben; was die Zeilen der Gestaltung in beiden Stellungen von „Ändern für" schreiben und was ihre Marke sagt, prüfen sieben in client/GestaltungEinstellungen.test.tsx. Es zählt die Schicht, nicht der Wert: Wer selbst den Wert der Vorgabe wählt, sieht „von dir · zurücksetzen" — dieselbe Zählung wie „{n} Einstellungen weichen von der Vorgabe ab" unter den Kategorien. Christian hat diese Lesart am 24.09.2026 bestätigt, ebenso, dass die Marke ein Wort ohne Zeichen bleibt (N210, Gestaltung §6).
Bis dahin stand das Wort „Vorgabe" an genau zwei Zeilen, Inhaltsbreite und Zeilennummern, und zwar dann, wenn der Wert auf der eingebauten Vorgabe stand — das Gegenteil dessen, was die Zeilen jetzt sagen. Beide Wörter sind fort.
So sieht sie aus. Klein (xs) und im Nebentext; hinter einer Beschriftung mit einem „·" davor, damit sie sich nicht als Teil des Namens liest — „Wo eine Tabellenzeile bearbeitet wird von Rolle Tutoren" war ein Satz. „zurücksetzen" steht in der Anwendungsfarbe und unterstrichen, wie „Mehr zeigen": Es ist ein Knopf (Guide §3.1).
| Kategorie → Gruppe | Wo die Marke steht |
|---|---|
| Darstellung → Szene | hinter Nach Tageszeit; je Tageszeit auf einer eigenen Zeile unter der Auswahl, deren Wert sie meint; bei fester Szene auf einer eigenen Zeile unter den Szenenknöpfen |
| Darstellung → Abo-Theme | auf einer eigenen Zeile unter den Mustern, nur wenn das Konto selbst gewählt hat — etwas anderes als „von dir" kann dort nicht stehen, der Schlüssel hat nur die Nutzerschicht |
| Darstellung → Rang am Namen | auf einer eigenen Zeile unter den Abzeichen, nur wenn das Konto selbst gewählt hat — wie beim Abo-Theme hat der Schlüssel nur die Nutzerschicht |
| Darstellung → Himmel, Dichte, Bewegung, Zeichen | Himmel, Wetter, Zeichen, Serifen, Dichte, Bewegung, Kontrast, Rütteln — an allen acht hinter der Beschriftung, auch für einen Wert am Gerät („dieses Gerät · zurücksetzen", N260) |
| Darstellung → Sprache | auf einer eigenen Zeile unter den Sprachknöpfen |
| Darstellung → Breite, Umbruch, Zeileneditor | an allen vier Zeilen |
| Darstellung → Kurzmeldungen | Für wen die Meldungen geschrieben sind und die Zeile darunter, deren Beschriftung mit der Wahl wechselt |
| Zeit und Anfang → Zeitzone, Woche, Uhrzeit | an allen drei Feldern, hinter der Beschriftung über dem Feld; die Felder stehen seitdem untereinander |
| Zeit und Anfang → Was im Tagesbriefing steht | auf einer eigenen Zeile unter den Haken, einmal für die ganze Liste: Sie ist ein Wert (briefing.bloecke), und eine Rolle kann ihn vorgeben. Die Gruppe kam am selben Tag mit BE44 dazu und bekam die Marke beim Einspielen — ohne sie hätte die Liste einer Rolle ausgesehen wie die eingebaute |
| Zeit und Anfang → Roller oder Bahn im Briefing | zwei Marken, weil es zwei Werte sind (BE18): hinter dem Haken die des Schalters (briefing.rolleran), neben dem Wort Rollerregel die der Regel (briefing.roller). Eine Rolle kann beide getrennt vorgeben |
| Zeit und Anfang → Benachrichtigungen | drei Marken (L02, BE-261007-frist-erinnerung): hinter Uhrzeit die von briefing.pushuhrzeit, hinter Zeilen der Nachricht die von briefing.pushzeilen, seit dem 13.10.2026 hinter Erinnerung zur Frist die von todos.erinnerung. Haken und Geräteliste tragen keine — sie sind keine Einstellung, sondern Zeilen in personal.push_subscriptions |
Ohne Marke bleiben die Stufenwahl, die Farben und Zeichen der Bereiche, Skills und Gebiete (sie folgen mit A03, Punkt 3, wenn je Pfad geschrieben wird — Punkt 93 unten) und die Handwahl der Szene, die ihren eigenen Knopf „Zurücknehmen" hat. Die Gründe stehen in §6 der Gestaltung.
Wo keine Beschriftung ist, steht die Marke auf einer eigenen Zeile. Unter Sprache und fester Szene (bis zum 09.10.2026 auch unter Wo Denotato aufgeht) steht nur eine Reihe Knöpfe, unter dem Tagesbriefing nur eine Liste von Haken. Hinter dem letzten Knopf gehörte die Marke sichtbar zu ihm: Am Telefon las sich „Material · von dir", obwohl „Aufgaben" gewählt war, zwei Reihen höher. Gesehen mit /ansehen am selben Tag, noch vor dem Einspielen.
Die Zeile wird von der Marke nicht höher. Am Telefon ist „zurücksetzen" 40 Punkte hoch (Guide §16.1), aber mit negativen Rändern, die ihm genau das nehmen, was er über eine Textzeile hinaus hat. Im ersten Bau wuchs die Zeile mit: Die Knopfreihe unter einer Beschriftung sprang beim Wählen um 23 Punkte nach unten, unter dem Daumen weg, und die beiden Zeitfelder standen 10 Punkte versetzt. Die Fläche reicht jetzt über die Zeile hinaus; wo sie auf die Knopfreihe darunter trifft, bekommt die Knopfreihe den Tipp.
Auf die Reihe darüber reicht sie nicht. Die Marke steht später im Dokument als die Knöpfe darüber und bekäme dort den Tipp. Im zweiten Bau lag die Fläche einer Marke auf eigener Zeile 7,5 Punkte über der Unterkante der Knöpfe: Wer „Kalender" an der Unterkante traf, setzte „Wo Denotato aufgeht" zurück; unter den Abo-Mustern waren es 3 Punkte. Seitdem hält eine Marke auf eigener Zeile am Telefon rund elf Punkte Abstand nach oben. Gemessen mit elementFromPoint, alle Marken gesetzt, auf 390, 375, 360 und 834 Punkten Breite: keine Fläche über etwas Früherem.
Die Beschriftung hält den Platz für ihre Marke frei (24.09.2026, A40, N207). Bis dahin wurden auf 360 Punkten Breite drei Beschriftungen zweizeilig, sobald „· von dir · zurücksetzen" dazukam, und ihre Knopfreihe sprang beim ersten eigenen Wert nach unten: Zeilennummern im Dokumenteneditor und Für wen die Meldungen geschrieben sind um 17 Punkte, Kurzes Rütteln bei Rückmeldungen um 20, dieses auch auf 375. Jetzt steht hinter jeder Beschriftung ein unsichtbarer Platzhalter mit genau diesem Text, als erzeugter Text (::before aus data-platz), damit „von dir" nicht an jeder Zeile im Baum steht. Wo er nicht in die Zeile passt, steht ohne eigenen Wert eine leere zweite Zeile unter der Beschriftung; die Reihe steht in jedem Zustand an derselben Stelle. Gesehen mit /ansehen vorher und nachher, Darstellung und Zeit und Anfang, auf Telefon, Tablet und Rechner, hell und dunkel: Ohne eigene Werte sind die Bilder gleich bis auf die Uhrzeit im Beispiel. Gemessen, alle Marken gesetzt und wieder zurückgenommen, auf 360, 375, 390, 834 und 1440 Punkten: Keine der fünfzehn Beschriftungen ändert ihre Höhe, keine Fläche liegt über etwas Früherem. Wie es gebaut ist, steht in Gestaltung §6; die Tests prüfen den Platzhalter über data-platz, weil jsdom erzeugten Text nicht zeichnet.
In der Szenenliste steht die Marke unter der Auswahl, deren Wert sie meint — am Rechner in deren Spalte, am Telefon über die ganze Breite. Direkt hinter der Uhrzeit las sich „ab 06:13 · von dir" so, als habe man die Uhrzeit gesetzt — die rechnet Denotato aber aus dem Sonnenstand. Neben dem Beginn, wie im zweiten Bau, brach sie am Telefon unter die Uhrzeit um, also zwischen Beschriftung und Auswahl, und die eben angetippte Auswahl rutschte beim Wählen 16 Punkte nach unten. Unter der Auswahl erscheint sie, ohne dass sich die Auswahl bewegt; nur die Abschnitte darunter rücken nach. Am Telefon steht die Auswahl dafür mit sm Abstand unter Name und Uhrzeit, und zwischen den Abschnitten ist die Lücke sm statt xs, damit die Marke sichtbar zu ihrem Abschnitt gehört.
„Ändern für": Konto oder nur dieses Gerät (A03, Punkt 4; N259, N260). Unter dem Umfang steht ein zweites Band derselben Form: „Ändern für" mit mein Konto und nur dieses Gerät (client/Einstellungsziel.tsx). Beide Bänder sind seit dem 28.09.2026 Segmente in einer Kapsel (Segmentwahl, N400, RL02): Das gewählte Feld trägt die Farbe des Maschinenraums, am Telefon ist jedes Feld 40 Punkte hoch. Der Knopf „Einstellungen zurücksetzen“ unter den Kategorien ist kein Hauptknopf mehr; hervorgehoben wird erst „Wirklich zurücksetzen“ in der Nachfrage. Beim Öffnen steht es immer auf dem Konto; die Wahl liegt weder in der Adresse noch im Speicher, damit niemand unbemerkt im Gerätemodus bleibt.
- mein Konto: Jede Zeile schreibt ins Konto. Trägt dieses Gerät für denselben Schlüssel einen eigenen Wert, nimmt der Knopf ihn mit — sonst gewänne der alte Gerätewert, und der Tipp sähe wirkungslos aus.
- nur dieses Gerät: Es bleiben die Kategorien Darstellung und Zeit und Anfang, und in ihnen nur die Zeilen, deren Schlüssel das Gerät erreicht — die zwölf mit Reichweite Gerät außer der Sprache (N40). Ohne Abo-Theme, Sprache, Kurzmeldungen, Skills, Interessengebiete, Beim Öffnen und Briefing; ohne Nach Tageszeit (eine Szene am Gerät ist eine feste), ohne Wetter auf der Szene, Zeilennummern, Zeitzone und Wochenstart; ohne „{n} Einstellungen weichen von der Vorgabe ab" und ohne „Als Vorgabe für alle". Jede Zeile schreibt nach
denotato.geraet.
Steht ein Wert am Gerät, sagt die Marke an der Beschriftung „dieses Gerät · zurücksetzen" — in beiden Stellungen, und vor „von dir": Der Gerätewert ist der, der gilt. Ihr Knopf nimmt nur den Gerätewert zurück, danach gilt wieder, was das Konto sagt. Den frei gehaltenen Platz (A40) misst die Marke bei einem Schlüssel, den das Gerät erreicht, an diesem längeren Text; am Telefon hält „Kurzes Rütteln bei Rückmeldungen" deshalb eine zweite, leere Zeile.
Bis zum 24.09.2026 kannten nur Dichte, Bewegung und Rütteln einen Gerätewert, mit einer eigenen Marke „an diesem Gerät gesetzt — zurücknehmen" unter ihrer Knopfreihe, und gesetzt wurde er von keiner Zeile der Seite. Die Marke ist fort; die Beschriftung sagt jetzt, was jede andere Herkunft auch sagt.
Zeit und Anfang: Die Beschriftung umschließt das Feld nicht mehr, und die Felder stehen untereinander. Bis zum 24.09.2026 stand jede der drei Auswahlen samt ihrem Text in einem <label>. Ein Knopf darf darin nicht stehen: Ein <label> benennt sein erstes beschriftbares Kind, und ein Klick auf den Text löst dieses Kind aus — mit der Marke vor der Auswahl wäre das „zurücksetzen" gewesen. Jetzt steht über dem Feld ein Kopf aus <label htmlFor> und Marke (Feldkopf in ZeitEinstellungen.tsx), und die Auswahl trägt die Kennung, auf die er zeigt. Der Fallstrick dazu steht in docs/kontext/fallstricke.md. Woche und Uhrzeit standen bis dahin nebeneinander; mit der Marke zog der Kopf die Auswahl auf seine Breite (die Uhrzeit von 105 auf 154 Punkte) und schob das Nachbarfeld am Telefon in eine eigene Zeile — dichter an das Feld darüber als an seine eigene Auswahl. Untereinander, mit md zwischen den Feldern und xs im Feld, gehört jede Beschriftung sichtbar zu ihrer Auswahl, und jede Auswahl ist so breit wie ihr längster Eintrag.
Abo-Theme: Die eigene Stufe schreibt nichts mehr. Bis zum 24.09.2026 schrieb ihr Knopf auto in theme.abo. Der Schlüssel gilt nur für das Konto (NUR_NUTZER), sein Rückfall ist also immer auto; gespeichert hätte die Wahl „von dir · zurücksetzen" an einen Wert gestellt, dessen Zurücksetzen nichts ändert. Jetzt nimmt die eigene Stufe die eigene Wahl zurück (null).
Nebenbei: „1 Einstellungen liegen". Unter der Stufenwahl stand bei einer einzigen verborgenen Einstellung die Mehrzahl. Der Satz hat jetzt eine Einzahl („Es gibt noch mehr — 1 Einstellung liegt unter einer höheren Stufe."), auch im Englischen.
Was im Tagesbriefing steht (24.09.2026, BE44)
Unter Zeit und Anfang steht seit dem 24.09.2026 die Gruppe „Was im Tagesbriefing steht" mit dem Satz „Welche Zeilen das Briefing auf der Übersicht bringt." Darin vierzehn Haken, einer je Block, in einem Raster, das sich der Breite anpasst: Termine des Tages · Stundenplan · Vorgänge, die auf eine Entscheidung warten · Fristen · Prüfungen · Karteikarten · Aufgaben · Gewohnheiten · Geburtstage · Schlaf · Interessenbaum · Der nächste feste Termin der kommenden Tage · Wetter · Speiseplan der Mensa. Die Eröffnung fehlt mit Absicht: Sie ist der Satz über den Tag, und ein Briefing ohne sie wäre eine Liste.
Warum es die Gruppe gibt. Ben las in seinem Morgenbriefing „46 Vorgänge warten auf deine Entscheidung" — Christians Schlange, nicht seine. Abschalten ließ sich die Zeile schon vorher, mit dem × an der Zeile auf der Übersicht (N8, das bleibt der erste Weg). Das × kennt aber nur eine Richtung: Was weggeklickt ist, steht nicht mehr da und lässt sich dort nicht wieder anklicken. Hier stehen alle Blöcke, und ein Haken schaltet in beide Richtungen.
Dieselbe Einstellung wie das ×. Geschrieben wird briefing.bloecke, die Liste des Abgeschalteten — ein Block, den es neu gibt, ist deshalb für jeden an. Die Liste der Blöcke und ihre Namen stehen einmal, in @shared/handlers/briefing/abschaltbar.ts; das ×, diese Gruppe und das Werkzeug briefing_bloecke_setzen lesen sie alle drei. Das Bauteil selbst liegt im Dashboard (dashboard/client/Briefingeinstellung.tsx), weil die Blöcke dorthin gehören; die Einstellungsseite zeichnet es nur.
Das Briefing von heute folgt sofort. Ein Briefing wird aufgehoben, nicht neu gerechnet. Trägt das von heute einen Block, der inzwischen aus ist, rechnet der Server es beim nächsten Abruf neu — gleich, ob über diese Gruppe, das Werkzeug oder eine Rollenvorgabe abgeschaltet wurde. Frühere Tage bleiben, wie sie waren: Sie sind nachzulesen, was an dem Tag galt.
Zwei Setzungen, die beim Bau gefallen sind und nicht Christians Entscheidung waren:
- Alle vierzehn stehen da, auch ohne den Bereich dahinter. Wer keine Verwaltung hat, bekommt die Zeile ohnehin nie; der Haken schadet dann nicht. Eine Zuordnung Block → Bereich hätte dagegen, wo sie falsch ist, einen Schalter versteckt, den jemand braucht.
- Stufe erweitert, wie die übrigen Schalter über Einzelheiten. Die Suche findet die Gruppe unter Briefing, Morgen, Zeilen, abschalten, ausblenden, Verwaltung, Vorgänge, Wetter, Mensa und hebt die Stufe beim Sprung.
Höchstens Zeilen (24.09.2026, N250, BE32)
Unter den Haken derselben Gruppe steht seit dem 24.09.2026 eine Auswahl „Höchstens Zeilen" mit den Werten 4 Zeilen bis 10 Zeilen; die Vorgabe ist 6 Zeilen, die Eröffnung mitgezählt. Der Satz über der Gruppe sagt dazu: „Bei der Höchstzahl der Zeilen zählen Wetter und Speiseplan nicht mit." Daneben trägt die Auswahl die Herkunftsmarke (N196), wie jede Einstellung, die eine Rolle vorgeben kann.
Warum es sie gibt. Bis zum 24.09.2026 schnitt der Redakteur fest nach sechs Zeilen (N27). Ben nennt für sein Morgenbriefing neun Bausteine; an einem gewöhnlichen Uni-Tag kamen die hinteren — Gewohnheiten, also Sport, und der nächste feste Termin — nie an die Reihe, nicht weil sie fehlten, sondern weil vorn schon fünf standen (BE32, gemessen am 21.09.2026). Christian hat die Zahl zur Einstellung gemacht und sechs als Vorgabe gelassen (N250). Die Rangfolge bleibt, wie sie ist: Wer neun einstellt, bekommt die neun wichtigsten, nicht andere.
Was beim Bau gesetzt wurde und nicht Christians Entscheidung war:
- Eine Auswahl, kein Zahlenfeld. Es gibt sieben erlaubte Werte; die Liste zeigt sie alle, statt einen achten erst anzunehmen und dann abzulehnen. Die Grenzen stehen einmal, in
@shared/handlers/briefing/briefingzeilen.ts, und die Auswahl, der Schlüssel inpreferenceKeys.tsund der Redakteur lesen sie von dort. - Ein ungültiger Wert fällt auf sechs zurück, nicht auf die nächste Grenze. Eine 12 ist keine gemeinte 10.
- Das Briefing von heute folgt beim nächsten Abruf. Die Grenze, nach der es geschnitten wurde, steht unter
zeilengrenzein seinen Daten; weicht sie von der Einstellung ab, rechnet der Server es neu. Frühere Tage bleiben, wie sie waren. - Der Baustein liegt in
settings(settings/client/BriefingzeilenEinstellung.tsx) und nicht neben den Haken im Dashboard, weil er die Herkunftsmarke trägt, und die gehört der Einstellungsseite; das Dashboard ist Gerüst (Grundsatz 43). - Die Suche findet die Gruppe zusätzlich unter Länge und höchstens.
Gesehen ist nur das „nachher" (/ansehen, Lauf nachher-zeilen vom 24.09.2026, Telefon, Tablet und Rechner, hell): Die Auswahl steht unter den Haken, die Marke daneben. Ein Bild „vorher" gibt es nicht (Grundsatz 5). Die drei Fehler jenes Laufs betreffen den Knopf „Maschinenraum" in der Leiste auf Glas (1,99 : 1) und nicht diese Gruppe.
Roller oder Bahn im Briefing (24.09.2026, BE18)
In derselben Gruppe steht unter der Zeilenzahl ein Haken „Roller oder Bahn im Briefing" mit dem Satz „Ein Satz hinter dem Wetter: Roller nur ohne Niederschlag, unter der Regenschwelle, ab der Mindesttemperatur und in den gewählten Monaten, sonst Bahn. Geprüft werden Hin- und Rückfahrt zum Stundenplan und zum Sport." Er ist vorgegeben aus — nicht jedes Konto fährt Roller.
Eingeschaltet steht darunter die Rollerregel: Bahn ab Regenwahrscheinlichkeit (10 bis 90 %, in Zehnern), Bahn unter (−5 bis 15 °C) und zwölf Haken Roller in diesen Monaten. Vorgegeben ist Bens Regel (N221, N280): Bahn ab 40 %, unter 5 °C und außerhalb von April bis Oktober. Was das Briefing daraus macht, steht in dashboard.md unter „Roller oder Bahn".
Zwei Schlüssel, nicht einer. Der Schalter ist briefing.rolleran (Wahrheitswert), die Regel briefing.roller ({regen, grad, monate}). Ein einziger Schlüssel mit null für „aus" ging nicht: In der Schichtung heißt null „diese Schicht sagt nichts", eine Vorgabe null löst also zu gar keinem Wert auf — verify:schalter hat das beim Bau gefunden. Dasselbe Muster wie lernzeit.an neben den Lernzeiten.
Was beim Bau gesetzt wurde und nicht Bens Entscheidung war:
- Auswahllisten, keine Zahlenfelder — wie bei der Zeilenzahl. Ein gespeicherter Wert, der nicht auf dem Raster liegt (etwa 35 % von einer Rolle oder vom Connector), steht trotzdem in der Liste; der Server nimmt jede ganze Zahl von 0 bis 100 % und von −10 bis 25 °C.
- Eine ungültige Regel zeigt die Vorgabe, dieselbe Prüfung (
istRollerregelin@shared/handlers/briefing/rollerwetter.ts), mit der der Server sie ablehnt. - Die Monate werden sortiert gespeichert; eine leere Liste ist erlaubt und heißt „immer Bahn" — das Briefing sagt es dann so.
- Der Baustein liegt in
settings(settings/client/RollerEinstellung.tsx), aus demselben Grund wie die Zeilenzahl: Er trägt die Herkunftsmarke. - Die Suche findet die Gruppe zusätzlich unter Roller, Bahn, Regen, Temperatur und Monate.
Angesehen mit /ansehen (Läufe roller und rollerdesktop vom 24.09.2026, Telefon und Rechner, hell und dunkel, eingeschaltet über „Alles" und den Haken): Die drei Felder stehen untereinander, die Monate auf dem Telefon in zwei, auf dem Rechner in vier Spalten. Kein Fehler gemessen; die Hinweise „verdeckt" bei Januar und März gelten der Eule im ersten Abschnitt, im zweiten liegen die Monate frei. Ein Bild „vorher" gibt es nicht (Grundsatz 5).
Nutzungsprotokoll (07.10.2026, DS-261006-schalter-hinweis)
Zwei Zeilen für zwei Rechtsgrundlagen (docs/kontext/datenschutz-nutzungsprotokoll.md), je mit „An" und „Aus" wie bei der Post:
- Nutzung erfassen (Vorgabe an) ist der Widerspruch gegen den Serverteil (Art. 21 DSGVO). Aus heißt: Für das Konto entsteht keine Zeile mehr, auch keine aus dem Browser.
- Nutzung im Browser erfassen? (Vorgabe aus) ist die Einwilligung in den Browserteil (§ 25 Abs. 1 TDDDG), mit dem vollen Wortlaut der Frage. Solange widersprochen ist, ruht sie: Die Knöpfe sind gesperrt, und ein Satz sagt warum.
Jede Änderung stellt den Browser sofort ein (setzeEinwilligung), nicht erst bei der nächsten Anmeldung. Gefragt wird außerdem einmal nach der Anmeldung, in einem Fenster mit zwei gleich gewichteten Knöpfen (components/nutzung/Nutzungsfrage.tsx); Wegklicken und Escape gelten als Nein. Die Tour wartet, bis die Frage beantwortet ist (Vortritt, context/Vortrittschicht.tsx). Erreichbar ist die Gruppe über /settings?a=daten&g=nutzung (NUTZUNGSWAHL_WEG). Im Kontowechsel lehnt der Server jede Änderung ab (403), und die Frage erscheint nicht.
Meine Nutzung (07.10.2026, DS-261006-eigene-nutzung)
Was das Nutzungsprotokoll über das eigene Konto weiß — Auskunft, Übertragbarkeit und Löschen (Art. 15, 20, 17 DSGVO). Die Gruppe steht unter „Deine Daten" nach „Nutzungsprotokoll" und ist über /settings?a=daten&g=meine-nutzung erreichbar.
Oben ein Satz: „{anzahl} Einträge vom {erste} bis zum {letzte}." oder, wenn nichts erfasst ist, „Über dein Konto steht nichts im Nutzungsprotokoll." Fehlt dem Server der Schlüssel für die Pseudonyme, sagt ein zweiter Satz, dass zurzeit nichts erfasst wird. Darunter nebeneinander die häufigsten Wege und Aktionen, je höchstens zehn, mit ihrer Zahl.
- „Als Datei herunterladen" holt alle Rohzeilen als
denotato-nutzung-JJJJ-MM-TT.json. Der Server nennt je Gegenstand nur die Kennung — und nur, wenn das Konto ihn heute noch sehen darf; die Titel setzt der Browser aus den Listen der Dokumente, des Wikis und der Lesepfade ein (eigeneNutzungTitel.ts). Fällt eine Liste aus, bleibt der Titel leer. - „Meine Einträge löschen" fragt einmal nach und nennt die Zahl: „Alle {anzahl} Einträge endgültig löschen? Die Tagessummen ohne Konto bleiben." — „Endgültig löschen" oder „Abbrechen".
Beide Knöpfe sind gesperrt, solange nichts erfasst ist. Im Kontowechsel lehnt der Server alle drei Anfragen ab (403). Nicht mit /ansehen angesehen (keine laufende API in der Bausitzung); geprüft im jsdom-Test MeineNutzung.test.tsx.
Benachrichtigungen (03.10.2026, L02, N311)
Eine eigene Gruppe unter Zeit und Anfang, nach dem Tagesbriefing: Denotato klopft einmal am Morgen mit dem Kurz-Briefing (N311). In der Gerätesicht („nur dieses Gerät") fehlt sie, weil keiner ihrer Werte am Gerät gilt.
Oben steht, was dieses Gerät kann, genau eines davon:
- „Benachrichtigungen sind auf diesem Server noch nicht eingerichtet." — der Server hat kein VAPID-Paar (Handgriff in L02,
## Schritte). - „Auf dem iPhone und iPad kommen Benachrichtigungen nur in der Web-App: in Safari „Teilen“, dann „Zum Home-Bildschirm“, und Denotato von dort öffnen." — Safari kennt Push nur für eine Web-App auf dem Home-Bildschirm (iOS 16.4); im Browser fehlt
PushManager. - „Dieser Browser kann keine Benachrichtigungen empfangen."
- sonst der Haken „Kurz-Briefing auf diesem Gerät". Erst er fragt den Browser um Erlaubnis — einen zweiten Versuch gibt es nicht, also nie beim Laden. Abgelehnt sagt der Satz darunter, dass die Erlaubnis in den Einstellungen der Website liegt.
Darunter die angemeldeten Geräte, je eine Zeile: der Browser, aus dem Push-Dienst geschlossen (Chrome oder Android, Firefox, Safari oder iPhone, Edge unter Windows), „— dieses" am eigenen, und „angemeldet …" (Datum) oder „zuletzt …" (Datum und Uhrzeit), wenn schon geklopft wurde. Ein anderes Gerät lässt sich über Wegtun abmelden („Wieder anmelden lässt es sich nur an ihm selbst."). Die Adresse beim Push-Dienst zeigt der Schirm nicht; sie trägt die Kennung des Geräts und sagt einem Menschen nichts.
„Kurz-Briefing jetzt schicken" stellt sofort an alle Geräte des Kontos zu und sagt, an wie viele.
Uhrzeit (briefing.pushuhrzeit, Vorgabe 06:30): Viertelstunden von 04:00 bis 12:00; ein gespeicherter Wert außerhalb des Rasters steht trotzdem in der Liste. Der Zeitgeber klopft ab dieser Zeit und bis drei Stunden danach, einmal je Gerät und Tag.
Zeilen der Nachricht (briefing.pushzeilen, Vorgabe Termine, Fristen, Prüfungen, Karteikarten, To-Dos): die Blöcke des Tagesbriefings, gewählte oben mit Pfeilen hoch und runter, die übrigen darunter ohne Haken. In der Nachricht stehen die ersten drei mit Inhalt. Ein neuer Haken hängt den Block hinten an; den letzten gewählten kann man nicht abwählen. Jede Zeile ist unter dem Daumen so hoch wie die Zielfläche (44 px, Marke layout.zielflaeche), gewählt oder nicht.
Erinnerung zur Frist (todos.erinnerung, Vorgabe eine Stunde, seit dem 13.10.2026, BE-261007-frist-erinnerung): wie lange vor einer Frist mit Uhrzeit sich eine Aufgabe auf jedem angemeldeten Gerät meldet — „Zur Frist“, 5 Minuten bis 2 Tage vorher oder „Aus“. Der Satz darunter sagt, dass einzelne Aufgaben abweichen können; das tun sie im Aufgabenformular neben der Uhrzeit. Christian hat am 12.10.2026 „Konto-Vorgabe plus Abweichung“ gewählt.
Was beim Bau gesetzt wurde und nicht entschieden war:
- Die Uhrzeit als Auswahl, nicht als Zeitfeld — wie die Zeilenzahl und die Rollerregel.
- Pfeile statt Ziehen für die Reihenfolge: ein Druck je Stelle, am Telefon ohne Ziehgeste, und mit Tastatur zu bedienen.
- Der Baustein liegt in
settings(settings/client/PushEinstellung.tsx, Browser inpushgeraet.ts, Server inpushanfragen.ts): Er trägt die Herkunftsmarke, und der jsdom-Test läuft ohne Service Worker. - Die Suche findet die Gruppe zusätzlich unter Push, Mitteilung, Handy, Kurz-Briefing, iPhone und Reihenfolge.
Angesehen mit /ansehen (Läufe nachher und nachher2 vom 03.10.2026, Telefon und Rechner, hell und dunkel, ohne VAPID-Paar): kein Fehler gemessen. Nach dem ersten Lauf standen die ungewählten Zeilen enger als die gewählten; seitdem haben alle unter dem Daumen dieselbe Höhe (heute 44 px). Die Hinweise „verdeckt" gelten Eule und Stift am unteren Rand. Ein Bild „vorher" gibt es nicht, die Gruppe ist neu. Haken und Geräteliste mit angemeldetem Gerät sind nur im Test gesehen — ohne Paar zeigt der Schirm sie nicht.
Mitteilungen als Push (20.10.2026, OE-261020-push-alle-arten)
Unter „Benachrichtigungen“ steht das Feld Mitteilungen mit Herkunftsmarke und je Art einem Häkchen: Freundesanfragen, Freigaben an mich, Nachrichten von Freunden. Ein abgehaktes Häkchen schreibt die Art in mitteilungen.pushaus (Vorgabe leer, alles klopft). Eine Freundesanfrage oder Nachricht stößt den Versand sofort an; sonst meldet der Timer denotato-push alle fünf Minuten, was seit der Marke je Art (personal.gesehen, push_<art>) neu ist, höchstens drei je Art. Fristen behalten ihre eigene Erinnerung; Nachrichten des Begleiters kommen dazu, sobald er schreibt (KI-261020-begleiter-schreibt). Ruhezeiten gibt es noch nicht.
Der Schalter eines Raums (30.09.2026, NV05, N432)
Christian: „Wir müssen mehr mit größeren Oberkategorien arbeiten und Plugin-Paketen die User ganzheitlich an und aus-machen können.“ Nach N388 ist das Paket der Raum. Die Kategorie „Bereiche“ zeigt deshalb die Räume, die das Konto hat — dieselbe Auflösung wie Seitenleiste und Übersicht (raeumeAufgeloest), mit der Einstellung raeume des Kontos. Gerechnet wird, als wäre alles Gewährte an: Die Leiste zeigt nur, was an ist; hier steht auch, was aus ist, sonst verschwände ein abgeschalteter Bereich samt dem Schalter, der ihn zurückholt. Bis zu diesem Tag gliederten vier feste Gruppen (BEREICHSGRUPPEN) die Schalter; sie ordnen seitdem nur noch die Kapitel der Tour.
- Aus schaltet jeden Bereich des Raums aus, der in keinem anderen eingeschalteten Raum steht. Eingeschaltet heißt dabei: mit einem Bereich an, der nicht zu diesem Raum gehört. Wer das Studium ausschaltet, während im Alltag die To-Dos laufen, behält den Kalender; hat der Alltag sonst nichts an, geht der Kalender mit.
- An schaltet alle Bereiche des Raums an, die aus sind. Eine frühere Einzelauswahl stellt das nicht her.
- Der Schalter steht an, solange Aus etwas umlegte — oder nichts mehr anzuschalten bleibt. So bewegt er sich bei jedem Druck. Er hat keinen eigenen Wert: Was an ist, sagen weiter die Einzelschalter, die der Server liest; ein Druck legt sie nacheinander um und lädt danach einmal nach. Leiste, Schnellsuche und Kacheln folgen, weil sie dieselben Einzelschalter lesen.
- Ein Raum gewährt nichts (N149). Es kommen nur Bereiche an, die dem Konto gewährt und schaltbar sind.
- Ein Raum mit einem Bereich des Gerüsts trägt keinen Schalter — von Haus aus Konto mit den Einstellungen. Das Gerüst lässt sich nicht abschalten; seine schaltbaren Bereiche (Verwaltung) bleiben einzeln schaltbar. Ein Raum ganz ohne schaltbaren Bereich hat keinen Kopf.
- Ein ganz ausgeschalteter Raum verschwindet aus Umschalter und Leiste. Für den Alltag galt das erst mit NV13 (N439): Bis dahin hing Leben an keinem Merkmal, und der Alltag blieb mit ihm allein stehen. Seither hängt Leben am Schalter „Leben und Kalender“.
Die Rechnung steht in frontend/src/bereiche/raumschalter.ts, ihr Test daneben (unter anderem: für jedes schaltbare Merkmal, das dem Konto fehlt, legt kein Raumschalter es um; der Schalter bewegt sich in jedem der 64 Stände eines Beispiels). Im Blick am 30.09.2026 (Wegwerf-Konto) schaltete „Raum Alltag“ To-Dos, Fortschritt und Personen aus und ließ Leben und Kalender an, weil das Studium an war. Mit Studium und Alltag aus standen im Umschalter nur noch Ablage und Konto (NV13).
Die neue Navigation (07.10.2026, A-261007-erneuerung-phase-3; Schalter entfallen am 09.10.2026)
Seit dem 09.10.2026 gilt die neue Navigation für jedes Konto, ohne Schalter (Entscheidung 2026-10-09-neue-navigation-immer.md): am Rechner die Seitenleiste, zwischen 600 und 900 px die Zeichenleiste, am Telefon die Leiste unten, nach dem Anmelden „Heute“ (00-rahmen.md, „Die neue Navigation gilt immer“). Unter „Bereiche“ steht dafür nichts mehr, und die Suche kennt die Anker navigation und start nicht mehr.
Entfernt ist, was vom 07. bis 09.10.2026 hier stand:
- die Karte „Neue Navigation“ ganz oben unter „Bereiche“ mit dem Schalter
navigation.neu(vorgegeben aus;client/NavigationEinstellung.tsx), - das Fenster „Zur alten Navigation zurück?“ mit der freiwilligen Frage nach dem Grund beim Ausschalten,
- die sieben Aktionen
navigation.anundnavigation.zurueck.<grund>im Nutzungsprotokoll, an denen die Rückkehrrate gemessen werden sollte — sie wird nicht mehr gemessen, - die Wahl der Startseite unter Zeit und Anfang › Wo Denotato aufgeht, die mit dem Schalter ruhte, samt dem Satz darüber.
Gespeicherte Zeilen von navigation.neu und start.seite bleiben in der Datenbank und werden nicht gelesen; der Schlüssel start.seite steht weiter in preferenceKeys.
Konto ist kein Raum zur Wahl (Christian, 08.10.2026, NV-261007-seitenleiste-schliff). Ein Bereich, den die Einstellung raeume nach Konto stellte, steht unter „Bereiche“ unter seinem Ausgangsraum. Gespeichert bleibt die Einstellung, wie sie ist. Konto behält einen eigenen Kopf, nur zur Ordnung und ohne Raumschalter (Christian am selben Tag: „Kopf Konto ohne Raumschalter, nur zur Ordnung.“): Darunter stehen die Bereiche, deren Deklaration nur Konto nennt, heute die Verwaltung, jede mit ihrem eigenen Schalter. Ein Bereich, der daneben einen wählbaren Raum nennt, steht nur dort. Bleibt unter Konto nichts zu schalten, etwa ohne das Recht auf die Verwaltung, fehlt der Kopf. Bis dahin stand die Verwaltung mit dem Schalter unter „Ohne Raum“. Die Rechnung steht in einstellungsraeume (frontend/src/bereiche/raumschalter.ts), der Test daneben. Die Karte eines Bereichs steht in client/Schalterkarte.tsx.
Sprache und Region (10.10.2026, VA-261010-sprache-region)
Die Sprache wählt die Texte, die Region die Schreibweise (Christian, Entscheidung 2026-10-10-verallgemeinerung-endfragen). Unter Darstellung › Sprache steht in der erweiterten Sicht die Gruppe Region (?a=darstellung&g=region, nicht in der Gerätesicht): ein Auswahlfeld mit „Wie die Sprache (Deutschland)“ — in Klammern die Region, der die Sprache gerade folgt — und den sechs Regionen Deutschland, Österreich, Schweiz, Vereinigte Staaten, Vereinigtes Königreich und Frankreich, gespeichert sofort beim Wählen (sprache.region, Vorgabe auto), mit der Herkunftsmarke daneben. Darunter die Probe „So sieht es aus: 10.10.2026 · 1.234,5“ mit dem heutigen Datum und einer Zahl in der gewählten Region. Ohne Wahl sieht alles aus wie vorher: Deutsch schreibt de-DE, Englisch en-US. Mit einer Wahl folgen Datum, Uhrzeit und Zahlen überall der Region, Monats- und Wochentagsnamen bleiben bei der Sprache; spricht die Region dieselbe Sprache (Englisch mit Vereinigtem Königreich, Deutsch mit Österreich), nimmt auch das lange Datum ihre Reihenfolge. CSV-Trenner und Papierformat trägt die Region schon (shared/handlers/translation/region.ts); den CSV-Trenner liest seit dem 10.10.2026 der Datenexport (VA-261010-csv-trenner), das Dezimalzeichen lesen die Noten (VA-261010-notenkomma), das Papierformat das LaTeX-Arbeitsblatt des Tutors (Letter für en-US, sonst A4; VA-261010-arbeitsblatt-letter). Vier jsdom-Tests in client/RegionEinstellungen.test.tsx.
Was man tun kann
Reiter ordnen (OE10, N500): Wer Vorgaben für alle setzen darf, ordnet und blendet die Reiter über „Bearbeiten“ im Kopf; die Folge steht in oberflaeche.reiter unter settings (die Kategoriespalte) (Rahmen §3).
| Element | Was passiert |
|---|---|
| Abschnitt auf/zu | klappt die Gruppe |
| Lösen unter Konto › Anmeldung (13.10.2026) | öffnet das Passwortfeld; bestätigt, entfernt der Server die Verknüpfung, außer es ist der letzte Weg ins Konto |
| Weiter mit Google / Mit Apple fortfahren unter Konto › Anmeldung (13.10.2026) | öffnet das Passwortfeld; bestätigt, geht es zum Anbieter und über /login/extern zurück hierher |
| Suchen (21.09.2026) | tippt man ins Feld ganz oben, klappt eine Liste mit höchstens acht Gruppen auf. Kein Enter nötig, keine Verzögerung; Escape leert |
| Springen (21.09.2026) | Enter oder Klick auf einen Treffer: wechselt die Kategorie, klappt die Gruppe auf, leert das Feld — und hebt die Stufe, wenn die Gruppe unter einer höheren liegt |
| Probieren (Rütteln, 21.09.2026) | schickt einen kurzen Stoß ans Gerät. Nur zu drücken, wenn der Schalter an ist und das Gerät rütteln kann; lehnt das Gerät ab, sagt der Satz darunter es |
| Kurz-Briefing auf diesem Gerät (L02) | fragt beim ersten Mal den Browser um Erlaubnis, meldet das Gerät beim Push-Dienst an und schickt die drei Werte an den Server; abgehakt meldet es ab, auf beiden Seiten |
| Abmelden an einem anderen Gerät (L02) | nach der Frage von Wegtun löscht der Server die Zeile über ihre Kennung |
| Kurz-Briefing jetzt schicken (L02) | stellt sofort an alle Geräte des Kontos zu, unabhängig von der Uhrzeit |
| Pfeile hoch / runter (L02) | tauschen einen Block mit seinem Nachbarn und schreiben briefing.pushzeilen |
| Alles auf / Alles zu | beide Richtungen. Das Wort steht in der Lesetinte (N323) und ist am Telefon wie „Mehr zeigen" unter der Seite so hoch wie die Zielfläche aus dem Theme, 44 px (E19, 27.09.2026; gemessen waren 113 × 32 und 61 × 17 Pixel; seit dem 15.10.2026 die Marke statt 40, E-261013-restfunde-blick) |
| Nach Tageszeit An / Aus (N132) | schaltet theme.folgtTageszeit; nimmt beim Umschalten eine laufende Handwahl zurück — der Knopf, der schon gilt, tut nichts |
| Szene je Abschnitt (N132) | eine Auswahl je Zeile, schreibt theme.szeneMorgen, …Tag, …Abend oder …Nacht — gilt ab dem nächsten Zeichnen, im laufenden Abschnitt sofort |
| Handwahl aufheben (N132, Name seit I07) | löscht die Szene am Gerät; die Tageszeit übernimmt sofort |
| Eigene Szene (E04) | Elternszene, Grundton und Himmelstöne schreiben nach 400 ms Pause theme.eigen, immer alle drei Felder; „Wie die Elternszene" setzt das Feld oder die Tageszeit auf die Elternszene zurück; „Eigene Szene wählen" schreibt theme.szene = "eigen" |
| Abo-Theme-Muster (N132) | schreibt theme.abo — den Namen der Stufe; die eigene Stufe nimmt seit dem 24.09.2026 die eigene Wahl zurück (null) statt auto zu speichern (A03, oben unter „Woher ein Wert kommt"). Beim Impersonieren gesperrt |
| Rang-Abzeichen (E22) | schreibt rang.gezeigt — den Schlüssel der Rolle; der erste Rang nimmt die Wahl zurück (null). Beim Impersonieren gesperrt |
| Roller oder Bahn im Briefing (BE18) | schreibt briefing.rolleran; eingeschaltet schreiben die zwei Auswahlen und die Monatshaken briefing.roller, immer die ganze Regel. Das Briefing von heute wird beim nächsten Abruf neu gerechnet |
| Haken im Tagesbriefing (BE44) | schaltet einen Block an oder ab und schreibt briefing.bloecke — die übrigen Blöcke bleiben, wie sie sind. Gilt ab dem nächsten Abruf; das Briefing von heute wird dabei neu gerechnet, wenn es den Block trägt |
| Wert ändern | speichert sofort |
| Namen ändern | schreibt den Anzeigenamen (einmal die Woche; der erste Wechsel immer) |
| zurücksetzen (A03, N196, ab 24.09.2026) | steht nur hinter „von dir" und nimmt genau diesen einen eigenen Wert zurück (null heißt „zurück auf die Schicht darunter"). Danach gilt, was darunter liegt — die Vorgabe einer Rolle, die für alle oder die eingebaute —, und die Marke sagt es sofort. Der Vorleser hört den Namen der Zeile mit, „Inhaltsbreite zurücksetzen". Die Zeile hieß bis dahin Vorgabe; einen Knopf dieses Namens hat der Schirm nicht |
| Einstellungen zurücksetzen | nimmt alle eigenen Werte auf einmal zurück. Steht unter den Kategorien, weil er alle zugleich betrifft; nennt vorher, wie viele abweichen, und fragt nach (zwei Klicks). Die Vorgabe für alle bleibt unangetastet |
| Als Vorgabe für alle (Entwickler) | setzt die Instanzschicht |
| für alle übernehmen (Verwaltung, „Vorgaben setzen") | legt den eigenen Wert der gewählten Einstellung als Vorgabe für alle ab und leert die Auswahl. Bleibt zu, solange keine Einstellung gewählt ist |
| meinen Wert für diese Rolle (Verwaltung, „Rollen", A29) | legt den eigenen Wert der gewählten Einstellung als Vorgabe dieser Rolle ab (PREFERENCE_ROLE) und liest die Rollen erst danach neu. Jede Rolle hat ihre eigene Auswahl |
| Vorgabe zurücknehmen (Entwickler) | nimmt eine gesetzte Vorgabe wieder weg — in „Was für alle gilt" die Instanzschicht, in „Was für eine Rolle gilt" die der Rolle (bis zum 23.09.2026 „Was für eine Gruppe gilt" und die der Gruppe, A29). Hieß bis zum 21.09.2026 nur „zurücknehmen" und stand damit allein neben einem Schlüsselnamen: Das sagte nicht, was zurückgeht, und las sich auf Englisch wie das Zurücknehmen der Rücknahmeleiste (Undo), das etwas ganz anderes tut |
| Ändern im Kalender (A24, ab 21.09.2026) | der Weg zur Zeile eines Abonnements auf /calendar. Steht statt eines Knopfes: Ein Abo hat hier nichts zu drücken, und ein zweiter Satz Knöpfe wäre ein zweiter Weg |
| Einrichten im Kalender (N205, ab 24.09.2026) | derselbe Weg wie „Ändern im Kalender“, solange dort noch nichts eingerichtet ist — heute nur beim eigenen .ics-Strom ohne Adresse |
| Verbinden | holt die Zustimmungsadresse und schickt den Browser dorthin. Seit dem 11.10.2026 (F-261011-zugaenge-ohne) steht er nur da, wenn die Instanz den Dienst verbinden kann (verbindbar im Stand). Fehlen ihr die Zugangsdaten — bei Google GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REDIRECT_URI oder CREDENTIAL_KEY —, trägt die Kachel statt des Knopfs den Satz „Diese Denotato-Instanz hat für diesen Dienst noch keine Zugangsdaten hinterlegt — das richtet der Betreiber ein, nicht du.“ Vorher kam derselbe Befund erst nach dem Druck als Fehler (501 connection_not_configured); der Server antwortet so weiterhin, falls doch jemand startet |
| Trennen | fragt seit dem 13.10.2026 erst „ja, endgültig“ wie jedes Löschen (N165, KN-261013-anschluss-einheitlich); vorher trennte ein Klick. Löscht das Merkmal hier und zieht die Erlaubnis beim Dienst zurück. Nimmt der Dienst den Widerruf nicht an, ist hier trotzdem getrennt — und der Schirm sagt, dass man drüben nachsehen soll. Seit F58 (23.09.2026) sagt er auch, was drüben stehen bleibt: „Getrennt. 13 Termine von Denotato bleiben in deinem Konto bei Google Kalender stehen: 9 in „GOLD · Geburtstage", 4 in „GOLD · Fällig". Denotato fasst sie nicht mehr an. Verbindest du dasselbe Konto wieder, übernimmt Denotato sie; löschen kannst du sie nur dort." — bei einem einzigen Termin in der Einzahl. Bleibt nichts zurück, steht auch dieser Satz nicht da. Geräumt wird beim Trennen nicht, nur gesagt: Denotato verliert mit dem Trennen den Zugang, könnte also nur vergessen statt löschen, und aus Vergessenem würden beim nächsten Verbinden doppelte Termine (Begründung im Kopf von trenneVerbindung). Bis zum selben Tag stand die Zahl in der Antwort des Servers und auf keinem Schirm — loeseVerbindung ließ das Feld fallen; so sind die dreizehn Termine aus F57 entstanden. Seit dem 24.09.2026 (B17, Durchsicht) trennt er auch, wenn sich das Merkmal nicht entschlüsseln lässt — etwa nach einem Wechsel von CREDENTIAL_KEY. Widerrufen lässt sich dann nichts, die Antwort sagt widerrufen: false, und der Schirm schickt wie beim abgelehnten Widerruf nach drüben. Vorher antwortete der Server 500, und Kontozeile und Merkmal blieben liegen |
| Zugang hinterlegen | speichert ein Merkmal — es geht nie wieder heraus (Grundsatz 18). Eine Adresse, die nicht mit https:// beginnt oder nicht ins öffentliche Netz zeigt, wird nicht gespeichert; der Grund steht über den Kacheln (D28, ab 23.09.2026) |
| Neu eintragen (ab 21.09.2026) | klappt das Formular eines hinterlegten Zugangs auf, mit dem Satz dazu, warum das Feld leer ist. Steht statt offener Passwortfelder: Ein Feld, das bei einem laufenden Zugang offen dasteht, sieht aus, als müsse man etwas eintragen |
| Abbrechen (Zugang) | klappt es wieder zu und leert die Felder — ein abgebrochener Versuch soll nichts im Formularspeicher hinterlassen |
| Ersetzen | schickt das aufgeklappte Formular ab; der alte Wert ist danach weg |
| Prüfen (F07, ab 20.09.2026) | fragt beim Dienst nach, ob das hinterlegte Merkmal noch trägt, und antwortet sofort im Klartext: gilt · abgelehnt — hol dir ein neues · nicht erreichbar, sagt nichts über das Merkmal aus · es liegt keines vor. Ändert beim Dienst nichts und nichts an der Buchführung der täglichen Wache. Seit KN-261013-anschluss-einrichten (14.10.2026) richtet ein tragendes Moodle-Merkmal gleich ein: Denotato holt die Kurse, und unter dem Befund steht der Satz dazu („Denotato hat deine 7 Kurse aus Moodle geholt. Für 4 schlägt es ein Modul vor …“) samt der Kursliste, je Kurs mit dem vorgeschlagenen Modul. Weil „Verbinden“ gleich prüft, steht das ohne weiteren Klick da. Steht nur da, wo es eine Probe gibt — seit F37 (23.09.2026) bei jedem Merkmalsdienst: Moodle, Notion, iCloud-Kalender — und der Bereich eingeschaltet ist; ein Knopf, der immer scheitert, wird nach dem zweiten Mal nicht mehr gelesen. Google steht seit B17 (24.09.2026) nicht mehr in dieser Liste und hat hier deshalb keinen Knopf: Sein Merkmal ist das des Abgleichs, gefragt wird es täglich von der Wache und auf Zuruf über MCP (zugang_pruefen). Bis dahin zeigte die Kachel des Altwegs die alte Ablage, während die Probe das Merkmal des Abgleichs fragte (N170) — ein Knopf dort hätte eine andere Frage beantwortet als die, die die Kachel stellt |
| Trennen (bis 13.10.2026 „Entfernen“) | löscht ein hinterlegtes Merkmal — seit dem 23.09.2026 in zwei Klicks, erst „ja, endgültig" (Q09, N165). Der Tooltip sagt, was bleibt: Beim Dienst gilt der Schlüssel weiter, bis er dort widerrufen wird. Bei iCloud räumt es seit dem 13.10.2026 auch die Kontozeile und schaltet den Abgleich aus, wenn kein Anbieter bleibt (KN-261013-caldav-trennen), und sagt danach wie das Google-Trennen, welche Termine von Denotato bei iCloud stehen bleiben (KN-261013-caldav-entfernen-nennt) |
| Anlegen (Schlüssel) | neuer Zugriffsschlüssel unter dem eingetippten Namen; ohne Namen passiert nichts und der Schirm sagt warum |
| Kopieren | Adresse oder frischer Schlüssel in die Zwischenablage; ohne HTTPS steht der Text daneben und ist auswählbar |
| Habe ihn | blendet den frischen Schlüssel aus — der einzige Weg, ihn loszuwerden |
| Tauschen oder widerrufen | klappt zwei Knöpfe auf, mit einem Satz dazu, was sie unterscheidet |
| Tauschen | neuer Schlüssel unter demselben Namen, alter danach widerrufen — in dieser Reihenfolge, damit dazwischen kein Moment ohne Zugang liegt |
| Widerrufen | zieht ihn ein; was ihn benutzt, steht danach still |
| Alles herunterladen | erzeugt denotato-export-JJJJ-MM-TT.json mit allem Eigenen |
| CSV (Q04, ab 21.09.2026) | holt genau eine Liste und legt sie als denotato-<liste>-JJJJ-MM-TT.csv ab — RFC 4180, CRLF, mit Byte-Order-Mark, getrennt mit dem Zeichen der Region (Semikolon oder Komma). Ein führendes =, +, - oder @ bekommt einen Apostroph davor: Eine Tabellenkalkulation liest =1+1 als Formel, und =HYPERLINK(…) in einer weitergegebenen Datei ist ein Angriff mit eigenem Namen |
| Markdown (Q04) | dieselbe Liste als denotato-<liste>-JJJJ-MM-TT.md — ein Abschnitt je Eintrag, kurze Felder als Stichpunkte, lange als Absätze. Leere Felder stehen gar nicht da statt als leerer Stichpunkt |
| Dateien herunterladen | lädt denotato-dateien-JJJJ-MM-TT.tar.gz mit den Dateien selbst (D10, Art. 20 DSGVO). Ein Verweis und kein Knopf: Der Download gehört dem Browser, nicht der Anwendung — bei hunderten Megabyte baute ein fetch sie erst vollständig im Speicher auf. Der Tag im Namen ist seit dem 24.09.2026 der des Kontos wie bei den anderen Ausfuhren; vorher rechnete der Server ihn in UTC (F93) |
| Datei wählen (BE36, ab 21.09.2026) | liest eine Exportdatei im Browser und sagt, was darin steht: Konto, Datum, Zeilen, Tabellen. Ein <label> und kein Knopf — ein <input type="file"> bringt seine eigene Darstellung mit, die in jedem Browser anders aussieht |
| Haken (BE36) | die Bestätigung, und in ihr stehen die Zahlen aus der Datei. Nicht das Passwort wie beim Löschen: Ein Import trifft ein leeres Konto, er nimmt nichts weg — ein Passwortfeld wäre hier keine Sicherheit, sondern Gewöhnung |
| Zurückspielen (BE36) | spielt den Export ein — nur in ein leeres Konto, in einer Transaktion, ohne die Rechte und — seit KI03 — ohne das Protokoll des Begleiters (personal.model_calls: seine Kosten zählen gegen den Monatsdeckel der ganzen Instanz, Stufe und Modell zeigt später die Verwaltung; eine bearbeitete Datei fälschte beides). Danach steht da, was passiert ist: Zeilen, ausgesetzte Tabellen mit Grund, geleerte Verweise, übersprungene Erstausstattung. Trägt die Datei Kennungen, die hier schon einem anderen Konto gehören, antwortet der Server seit dem 24.09.2026 mit 409 und dem Satz „Das Archiv enthält Kennungen eines anderen Kontos. Eingespielt wurde nichts …“ — ohne Tabelle, Kennung oder Schlüsselnamen (N208, F98). Trägt sie dieselbe Zeile zweimal, ist das ein Befund über die Datei und steht mit Tabelle und Schlüssel als Grund da. Eigene XP auf dem Skill eines anderen Kontos kommen ohne Skill herein und zählen unter den geleerten Verweisen (F99, N278) |
| Neu verbinden (KN-261013-anschluss-export, ab 14.10.2026) | steht nach einem angenommenen Import je Verbindung der Datei da, etwa „Moodle unter moodle.example.org neu verbinden“. Der Export trägt von einer Verbindung nur den Klartext — Dienst, Abschrift der Adresse, Feldnamen, Ablaufdatum (Positivliste nur in exportTabellen.ts, Entscheidung 2026-10-14-export-klartext); eine Verbindung kommt nicht zurück. Der Verweis führt auf /settings?a=zugaenge&dienst=…&adresse=…, und dort steht die Adresse im Adressfeld des Dienstes vor der der Hochschule; das Merkmal trägt man neu ein, die Adresse prüft der Server beim Speichern wie jede getippte. Eine Adresse, die nicht https:// ist, wird nicht vorbelegt (neuVerbinden.ts) |
| Zweiten Faktor einrichten (D07, ab 21.09.2026) | verlangt das Passwort und legt ein Geheimnis an — scharf ist noch nichts |
| Einschalten (D07) | prüft den ersten Code und macht den Riegel scharf; bringt die zehn Wiederherstellungscodes mit, einmal |
| Abgeschrieben (D07) | blendet die zehn Codes aus — der einzige Weg, sie loszuwerden, wie beim frischen Zugriffsschlüssel |
| Abschalten (D07) | verlangt das Passwort und nimmt Geheimnis und Wiederherstellungscodes mit |
| Wechseln (Impersonation) | öffnet ein fremdes Konto, nur lesend. Seit F50 (23.09.2026) nur mit Grund: neben dem Kontofeld steht ein zweites Feld „Grund — steht im Protokoll", und der Knopf bleibt zu, solange eines der beiden leer ist (Leerzeichen zählen als leer); Enter im Grundfeld wechselt ebenso. Ein Vorschlag aus der Liste unter dem Kontofeld wählt nur noch das Konto aus und setzt den Cursor ins Grundfeld — bis dahin wechselte ein Klick darauf sofort, ohne Grund. Der Server weist einen leeren Grund selbst ab (missing_body_field_error), die Karte sagt dann „Ohne Grund kein Wechsel". Die Karte steht seitdem in settings/client/Kontowechsel.tsx, ihr Test daneben. Seit dem 10.10.2026 (ES-261010-restliche-kartenraster) ist sie eine Zeile wie die übrigen Einstellungen, mit Haarlinie oben und unten statt Karton — sie stand als einzige Karte zwischen Zeilen (Guide §15.1). Seit dem 28.09.2026 (E22, N367) trägt jeder Vorschlag das Profilbild des Kontos mit seinem gezeigten Rang; der Server nennt dafür die Kennung jedes Vorschlags (userId), und verify:impersonation prüft, dass sie eine Kontokennung ist |
| Speichern / Lesen / Probe | je Abschnitt |
Fünf Schichten überlagern sich pfadweise: eingebaut · Instanz · Rolle · Nutzer · Gerät. Neben einem Wert steht, woher er kommt — seit dem 24.09.2026 nur, wo er nicht die eingebaute Vorgabe ist (N196, oben unter „Woher ein Wert kommt"). Die Rolle ist seit dem 21.09.2026 dabei (A09). Die Gruppe war bis zum 23.09.2026 eine sechste Schicht; seit A29, Stufe 1 (N155), wird sie weder gelesen noch geschrieben. Was eine Gruppe ihren Mitgliedern vorgibt, steht in der Rolle zur Gruppe, und die Herkunft heißt dann „von Rolle …". Seit Stufe 2 (Migration 325, 15.10.2026) liegt die Tabelle der alten Gruppenvorgaben im Schema archiv, und eine Mitgliedschaft trägt eine Rolle nur noch über ihre eigene Zeile in auth.user_roles.
Scheitert eine dieser Anfragen, bleibt der jeweilige Knopf bedienbar (F28b, 23.09.2026): „Mail noch einmal schicken"/„Adresse eintragen", „Alles herunterladen"/CSV/Markdown/„Zurückspielen", „Auf allen anderen Geräten abmelden", „Konto löschen", „Namen ändern", „Zurückholen"/„Jetzt endgültig löschen" im Papierkorb, das Passwort ändern, „Anlegen"/„Tauschen"/„Widerrufen" bei den Zugriffsschlüsseln, „Zugang hinterlegen"/„Ersetzen"/„Entfernen", „Wechseln"/„Beenden" beim Kontowechsel, „Zweiten Faktor einrichten"/„Einschalten"/„Abschalten" und seit KI01 die Mitgliedschaft unter Admin → Konten setzen ihren Laufmerker über useBusyLock und geben ihn in einem try/finally wieder frei, statt bis zum Neuladen gesperrt zu bleiben.
Der Begleiter als eine Stufe (16.10.2026, OE-261011-einstellungen)
Die Rückmeldung vom 08.10.2026: „VIEEEEEEL zu viele einstellungen … Machs wie apple … die haben so einstellungen die mehrere einstellungen zusammenfassen.“ Unter „Lernen“ standen bis dahin drei Gruppen des Begleiters mit gut einem Dutzend Haken. Jetzt steht dort eine Gruppe „Begleiter“ mit einer Segmentwahl aus drei Stufen und einem Satz, was die gewählte tut:
| Stufe | Von selbst melden | Karten vorschlagen | Karten selbst anlegen |
|---|---|---|---|
| Ruhig | aus | aus | aus |
| Ausgewogen (Werkstand) | an | an | aus |
| Eigenständig | an | an | an (nur Arten, die sich ganz zurücknehmen lassen) |
Eine Stufe setzt nur die Haken, die abweichen. Passt der Stand auf keine Stufe, ist kein Segment gewählt, und der Satz lautet „Eigene Auswahl. Eine Stufe setzt alle Haken darunter neu.“ Die Haken selbst stehen darunter hinter „Einzeln einstellen“ (<details>, ab Werk zu), mit den Unterüberschriften der drei früheren Gruppen.
Der Auto-Modus gehört zu keiner Stufe. Er führt auch Löschen ohne Nachfrage aus, und manches davon lässt sich nicht zurücknehmen; er bleibt eine eigene Wahl unter „Einzeln einstellen“.
Die Sucheinträge „Schreiben ohne Nachfrage“, „Von selbst melden“ und „Karten vom Begleiter“ bleiben, springen aber zur Gruppe begleiter. Bauteil: begleiter/client/Begleitereinstellung.tsx (Anschluss Begleitereinstellung), jsdom-Test daneben.
Woher die Daten kommen
/api/account/preferences/* (samt PREFERENCE_RESET seit dem 20.09.2026; seit N132 auch theme.folgtTageszeit, die vier Abschnittsszenen und theme.abo; seit BE44 briefing.bloecke, seit BE18 briefing.rolleran und briefing.roller, seit L02 briefing.pushuhrzeit und briefing.pushzeilen — kein neuer Endpunkt für den Schirm, die zwei unter /api/briefing/bloecke sind für den Connector) · /api/access/* · /api/zugaenge/* · /api/auth/passwort-aendern · /api/auth/name-aendern · /api/auth/mail-stand · /api/auth/mail-erneut · /api/auth/mail-aendern · /api/auth/loeschung · /api/auth/loeschung/anfordern · /api/auth/loeschung/widerrufen · /api/schluessel/* · /api/dev/impersonate · /api/rechte/konten · /api/rechte/konto-stufe (seit KI01, Admin → Konten) · /api/papierkorb mit /wegtun, /zurueckholen, /endgueltig und /leeren (B07 — ein Weg für alle Arten, nicht einer je Bereich; /leeren seit dem 21.09.2026, B20) · /api/account/export und /api/account/import (BE36 — dieselbe Datei, zwei Richtungen; der Import nimmt genau das JSON, das der Export ausgibt). Derselbe Export-Endpunkt trägt seit dem 21.09.2026 ein zusätzliches, freiwilliges Feld liste (Q04): ohne das Feld kommt alles, mit dem Feld genau eine der sieben Listen aus @shared/config/teilexport. Kein zweiter Pfad, weil es kein zweiter Vorgang ist — es ist derselbe Export, nur enger gefasst, mit derselben Rechteprüfung, derselben Sitzung und derselben Antwortform; ein zweiter Endpunkt hätte all das ein zweites Mal beschrieben, und die zweite Beschreibung ist die, die irgendwann von der ersten abweicht · /api/files/usage (D13, seit dem 21.09.2026 — belegter und erlaubter Speicher des eigenen Kontos, verschlüsselt wie FILES_LIST) · /api/account/preferences/* trägt seit dem 21.09.2026 (A04) Skill- und Gebietsfarben unter darstellung statt unter skill.colors, skill.icons, interest.colors, interest.icons — dieselben Endpunkte, ein Schlüssel statt vier · /api/briefing/push (Stand samt öffentlichem Schlüssel), /abonnieren, /abbestellen und /probe (L02, seit dem 03.10.2026; alle als POST, weil schon der Stand die eigene Adresse mitschickt, damit der Server die Zeile dieses Geräts erkennt) · /api/zweiter-faktor (der Stand) mit /beginnen, /bestaetigen und /abschalten (D07, seit dem 21.09.2026). Den fünften Endpunkt dieser Familie ruft dieser Schirm nicht: /api/auth/zweiter-faktor nimmt den Code bei der Anmeldung entgegen und gehört deshalb unter auth, nicht hierher. · /api/auth/identities und /api/auth/identities/remove, /api/auth/oidc/providers und /api/auth/oidc/start mit dem Zweck link (D-261008-google-apple, seit dem 13.10.2026; das Ende des Ablaufs ruft /login/extern, nicht dieser Schirm).
Hinweis: Hier stand zweimal
/api/preferences/*— diesen Weg gibt es nicht (korrigiert am 21.09.2026). Die Vorgaben liegen unter dem Konto:/api/account/preferencesund darunterset,reset,global,roles,role(PREFERENCES,PREFERENCE_SET,PREFERENCE_RESET,PREFERENCE_GLOBAL,PREFERENCE_ROLES,PREFERENCE_ROLE). Bis zum 23.09.2026 standen hiergroupundgroups; sie sind mit A29, Stufe 1, fort (N175), und die Verwaltung liest und schreibt seitdem über die beiden Rollenwege, die es seit A09 gab. Aufgefallen, alsverify:seitenanfing, auch hingeschriebene Pfade gegenAPIPathszu prüfen (F20).
Der Hinweis einer Gruppe steht erst aufgeklappt (27.09.2026, RL03, N373)
Eine Faltgruppe zeigt zugeklappt nur ihren Titel. Der erklärende Satz, der bis dahin unter jedem Titel stand, auch unter zugeklappten, steht jetzt als erste Zeile im aufgeklappten Inhalt, in neutral.lese. Nach Guide §15 erklärt eine Unterzeile nur, was die Überschrift nicht schon sagt, und das braucht erst, wer die Gruppe öffnet. Der Knopf heißt weiter nur wie sein Titel; der Hinweis gehört nicht in seinen Namen (Einstellungsgruppe.tsx, Nachweis Einstellungsgruppe.test.tsx).
Gruppen und Schalter stehen als Zeilen (10.10.2026, ES-261009-listen-flaechen-statt)
Eine Faltgruppe ist kein Kasten mehr, sondern ein Abschnitt: Über ihr steht eine Haarlinie in neutral.rand, unter der letzten einer Folge ebenfalls. Der aufgeklappte Inhalt rückt unter den Titel ein und trägt keine eigene Linie. Ein einzelner Schalter (Schalterkarte.tsx) ist eine Zeile mit Haarlinie darunter, kein Karton. Raumkopf und Gruppentitel im Abschnitt „Bereiche“ setzen sich mit einer Haarlinie ab. Vorher steckte im Bereich „Bereiche“ Karte in Karte: die Raumkarte in der Gruppe, der Schalter in der Raumkarte.
Unterzeilen nur mit Folge (28.09.2026, RL03, N373)
Rechtebaum, Schlüssel, Roller und Lernzeit tragen keine Sätze mehr, die beschreiben, was die Felder darunter einstellen. Die Datenschutz-Zusage bei den Zugängen und der Rollenhinweis in der Verwaltung bleiben.
Kein Leerlaufsatz (30.09.2026, RL20, N433)
Vierzehn Einstellungsgruppen und sechs Verwaltungsabschnitte haben ihren Hinweis verloren, weil er nur die Überschrift wiederholte („Welcher Schirm nach dem Anmelden dasteht.“). Der hinweis ist in der Einstellungssuche und in Verwaltungsabschnitte.tsx jetzt freiwillig; die Suche zeigt „ · Hinweis“ nur, wo einer steht. Hinweise mit Folge, Frist oder Datenschutz-Zusage bleiben — „Endgültig, nach dreißig Tagen Bedenkzeit.“, „Nur in ein leeres Konto, und ganz oder gar nicht.“ In den Erklärzeilen sind die Sätze entfallen, die dem Entwickler erklärten, warum es eine Einstellung gibt („Bis zum 16.09.2026 stand ‚Europe/Berlin‘ fest im Quelltext.“).
Zeichen bei Zustand und Meldung (23.09.2026, N134)
Christian: „Das mit den Icons funktioniert übrigens super und ich will, dass das überall in Denotato so umgesetzt wird." Wo bis dahin allein Farbe sagte, ob etwas gut, offen oder schlecht steht, steht jetzt zusätzlich ein stilles Zeichen (aria-hidden) links vom Wort, und die Farbe sitzt am Zeichen, nicht mehr am Satz.
Die Menüleiste. „Konto" und „Zugangsdaten" trugen beide gesperrt — dieselbe Silhouette für zwei verschiedene Dinge. „Konto" trägt jetzt tuer (der Weg hinein: Anzeigename, Adresse, Passwort, zweiter Faktor), „Zugangsdaten" trägt schluessel (die Wege nach draußen und für Programme — trifft sich mit „Zugriffsschlüssel" im Abschnitt selbst). Die Zuordnung steht als KATEGORIEZEICHEN in SettingsMenu.tsx, mit Test. „Rechte" kam am 25.09.2026 dazu, ebenfalls mit schluessel, und der Test war seitdem rot; seit dem 27.09.2026 trägt die Kategorie schild, das Zeichen des Gerüststücks rights, dessen Rechtebaum sie zeigt.
Die Kachel. In der Zustandszeile unter dem Namen steht jetzt, zwischen Punkt und Satz, ein kleines Zeichen für den Ton: verbunden → haken, warnung → warnung, schlecht → blockiert. offen bekommt bewusst keines — nichts Eingerichtetes ist kein Fehler, den ein Zeichen anzeigen müsste. Die Farbe sitzt am Zeichen, der Satz selbst ist neutral (vorher trug er die Tonfarbe). Der Kopf trägt nur noch das Dienstzeichen und den Namen — ein erster Entwurf hatte das Tonzeichen dort, der Prüfer hat es an den Satz verlegt, zu dem es gehört. Die Zuordnung steht als TONZEICHEN in Zugangskacheln.tsx, mit Test. Streifen und Punkt bleiben, wie sie waren.
Zugriffsschlüssel. Der Kontoname, „eben angelegt" und „N von M offen" (nur wenn noch Platz ist) tragen jetzt ein haken in Erfolgsfarbe; das Wort selbst ist neutral (vorher trug es die Farbe über $gueltig).
Adresse. „bestätigt"/„noch nicht bestätigt" tragen haken/warnung; dieselben Zeichen vor den Hinweis- und Fehlersätzen darunter.
Speicher. Die Warnzeile ab 80 % trägt ein warnung davor; der Balken selbst bleibt ohne Zeichen — eine Füllfläche kann keines tragen, und Zahl und Satz daneben sagen ohnehin, wie voll es ist.
Name, Passwort, zweiter Faktor. Jede Erfolgs- und Fehlerzeile (Name geändert, Eingaben ungleich, Passwort geändert, zweiter Faktor eingeschaltet, Hinweis- und Fehlersätze) trägt jetzt haken bzw. warnung; die Sätze selbst sind neutral statt grün oder rot.
Unverändert: die grüne Kante bei „dieses Gerät" in der Geräteliste — daneben steht seit je das Wort „— dieses", die Regel (Wort oder Zeichen neben Farbe) war dort schon erfüllt.
Für keines der Zeichen musste die Registry ergänzt werden — haken, warnung, blockiert, tuer und schluessel gab es bereits.
Laden und laufende Handlungen (28.09.2026, RL04, N373)
Solange eine Gruppe ihre Daten holt — Papierkorb, Post, Rechtebaum, Speichernutzung, die Liste der Gruppen —, steht die Form ihres Inhalts da: Zeilen, Kacheln oder Textzeilen aus Skeleton.tsx in einer LoadingRegion. Den Satz, was lädt, hört nur der Vorleser; sichtbar steht kein „Lädt…“ mehr (Style-Guide §11.5).
Drückt man „Namen ändern“, „Passwort ändern“, „Einschalten“, „Abschalten“, „Zweiten Faktor einrichten“, „Adresse eintragen“, „Mail noch einmal schicken“, „Konto löschen“ oder „Doch nicht löschen“, bleibt die Beschriftung stehen; davor dreht ein Spinner, und der Knopf trägt aria-busy, bis die Antwort da ist. Bis zum 28.09.2026 tauschte er seine Beschriftung gegen „einen Moment…“.
Die Eule: „Eine Einstellung erklären“ (KI21, N372)
Die offene Kategorie (/settings?a=<kategorie>) ist der Gegenstand der Eule (client/gegenstand.ts). Gelesen werden nur die Texte der Kategorie — Titel und erklärender Satz ihrer Gruppen —, nie ein Wert, den jemand eingestellt hat. Eine Kategorie, die es nicht gibt, wird abgewiesen wie ein unbekanntes Angebot.
Was fehlt
Kein Passwort ändern— gebaut am 18.09.2026 (D05). Eine eigene Kategorie „Passwort", vor „Zugangsdaten": jetziges Passwort, neues, Wiederholung. Das alte wird verlangt, obwohl man angemeldet ist — nicht gegen den Angemeldeten, sondern gegen die Anmeldung. Danach geht eine Mail hinaus, die nicht bestätigt, sondern alarmiert: Wer sie bekommt, ohne das Passwort geändert zu haben, weiß, dass jemand da war. Seit dem 21.09.2026 enden die anderen Anmeldungen (B01, B26): Wer das alte Passwort kannte, ist sofort draußen, dieses Gerät bleibt. Darunter steht „Deine Geräte" — je Zeile „Firefox auf Linux" und „zuletzt vor 3 Std.", die eigene Zeile markiert, dazu ein Knopf „Auf allen anderen Geräten abmelden". Keine Fassungsnummer, keine IP-Adresse, und kein Knopf je Zeile: Eine einzelne Sitzung gezielt zu beenden hieße, sie erkennen zu können, und das kann man mit „Firefox auf Linux" nicht, wenn zwei davon dastehen.Kein Konto löschen— gebaut am 18.09.2026 (D04). Unter „Deine Daten" steht jetzt „Konto löschen": das Passwort als Bestätigung, danach dreißig Tage Frist, in denen alles weiterläuft und ein Klick die Löschung zurücknimmt. Danach ein Zeitgeber (denotato-kontoloeschung.timer, 03:30), der wirklich löscht — 64 Tabellen über die Kaskade, die Dateien von der Platte, die Protokollzeilen über diesen Menschen.verify:loeschung(20 Prüfungen) hält beides fest: dass nichts übrigbleibt, und dass das Konto, das der Gelöschte einmal angelegt hat, stehen bleibt. Was fehlt: eine Erinnerung vor Ablauf der dreißig Tage — wer sie vergisst, wird nicht noch einmal gefragt.Kein Export— gebaut am 17.09.2026,und er ging nicht zurück— seit dem 21.09.2026 (BE36) tut er das. „Deine Daten" → „Alles herunterladen": 75 Tabellen als eine JSON-Datei; darunter „Einen Export zurückspielen", der dieselbe Datei wieder hineinnimmt. Ein Nachweis (verify:export) hält fest, dass über jede Tabelle mit einem Besitzer entschieden ist — im Export oder mit Grund daneben —, dass kein Geheimnis mitgeht, und seit BE36 den Rundlauf: exportieren, leeren, einspielen, wieder exportieren, vergleichen, in einer Transaktion gegen die laufende Datenbank, die am Ende zurückgedreht wird. 433 Zeilen kommen Byte für Byte gleich zurück.Und es gab nur den großen Weg— seit dem 21.09.2026 (Q04) auch den kleinen. „Einzeln mitnehmen": sieben Listen aus fünf Bereichen, je zwei Knöpfe, CSV oder Markdown.verify:teilexport(35 Prüfungen) hält drei Dinge fest — dass die Listen mit der Datenbank übereinstimmen, dass die Dateien das sind, was draufsteht, und dass ein fremdes Konto durch diesen Weg nichts sieht. Was fehlt: die Dateien selbst (sie stehen mit Namen und Größe darin, nicht mit Inhalt — D10), und damit auch ihre Zeilen beim Zurückspielen.- Der Kontoname ist nicht änderbar. Der Anzeigename ist es seit dem 18.09.2026 (BE34); die Kennung, mit der man sich anmeldet, bleibt. Die Prüfreihenfolge dafür liegt fertig in
archiv/2026-09-18-passworthash-von-aussen/— ihre alte Fassung verglich einen von außen gelieferten Passworthash und wurde deshalb abgelegt statt benutzt. Wer sie übernimmt, ändert zwei Dinge: das Passwort im Klartext prüfen und die Kollisionsprüfung nicht in ein Rennen laufen lassen. - Die E-Mail-Adresse ist nicht änderbar und nicht zu sehen. (
„Es gibt kein Feld dafür"war falsch: die Registrierung verlangt sie als Pflichtfeld, und sie steht inauth.users.email_address. Was fehlt, ist der Weg in/settings.) Seit dem 18.09.2026 wiegt das schwerer: an diese Adresse gehen die Rücksetzmail (D01) und die Ablaufwarnungen der Zugänge (BE23). Wer sich bei der Anmeldung vertippt hat, kann es nirgends richtigstellen und merkt es erst, wenn beides nicht ankommt. Kein Abmelden auf anderen Geräten.— gebaut am 21.09.2026 (B26), nachgezogen am 23.09.2026 (D29). „Auf allen anderen Geräten abmelden“ beendet die anderen Sitzungen auf dem Server, auch während einer nur lesenden Impersonation. Ist das Konto inzwischen gesperrt, kommt statt der Liste die Sperre mit ihrem Grund; dasselbe gilt für die Zugriffsschlüssel. Seit D29 (N137, N156) widerruft es auch die „Angemeldet bleiben“-Schlüssel der anderen Geräte, schlafende eingeschlossen — kein Gerät meldet sich danach von selbst wieder an. Der eigene Schlüssel, MCP- und Werkzeugschlüssel bleiben. Dasselbe geschieht beim Passwortwechsel.- Kein eigenes Theme. N33: „eigenes Theme in erweiterten Optionen".
Keine Benachrichtigungen.— gebaut am 03.10.2026 (L02): die Gruppe „Benachrichtigungen" unter Zeit und Anfang. Zugestellt wird erst, wenn das VAPID-Paar auf dem Server liegt.Kein Suchfeld.— gebaut am 21.09.2026. Ganz oben, über der Stufenwahl, ein Feld mit Lupe; ab dem ersten Zeichen höchstens acht Treffer, Pfeiltasten und Enter, Escape leert. Ein Treffer wechselt die Kategorie, klappt die Gruppe auf und hebt die Stufe mit, wenn sie darüber liegt. Das Verzeichnis dazu steht insettings/shared/einstellungssuche.ts, gegengehalten inverify:schalter, Teil 8. Was es nicht findet, steht als Punkt 61 und 62 unten.Der Schalter für die Vibration zieht nirgends.— halb gebaut am 21.09.2026. („Keine Vibration"war schon vorher falsch: „Kurzes Rütteln bei Rückmeldungen" steht in den Gestaltungseinstellungen, hat einen Schlüssel und geht bis ins Theme.) Es gibt jetzthaptik.ts(heute im Gerüst) mit den zwei Mustern aus Guide §11.6, das Umlegen auf „An" rüttelt selbst, daneben steht ein Knopf „Probieren", und darunter ein Satz, der sagt, ob dieses Gerät überhaupt kann. Im Rest der Anwendung rüttelt seit dem 07.10.2026 das Erledigen per Wischen; der Rest steht in Punkt 60.Kein Rechtebaum.— gebaut am 26.09.2026. Die Kategorie „Rechte“ zeigt jeden Knoten mit Pfad, Entscheidung und Herkunft. Eine unmittelbare Vergabe, eine Gruppe und ein geerbter Oberknoten werden ausdrücklich benannt; fehlt eine Vergabe, steht auch das dort. Der Schirm ist reine Auskunft — geändert werden Pakete und Pfade weiterhin in der Verwaltung.- Kein Protokoll. Wer wann was umgestellt hat, steht nirgends.
Kein Zurücksetzen im Ganzen.— gebaut am 20.09.2026, und dieser Punkt stand seither zu Unrecht hier: „Einstellungen zurücksetzen" liegt unter den Kategorien, nennt vorher die Zahl der abweichenden Werte und fragt nach (zwei Klicks); der Endpunkt istPREFERENCE_RESET, der Schirmclient/Zuruecksetzen.tsx, die Probe Teil 5 vonverify:schalter. Dieselbe Datei beschrieb ihn weiter oben unter „Was man tun kann" bereits als vorhanden — eine Seitendatei, die sich selbst widerspricht, ist schlimmer als eine, die schweigt.Ein Schlüssel bekommt keine Frist.— gebaut am 22.09.2026. Neben dem Namensfeld steht „Gültig" mit sechs Möglichkeiten: ohne Ende (Vorgabe), 30 Tage, 90 Tage, 180 Tage, ein Jahr, zwei Jahre. Die Route nahmgueltigTage(1 bis 730) von Anfang an entgegen; es fehlte nur das Feld. Was fehlt: Tauschen übernimmt die Frist nicht (Punkt 70), und eine Vorwarnung vor dem Ablauf gibt es nicht (Punkt 71).- Kein Schlüssel ist einem Weg zugeordnet. Man sieht nicht, ob ein Schlüssel über
/mcpoder/mcp/<name>benutzt wurde, und auch nicht, von welcher Adresse. „Zuletzt benutzt" ist ein Datum und sonst nichts. Die Höchstzahl steht nur im Text.— gebaut am 22.09.2026. Bei 25 von 25 ist „Anlegen" gesperrt, und darunter steht, warum und was zu tun ist: widerrufen, was nicht mehr gebraucht wird. Gezählt werden nur die gültigen; widerrufene und abgelaufene zählen nicht mit, genau wie beim Server. Die Zahl kommt aushoechstzahlder Antwort, nicht aus dem Schirm.- Der Schlüsselname ist nicht änderbar. Tauschen übernimmt ihn, umbenennen geht nicht; wer sich vertippt hat, legt neu an.
- Die Gegenprobe der Wache gibt es für Moodle und Google, nicht für Notion und iCloud. Google kam am 24.09.2026 dazu (B17): Sein Merkmal liegt seitdem bei den Zugängen, die Wache sieht es und fragt Google, ob es noch trägt; eine Ablehnung erreicht den Besitzer einmal je Störung, mit dem Weg „erst Trennen, dann Verbinden". Notion und iCloud haben seit F37 eine Probe für den Knopf, bekommen von der Wache aber nur die Vorwarnung über das eingetragene Datum.
- Ein Konto ohne Mailadresse erfährt nichts, und der Schirm sagt es nicht. Die Wache vermerkt „kein Postfach hinterlegt" in ihrem Protokoll; auf dem Schirm steht weiter „Gilt bis …", als käme die Warnung. Das ist die stillste Art, eine Warnung zu verlieren.
- Eine angemeldete Löschung sieht man nur hier. Wer sie vergisst, arbeitet dreißig Tage weiter, ohne dass irgendein Schirm daran erinnert — und findet am einunddreißigsten Tag kein Konto mehr vor. Ein Band über der Seite oder eine Mail eine Woche vorher wäre das Naheliegende; beides gibt es nicht.
- Vier Stellen warten inzwischen auf dieselbe Entscheidung. „Alle Sitzungen beenden" fehlt beim Passwort-Zurücksetzen (D01), beim Passwort ändern (D05), bei der Kontolöschung (D04) und bei Bens Fehlerbild (BE01). Alle vier hängen an B01, und B01 hängt an C02 — der Frage, was von einer Sitzung in der Datenbank steht.
- Ein Adresswechsel meldet sich nicht an der alten Adresse. Wer eine fremde Sitzung hat und das Passwort kennt, kann die Adresse tauschen, ohne dass der Besitzer es erfährt — die Bestätigungsmail geht nur an die neue. Eine zweite Nachricht an die alte („deine Adresse soll gewechselt werden") wäre das Naheliegende und fehlt.
- Die laufende Anmeldung überlebt die Löschung. Sitzungen liegen im Arbeitsspeicher der API (B01); wer sein Konto löschen lässt und den Reiter offen hat, bekommt danach „Konto nicht gefunden" statt einer Abmeldung. Ungefährlich, aber es sieht aus wie ein Fehler.
- Der Papierkorb hat erst einen Eingang. Wegtun geht bis jetzt nur bei Personen (Q01); Ereignisse, Tagebuch, Gedächtnis, Aufgaben und Quellen haben die Spalte, aber keinen Knopf — und ihre Leseabfragen filtern noch nicht (22 Stellen,
verify:papierkorbnennt die Zahl). Der Papierkorb lässt sich nicht als Ganzes leeren.— behoben am 21.09.2026 (B20). Unter der Liste steht „Alle 14 endgültig löschen", mit der Zahl darin und einer Rückfrage; gelöscht wird nur, was schon im Papierkorb liegt. Was bleibt: Heikles, das dieser Zugang nicht sehen darf, bleibt liegen — richtig so, aber die gemeldete Zahl sagt nicht, dass etwas übrig ist. Dasselbe gilt seit dem 24.09.2026 für eine Kalenderkategorie, an der noch etwas hängt (F87).- Ein Abonnement lässt sich hier nicht anlegen. Die Liste nennt jedes
.ics-Abo mit demselben Zustandssatz (A24) und schickt zum Kalender — eintragen, jetzt lesen und kündigen gibt es nur dort. Das ist die Entscheidung („zusammengeführt wird die Auskunft, nicht die Bedienung") und zugleich die Grenze: Wer hier steht, muss für den einen Handgriff die Seite wechseln. - Der Zustandssatz kommt fertig vom Server und ist damit unübersetzbar.
verbindungszustand()bildet ihn auf Deutsch (shared/handlers/verbindungen/zustand.ts); der Schirm gibt ihn unverändert aus, ohnet(). Solange Denotato zweisprachig werden soll (N34), ist das eine Zeile, die die Sprache nicht wechselt — richtig wäre,lage,seitundbiszu schicken und den Satz erst im Browser zu bilden. Die Ausnahmegooglesteht weiter in den Zugangsdaten.— behoben am 24.09.2026 (B17, erste Stufe). Google steht nur noch unter „Nach draußen", als Kachel mit „Verbinden" oder „Trennen". Das Merkmal legt der Rückruf der Zustimmung verschlüsselt bei den Zugängen ab (auth.service_credentials, FeldrefreshToken); Kennung und Geheimnis der Anwendung kommen aus der Umgebung der Instanz und lassen sich von keinem Konto mehr überschreiben. Die Liste unter „Nach innen" zeigt nur noch Dienste der Artmerkmal, und der Server weist Hinterlegen, Entfernen und ein Ablaufdatum füroauth2ab — mit einem Satz, der „Verbinden" oder „Trennen" nennt. Was bleibt: Eine Zeile aus dem Altweg (clientId,clientSecret,refreshToken, von Hand eingetragen) gilt weiter als Verbindung, damit sie sich trennen lässt; ob sie in der zweiten Stufe umgeschrieben oder verworfen wird, steht in B17.- Ein Abonnement, das nichts mehr holt, fällt hier nicht auf. Der Zustandssatz sagt „verbunden seit …" — auch dann, wenn der letzte erfolgreiche Abruf Wochen her ist. Der Fehlertext steht daneben, aber nur, wenn der letzte Versuch scheiterte; ein Kalender, der seit einem Monat dieselbe leere Antwort gibt, sieht aus wie einer, der trägt.
personal.documentsbleibt außen vor.— behoben am 21.09.2026 (B20). Die Seiten sind die siebte Art im gemeinsamen Papierkorb; eine weggetane Seite steht unter „Deine Daten" und sagt in derselben Zeile, wieviele Unterseiten mitgingen. Was bleibt: Die ältere Ansicht unter/documents?a=papierkorbsteht weiter da — sie zeigt jetzt dieselben Zeilen, ist also eine zweite Ansicht und kein zweiter Papierkorb, aber zwei Orte sind zwei Orte (D15).- Unter „Nach draußen" stehen zwei Wände, nicht eine. Der eine Baustein kennt
/api/verbindungen, der andere/api/zugaenge; beide zeichnen ihre eigene Kachelwand mit derselben Spaltenrechnung. Wo die erste ungerade endet, bricht die zweite neu um, und dann steht eine Lücke in der Reihe. Zusammenzuziehen hieße einen dritten Baustein zu bauen, der beide Endpunkte kennt — oder einen Endpunkt, der beides liefert; das ist die eigentliche Antwort und ist nicht gebaut. - Die Kachelwand lässt sich nicht durchsuchen oder filtern. Bei sechs Diensten geht das; bei fünfundzwanzig Schlüsseln fängt „zeig mir nur die gültigen" an zu fehlen. Es gibt keinen Reiter, kein Feld und keine Sortierung — die Reihenfolge ist die des Servers.
Der Ton der Kachel hat keine Legende.— gebaut am 22.09.2026. Unter jeder der beiden Überschriften läuft eine Legende: Punkt plus Wort, je Wand mit ihren eigenen Wörtern — nach draußen verbunden · nicht eingerichtet · läuft bald ab oder klemmt · abgelehnt oder abgelaufen; nach innen gültig · abgelaufen · widerrufen. Alsulmitaria-label, damit auch etwas dasteht, wo keine Farbe ankommt. Was fehlt: Die Wörter der Legende und der Zustandssatz auf der Kachel sind zwei Quellen (Punkt 72).- Die Kacheln tragen keine Bereichsfarbe. Der Guide sagt „Farbe sagt, wozu etwas gehört" (§1.4) — hier sagt sie, wie es steht. Das ist eine bewusste Wahl (der Zustand ist die Frage, wegen der jemand herkommt), aber sie kostet: Man sieht einer Kachel nicht an, dass Moodle zum Studium und ein Abo zum Kalender gehört. Zwei Kanäle auf einer Fläche wären drei zu viel; ein Zeichen in Bereichsfarbe wäre der Ausweg und ist nicht gebaut.
- Der Altweg
googleerbt das Kalenderzeichen.registereintrag()übersetzt ihn aufgoogle-kalender, und damit steht er mit demselben Zeichen da wie die echte Kalenderverbindung — zwei Kacheln, die gleich aussehen und Verschiedenes sind. Richtig wäre ein eigenes Zeichen für „alter Weg"; solange B17 offen ist, wäre das ein Zeichen für etwas, das verschwinden soll. folgeundhinweissind unübersetzbar. Dieselbe Lücke wie bei Punkt 27: Beide stehen auf Deutsch im Register und gehen ohnet()durch den Schirm. Es sind jetzt elf Sätze statt einem — der Umbau hat das Problem nicht geschaffen, aber vergrößert.- „Neu eintragen" ist ein Klick mehr als vorher. Wer ein Merkmal tauschen will, drückt jetzt zweimal statt einmal. Das ist der Preis dafür, dass ein laufender Zugang keine offenen Passwortfelder zeigt, und er ist bewusst bezahlt — aber es ist ein Preis, und wer täglich tauscht (niemand tut das), merkte es.
- Der Schirm ist nie im Browser gesehen worden. Die Einstellungen liegen hinter der Anmeldung, und jsdom rechnet kein Layout: ob die Wand wirklich zwei Spalten hat, ob ein Feld in einer Spalte die richtige Höhe bekommt, ob der Streifen links sichtbar ist — nichts davon steht in einem Nachweis. Genau daran ist am 18.09.2026 der Rücksetzschirm gescheitert, bei grünen Typen und grünem Lint.
- Der Import ist nie gelaufen, außer im Nachweis. Gebaut, gemessen, nicht ausgelöst: Eine Übertragung, die eine Bestätigung im Moment des Tuns verlangt (Grundsatz 27), bestätigt man nicht selbst. Der Rundlauf in
verify:exportfährt den ganzen Weg — aber er geht durchspieleEin, nicht durch den Endpunkt, nicht durch die Verschlüsselung und nicht durch den Schirm. Der erste echte Klick ist noch offen. - Die Dateien kommen nicht zurück (D10).
study.filesbleibt beim Import aus, weilstorage_patheine Pflichtangabe ist, die nie hinausgeht — eine Zeile ohne Inhalt auf der Platte wäre eine Datei, die es laut Verzeichnis gibt und nicht gibt. Dasselbe trifftlife.calendar_exports(secret). Der Abschnitt sagt das hinterher; sagen müsste er es vorher, an der Datei, die man gerade gewählt hat. - Die Erstausstattung gewinnt gegen die Datei.
personal.settings(die Szene),personal.customizationsundauth.user_feature_settingsschreibt schon das Anlegen des Kontos; der Import schreibt sie mitON CONFLICT DO NOTHINGund lässt sie deshalb stehen. Wer umzieht, bekommt seine Szene nicht zurück und muss sie neu wählen. Die Antwort sagt, wie viele Zeilen es betraf; besser wäre, sie beim Namen zu nennen. - Ein zweites Konto in derselben Instanz geht nicht. Die Kennungen gehen mit — das ist der Grund, warum ein notierter Verweis nach dem Zurückspielen weiter stimmt —, und deshalb weist der Import ab, wenn eine davon schon einem anderen Konto gehört: mit 409 und ohne zu sagen, wo (N208; bis zum 24.09.2026 nannte die Abweisung Tabelle und Kennung, F98). Für „mach mir eine Kopie" bräuchte es eine Umnummerierung über alle 72 Tabellen, und dann wäre es keine Wiederherstellung mehr, sondern L07.
- Es gibt keine Vorschau. Der Haken nennt Zeilen, Tabellen, Datum und Konto; was er nicht zeigt, ist, was kommt — sieben Dokumente, vierzig Karten, drei Module. Die Zahl 433 ist wahr und sagt einem Menschen wenig.
- Es gibt keinen Weg zurück. Ein Import lässt sich nicht rückgängig machen; wer die falsche Datei erwischt, hat ein volles Konto, in das nichts mehr hineingeht. Solange das Konto vorher leer war, ist der Schaden klein — aber „leer" heißt nicht „egal".
- Zeiten ohne Zone wandern mit dem Rechner. Der Import schreibt
timestamp without time zonein der Ortszeit zurück, in der der Export gelesen wurde. In derselben Instanz stimmt das auf die Millisekunde; geht eine Datei nach Amerika, verschieben sich diese Angaben um den Zonenunterschied. Das liegt an der Spaltenart — eine Zeit ohne Zone sagt nicht, welche gemeint war —, und der richtige Schritt wäre, sie loszuwerden. - Der Import hat kein MCP-Werkzeug, anders als fast alles andere. Absicht: Ein Werkzeug dafür wäre ein Modell, das eine Übertragung auslöst, die eine menschliche Bestätigung verlangt — und eine Bestätigung, die sich ein Modell selbst gibt, ist keine. Der Export hat aus demselben Grund keines. Sollte das jemals anders entschieden werden, gehört es hierhin und nicht in einen Nebensatz.
- Ein sehr großes Konto ist nicht gemessen. Der Rumpf darf 64 MiB haben, der Browser baut das JSON vollständig im Speicher auf, und der Server fügt Zeile für Zeile ein. Bei 433 Zeilen ist das unsichtbar. Wo die Grenze liegt — zehntausend Blöcke? hunderttausend Ereignisse? — weiß niemand, und bis dahin gibt es auch keine Fortschrittsanzeige.
Die MCP-Adresse steht da, aber nicht, wie man sie einträgt.— gebaut am 22.09.2026. Neben Adresse undAuthorization: Bearer …stehen zwei Sätze: In claude.ai unter Add custom connector die Adresse eintragen und No sign-in wählen — Denotato prüft den Schlüssel selbst. Wer Sign in now nimmt, sucht einen Anmeldedienst, den Denotato nicht betreibt, und bekommt „Couldn't register with … sign-in service" zu lesen. Ben ist am 21.09.2026 genau daran hängengeblieben (F13). Was fehlt: Derselbe Weg steht ein zweites Mal inpackages/mcp/README.md(Punkt 73).- Die Speichergrenze ist eine, nicht viele (D13, 21.09.2026).
storageQuotaBytes()inablage.tsliest heute nur die Instanz-Umgebungsvariable FILE_STORAGE_QUOTA_BYTES — jedes Konto hat dieselbe Grenze. Gestufte Grenzen nach Kontoart sind D19 und bewusst nicht mitgebaut; der Grund steht dort.storageUsage()nimmt schon eineuserIdentgegen, damit ein Nachfolger die Zahl je Nutzer aufschlagen kann, ohne die Aufrufstellen umzubauen — mehr Vorsorge ist es nicht. (Das MCP-Werkzeug fehlt seit dem 21.09.2026 nicht mehr:datei_speicherstandfragt/api/files/usageund nenntusedBytesundquotaBytes, damit ein Modell vor einem grossendatei_hochladenrechnen kann statt hinterher abgewiesen zu werden.) Die vier alten Darstellungsschlüssel stehen noch in der Datenbank(A28, seit 21.09.2026).— erledigt am 24.09.2026 (A28): ausPREFERENCESgefallen, von der API abgewiesen, von Migration 127 geräumt. Was hier stand: Erste Stufe von A04 kopiert, sie löscht nicht:skill.colors,skill.icons,interest.colorsundinterest.iconsliegen weiter inpersonal.preferencesund inPREFERENCES, und wer sie über die API schreibt, bekommt sie angenommen — gelesen werden sie dann nur, solangedarstellungzu derselben Kennung nichts sagt. Das ist ein Zustand mit zwei Wahrheiten und gehört beendet, sobald ein Release darüber gegangen ist.„Alles zurücksetzen" nimmt den Altbestand nicht mit.— erledigt am 24.09.2026 (A28): Es gibt keinen Altbestand mehr, den die Hooks lesen. Was hier stand:PREFERENCE_RESETlöscht die Zeilen, die der Schirm kennt; die vier alten stehen danach noch da. Sichtbar wird das erst, wenn jemand vor dem Umzug Farben gesetzt und seither keine angefasst hat: sein „zurücksetzen" räumtdarstellungab, und die alte Farbe kommt aus dem Altbestand zurück. Mit A28 erledigt sich das; bis dahin ist es ein Fall, den niemand sieht, weil jedes Schreibendarstellungfüllt — aber es ist da.- Der kleine Weg deckt fünf Bereiche, nicht alle (Q04, 21.09.2026). Sieben Listen: Seiten, Gedächtnis, Tagebuch, Ereignisse, Personen, Schlaf, Einstellungen. Das Studium, die Karten, die Aufgaben, die Gewohnheiten und das Spiel haben keine — sie sind nur über die große JSON-Datei zu holen. Die Erweiterung ist eine Zeile in
TEILEXPORT_LISTEN, aber jede Zeile will eine Spaltenauswahl, die jemand entschieden hat, und keine, die jemand abgeschrieben hat. - Ein Ausschnitt ist ein zweiter Rundgang durch die Tabelle. Wer alle sieben Listen einzeln holt, schickt sieben Anfragen und lädt Zeilen, die er in der großen Datei schon hatte. Bei einem Konto dieser Größe fällt das nicht auf; bei einem Tagebuch über zehn Jahre ist der Unterschied zwischen „einmal alles" und „siebenmal etwas" messbar, und gemessen ist er nicht.
- Es gibt kein „alle als ZIP". Wer die sieben Dateien will, klickt vierzehnmal. Ein Bündel wäre der offensichtliche nächste Schritt und ist bewusst nicht gebaut: Es hieße, die Dateien im Browser zusammenzupacken, und damit käme eine Abhängigkeit ins Haus (Grundsatz 67), für einen Weg, den es an Tag eins noch nicht gibt.
- Der Ausschnitt kennt keinen Zeitraum. „Mein Tagebuch aus 2025" geht nicht — es kommt immer alles. Für den Zweck von Grundsatz 53 („nichts ist gefangen") ist das richtig; für den Zweck „ich will das eine Jahr an jemanden geben" ist es zu viel, und wer zu viel weitergibt, hat es nicht gemerkt.
- Die Spaltenköpfe stehen ohne Umlaute da. Geloescht, Gedaechtnis, Erstellt. Das ist die Vorsicht aus
@shared, wo die Kopfzeilen als Bezeichner neben Feldnamen stehen — in einer Datei, die ein Mensch liest, ist es schlicht falsch geschrieben. Eine Übersetzungsschicht zwischen Spaltenname und Kopf gäbe es dafür, sie ist nicht gebaut. - Der Schirm sagt nicht, wie viele Zeilen kommen. Man klickt CSV und bekommt eine Datei — ob mit drei oder dreitausend Zeilen, steht erst darin. Eine Zahl an der Zeile („412 Einträge") wäre ein zweiter Endpunktaufruf je Liste beim Öffnen des Schirms; billiger wäre, sie in die Antwort des großen Exports zu legen, den dieser Schirm ohnehin kennt.
- Der Fehlerfall ist ein Satz, kein Weg. Scheitert das Holen, steht „Seiten liess sich nicht holen." da. Warum — Sitzung abgelaufen, Bereich abgeschaltet, Netz weg — sagt der Schirm nicht, und ein zweiter Versuch ist derselbe Klick auf denselben Knopf, ohne Hinweis, dass er eine bessere Chance hat.
- Niemand hat die Dateien je in einem anderen Programm geöffnet. Der Nachweis nimmt die CSV wieder auseinander und prüft sie gegen das, was hineinging — aber er ist derselbe Kopf, der sie geschrieben hat. Ob LibreOffice, Excel und Numbers das Byte-Order-Mark und die CRLF so lesen, wie RFC 4180 es verspricht, ist angenommen und nicht gesehen.
Denotato rüttelt nur auf diesem Schirm— teils behoben am 07.10.2026 (BW-261007-gesten).haptik.tsliegt jetzt im Gerüst (components/bewegung/haptik.ts), mituseHaptik(), das den Schlüsselhaptikliest; dieser Schirm benutzt es wie jede andere Stelle. Es rüttelt auch eine Aufgabe, die per Wischen erledigt wird. Offen bleiben der gesetzte Stempel und die abgelehnte Eingabe (doppelt), die nach Guide §11.6 ebenfalls rütteln müssten.- Die Suche findet Gruppen, keine Werte. Wer Serifen oder Wochenanfang tippt, landet in der richtigen Gruppe und sucht die Zeile dann mit dem Auge. Eine Zeile je Wert wäre das ehrlichere Verzeichnis, verlangt aber, dass jeder einzelne Schalter eine Kennung trägt, an die man springen kann — heute hat nur die Gruppe eine.
- Das Verzeichnis ist eine zweite Quelle und bleibt es.
verify:schalterTeil 8 hält Name, Kategorie und Stufe jeder Gruppe zusammen — aber nicht Titel und Hinweissatz: Die stehen im Schirm als JSX und im Verzeichnis als Zeichenkette, wortgleich abgeschrieben. Ändert jemand den Satz am Schirm, sucht man danach weiter nach dem alten. Die Auflösung wäre, dass der Schirm seine Gruppen aus dem Verzeichnis baut, statt sie daneben zu wiederholen. Nach dem Sprung wird nicht gescrollt.— gebaut am 22.09.2026. Jede Faltgruppe trägt eindata-sprungzielmit ihrer Kennung, der Sprung sucht es und rollt mitscrollIntoView({ block: 'center' })hin — weich, außer beiprefers-reduced-motion: reduce. Ein Zähler neben dem Ziel sorgt dafür, dass auch der zweite Sprung auf dieselbe Gruppe rollt.verify:schalterprüft, dass es zu jedem Sprung ein Ziel gibt. Was fehlt: Der Sprung setzt keinen Tastaturfokus (Punkt 74), und ob das Rollen unter der festen Leiste des Rahmens endet, ist gerechnet und nicht gesehen (Punkt 75).- Die Suchwörter gibt es nur auf Deutsch. Je Eintrag steht ein
satz(...)-Block mit den zusätzlichen Wörtern (schriftgroesse zeilenhoehe kontrast …). Er liegt im Katalog und ist übersetzbar, ist aber nicht übersetzt — auf Englisch sucht man also mit deutschen Wörtern oder gar nicht. Das ist dieselbe Lücke wie beifolgeundhinweis(Punkt 36), nur an einer Stelle, an der sie unmittelbar weh tut. Die Stufenwahl selbst ist nicht zu finden.— gebaut am 22.09.2026. Der Eintrag „Umfang" steht im Verzeichnis mitkategorie: null— über allen Kategorien, so wie die Stufenwahl auf dem Schirm. Auf der Trefferzeile steht als Ort „Ganz oben", der Sprung lässt die offene Kategorie stehen und rollt zum Ankerstufenwahl. Stufe, erweitert, entwickler, verborgen, Umfang finden ihn. Was fehlt: Er hebt die Stufe nicht selbst — er zeigt nur, wo man sie hebt (Punkt 76).- Ein Gerät, das nicht rütteln kann, sieht den Schalter trotzdem. Der Satz darunter sagt es, der Schalter bleibt bedienbar, und der gespeicherte Wert gilt kontoweit — am Telefon desselben Kontos wirkt er also. Richtig wäre das auch dann, wenn der Schalter am Rechner gar nicht erst dastünde; nur weiß der Schirm nicht, ob es dieses Gerät ist, für das jemand gerade einstellt, oder ein anderes. Die Geräteschicht kann beides, die Oberfläche erklärt es nicht.
- Kein Protokoll (war Punkt 12 und bleibt es). Wer wann was umgestellt hat, steht nirgends — und es liegt nicht hier: Es braucht eine Tabelle, einen Endpunkt und eine Rechteprüfung, und das Plugin
settingshat keinserver/. Es ist der Schirm für Einstellungen, die anderswo liegen. Gebaut werden müsste es inpackages/plugins/src/auth/serveroder einem eigenen Bereich, und erst dann bekäme dieser Schirm eine Kategorie dafür. Keine Benachrichtigungen— mit Punkt 8 gebaut (03.10.2026, L02). Gekommen ist nach N311 kein Kanal und keine Ruhezeit, sondern ein Klopfen am Morgen; Schalter je Bereich gibt es nicht, weil kein Bereich einzeln meldet. Der alte Text: (war Punkt 8 und bleibt es), aus demselben Grund: Es gibt nichts zu melden, solange kein Bereich etwas meldet (Richtung G2). Ein Einstellungsschirm für Benachrichtigungen, die es nicht gibt, ist ein leeres Formular — die Entscheidung gehört an den Anfang, nicht ans Ende. L02 (PWA und Web-Push) ist der Vorgang, an dem es hängt; kommt der, kommt hier eine Kategorie „Benachrichtigungen" mit Kanal, Ruhezeiten und je Bereich einem Schalter.- Der neue Teil des Schirms ist nie im Browser gesehen worden (dasselbe wie Punkt 38, aber für das Suchfeld und das Rütteln frisch). Die Treffer liegen als Glas über dem Inhalt, mit
z-indexaus dem Theme — ob sie unter der Leiste des Rahmens hervorkommen, ob die Liste am Telefon die Tastatur trifft, und obnavigator.vibrateim echten Chrome auf Android überhaupt feuert, ohne dass vorher irgendwo geklickt wurde, ist gerechnet und nicht gesehen. - Tauschen übernimmt die Frist nicht. Das Anlegefach fragt seit dem 22.09.2026 nach „Gültig", der Tauschknopf an der Kachel nicht — er schickt
nullund macht damit aus einem Schlüssel, der in 30 Tagen ablaufen sollte, einen ohne Ende. Der Server kann es (gueltigTagesteht in derselben Route), es fehlt die Wahl an der Kachel. Richtig wäre entweder ein zweites Auswahlfeld im Stellwerk oder — billiger und ehrlicher — die alte Frist zu übernehmen, weil ein Tausch derselbe Zugang unter neuem Geheimnis ist. - Vor dem Ablauf warnt niemand. Eine Frist ist erst dann brauchbar, wenn man ihr Ende kommen sieht: Der Zustandssatz nennt „läuft ab am …", aber es gibt keine Vorwarnung wie bei den Zugängen nach draußen (die Wachzeile, 14 Tage vorher, gelb). Ein Schlüssel, der nachts abläuft, meldet sich am nächsten Morgen als Fehler im Sprachmodell, und niemand verbindet das mit dieser Seite.
- Legende und Kachelsatz sind zwei Quellen. Die Wörter der Legende stehen in
SettingsMenu.tsx, der Zustandssatz einer Kachel entsteht inVerbindungsEinstellungen,ZugangsEinstellungenundSchluesselEinstellungen. Dass beide dasselbe sagen, hält kein Nachweis fest — wer einen Zustandssatz umformuliert, lässt die Legende stehen, und die Wand erklärt sich dann mit Wörtern, die auf keiner Kachel vorkommen. Ein Nachweis wie Teil 8 vonverify:schalter, nur für die Töne, wäre die Antwort. - Der claude.ai-Weg steht jetzt zweimal. Dieselben zwei Sätze — Add custom connector, No sign-in — stehen im Schirm und im Abschnitt „claude.ai einrichten" von
packages/mcp/README.md. Läuft claude.ai auseinander (der Dialog hieß schon einmal anders), muss man an beide Stellen denken. Ein Verweis statt einer Wiederholung ginge nicht: Der Schirm kann kein README zeigen, und ein Link dorthin führt aus Denotato hinaus. - Der Sprung rollt, setzt aber keinen Fokus. Wer mit der Tastatur sucht, landet nach Enter optisch bei der Gruppe — der Fokus steht aber weiterhin dort, wo das geleerte Suchfeld war. Der nächste Tabulator geht deshalb nicht dort weiter, wo man hinsieht. Richtig wäre
focus()auf den Kopf der Gruppe, und dafür bräuchte der einentabIndex={-1}. - Ob das Rollen unter der Leiste endet, ist nicht gesehen. Der Rahmen hat eine feste Kopfzeile;
scrollIntoView({ block: 'center' })rechnet sie nicht heraus, und bei einer Gruppe nahe am oberen Ende reicht „center" nicht bis zur Mitte. Am Telefon kommt die Tastatur dazu, die den sichtbaren Bereich halbiert, während die Trefferliste noch offen ist. Das ist gerechnet und im Browser nie angesehen worden — dieselbe Lücke wie Punkt 69. - Der Treffer „Umfang" hebt die Stufe nicht. Er zeigt, wo sie steht, und das ist die ehrliche Hälfte. Wer aber nach entwickler sucht, will meistens die Stufe wechseln und nicht zu ihr hingerollt werden — ein zweiter Knopf auf der Trefferzeile („gleich auf Entwickler stellen") wäre der Griff, den man erwartet. Er wäre auch der erste Treffer, der etwas tut statt zu springen, und damit ein zweiter Trefferbegriff; deshalb steht er hier und ist nicht gebaut.
- Die Abschnittsgrenzen sind im Browser nie angesehen. Die Rechnung in
theme/tageszeit.tsist mit neunzehn Proben belegt — Mitternacht, beide Umstellungen der Sommerzeit, Reykjavík im Juni, Oslo im Dezember —, aber niemand hat die vier Zeilen an einem echten Morgen umspringen sehen. Die Zeile „ab 06:20" ist die Uhrzeit von heute; wer nach Mitternacht nachsieht, liest schon die Zeiten des neuen Tags. - Die Abstände zur Sonne sind geraten. Vierzig Minuten vor Aufgang, eine Stunde danach, eine Stunde vor Untergang, vierzig Minuten danach: eine Ableitung aus der bürgerlichen Dämmerung, keine Entscheidung Christians. Einstellbar sind sie nicht; ob der Morgen zu früh kommt, zeigt erst ein Winter.
- Die Handwahl lebt nur auf diesem Gerät. Wer am Rechner von Hand die Wüste wählt, sieht am Telefon weiter die Szene des Abschnitts. Das ist gewollt (die Geräteschicht), steht aber nirgends am Schirm des Telefons.
- Eine eigene Szene lässt sich nicht als Handwahl setzen.
eigenist kein Name, den das Gerät speichern kann (der Token-Satz fehlt, Bauplan C1); gewählt aus der Leiste, schreibt sie deshalb weiterhintheme.szene— und wirkt mit Tageszeit gar nicht, weil dann die vier Abschnitte gelten. Das Abo-Theme für Premium gibt es noch nicht zu sehen.— gebaut am 24.09.2026 (KI01, N231). Die Mitgliedschaft steht alsauth.users.membershipam Konto (freioderpremium, Wanderung 120),/api/access/memeldet sie, und ein Premium-Konto sieht die Gruppe mit zwei Mustern — hier hat sich dafür nichts geändert. Gesetzt wird sie unter Admin → Konten.- Die Suche blendet nur Abo-Theme und Rang aus.
ohneGruppennimmt heute genau diese zwei Gruppen aus der Suche (den Rang seit E22). „Skills" und „Interessengebiete" stehen ebenfalls nur mit ihrem Recht da und führen für Konten ohne dieses Recht weiterhin ins Leere; sie gehören in dieselbe Menge. - Das Wetter wirkt, aber man sieht nicht, welches. Liegt ein Gewitter auf der Szene, wird der Himmel dunkler — und nichts am Schirm sagt, dass das Wetter ist und nicht die Szene. Ein kleines Wort am Kopfband („Gewitter") wäre die Auskunft.
- Zwei Wetter mit einem Namen. Das Kopfband der Übersicht zeigt das Wetter immer — das ist §4.5 des Guides (B6·C, Wetter auf dem Himmel) und kein Versehen;
Dashboard.tsxreicht es deshalb ausdrücklich hinein. Der Schalter „Wetter auf der Szene" (F21) legt es zusätzlich auf den Grund der Anwendung — und nur dort, wo der Himmel den Grund erreicht (Überall, Vollbild); bei Kopfband und Aus bewirkt er nichts Sichtbares. Wer den Schalter auf Aus stellt und über der Übersicht trotzdem Regen sieht, liest das leicht als Fehler; ein Satz dazu am Schalter fehlt. - Die Farbmuster sind nicht gegen Farbenblindheit geprüft. Bis zum 27.09.2026 lagen Amethyst und Violett im Farbton nahe beieinander; Himbeer liegt heute gut 55° von Violett weg, und die Knöpfe unterscheiden sich zusätzlich in der Form (Treppe, Kissen, Brillant). Der Name der Farbe steht trotzdem dabei, denn geprüft ist es noch immer nicht.
Fehler,SchwaecheundOhnmachtssatzinZugangskacheln.tsxbleiben farbig ohne Zeichen(N134, 23.09.2026) — behoben am 23.09.2026. Alle drei tragen jetzt vor dem Satz das Zeichenwarnung, ueber den gemeinsamen BausteinMeldeZeile; die eigeneFehlerinKontoloeschung.tsxebenso, lokal, weil sie eine andere Schriftgroesse traegt. Die Annahme „außerhalb dieses Auftrags" war falsch:SchluesselEinstellungen.tsx,VerbindungsEinstellungen.tsx,ZugangsEinstellungen.tsxundKontoloeschung.tsxgehören alle zum Bereichsettingsund sind im selben Zug mitgezogen.Streifen, Punkt und Zeichen sagen den Ton dreimal.Der Streifen ist am 10.10.2026 gegangen (ES-261009-farbige-seitenstreifen, E11); Punkt und Zeichen sagen ihn noch zweimal. Seit das Tonzeichen in die Zustandszeile gewandert ist (23.09.2026), steht es unmittelbar neben dem Punkt, und beide tragen dieselbe Farbe aus derselben Quelle (ton); der Streifen links sagt es ein drittes Mal. Der Satz daneben stammt aus einer zweiten Quelle (der eigene Zustandssatz, Punkt 72) und sagt es bei „verbunden" und „schlecht" in Worten noch einmal. Ob der Punkt neben dem Zeichen noch etwas beiträgt oder weichen kann, hat niemand angesehen — eine Gestaltungsfrage, keine Reparatur.KATEGORIE_IDSinSettingsMenu.tsxist eine zweite Liste neben der Kategorienliste selbst. Sie gibtKATEGORIEZEICHENeinen geschlossenen Schlüsseltyp (KategorieId), damit der Test jede Kategorie gegen ein Zeichen prüfen kann. Kommt eine Kategorie dazu, muss sie an beiden Stellen stehen; der Typ fängt nur das Fehlen im Zeichenverzeichnis ab, nicht das Fehlen inKATEGORIE_IDS. Eine Liste, aus der beides abgeleitet wird, wäre die saubere Form.- Die Adressregel sagt sich erst nach dem Absenden. Der Satz unter dem Feld „Adresse deines Moodle" nennt ein Beispiel mit
https://, aber nicht, dass nurhttps://geht und warum; werhttp://einträgt, erfährt es erst aus der Absage (D28) — und die steht über der Kachelwand, nicht am Feld. Derhinweisim Register ist die Stelle für den Satz; eine zweite Prüfung im Browser braucht es nicht. - Der Grund einer abgewiesenen Adresse ist nur deutsch. Er kommt als Satz in
detailsvom Server und geht durchmeldungstext, das ihn als unbekannte Kennung stehen lässt — in einer englischen Oberfläche steht er deutsch da. Dasselbe gilt schon für „Das Feld … fehlt."; beides bräuchte Kennungen mit Platzhaltern (D28). - Die Fassung ist im Betrieb „vorläufig". Die Marken der Commits stehen nur dort, wo eine Sitzung sie nachgetragen hat; nach origin sind sie aus der Cloud nicht gekommen (C46). Der Server, aus dem Denotato läuft, holt sie deshalb nicht mit, und die Zeile sagt „vorläufig", bis sie drüben stehen oder dort jemand
node betrieb/fassung.mjs nachtragenruft. - Am Telefon kürzt die Rollenkarte ihre Auswahl. Auswahl und „meinen Wert für diese Rolle" teilen sich eine Zeile; bei 390 px bricht der Knopf in zwei Zeilen um, und der Platzhalter endet als „Einstellung wähle…". Er bedeutet noch etwas, und Konfiguration ist nach Grundsatz 9 des Style-Guides Sache des PCs — deshalb so gelassen. Sauberer wäre eine Zeile, die am Telefon umbricht und die Auswahl über den Knopf stellt (gesehen am 23.09.2026, A29).
- Die Farben und Zeichen unter
darstellungsagen nicht, woher sie kommen. Bereiche, Skills und Gebiete tragen keine Herkunftsmarke (N196): Die Farbeditoren schreiben das ganze Objekt zurück, und nach der ersten eigenen Wahl stünde an jeder Farbe „von dir". Der Kontext kann es bis auf die Stelle genau (herkunftPfad,eigenGesetzt(schluessel, pfad)); es fehlt das Schreiben je Pfad — A03, Punkt 3. - Unter „Nach innen“ sagt die Legende „zurückgezogen“, die Strom-Kachel „nicht eingerichtet“. Beide meinen den grauen Punkt; für einen Schlüssel ist grau „zurückgezogen“, für den Strom „keine Adresse“ — auch eine zurückgezogene. Der Satz auf der Kachel stimmt, die Legende verallgemeinert. Und der Baustein fragt
/api/verbindungenfür diese eine Kachel ein zweites Mal ab; der Preis dafür, dass kein dritter Baustein beide Hälften kennen muss. Eine Standortzone steht ohne Standort in der Zeitzonenliste.Die Auswahl zeigt „Europe/Paris“, nicht „Campus Paris“, und sortiert die Standortzonen nach dem Zonennamen hinter die feste Liste. Wer nicht weiß, welche Zone sein Campus hat, findet sie dort nicht; der Satz nach der Standortwahl in „Hochschule“ nennt sie (09.10.2026, VA-261009-zeitzonen-standorte).— behoben am 09.10.2026 (VA-261009-standortzonen-tragen). Jede Standortzone nennt hinter dem Zonennamen die Standorte, aus denen sie kommt („Europe/London · ESCP London“), höchstens drei, danach „…“; ein Standort heißt dort Einrichtung und Standort, es sei denn, sein Name nennt die Einrichtung schon. Gesucht inZeitEinstellungen.tsx(standortzonen,zonentext) und im jsdom-Test. Die Zonen der festen Kurzliste tragen den Standort ebenfalls, wo ein sichtbarer Standort sie hat.- Ein Konto ohne Passwort kann unter „Anmeldung“ nichts ändern. Wer sich über Google oder Apple angelegt hat, sieht seine Verknüpfung und den Satz, dass erst ein Passwort her muss — einen Weg dorthin außer „Passwort vergessen“ auf der Anmeldeseite gibt es nicht (D-261008-google-apple, 13.10.2026). Der Server fragt bei einem solchen Konto ebenfalls nach dem Passwort; eine Bestätigung über den Anbieter selbst wäre der Ausweg; offen als Vorgang D-261013-passwortnachfrage-ohne.
- Ein Gast sieht die Gruppe nicht. Die Gastsitzung über Google oder Apple in ein Konto zu überführen, geht nur über die Registrierung (D-261008-google-apple, 13.10.2026).