/ereignisse — Der eigene Verlauf

Hinweis: Rahmen: 00-rahmen.md. Code: packages/frontend/src/components/screens/Ereignisschirm.tsx · handlers/requests/ereignisHandler.ts · packages/backend/src/routes/api/ereignisse.ts · database/access/ereignisleser.ts · packages/shared/src/handlers/ereignisse/lesbar.ts · Nachweise npm run verify:ereignisleser und npm run verify:trennung.

Wofür

Die Leseseite des Ereignisstroms (G01). Seit dem 17.09.2026 schreiben drei Bereiche in personal.event_stream — eine bewertete Karte, eine abgehakte Aufgabe, ein abgeschlossenes Thema, eine bewertete Übungsaufgabe —, seit dem 21.09.2026 auch die Löschzeitgeber, wenn sie den Papierkorb abräumen, abgelaufene Sitzungen entfernen oder Ereignisse verfallen lassen, und seit dem 27.09.2026 jeder Bereich, der eine eigene Tat hat (NB01, N319): siebzehn, nicht alle.

Gezählt wird das Anlegen oder Abschließen, nicht jedes Speichern — eine Seite, die beim Tippen sechzigmal gesichert wird, ist eine Seite. Welcher Bereich welche Art schreibt, erklärt er selbst in seiner Deklaration (ereignisarten in plugin.ts); das Register rechnet daraus BEREICH_DER_EREIGNISART, und verify:arch prüft, dass jede Schreibstelle in dem Plugin liegt, das ihre Art erklärt.

BereichArtWann
studycard_reviewed, topic_completedKarte bewertet, Thema abgeschlossen
taskstask_completedAufgabe auf einen Endzustand gesetzt
tutorexercise_gradedÜbungsaufgabe bewertet
documentsdocument_createdSeite angelegt, im eigenen Baum oder in einem Raum
wikiwiki_version_savedFassung gesichert — von Hand, nicht die selbsttätige
peopleperson_addedPerson angelegt
memoriesmemory_addedGedächtniseintrag angelegt
lifelife_event_created, journal_entry_writtenEreignis im Formular angelegt, Tagebucheintrag geschrieben
schlafsleep_recordedNacht zum ersten Mal angekommen
stundenplanlecture_addedVeranstaltung von Hand eingetragen oder ein Vorschlag aus dem Vorlesungsverzeichnis übernommen; nicht beim AGNES-Abgleich und nicht beim Einfügen aus Text
timerstudy_block_finishedLernblock beendet, nicht verworfen
materialssource_addedQuelle angelegt
progresshabit_checkedGewohnheit abgehakt, nicht zurückgenommen
calendarcalendar_category_createdKalenderkategorie angelegt
moodlemoodle_course_linkedMoodle-Kurs an ein Modul gehängt
begleitercompanion_asked, companion_conversation_deleted, companion_turn_deletedDem Begleiter eine Frage gestellt; ein Gespräch mit ihm gelöscht, mit der Zahl der Runden und ohne Inhalt (KI35); eine einzelne Runde gelöscht, mit ihrer Kennung und ohne Inhalt (KI55)
adminwork_item_answeredVorgang der Verwaltung beurteilt oder kommentiert

Wer keine Art hat, und warum. flashcards — die Bewertung einer Karte schreibt study, der Kartenbereich selbst legt nichts an, was eine Tat wäre; rueckblick liest nur; noten und settings haben keinen Server; das Gerüst (Übersicht, Anmeldung, Sitzung, Rechte, Dateien, Rückmeldung, Verknüpfungen) ist Handwerk und keine Nutzung. Ein Ereignis „gelesen" oder „geöffnet" gibt es nicht (Grundsatz 49): Ein Bereich, in dem man nur nachschlägt, erscheint im Strom nicht.

Gelesen hat diesen Strom bis zum 21.09.2026 nur der Meta-Server, also der Betreiber. Ein Protokoll, das jeder sehen kann außer dem, von dem es handelt, beantwortet die Frage nicht, für die es angelegt wurde: „Was ist mit meinen Daten passiert?"

Was hier nicht steht, ist der Inhalt. Der Strom trägt Art, Gegenstand, ein paar Zahlen und einen Zeitpunkt — nie einen Titel, nie einen Text (Grundsatz 49). Das ist keine Sparsamkeit, sondern die Bedingung dafür, dass das Protokoll zwei Jahre liegen bleiben darf, während Grundsatz 50 die Inhalte nach dreißig Tagen abräumt.

Weg und Rahmen

Route/ereignisse — seit dem 28.09.2026 ein Werkzeug des Raums Konto in Leiste und Schublade, wie der Papierkorb (NV08, Schnitt 3). Seit dem 09.10.2026 steht er für jedes Konto statt in der Seitenleiste im Kontoknopf unter „Deine Daten ›“, und die Schublade ist entfernt (NV-261007-seitenleiste, Entscheidung ../kontext/entscheidungen/2026-10-09-neue-navigation-immer.md)
Gefunden überSchnellsuche → Befehl „Verlauf" (auch unter „Ereignis", „Ereignisse", „Protokoll", „Chronik", „Historie", „Log", „Aktivität", „Was ist passiert" und den englischen „event", „activity", „history", „what happened"); seit dem 28.09.2026 in Leiste und Schublade als Werkzeug des Raums Konto (NV08, Schnitt 1 und 3, 00-rahmen.md §1)
Merkmalkeines — der Strom gehört zum Gerüst, nicht zu einem Bereich
ZimmerEinstellungen-Lautstärke (Stufe 1): Text und Linien, keine Schienen, kein Korn
EndpunkteEREIGNISSTROM, EREIGNISSTROM_EINTRAG

Er liegt im Kern und in keinem Plugin. Migration 35 nennt den Strom „Infrastruktur … gehört keiner Domäne", und das ist hier wörtlich zu nehmen: Ein Bereich, dem der Strom gehörte, besäße die Chronik aller anderen.

Was man sieht

Oben ein Satz: „Keine Inhalte, und außer dir sieht das niemand. Nach 730 Tagen wird ein Eintrag von selbst gelöscht." Die Zahl kommt vom Server, nicht aus dem Schirm; meldet er keine Frist, steht nur „Außer dir sieht das niemand."

Darunter ein Filterkasten, Papier mit Haarlinie wie die Datumsfelder darin (seit 10.10.2026, ES-261010-glastoene-liegenden; vorher lag er als halbdurchsichtiger Glaston auf dem Himmel):

Artenknöpfeje Art ein Schalter mit ihrer Anzahl im Zeitraum — „Karte bewertet (412)". Gedrückt heißt: nur diese. Mehrere gehen.
ab / biszwei Datumsfelder; „bis" zählt den ganzen Tag mit. Ein Tag ist der Tag in der Zone des Kontos (zeit.zone, N167) — der Server rechnet die Grenzen dort, und Tagesüberschriften und Uhrzeiten der Liste stehen in derselben Zone (useZeit()), nicht in der des Rechners
Filter zurücksetzenerscheint nur, wenn etwas gefiltert ist

Dann der Strom selbst — eine Liste, keine Kacheln. Je Tag eine Überschrift („Montag, 21.09.2026"), darunter je Zeile die Uhrzeit in gleicher Zeichenbreite und ein Satz: „Karteikarte bewertet — gut, neu", „3 Personen endgültig gelöscht — die Frist war abgelaufen". Der Satz kommt vom Server, damit er im Schirm, im MCP-Werkzeug und im Rückblick derselbe ist.

Unten, wenn es mehr als eine Seite gibt: Neuere · Seite 2 von 7 — 318 Einträge · Ältere.

Kein Zeichen an Artknopf oder Zeile (N134, 23.09.2026 geprüft). Die Zeichensprache zeigt an anderer Stelle das Zeichen des Bereichs, aus dem etwas stammt — hier ginge das nur, wenn der Kern (dieser Schirm liegt in components/screens) einen Bereich beim Namen nennt, und das verbietet Grundsatz 43. Weder Ereignisart (kein Präfix) noch gegenstand (deckt nur vier von sieben Werten auf einen Bereich ab, und steht ohnehin nicht auf der Artenzählung) tragen eine saubere Zuordnung. Ein Ersatzzeichen wie zeit an jeder Zeile entfiele ebenfalls — die Uhrzeit steht als Text schon daneben, ein zweites, immer gleiches Zeichen unterschiede nichts.

Ist nichts da, steht dort einer von drei Sätzen, und sie meinen drei verschiedene Dinge: „In diesem Ausschnitt ist nichts passiert" (der Filter ist zu eng), „Dein Strom beginnt am … — davor gibt es nichts zu sehen" (der Zeitraum liegt vor dem Anfang) oder „Sobald du eine Karte bewertest oder eine Aufgabe abhakst, fängt der Strom an" (der Strom ist leer, kein Filter gesetzt).

Der leere Strom steht als Leerzustand (29.09.2026, RL02): Wer noch nie etwas mitgeschrieben hat und keinen Filter gesetzt hat, sieht den gemeinsamen Leerzustand mit Eule statt einer grauen Nebenzeile — und keinen Filterkasten. Vorher standen darüber „Art — In diesem Zeitraum gibt es keine Arten“ und zwei leere Datumsfelder, ein Filter über nichts (N318). Mit dem ersten Ereignis oder einem gesetzten Filter ist der Kasten wieder da. Die Überschrift heißt seit demselben Tag „Verlauf“ wie in Leiste, Brotkrumen und Schnellsuche; vorher stand dort „Ereignisse“.

Was man tun kann

ElementWas passiert
Artenknopfschaltet diese Art zu oder ab; mehrere gleichzeitig möglich; springt auf Seite 1 zurück
ab / bisgrenzt den Zeitraum ein; springt auf Seite 1 zurück
Filter zurücksetzenalle Arten an, Zeitraum offen
Neuere / Ältereeine Seite vor oder zurück (50 Zeilen); am Rand ausgegraut

Was man hier nicht kann: etwas ändern oder löschen. Beide Routen tragen schreibt: false. Ein Protokoll, das sein Gegenstand bearbeiten darf, ist keines — und ein Eintrag verschwindet ohnehin von selbst, wenn seine zwei Jahre um sind.

Ein fremdes Konto sieht hier nichts. Jede Abfrage trägt user_id = $1; /ereignisse/eintrag antwortet auf eine fremde Kennung genau so wie auf eine erfundene — mit null und HTTP 200, damit der Unterschied nicht verrät, welche Kennungen es gibt. Belegt in verify:trennung (Abschnitt „ereignisse") und in verify:ereignisleser.

Woher die Daten kommen

Der Schirm ruft einen Weg: EREIGNISSTROM (POST, schreibt: false). Handler ist ereignisseRoutes in packages/backend/src/routes/api/ereignisse.ts; er prüft Arten und Zeitraum, rechnet die Grenzen in der Zone des Kontos (zeit.zone) und fragt leseEreignisse in database/access/ereignisleser.ts. Die liest aus personal.event_stream — drei Abfragen in einer Transaktion: die Seite, die Artenzählung ohne Artenfilter und den Beginn des Stroms. Den Satz je Zeile macht der Server mit satzZuEreignis aus @shared/handlers/ereignisse/lesbar; der Schirm baut ihn nicht selbst.

Der zweite Weg, EREIGNISSTROM_EINTRAG, liefert eine Zeile über ihre Kennung. Der Handler fetchEreignis steht in ereignisHandler.ts, der Schirm ruft ihn nicht; gebraucht wird er vom Trennungsnachweis (verify:trennung).

Beide Wege laufen durch die AES-Strecke (registerEncryptedRoute) und verlangen kein Recht außer einem Konto (ohneRecht: 'jedesKonto'): Jeder hat einen Strom, und er handelt nur von ihm. Verschlüsselt ist der Weg; die Spalten der Tabelle liegen im Klartext, und payload trägt nur Zahlen und Wörter (Grundsatz 49). Dass jede Abfrage user_id = $1 trägt, steht unter „Was man tun kann".

Was fehlt

  1. Kein Weg in den Bereich zurück. gegenstandId steht in der Antwort, aber keine Zeile verlinkt dorthin. Der Grund ist echt — der Gegenstand kann längst gelöscht sein, und ein Verweis, der bei der Hälfte ins Leere führt, ist schlechter als keiner. Die Lösung wäre ein Auflöser, der vorher fragt, ob es das Ding noch gibt.
  2. personal.event_stream trägt keine Zeilensicherheit. In rlsTabellen.ts steht sie unter TABELLEN_ZURUECKGESTELLT: Das Aufräumen (ereignisseAufraeumen.ts) zählt und kürzt den Strom aller Konten über appPool ohne app.user_id, und eine Richtlinie liesse die Aufbewahrung leer laufen. Die Trennung hängt deshalb allein am user_id = $1 in ereignisleser.ts — richtig, aber ohne zweiten Riegel. Nachzuholen mit einer Wanderung, einem Aufräumen, das am Richtlinienweg vorbei darf, und einem Eintrag in ISOLATIONSPROBEN.
  3. Keine Suche im Strom. Wer wissen will, wann er zuletzt eine Karte mit „nochmal" bewertet hat, muss blättern. Ein Feld über den Werten (payload) wäre möglich, braucht aber einen Index — heute liegen drei auf der Tabelle, keiner auf payload.
  4. Kein Ausdruck und kein Export. Der Teilexport (exportTabellen.ts) kennt den Strom nicht. Wer sein Protokoll mitnehmen will, hat keinen Weg.
  5. Die Artenzählung nennt nur Arten, die vorkommen. Eine Art, die es gibt, aber zu der nichts passiert ist, fehlt im Filter — man kann also nicht nach ihr suchen und „nichts" als Antwort bekommen.
  6. Kein Sprung zu einem Datum. Bei zweiundsiebzig Seiten ist „Ältere" siebzigmal drücken. Ein Feld „springe zu" oder ein Jahresstreifen fehlt.
  7. Der Schirm kennt keine Bereichsfarbe. Für N134 geprüft (23.09.2026): Weder Ereignisart noch gegenstand tragen eine saubere Zuordnung zu einem BereichId, und der Kern darf keinen Bereich beim Namen nennen (Grundsatz 43) — Artknopf und Zeile bleiben deshalb bewusst ohne Zeichen und ohne Bereichsfarbe. Ein sauberer Weg bliebe ein Anschluss (Bauplan 1.2): eine Funktion, die zu einer Ereignisart das Bereichszeichen zurückgibt, ohne dass der Kern den Bereich importiert. Noch nicht gebaut.
  8. Keine Zusammenfassung. „Diese Woche: 214 Karten, 31 Aufgaben" wäre die Zeile, die die meisten eigentlich suchen; heute muss man die Zahlen aus den Artenknöpfen ablesen.
  9. Der Strom hat keine eigene Zeile im Briefing. Die Eule könnte sagen, was gestern passiert ist; sie tut es nicht.
  10. Kein MCP-Werkzeug bis zur Eintragung. Das Werkzeug ereignisstrom ist als geteilte Zeile vorgesehen; bis der Hauptlauf sie einträgt, kommt ein Modell an den Strom nicht heran.
  11. Eine erledigte Aufgabe nennt ihren Zustand englisch. Der Satz hängt den Wert aus payload.status roh an: „Aufgabe erledigt — done" oder „— fine". satzZuEreignis in @shared/handlers/ereignisse/lesbar braucht für die Zustände eine Abbildung auf Wörter, wie sie es für Bewertungen und Lernarten schon hat.
  12. Zwei Papierkorbarten stehen ohne Wort da. Die Frist räumt auch Kalenderkategorien und LaTeX-Texte ab, aber PAPIERKORBARTEN in lesbar.ts kennt beide nicht; die Zeile heißt dann „2 kalenderkategorie endgültig gelöscht" oder „1 latextext endgültig gelöscht". Fehlen die Mehrzahlen „Kalenderkategorien" und „LaTeX-Texte".