/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· Nachweisenpm run verify:ereignisleserundnpm 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.
| Bereich | Art | Wann |
|---|---|---|
study | card_reviewed, topic_completed | Karte bewertet, Thema abgeschlossen |
tasks | task_completed | Aufgabe auf einen Endzustand gesetzt |
tutor | exercise_graded | Übungsaufgabe bewertet |
documents | document_created | Seite angelegt, im eigenen Baum oder in einem Raum |
wiki | wiki_version_saved | Fassung gesichert — von Hand, nicht die selbsttätige |
people | person_added | Person angelegt |
memories | memory_added | Gedächtniseintrag angelegt |
life | life_event_created, journal_entry_written | Ereignis im Formular angelegt, Tagebucheintrag geschrieben |
schlaf | sleep_recorded | Nacht zum ersten Mal angekommen |
stundenplan | lecture_added | Veranstaltung von Hand eingetragen oder ein Vorschlag aus dem Vorlesungsverzeichnis übernommen; nicht beim AGNES-Abgleich und nicht beim Einfügen aus Text |
timer | study_block_finished | Lernblock beendet, nicht verworfen |
materials | source_added | Quelle angelegt |
progress | habit_checked | Gewohnheit abgehakt, nicht zurückgenommen |
calendar | calendar_category_created | Kalenderkategorie angelegt |
moodle | moodle_course_linked | Moodle-Kurs an ein Modul gehängt |
begleiter | companion_asked, companion_conversation_deleted, companion_turn_deleted | Dem 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) |
admin | work_item_answered | Vorgang 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 über | Schnellsuche → 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) |
| Merkmal | keines — der Strom gehört zum Gerüst, nicht zu einem Bereich |
| Zimmer | Einstellungen-Lautstärke (Stufe 1): Text und Linien, keine Schienen, kein Korn |
| Endpunkte | EREIGNISSTROM, 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öpfe | je Art ein Schalter mit ihrer Anzahl im Zeitraum — „Karte bewertet (412)". Gedrückt heißt: nur diese. Mehrere gehen. |
| ab / bis | zwei 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ücksetzen | erscheint 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
| Element | Was passiert |
|---|---|
| Artenknopf | schaltet diese Art zu oder ab; mehrere gleichzeitig möglich; springt auf Seite 1 zurück |
| ab / bis | grenzt den Zeitraum ein; springt auf Seite 1 zurück |
| Filter zurücksetzen | alle Arten an, Zeitraum offen |
| Neuere / Ältere | eine 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
- Kein Weg in den Bereich zurück.
gegenstandIdsteht 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. personal.event_streamträgt keine Zeilensicherheit. InrlsTabellen.tssteht sie unterTABELLEN_ZURUECKGESTELLT: Das Aufräumen (ereignisseAufraeumen.ts) zählt und kürzt den Strom aller Konten überappPoolohneapp.user_id, und eine Richtlinie liesse die Aufbewahrung leer laufen. Die Trennung hängt deshalb allein amuser_id = $1inereignisleser.ts— richtig, aber ohne zweiten Riegel. Nachzuholen mit einer Wanderung, einem Aufräumen, das am Richtlinienweg vorbei darf, und einem Eintrag inISOLATIONSPROBEN.- 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 aufpayload. - Kein Ausdruck und kein Export. Der Teilexport (
exportTabellen.ts) kennt den Strom nicht. Wer sein Protokoll mitnehmen will, hat keinen Weg. - 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.
- Kein Sprung zu einem Datum. Bei zweiundsiebzig Seiten ist „Ältere" siebzigmal drücken. Ein Feld „springe zu" oder ein Jahresstreifen fehlt.
Der Schirm kennt keine Bereichsfarbe.Für N134 geprüft (23.09.2026): WederEreignisartnochgegenstandtragen eine saubere Zuordnung zu einemBereichId, 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 einerEreignisartdas Bereichszeichen zurückgibt, ohne dass der Kern den Bereich importiert. Noch nicht gebaut.- 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.
- Der Strom hat keine eigene Zeile im Briefing. Die Eule könnte sagen, was gestern passiert ist; sie tut es nicht.
- Kein MCP-Werkzeug bis zur Eintragung. Das Werkzeug
ereignisstromist als geteilte Zeile vorgesehen; bis der Hauptlauf sie einträgt, kommt ein Modell an den Strom nicht heran. - Eine erledigte Aufgabe nennt ihren Zustand englisch. Der Satz hängt den Wert aus
payload.statusroh an: „Aufgabe erledigt — done" oder „— fine".satzZuEreignisin@shared/handlers/ereignisse/lesbarbraucht für die Zustände eine Abbildung auf Wörter, wie sie es für Bewertungen und Lernarten schon hat. - Zwei Papierkorbarten stehen ohne Wort da. Die Frist räumt auch Kalenderkategorien und LaTeX-Texte ab, aber
PAPIERKORBARTENinlesbar.tskennt 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".