/stundenplan — Der Stundenplan

Hinweis: Rahmen: 00-rahmen.md. Code: packages/plugins/src/stundenplan/ — client/Stundenplanmenue.tsx, client/Wochenbaustein.tsx, client/Veranstaltungsformular.tsx, client/Freietagefach.tsx, client/Einfuegefach.tsx, client/Agnesfach.tsx, client/Verzeichnisfach.tsx, client/Postenliste.tsx, client/Trainingszeile.tsx · Logik packages/shared/src/handlers/stundenplan/raster.ts, Einfügen handlers/stundenplan/einfuegen.ts (Leser) und einfuegeabgleich.ts (Abgleich), Server server/einfuegen.ts · Vorlesungsverzeichnis (HIS-LSF, VA07; HISinOne, VA16) handlers/stundenplan/agnesseite.ts (Seite lesen), agnesabgleich.ts (Abgleich), Server server/agnes.ts, Zeitgeber denotato-agnes.timer · Rückfall per Sprachmodell (VA08) handlers/stundenplan/rueckfall.ts (Seitentext, Anweisung, Prüfung der Antwort), Server server/rueckfall.ts · Haken am Sport handlers/stundenplan/haken.ts (Soll, Ist, Strähne), Server server/haken.ts · Lernvorschläge handlers/stundenplan/lernzeit.ts, ihre Einstellungen settings/client/LernzeitEinstellungen.tsx · Nachweis npm run verify:stundenplan.

Seit dem 15.10.2026 (KN-261014-woche-bild) öffnet der Kalender dasselbe Formular als Fenster, client/Veranstaltungsfenster.tsx über den Anschluss stundenplan.Veranstaltungsfenster — zum Eintragen aus dem Anlegefach und zum Bearbeiten aus dem Aufklapper einer Vorlesung (calendar.md).

Seit dem 16.10.2026 ist der Stundenplan ein Pflegeschirm ohne Woche (KN-261014-woche-bild, F1 A). /stundenplan und /<raum>/stundenplan leiten auf /calendar?nur=stundenplan um (client/Stundenplanschirm.tsx): Der Kalender zeigt dann nur die Veranstaltungen, mit Ausfällen, Verlegungen und freien Tagen als Band; der erste Klick in seiner Legende hebt den Filter auf. Der Leisteneintrag bleibt und führt dorthin. Gepflegt wird unter /stundenplan/einrichten (client/Stundenplanmenue.tsx), erreichbar über die Zeile „Stundenplan“ unter „Kalender einrichten“: die Liste aller Veranstaltungen (ein Klick öffnet Formular und Ausnahmefach), AGNES, Vorlesungsverzeichnis, Einfügen und freie Tage. Das Wochenraster des Schirms, die Reiter Woche und Liste, die Kopfreihe mit Blättern und „Lernzeiten“, der Lernwochenstand und die Trainingszeile sind dort weg. Was unten über die Woche steht, beschreibt den Schirm bis zu diesem Tag; der Baustein „Wochenraster“ in Seiten zeichnet über client/Wochenbaustein.tsx den gemeinsamen Baustein Zeitraster. Strähne der Trainingszeile und Lernwochenstand stehen seit dem 16.10.2026 im Kalender (Anschluss stundenplan.Wochenstand, client/Wochenstand.tsx; beschrieben in calendar.md, „Lernzeiten und Sport der Woche“).

Wofür

Die Woche, die sich wiederholt. Eine Veranstaltung ist das einzige in Denotato, das keinen Termin hat, sondern einen Platz: Die Vorlesung am Dienstag um zehn findet nicht am 21. September statt, sie findet dienstags um zehn statt. Alles andere im Studium hat ein Datum — eine Prüfung, eine Frist, eine Aufgabe —, und deshalb passt die Woche in keine der bestehenden Tabellen.

Das ist auch der Grund für den eigenen Bereich und nicht für einen Reiter unter „Studium" (NB08): Ein anderes Datenmodell verdient eine andere Seite, und der Kalender kann es nicht übernehmen, weil dort jede Zeile einen Zeitpunkt hat.

Wozu das gut ist, sieht man erst außerhalb dieser Seite. Der Stundenplan ist der einzige Ort, der sagt, wann jemand nicht kann — die Grundlage dafür, dass eine Planung nicht Dienstag zehn Uhr vorschlägt.

Weg und Rahmen

Route/stundenplan (Umleitung auf /calendar?nur=stundenplan) und /stundenplan/einrichten (Pflege), Leisteneintrag im Zimmer uhrenraum
Merkmalstundenplan — jedes Konto bekommt es, bestehende über Migration 48
Abschaltbarja, wie jeder Bereich seit N63
Endpunktezweiundzwanzig unter /api/stundenplan: Stamm, _speichern, _wegtun, /ausnahmen(+/speichern,/aufheben), /freietage(+/speichern,/aufheben,/feiertage), /kalendertermine, /einfuegen/vorschau, /einfuegen/uebernehmen, /agnes(+/vorschau,/uebernehmen,/verwerfen,/jetzt), /lernwoche, /lernzeit/einstellungen(+/setzen) und /lernzeit/vermerken — alle verschlüsselt
Tabellenstudy.veranstaltungen (Migration 48, Gruppe ab 51), study.veranstaltungsausnahmen (55), study.freie_tage (68, Spalte art seit 115), study.agnes_seiten und die Spalte agnes_adresse (124), die Spalte dozent_id (135), study.learning_block_marks (147), study.veranstaltungshaken (162), study.calendar_event_checks (316), die Spalte gewaehlt (327)
MCPstundenplan_lesen, _speichern, _wegtun, _ausnahmen, _ausnahme_speichern, _ausnahme_aufheben, _freie_tage, _freier_tag_speichern, _freier_tag_aufheben, _feiertage_eintragen, _kalendertermine, _einfuegen_vorschau, _einfuegen, _agnes, _agnes_vorschau, _agnes_uebernehmen, _agnes_verwerfen, _agnes_jetzt, lernzeit_woche, lernzeit_einstellungen, lernzeit_einstellungen_setzen, lernzeit_vermerken
AnschlüsseANSCHLUESSE.studium?.module() (Modul, Dozent) · ANSCHLUESSE.personen?.liste() (Auswahl des eigenen Dozenten, BE57) · ANSCHLUESSE.kalender?.woche() (Termine mit Uhrzeit, A23) · ANSCHLUESSE.ereignisse?.legeAn() (Einzeltermine aus dem Einfügen, BE52) · ANSCHLUESSE.kalender?.abonnements() (Einfügen aus einem Abo, VA-261009-stundenplan) — alle fakultativ

Was man sieht

Zwei Ansichten, umschaltbar über die zweite Reiterreihe — beide tragen seit dem 23.09.2026 ein Zeichen (Guide §7.3, N134): Woche den Kalender (kalender), Liste die Tabelle (tabelle, seit N406; vorher uebersicht). Ohne Veranstaltung und ohne Wochenziel fehlen beide Reiter (N406): sie zeigten nur denselben Leerzustand.

Woche — das Raster. Sieben (oder fünf) Spalten, eine Zeitspalte links, Stundenlinien im Hintergrund. Jede Veranstaltung ist ein Block, und seine Höhe ist ihre Dauer: eine Doppelstunde ist doppelt so hoch wie eine einfache. Darin Titel, Zeitspanne und — auf einer Zeile — Ort und Dozent (H 3 · Prof. Meier). Der linke Rand trägt die Farbe der Veranstaltung, ersatzweise die des Bereichs.

Seit dem 19.10.2026 nimmt das Wochenraster sein Aussehen aus dem Rezept zeitraster des aktiven Stilpakets, wie Stundenraster und Monatsblatt im Kalender (E-261018-zeitraster-i-rezept); jeder Block trägt dazu seine Ebene als Attribut, seit dem 20.10.2026 auch die Kategorie eines eingeblendeten Kalendertermins (E-261019-zeitraster-kategorie). Seit demselben Tag ist das Wochenraster derselbe Baustein wie das Stundenraster im Kalender (E-261016-bausteine-iii; beschrieben in calendar.md, „Ein Raster für Kalender und Stundenplan“).

Der Dozent steht am Modul, die Veranstaltung kann ihn übersteuern (BE13; seit dem 24.09.2026 BE57, N228). Wer die Vorlesung und ihre drei Übungen einträgt, trägt den Namen einmal ein, am Modul — beim Wechsel ist es eine Stelle. Nur wo jemand anderes die Veranstaltung hält (Übung, Tutorium, Praktikum), steht an ihr ein eigener Dozent (study.veranstaltungen.dozent_id, Wanderung 135); leer heißt „wie das Modul“. Den Namen im Block rechnet der Server: der eigene vor dem des Moduls, keiner aus dem Papierkorb (dozent an der Veranstaltung). Nur wenn er keinen nennt, fällt das Raster auf die Module zurück, die es über ANSCHLUESSE.studium?.module() fragt — ist das Studium abgeschaltet, steht im Block dann eine Zeile weniger.

Bis zum 24.09.2026 stand hier, der Dozent stehe mit Absicht nicht an der Veranstaltung. Das trug für die Vorlesung und alle Gruppen, die derselbe Mensch hält — nicht für Übung und Praktikum: Ben hat gemessen, dass dort in „GOLD · Uni“ der Name der Vorlesung stand (BE57).

Liste — dieselben Daten als Tabelle (Titel, Art, Tag, Zeit, Ort, Gruppe, Modul, Dozent, Rhythmus), sortiert nach Tag und Uhrzeit. Für den Blick „was habe ich überhaupt", wenn die Woche zu voll für das Raster ist. Seit dem 03.10.2026 (NV15, N499) ist das Modul ein Weg zu genau diesem Modul im Studium (ANSCHLUESSE.knoten?.module?.weg); eine Veranstaltung ohne Modul zeigt den Namen als Text. Gruppieren nach Modul geht weiter.

Bausteine (seit 20.10.2026, E-261020-umzug-kalender, E-261020-umzug-bausteine)

Die Fächer der Pflege zeichnen ihre Teile aus den gemeinsamen Bausteinen statt aus eigenen Nachbauten.

StelleBausteine
Liste der Veranstaltungen, Ausnahmefach, Freie TageRumpf auf Fläche (stein); Köpfe als Abschnittstitel (klein); Tag, Spanne und Angaben als Nebentext
Einfügendas Textfeld als Feld (mehrzeilig) mit Hover- und Fokusrand; der Dateiwähler als Knopf (sekundär) wie im Datenimport; das Muster als Nebentext, der Mustertext auf Fläche (papier); Kopf der Vorschau als Abschnittstitel, halbfett
Formular einer Veranstaltungder Rahmen als Fläche (rahmen), Rundung md statt lg
AGNES, Vorlesungsverzeichnis, Fenster einer VeranstaltungTitel als Abschnittstitel, Hinweise als Nebentext

Sichtbar anders als vorher: Hinweise in xs statt sm; der Wähler im Einfügen sieht aus wie jeder sekundäre Knopf.

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 stundenplan (die Ansichten „Woche“ und „Liste“) (Rahmen §3).

ElementWas passiert
Veranstaltung (Anlegefach)klappt das Formular auf; Pflicht sind Titel, Tag und Zeitspanne
Block im Raster anklickenöffnet dieselbe Veranstaltung im Formular — und belegt im Ausnahmefach den Tag vor, auf den du geklickt hast
Zeile in der Liste anklickendasselbe
Speichernschreibt die Änderung und lädt die Woche neu
Wegtunlegt sie in den Papierkorb — wiederherstellbar, nicht gelöscht. Seit dem 23.09.2026 zwei Klicks (Q09, N165): „Wegtun" wird zu „ja, weg" und „doch nicht", der gemeinsame Baustein wie überall; vorher ein eigener Knopf, der mit einem Klick wegtat
Abbrechenschließt das Formular, ohne etwas zu ändern
Eintragen (Ausnahmefach)setzt einen Ausfall, eine Verlegung oder einen Zusatztermin für einen Tag — oder mit „bis" für jeden Tag einer Spanne
Freie Tageklappt das Fach für Feiertage und vorlesungsfreie Spannen auf; die Zahl daneben sagt, wie viele eingetragen sind. Tag und Spanne stehen seit dem 09.10.2026 (VA-261009-tagesangaben) ohne Jahr in der Sprache des Kontos — „24. Dezember – 6. Januar“, englisch „December 24 – January 6“
Art des freien Tages (Freie Tage)wählt vor dem Eintragen Vorlesungsfrei (die Vorgabe) oder Feiertag — und damit, was an dem Tag entfällt (C37)
Eintragen (Freie Tage)trägt einen freien Tag mit der gewählten Art ein — „bis" nur, wenn es eine Spanne ist; danach steht die Auswahl wieder auf „Vorlesungsfrei"
Feiertage eintragen (Freie Tage)klappt eine Zeile mit Bundesland und Jahr auf (Vorgabe: das laufende Jahr; das Bundesland ist vorgewählt, wenn der Standort der eigenen Hochschule eines trägt, seit 14.10.2026, KN-261013-einrichtung-bauen) und trägt die gesetzlichen Feiertage dieses Landes als freie Tage der Art Feiertag ein; ein Tag, den schon ein freier Tag bedeckt, wird übersprungen, und das Fach meldet etwa „9 Feiertage eingetragen, 2 standen schon da“ (seit 10.10.2026, VA-261010-feiertage-je)
Vorlesungsfreie Zeiten eintragen (Freie Tage)steht neben „Feiertage eintragen“, nur wenn die Semesterzeiten der eigenen Hochschule noch kommende vorlesungsfreie Zeiten nennen; trägt sie als freie Spannen der Art Vorlesungsfrei mit ihrem Grund ein, eine Spanne mit gleichem erstem und letztem Tag wird übersprungen, und das Fach meldet etwa „2 vorlesungsfreie Zeiten eingetragen, 1 stand schon da“ (seit 14.10.2026, KN-261013-einrichtung-bauen)
Art von … an einem freien Tagstellt ihn zwischen Vorlesungsfrei und Feiertag um und speichert sofort — Tag, Spanne und Grund bleiben, das Raster rechnet neu
× an einem freien Taghebt ihn auf — danach findet dort wieder statt, was die Regel sagt. Zwei Klicks, „ja, endgültig" (seit 23.09.2026, Q09)
× an einer Ausnahmehebt sie auf — bei einer Spanne alle ihre Tage in einem Zug; danach gilt wieder die Regel. Zwei Klicks, „ja, endgültig" (seit 23.09.2026, Q09)
Lernzeitenblendet die Lernvorschläge ein; der Knopf heißt dann „Lernzeiten aus". Seit W22 eine Einstellung (lernzeit.an): Sie übersteht ein Neuladen und steht auch unter Einstellungen → Lernen
× an einem Lernvorschlagwischt ihn weg — er kommt in dieser Ansicht nicht wieder
Lernvorschlag ziehen (Maus oder Stift)legt ihn an einen anderen Platz derselben Woche; er rastet beim Loslassen auf Viertelstunde und Tag ein und bleibt dort, auch nach dem Neuladen. Ein verschobener Block trägt einen gestrichelten Rand; im Fach steht dann An den alten Platz (…) (seit 14.10.2026, BE73)
Winkel zurueck / weiter / Diese Wocheblättert die Woche, ohne zu laden
Knopf eines Sporttermins (Zeile „Sport")setzt den Haken für diesen Termin an diesem Tag, ein zweiter Druck nimmt ihn wieder; der Knopf ist gefüllt, solange der Haken steht, und wartet, bis der Server geantwortet hat (BE29)

Seit dem 16.10.2026 (KN-261015-termin-satz, Befunde B18) steht über einer neuen Veranstaltung ein Feld „In einem Satz: Mo 10–12 …“: „Übung Lineare Algebra Di 14:15–15:45 @ SR 2“ füllt Titel, Art, Wochentag, Beginn, Ende und Ort aus, gespeichert wird erst mit „Anlegen“. Nennt der Satz nur den Beginn, endet die Veranstaltung neunzig Minuten später. Die Regeln und der Rückfall auf den Begleiter sind dieselben wie beim Termin im Kalender (calendar.md, „Ein Termin in einem Satz“); den Leser des Modells reicht der Kalender über Veranstaltungsfensterangaben.leseSatz herein, ohne ihn lesen hier nur die Regeln. Beim Bearbeiten fehlt das Feld.

Das Formular kennt Art (Vorlesung, Übung, Seminar, Praktikum, Tutorium, Sonstiges — und seit dem 21.09.2026 Sport, Arbeit, Lernen), Rhythmus (jede Woche, alle zwei Wochen), Gilt ab / Gilt bis, Ort, Gruppe, Modul, Notiz und — seit dem 24.09.2026, sobald das Konto Personen hat — Dozent, wenn anders als im Modul (BE57). Die leere Wahl sagt, wer es dann ist („— wie im Modul: … —“). Gibt es keine Personenliste (keine Personen, Bereich aus), fehlt das Feld, und das Speichern schickt es gar nicht: Der Server lässt den gesetzten Dozenten dann stehen, statt ihn zu löschen, ohne dass man ihn sehen konnte. Eine Person aus einem anderen Konto nimmt der Server nicht an. Bei Sport, Arbeit und Lernen fehlt das Feld wie Modul und Gruppe.

Eigene feste Blöcke (BE17, ab 21.09.2026)

Sport, Arbeit und Lernen stehen in derselben Tabelle wie die Vorlesungen, und das ist die Entscheidung: Für das Raster ist beides dasselbe — ein Wochentag, eine Zeit, ein Rhythmus, ein Zeitraum. Und für die Kollisionsprüfung erst recht, denn Sport um sieben macht die Übung um sieben genauso unmöglich wie eine zweite Übung. Eine zweite Tabelle hätte dieselbe Rechnung zweimal gebraucht und die Frage „was habe ich am Dienstag" auf zwei Abfragen verteilt.

Der Gültigkeitszeitraum ist derselbe Mechanismus wie bei den Übungsgruppen (BE14). Bens drei Fälle — „immer" · „bis 3.12." · „ab 4.12." — sind „Gilt ab" und „Gilt bis", nichts weiter. „Sport, Di 19–21, bis 3.12." steht bis zum 3. Dezember im Plan, danach nicht mehr, und die Warnung im Formular kennt ihn genauso lange.

Bei einem eigenen Block verschwinden Modul und Übungsgruppe. Sie gehören zu einer Vorlesung; an einem Sporttermin sind sie zwei Felder, die man überliest oder, schlimmer, falsch ausfüllt. Sie werden nicht ausgegraut, sondern weggelassen — und beim Speichern auch dann nicht mitgeschrieben, wenn vorher eine Vorlesung im Formular stand.

Die Übungsgruppe ist ein freier Name — „G3", „Gruppe 3", „Übung B"; jede Hochschule nennt es anders, und eine Liste, die das vorschreibt, wäre beim ersten Modul falsch. Sie steht im Raster als kleine Marke am Titel.

Ein Gruppenwechsel mitten im Semester sind zwei Einträge (BE14): einer bis zum Wechsel, einer ab dem Wechsel. Bens Fall — Analysis ab dem 04.12. von G3 (Mi 9–11) zu G1 (Di 15–17) — ergibt damit am 03.12. eine andere Woche als am 05.12., ohne eine zweite Tabelle. Gerechnet wird tagesgenau: In der Übergangswoche erscheint nur, was vor dem Wechsel liegt.

Der Haken am Sport (BE29, N268, N299, ab 24.09.2026)

Was Ben trainieren will, steht schon im Plan; gespeichert wird nur, dass er da war. Christian hat am 24.09.2026 Entwurf 3 aus BE29 gewählt (N268): ein Haken am Plan, kein neuer Speicher für Einheiten, kein Strava. Eine Zeile in study.veranstaltungshaken (Wanderung 162: Besitzer, Tag, Veranstaltung) heißt „an diesem Tag fand der Termin statt, und das Konto war da". Soll, Ist und Strähne rechnet @shared/handlers/stundenplan/haken.ts — der Schirm, das Briefing und der Nachweis dieselbe Rechnung.

Der Haken sitzt in einer Zeile über dem Raster, nicht im Block (N299). Der Block ist schon ein Knopf (er öffnet das Formular), und am Telefon ist ein Sportblock 38 Bildpunkte breit, sobald Laufen am Samstag das Wochenende einschaltet — ein Haken darin wäre ein Knopf im Knopf und zu klein zum Treffen (Guide §16.1). In der Zeile hat jeder Termin einen eigenen Knopf in voller Größe; der Block zeigt den Haken nur an, und seine Vorlesehilfe endet auf „erledigt".

Im Briefing steht morgens und mittags hinter dem Plan des Tages „Sport diese Woche: 1 von 3." — abends nicht, weil die Zeile dann von morgen spricht (C49), und an einem Tag ohne Veranstaltung nicht als eigene Zeile. Das Briefing fragt über den Anschluss ANSCHLUESSE.stundenplan?.trainingsstand(); der Schalter „Stundenplan" nimmt den Satz mit.

Ausfälle, Verlegungen und Blöcke (BE15, ab 20.09.2026)

Drei Abweichungen von „jeden Dienstag um zehn", und alle drei kommen in einem Semester vor:

ArtWas sie bedeutet
AusfallAm 3. November findet sie nicht statt — Feiertag, Krankheit, Blockwoche. Der häufigste Fall
VerlegungSie findet statt, aber woanders oder zu anderer Zeit. Was die Ausnahme nicht nennt, gilt weiter aus der Regel
ZusatzterminSie findet statt, obwohl das Raster es nicht sagt — so wird eine Blockveranstaltung abgebildet

Die Ausnahme ändert die Veranstaltung nicht. „Analysis fällt am 3. November aus" ist eine Aussage über einen Tag und nicht über die Regel; wer die Regel dafür anfasst, hat danach zwei Regeln und eine Lücke dazwischen. Dieselbe Überlegung wie bei den Übungsgruppen — nur andersherum: Dort war der Wechsel dauerhaft, hier ist er einmalig.

Im Raster verschwindet ein Ausfall, und ein verlegter oder zusätzlicher Termin trägt eine Marke am Titel — seit dem 23.09.2026 mit Zeichen davor (Guide §7.1, N134): verlegt seit E12 (30.09.2026) das eigene Zeichen verlegt — ein Pfeil, der auf einen anderen Platz zeigt; bis dahin lieh es sich weiter, wie der Studienteil, der dieselbe Ausnahmeart genauso zeigt und seither ebenfalls verlegt trägt —, zusatz das Zeichen neu, wie es der Studienteil für seinen Zusatztermin schon tut (eigene Konstante ARTZEICHEN in Ausnahmefach.tsx, gleicher Inhalt, nicht von dort importiert). Dieselben Zeichen stehen jetzt auch vor jeder Zeile im Ausnahmefach — dort zusätzlich blockiert für den Ausfall, den das Raster gar nicht erst zeichnet. Gerechnet wird in @shared (terminAnTag, wocheMitAusnahmen): Die Frage „findet das an diesem Tag statt" ist reine Logik und gehört nicht in ein Bauteil.

Eingetragen wird sie im Ausnahmefach unter dem Formular einer gewählten Veranstaltung. Wer im Raster auf den Dienstag klickt, meint diesen Dienstag: Das Datum steht dann schon da. Aus der Liste heraus gibt es keinen Tag, und dann bleibt das Feld leer — eine geratene Vorbelegung wäre schlimmer als keine — „fällt am 3. November aus" ist kein Satz für sich. Das Formular ändert sich mit der Art: Ein Ausfall zeigt keine Uhrzeitfelder, statt sie auszugrauen. Ein ausgegrautes Feld ist eine Frage, die man nicht beantworten darf, und damit eine Frage zu viel.

Eine Blockwoche ist eine Angabe und keine fünf (ab 21.09.2026). Neben dem Tag steht ein freiwilliges „bis"; steht es da, gilt dieselbe Aussage für jeden Tag der Spanne. Bens Einführungspraktikum vom 9. bis 13. Dezember ist damit ein Handgriff.

Gespeichert wird trotzdem eine Zeile je Tag. Die Tabelle kennt genau eine Aussage je Veranstaltung und Tag, und daran hängt, dass sich ein einzelner Tag nachträglich anders beantworten lässt („am Mittwoch doch im anderen Raum"). Zusammengefasst wird erst beim Anzeigen: In der Liste steht „2026-12-09 – 2026-12-13 · 5 Tage", und das × hebt das ganze Bündel auf. Gebündelt wird nur, was lückenlos aufeinander folgt und inhaltlich gleich ist — wer „9. bis 13.12." liest, soll sich darauf verlassen können, dass dazwischen nichts anderes steht.

Eine Ausnahme wird gelöscht, nicht weggetan — der einzige Ort im Bereich ohne Papierkorb. Sie ist kein Inhalt, sondern die Aussage „hier gilt die Regel nicht"; sie aufzuheben heißt, dass die Regel wieder gilt, und eine aufgehobene Aussage im Papierkorb wäre ein Zustand, den niemand braucht.

Gefragt wird trotzdem (seit dem 23.09.2026, Q09, N165). Was ohne Papierkorb weggeht, fragt in Denotato zweistufig: Das × wird zu „ja, endgültig" und „doch nicht". Bis dahin nahm ein Klick daneben eine Blockwoche samt Ort und Notiz weg, und sie war neu zu tippen. Dasselbe gilt für das × an einem freien Tag.

Freie Tage: vorlesungsfrei oder Feiertag (BE13, ab 21.09.2026; Art seit C37)

Ein Feiertag ist keine Ausnahme, und der Unterschied ist die Reichweite der Aussage:

Worüber sie spricht
Ausnahme (BE15)diese Vorlesung, an diesem Tag
Freier Tagdiesen Tag, und damit über jede Lehrveranstaltung — am Feiertag über jede Veranstaltung —, auch über die, die noch gar nicht eingetragen ist

Die Weihnachtspause wäre als Ausnahme bei vier Veranstaltungen und zwölf Tagen achtundvierzig Einträge für eine einzige Aussage; und wer im Januar eine Veranstaltung nachträgt, hätte sie zu ergänzen vergessen.

Das Modul kommt über den Anschluss ANSCHLUESSE.studium?.module(). Ist das Studium abgeschaltet, gibt es die Auswahl nicht, und der Stundenplan funktioniert trotzdem — ein Import wäre hier der bequeme Fehler gewesen (Grundsatz 43). Ohne „Gilt ab" und „Gilt bis" läuft die Veranstaltung durch — der Normalfall im Semester. Im Kalender endet sie dann am Vorlesungsende des Semesters (VA13; aus den eigenen Semestern im Studium, sonst von der Hochschule, calendar.md); das Raster hier zeigt sie weiter ohne Ende. Bei „alle zwei Wochen" ist „Gilt ab" die Woche, in der sie stattfindet; ohne Angabe zählt jede gerade Woche ab dem Anlegen.

Das Formular warnt, bevor gespeichert wird (BE16): „Überschneidet sich mit Analysis I. Speichern geht trotzdem." Gerechnet wird über die nächsten zwölf Wochen, nicht nur über eine — ein zweiwöchentlicher Rhythmus kollidiert in jeder zweiten Woche, und wer nur die aktuelle ansieht, gibt in der Hälfte der Fälle eine falsche Entwarnung.

Seit dem 21.09.2026 warnt es auch über den Kalender (A23): „Im Kalender steht zur selben Zeit Zahnarzt. Speichern geht trotzdem." Der Stundenplan holt die Termine über ANSCHLUESSE.kalender?.woche(...) — nicht über einen Import und nicht über eine eigene Abfrage auf life.events. Ein Termin aus einem abonnierten fremden Kalender zählt seit dem 22.09.2026 bei dieser Kollisionsprüfung nicht mit (Riss 7, F49, gefiltert in woche.ts) — Denotato warnt nicht vor einem Termin, den es nicht selbst geschrieben hat.

Gespiegelter Sport zählt wie früher die Sportzeile (BE56, N228, gemessen am 24.09.2026). Seit Bens Training aus seinen iCloud-Kalendern kommt, steht es als Spiegel in der Woche; ein Termin in der Kategorie, auf die die aktive Regel art = sport zeigt, trägt dort sport: true und seinen Ort. Eine neue Veranstaltung, die ihn schneidet, bekommt die Warnung wie vor jedem anderen Kalendertermin. Solange eine lebende Sportzeile gleichen Namens zur selben Minute im Stundenplan steht, verdeckt sie den Spiegel als Dublette; liegt sie im Papierkorb, zählt sie nicht mehr, und der Spiegel steht wieder da. verify:stundenplan misst alle drei samt Gegenprobe gegen die Datenbank.

Gefragt wird zweimal: ob es den Bereich calendar in dieser Installation gibt (der Anschluss) und ob dieses Konto ihn hat und eingeschaltet lässt (Feature.EVENTS). Der Anschluss ist eine Zeile im Register und weiß von einzelnen Konten nichts; wer nur ihn fragt, zeigt jemandem, der den Kalender abgeschaltet hat, trotzdem seine Termine. Fehlt eines von beiden, kommt kalender: false mit einer leeren Liste, und das Formular warnt eben nur über das, was es weiß. Ein Fehler wäre hier die falsche Antwort.

Ein Ganztagstermin kollidiert mit nichts. „Geburtstag Toni" am Dienstag macht die Vorlesung um zehn nicht unmöglich, und eine Warnung, die das behauptet, ist eine, die man nach dem dritten Mal wegsieht. Genannt wird er seit dem 15.10.2026 trotzdem, grau und nicht in Warnfarbe (BE16, Christians Wahl W8 vom 14.10.2026): „Am Dienstag steht ganztags: Umzug.“ Der Hinweis hängt am Wochentag und nicht an der Uhrzeit, denn wer den Tag wählt, soll den Umzug schon sehen (ganztagstermine, @shared/handlers/stundenplan/raster.ts).

Gewarnt, nicht verhindert. Zwei Veranstaltungen zur selben Zeit sind ein Zustand, den es gibt: Man hört die eine hälftig, man entscheidet sich später, man trägt beide ein und streicht eine. Ein Formular, das das nicht speichern ließe, wäre im Weg.

Die Warnung hängt an der Zeit, nicht am Titel — man trägt oft zuerst die Uhrzeit ein („passt der Termin überhaupt?") und benennt danach.

Liegt das Ende vor dem Beginn, sagt das Formular es und der Knopf bleibt aus. Der Server prüft dasselbe noch einmal — eine Prüfung, die nur im Browser steht, ist keine.

Automatisch geplante Lernblöcke (BE19, W22, seit 25.09.2026)

Über dem Raster schaltet Lernzeiten blasse Vorschläge ein. Ohne Wochenziel gelten weiter Bens vier Grenzen: höchstens drei Stunden am Tag, nicht vor dem ersten Termin, nicht nach 19 Uhr und streichbar statt verschiebbar. Mit Wochenziel verteilt der Server das Soll gleichmäßig über die gewählten Lerntage, auch auf Tage ohne Termin. Blocklänge, Mindestlänge, Pause, Terminpuffer, Tagesgrenzen, Karten-Block, Blöcke je Übungsblatt und Prüfungsfaktor stehen unter Einstellungen → Lernen.

Der Plan entsteht am Server aus Veranstaltungen, Ausnahmen, freien Tagen, Kalenderterminen und dem Lernstoff des laufenden Semesters. Fristen kommen zuerst; den Rest verteilt Sainte-Laguë nach LP und Prüfungsnähe. Jeder Block nennt Modul und Grund, etwa „Nachbereitung der Vorlesung“, „Blatt 3, fällig Do“ oder „Klausur in 9 Tagen“. Derselbe Plan versorgt Raster, „Heute fachlich“, Morgenbriefing und das MCP-Werkzeug lernzeit_woche.

Im Raster steht der Grund in der Sprache des Kontos (grundInWorten mit Sprache; Sätze aus dem Katalog, Wochentag über Intl); Briefing und MCP bleiben deutsch.

Über dem Raster steht der Wochenstand mit gelernt, geplant, Ziel und gegebenenfalls fehlender Zeit. Ein Sprung führt zu den Lernzeit- Einstellungen. Am Rechner stehen Abhaken und Schließen im Block; Schließen bietet Streichen (später nachholen) und Heute nicht (entfallen). Auf Telefonen und anderen groben Zeigern bleiben die engen Blöcke frei von Kleinstknöpfen: Ein Tipp öffnet ein Handlungsfach mit Abhaken, Streichen und Heute nicht.

Gespeichert wird nur der Vermerk in study.learning_block_marks, nie der berechnete Block. Dadurch bleibt der Plan aus seinen Quellen reproduzierbar. Gehaltene Blöcke zählen als gelernt; gestrichene und vergangene unbestätigte Blöcke werden auf späteren Lerntagen nachgeholt, zuerst für dasselbe Modul. „Heute nicht“ senkt das Soll nicht heimlich, sondern zählt im Wochenstand als entfallen. Mit Wochenziel aus bleibt das Verhalten von BE19 erhalten.

Verschieben (BE73, N468, seit 14.10.2026): Ein Lernvorschlag lässt sich mit Maus oder Stift an einen anderen Platz derselben Woche ziehen. Gespeichert wird nur der Platz, in derselben Zeile von study.learning_block_marks unter dem alten Schlüssel aus Tag und ursprünglichem Beginn (Status verschoben, Spalten moved_day, moved_start, moved_end; Migration 318). Der Plan bleibt gerechnet und legt den Block nur an seinen neuen Platz; Abhaken, Streichen und „Heute nicht“ gehen weiter an den alten Schlüssel, ein abgehakter verschobener Block bleibt, wo er liegt. Ändert sich der Stundenplan so, dass der Block unter seinem Schlüssel nicht mehr entsteht, wirkt die Zeile nicht mehr — lieber ein Vorschlag verloren als ein falscher verschoben. Am Telefon zieht nichts, der Finger scrollt die Woche. Gezogen wird nur, wenn der Server die Woche rechnet; MCP: lernzeit_verschieben.

Scheitert das Laden, hängt der Schirm nicht in der Ladeanzeige fest (F28b, 23.09.2026): Der Ladezustand kommt aus useMenuScreen und nicht aus der Komponente selbst; ein try/finally setzt ihn zurück, auch wenn die Anfrage wirft. Ausnahmefach und Veranstaltungsformular waren davon nicht betroffen — sie standen schon richtig.

Stundenplan einfügen (BE52, ab 24.09.2026)

Über beiden Ansichten steht zugeklappt Stundenplan einfügen. Es ist die seltenste Arbeit auf diesem Schirm — einmal im Semester —, und was sie bringt, zeigen Woche und Liste gleichermaßen; deshalb steht das Fach nicht in einer von beiden, und der eingefügte Text bleibt beim Umschalten erhalten. Der Leertext nennt es als zweiten Weg neben „Veranstaltung“.

Der Weg (N222): Man markiert den Stundenplan in AGNES und fügt ihn ins Feld ein, oder man wählt eine Kalenderdatei (.ics). Die Datei wird im Browser gelesen und landet als Text im Feld; sie geht nicht als Datei zum Server. Für beide gilt dieselbe Grenze von zwei Millionen Zeichen.

Woher der Plan kommt (KN-261013-einrichtung-bauen, ab 14.10.2026): Trägt die eigene Hochschule ein Vorlesungsverzeichnis mit Adresse, steht aufgeklappt über dem Feld ein Satz mit „Vorlesungsverzeichnis öffnen“. Bei HIS-LSF und HISinOne nennt er beide Wege, die Tabelle kopieren oder die Kalenderdatei laden; bei einem reinen Kalenderexport und bei „andere“ nur die Kalenderdatei. Ohne Hochschule fehlt der Satz.

Aus einem abonnierten Kalender (VA-261009-stundenplan, ab 09.10.2026): Hat das Konto unter /calendar ein Abo mit Adresse, steht neben „Datei wählen“ die Auswahl „Aus abonniertem Kalender“. Wer dort ein Abo wählt, leert das Feld; Vorschau und Übernehmen schicken dann statt des Texts die Kennung des Abos (abo), und der Server holt die Adresse bei jedem der beiden Schritte selbst — ohne Merkmal des letzten Abrufs, damit kein leeres „unverändert“ zurückkommt, und ohne etwas am Abo zu schreiben. Tippen oder eine Datei wählen hebt die Wahl wieder auf. Ein Abo aus einer hochgeladenen Datei hat keine Adresse und steht nicht in der Auswahl; über das MCP gewählt, sagt die Antwort, die Datei über „Datei wählen“ einzulesen. Die Grenze von zwei Millionen Zeichen gilt auch für den geholten Text. Ohne Abo gibt es die Auswahl nicht. Die Rechnerfreigabe fragt das Holen nicht: Es ist derselbe Abruf, den der Kalender für dieses Abo ohnehin macht.

Vorschau schickt den Text an /einfuegen/vorschau. Der Server liest ihn, gleicht ihn mit dem Bestand des Kontos ab und schreibt dabei nichts; der Text wird nicht abgelegt. Die Vorschau steht in vier Gruppen mit Überschrift — Veranstaltungen, Ausfälle und Zusatztermine, Freie Tage, Termine ohne Reihe — und jede Zeile trägt ein Häkchen, den Titel, ihren Stand, die gelesene Angabe (Tag, Zeit, Raum, Lehrperson), die Änderungen gegen den Bestand, Überschneidungen mit anderen Veranstaltungen und Kalenderterminen und die Kalenderkategorie, in der sie landen wird.

StandHeißtHäkchen vorgegeben
neusteht so noch nicht im Planja — außer bei Parallelgruppen, siehe unten
geändertsteht im Plan, aber Ende, Rhythmus, Zeitraum, Raum, Gruppe oder eine sicher gelesene Art weichen abja
schon dasteht so im Plannein
nicht mehr im Textsteht im Plan und im Zeitraum des Texts, der Text nennt es aber nichtnein — angehakt geht es in den Papierkorb

Ein Einzeltermin, der schon vorbei ist, steht mit „liegt zurück“ da und ist nicht angehakt.

Parallelgruppen sind nicht vorgewählt (seit dem 24.09.2026, BE66). Ein AGNES-Export trägt jede Übungsgruppe einer Veranstaltung, nicht nur die eigene — gemessen an einem echten Export mit 31 Serien, von denen 21 Parallelgruppen waren. Stehen zu einem Titel mehrere Übungen oder Tutorien im Text, ist keine neue davon angehakt, und über den Zeilen steht je Veranstaltung ein Satz der Form „Experimentalphysik A“: 3 Übungsgruppen im Text; neue sind nicht vorgewählt — hake nur die an, in der du bist. Ihre Ausfälle und Zusatztermine sind ebenfalls nicht angehakt. Wer eine Veranstaltung anhakt, hakt ihre Ausfälle und Zusatztermine mit an (und wieder ab); einzeln bleiben sie abwählbar. Unterscheiden lassen sich die Gruppen an Zeit, Raum und Lehrperson in der Angabe. Eine Gruppe, die schon im Plan steht, findet der Abgleich zuerst im selben Raum — zwei Gruppen zur selben Zeit unterscheiden sich oft nur darin — und zeigt sie als „schon da“.

Die Art lässt sich je Veranstaltung umstellen. Der Leser nimmt sie aus einer Spalte „Art“, sonst aus einem Wort im Titel; ein Wort, das er nicht kennt (Kolloquium, Repetitorium), macht „Sonstiges“, und die Zeile sagt „Die Art ist geraten — bitte prüfen.“ Wer die Art umstellt, bekommt eine neue Vorschau — an der Art hängt die Kategorie — und das Häkchen der Zeile, denn wer die Art ändert, will die Änderung auch haben.

Übernehmen schickt denselben Text noch einmal, mit den angehakten Zeilen und den umgestellten Arten, an /einfuegen/uebernehmen. Der Server rechnet neu und schreibt alles in einer Transaktion — ganz oder gar nicht. Einzeltermine ohne Reihe werden Ereignisse im Kalender (über den Anschluss ereignisse, nur mit Kalender); was in den Papierkorb soll, geht nach dem Schreiben dorthin und lässt sich von dort zurückholen. Danach steht ein Satz da („Übernommen: 6 Veranstaltungen angelegt, 2 Ausfälle und Zusatztermine, 1 freier Tag.“), mit den Zeilen, die übergangen wurden, und Plan, Ausnahmen, freie Tage und Kalendertermine laden neu.

Die Lehrperson wird der eigene Dozent (seit dem 24.09.2026, BE57) — aber nur, wenn genau eine eigene Person außerhalb des Papierkorbs so heißt (Groß- und Kleinschreibung und Ränder zählen nicht). Ein Titel davor („Prof. Dr.“), zwei Namen in einer Zelle oder zwei Personen gleichen Namens ergeben keinen Treffer, und dann bleibt das Feld leer; angelegt wird beim Einfügen niemand. Hält die gefundene Person schon das Modul, bleibt es ebenfalls leer — leer heißt „wie das Modul“. Eine geänderte Veranstaltung mit einem von Hand gesetzten Dozenten behält ihn. Die Vorschau nennt die gelesene Lehrperson in der Angabe (seit BE66), damit Parallelgruppen zu unterscheiden sind; als Änderung zählt sie nicht.

Was gemessen ist und was vermutet (24.09.2026, BE66): Der .ics-Export aus AGNES ist gemessen, an einem echten Export, der nicht im Repository liegt (N218). Er kommt aus HIS-LSF und schreibt den Titel als Veranstaltungsnummer, Bindestrich, Titel und die Lehrpersonen in Klammern; die Art steht als Kategorie (Vorlesung, Übung, Praktikum), Ausfalltage als EXDATE, das Ende der Reihe als UNTIL um 23:59 UTC. Der Leser nimmt die Nummer weg, die Klammer als Lehrperson — außer sie ist selbst eine Art wie „(Übung)“, dann bleibt sie im Titel — und die Art aus der Kategorie vor einem Wort im Titel. Zeiten, Zeiträume, Ausfalltage, ein leerer Ort und ein Ausfall am ersten Tag kamen richtig an. Die Proben in einfuegen.test.ts tragen diese Form als ausgedachtes Beispiel. Vermutet bleibt der kopierte AGNES-Stundenplan: Seine Spaltenköpfe, das „c.t.“ und die Blockangaben stammen aus der Beschreibung in N222, aus einem nachgebauten Beispiel und aus der gemessenen Detailseite (BE45), nicht aus einem kopierten Plan. Ebenfalls vermutet: ob ein Export nach der Belegung nur noch die eigenen Gruppen trägt. Ein Text, den der Leser nicht versteht, meldet sich als „unbekannte Form“ mit Hinweis, statt still nichts zu finden.

Sprachen (09.10.2026, VA-261009-stundenplan-einfuegen): Spaltenköpfe, Wochentage, Rhythmus-, Frei- und Lehrpersonwörter liest der Leser deutsch, englisch, französisch, spanisch und italienisch nebeneinander, ohne dass man eine Sprache wählt; Daten als TT.MM.JJJJ, TT/MM/JJJJ und JJJJ-MM-TT, dazu mit ausgeschriebenem oder abgekürztem Monatsnamen („12 October 2026“, „Oct 12“, „12. Oktober“, „12 octobre“, „12 de octubre de 2026“, „12 ottobre“); fehlt das Jahr, gilt das Jahr, das dem nächsten Datum mit Jahr im Text am nächsten liegt, ohne ein solches das dem Einfügetag nächste. Uhrzeiten mit ausdrücklichem am/pm („9am–12pm“, „9:00 AM - 12:15 PM“) werden gelesen, ohne am/pm bleibt es die 24-Stunden-Uhr. Vermutet ist Tag vor Monat — MM/TT/JJJJ rät der Leser nicht, ein offenbar so gemeintes Datum meldet er als Hinweis.

Eine Grenze: Termine aus einem abonnierten Kalender kommen über kalender.woche nicht an (F49). Steht ein Einzeltermin aus dem Text dort schon, erkennt die Vorschau ihn deshalb nicht als „schon da“ — nur, was Denotato selbst im Kalender hat oder spiegelt.

Der Abgleich mit dem Vorlesungsverzeichnis (BE45, N235, ab 24.09.2026; VA07, VA16)

Bis zum 03.10.2026 hieß er AGNES-Abgleich und las nur agnes.hu-berlin.de. Seit VA07 liest er jede öffentliche Veranstaltungsseite eines HIS-LSF-Verzeichnisses — AGNES an der HU, LSF an HTW, ASH und UdK —, dessen Rechner ein Admin unter Einrichtungen freigegeben hat (N496). Seit VA16 liest er auch die Detailseiten von HISinOne (Polli an der BHT; die HU stellt um): dieselben Termintabellen unter anderen Spaltennamen, der Titel aus den Grunddaten, die Gruppe aus der Legende ihres Abschnitts („Zug 1“).

Die Adresse steht an der Veranstaltung. Das Formular hat unter dem Modul ein Feld „Seite der Veranstaltung im Vorlesungsverzeichnis (Adresse)“ — nur für Lehrveranstaltungen, nicht für eigene Blöcke, und nur, wenn die gewählte Hochschule ein Verzeichnis in HIS-LSF oder HISinOne hat oder im Plan schon eine Adresse steht. Hinein kommt die Adresse der Detailseite, wie der Browser sie zeigt, auch aus einer angemeldeten Sitzung. Gespeichert wird die öffentliche Form, die Denotato aus Rechner, Pfadwort (lupo, qisserver) und Veranstaltungsnummer neu baut (agnesAdresse()); eine Sitzungskennung, auch ;jsessionid=… am Pfad, fällt dabei weg. Bei HISinOne ist das der Permalink der Detailansicht aus Rechner, Pfadwort, Einheit (unitId) und wahlweise Semester (periodId); Navigationsposition und Ablaufschlüssel fallen weg. HISinOne zeigt die Seite erst beim zweiten Abruf: Der erste antwortet mit einer Weiterleitung auf dieselbe Seite und einem Sitzungskeks. Diesen einen Schritt geht Denotato, nur auf denselben Rechner und Pfad, mit dem Keks nur für diesen Abruf. Eine Adresse, die keine Veranstaltungsseite aus einem Vorlesungsverzeichnis ist — kein https, ein Port, Anmeldedaten, ein anderer Pfad oder keine Nummer —, sagt das unter dem Feld und lässt sich nicht speichern; die Datenbank nimmt sie auch selbst nicht an (Wanderung 216, für HISinOne 217). Steht der Rechner noch nicht in den Hostfreigaben, wird die Adresse gespeichert, aber nicht abgerufen, und das Fach nennt den Rechner als Fehler des Abrufs. Mehrere Veranstaltungen dürfen dieselbe Adresse tragen — Vorlesung und Übung stehen oft auf einer Seite.

Ein Verzeichnis, das Denotato nicht liest (TU, FU, jede Art außer HIS-LSF und HISinOne), bekommt kein Feld, aber einen Weg (VA17): An der Stelle des Felds steht der Satz, den Plan dort als Kalenderdatei (.ics) herunterzuladen und unter „Stundenplan einfügen“ zu wählen, mit dem Verweis „Vorlesungsverzeichnis öffnen“ auf die Adresse aus der Einrichtung (neuer Tab). Er steht nur bei einer öffentlichen https-Adresse, nie neben dem Feld und nie bei „keine“. Bei der Art andere nennt er dazu den Rückfall per Sprachmodell (VA08, unten); beim Kalenderexport nicht.

Gelesen wird einmal am Tag, vom Zeitgeber denotato-agnes.timer (06:40, zehn Minuten Streuung) für jedes Konto mit einer Adresse. Er holt die öffentliche Seite ohne Anmeldung, liest ihre Termintabellen und legt die gelesene Seite je Konto und Adresse ab (study.agnes_seiten). Scheitert ein Abruf, bleibt die zuletzt gelesene Seite stehen, und der Fehler steht daneben. Der Abgleich selbst wird nicht abgelegt: Er wird bei jedem Blick gegen den heutigen Stand gerechnet, denn Ben ändert seinen Plan auch zwischen zwei Läufen.

Das Fach steht über „Stundenplan einfügen“ und erscheint nur, wenn eine Veranstaltung eine Adresse trägt. Zugeklappt ist es eine Zeile:

ZeileHeißt
Vorlesungsverzeichnis: 3 Änderungen — ansehenso viele Vorschläge sind offen, über alle Seiten
Vorlesungsverzeichnis: 1 Seite nicht verstanden — anseheneine Seite ist gelesen, aber der Abgleich versteht sie nicht
Vorlesungsverzeichnis: 1 Seite nicht abgerufen — ansehender letzte Abruf ist gescheitert
Vorlesungsverzeichnis: nichts Neuesalles gelesen, nichts offen
Vorlesungsverzeichnis: noch nicht gelesenseit der Adresse ist der Zeitgeber noch nicht gelaufen

Aufgeklappt steht je Seite eine Zeile: der Titel der Seite (sonst die Veranstaltungen, die sie tragen), ihr Stand („2 Änderungen“, „nichts Neues, gelesen“ mit Tag und Uhrzeit, „nicht verstanden — Grund“, „nicht abgerufen — Fehler“; der Grund steht in der Sprache des Kontos und nennt kein bestimmtes Verzeichnis), ein Verweis „im Vorlesungsverzeichnis öffnen“ und, wenn etwas offen ist, „ansehen“. „Jetzt abrufen“ darunter holt die Seiten sofort — eine Seite, die in den letzten fünf Minuten versucht wurde, nicht noch einmal.

Die Vorschau ist dieselbe Liste wie beim Einfügen (Postenliste.tsx): die vier Gruppen, je Zeile Häkchen, Titel, Stand, Angabe, Änderungen und Kategorie; die Art lässt sich umstellen. Die Stände heißen hier „neu auf der Seite“, „geändert“ und „nicht mehr auf der Seite“ — „schon da“ kommt in der Vorschau nicht vor, denn gezeigt wird nur, was offen ist. Darüber steht, welche Gruppe der Seite gilt („Passende Gruppen auf der Seite: Gruppe 2“).

Übernehmen schickt die angehakten Zeilen mit dem Abdruck, den die Vorschau zu jeder Zeile mitgebracht hat. Hat sich zwischen Vorschau und Klick etwas geändert — der Zeitgeber hat eine neue Seite gelesen, Ben hat den Plan geändert —, passt ein Abdruck nicht mehr, und es wird nichts gesetzt, mit der Bitte, die Vorschau neu zu laden. Eine neue Veranstaltung aus der Seite (eine Gruppe, die Ben noch nicht hat) bekommt Adresse und Modul mit. Beiseitelegen legt die angehakten Vorschläge ab, ohne sie zu übernehmen; sie kommen nicht wieder, solange die Seite sie nicht ändert. Beides wird je Adresse als quittierter Abdruck gemerkt.

Welche Gruppe gilt, entscheidet die Gruppe an der Veranstaltung („G2“, „Gruppe 2“ und „2“ sind dieselbe); steht keine da, die, deren Tag und Beginn zur Veranstaltung passen. Ist das nicht eindeutig, ist die Seite nicht verstanden — lieber das als Vorschläge aus einer fremden Gruppe. Ebenso eine Seite, deren Terminzeile der Leser nicht lesen kann („nach Vereinbarung“), oder eine, die gar keine Termintabelle trägt. Nicht verstanden und nicht abgerufen stehen außerdem im Störungsbuch (Quelle agnes). Was schon vorbei ist, fällt aus dem Plan.

Gemessen am 24.09.2026 gegen eine echte öffentliche Seite im Wegwerf-Aufbau: zwei Terminzeilen in einer Gruppe (wöchentlich und vierzehntäglich), Ausfälle in „fällt aus am“; die wöchentliche Zeile kam als neu, die vierzehntägliche als geändert (Raum), die Ausfälle als Vorschläge. Die Seite selbst ist nicht im Repository (N218).

Nicht dabei: Fachini (N235), und Prüfungstermine als eigene Sorte — ein Prüfungstermin, der als Einzeltermin in einer Gruppe steht, kommt als „Termin ohne Reihe“; ob AGNES Prüfungen auf der Detailseite eigens führt, ist nicht gemessen.

Der Rückfall per Sprachmodell (VA08, N502, ab 04.10.2026)

Für ein Verzeichnis der Art andere (TU, FU, Charité, KHB) hat Denotato keinen Wandler. Dort liest auf Wunsch ein Sprachmodell die öffentliche Seite einer Veranstaltung und bringt ihre regelmäßigen Termine in Denotatos Form; in den Stundenplan kommt ein Termin erst auf Klick.

Das Fach steht unter dem Abgleich mit dem Vorlesungsverzeichnis, wenn das Verzeichnis der eigenen Einrichtung die Art andere hat oder noch Vorschläge offen sind. Zugeklappt ist es eine Zeile:

ZeileHeißt
Vom Modell gelesen: 2 Vorschlägeso viele Vorschläge sind offen, über alle Seiten
Veranstaltungsseite vom Modell lesen lassennichts offen

Aufgeklappt steht bei der Art andere ein Feld für die Adresse der Seite mit „Lesen“ und darunter der Satz, was hinausgeht und was es kostet. Je offenem Vorschlag folgen Titel, eine Zeile mit Art, Tag, Zeit, Rhythmus, Zeitraum, Ort, Gruppe und Dozent, das Zeichen des Begleiters mit „vom Modell gelesen aus “ und dem Rechner, und die Knöpfe „Übernehmen“ und „Verwerfen“. Ohne die Art andere, aber mit offenen Vorschlägen (die Einrichtung wurde gewechselt) fehlt das Feld, die Vorschläge bleiben.

Lesen prüft die Adresse — https, ohne Port und Anmeldedaten, höchstens 900 Zeichen, auf dem Rechner des Verzeichnisses der eigenen Einrichtung, und dieser Rechner in den Hostfreigaben. Der Rechner ist fest und nicht einstellbar: Sonst ließe sich über ein Konto jede freigegebene Seite auf Kosten seines Kontingents lesen. Dann holt der Server die Seite und nimmt ihren Text (höchstens 12 000 Zeichen). Was hinausgeht: dieser Text und die Adresse, nichts aus dem Konto.

Einmal gelesen, oft benutzt. Der Stand einer Seite ist der SHA-256 ihres Texts. Ist dieselbe Adresse im selben Stand schon gelesen — auch von einem anderen Konto —, kommt die Lesung aus dem geteilten Zwischenspeicher, kostet nichts, und die Meldung sagt das. Sonst ruft der Server den Begleiter mit dem Anlass verzeichnis-lesen (zehn am Tag); die erste Lesung zählt gegen den Deckel des Kontos, das sie auslöst.

Was die Meldung sagt: wie viele Vorschläge offen sind, ob die Seite aus dem Speicher kam und wie viele Einträge der Antwort nicht in Denotatos Form passten und wegfielen. Hat das Modell nicht gelesen — kein Schlüssel, Deckel erreicht, Begleiter abgeschaltet, Antwort unbrauchbar —, steht der Grund da, und nichts wird angelegt (Grundsatz 40). Nur eine unbrauchbare Antwort kommt mit ihrem Grund in den Speicher, denn sie liegt an der Seite; alles andere liegt am Augenblick.

Übernehmen legt aus genau einem Vorschlag eine Veranstaltung an, geprüft wie eine Eingabe von Hand; den Dozenten sucht Denotato unter den eigenen Personen und legt keinen an. Die Veranstaltung trägt die Seite in gelesen_von, und ihr Formular nennt über den Feldern „Vom Modell gelesen aus“ mit dem Verweis auf die Seite. Verwerfen legt nichts an. Ein erledigter Vorschlag kommt aus derselben Seite im selben Stand nicht wieder; ändert sich die Seite, ist es ein neuer Stand.

Die Mitschrift zur Vorlesung (KI-261007-ablage-vorschlaege)

Beginnt eine Vorlesung oder ein Seminar in höchstens 15 Minuten oder läuft sie schon, bietet der Begleiter beim nächsten Blick auf seine Karten „Seite für die Mitschrift anlegen?“ an (stundenplan/server/mitschriftkarten.ts, Herkunft vorlesung). Der Titel ist „Veranstaltung · TT.MM.JJJJ“; Termin, Modul und jüngstes Skript des Moduls stehen oben auf der Seite. Woher die Veranstaltung stammt, spielt keine Rolle. Gibt es die Seite schon, kommt keine Karte; „Nicht jetzt“ gilt für diesen Termin, nächste Woche fragt der Begleiter wieder. Der Schalter heißt „Wenn eine Vorlesung beginnt“. Ein Thema der Sitzung fehlt im Titel: Kein Bereich führt einen datierten Themenplan.

Woher die Daten kommen

/api/stundenplan mit seinen Unterwegen — Veranstaltungen, Ausnahmen, freie Tage, Kalendertermine; der Rückfall unter /api/stundenplan/verzeichnis/ mit lesen, vorschlaege, uebernehmen und verwerfen (MCP stundenplan_verzeichnis_*). Seine Tabellen sind study.verzeichnis_lesungen (geteilter Zwischenspeicher, ohne Besitzer) und study.verzeichnis_vorschlaege (je Konto, mit Zeilensicherheit), Wanderung 218.

Aufgehoben wird unter stundenplan.veranstaltungen, stundenplan.ausnahmen und stundenplan.freietage (G03, 21.09.2026, Rahmen 7). Die Kalendertermine nicht: Sie gehören zu einer Woche, und ein Rückfall unter einem Schlüssel zeigte beim nächsten Ausfall die Termine der vorigen Woche unter dem Datum der jetzigen.

Jede Zeile der Kalendertermine trägt kategorie und farbe (seit 23.09.2026, AP5, BE41) — der Name der Kategorie, in die der Termin fällt, und ihre Farbe als #rrggbb. Gerechnet wird im Kalender (calendar/server/woche.ts) mit der Lage und der Zuordnung des Abgleichs (ladeKategorienlage, ordneTerminZu in calendarCollector.ts), nicht im Stundenplan. Fehlen beide Felder, hat das Konto keine Kategorien; kategorie: null heißt „fällt in keine", und ein gespiegelter Termin trägt dann die Farbe seines fremden Kalenders. Die Farbe ist die der eigenen Kategorie, auch wenn sie in den Kalender einer anderen schreibt. Ein Ereignis, das eine Regel an diesem Tag unterdrückt, bleibt in der Woche stehen — es findet statt und kollidiert — und nennt keine Kategorie. Eine ruhende Kategorie (aktiv: false) wird dagegen genannt, mit Name und Farbe: Das Ereignis fällt in sie, nur schreibt sie nichts — der Abgleich und kommende im Kalender führen es deshalb nicht (Seitendatei calendar.md, Punkt 107). Gefragt wird die Zuordnung am Tag in der Zone des Kontos, wie im Abgleich; eine Übersteuerung an einem Tag greift deshalb auch jenseits der Datumsgrenze. Ein gespiegelter Termin, dessen Kategorie weggetan ist, zählt als ohne Kategorie (seit 23.09.2026). Der Client (holeKalendertermine) reicht die Felder durch; das Raster benutzt sie noch nicht (Punkt 27).

Die Haken (BE29) liest GET /api/stundenplan/haken als Liste aus Veranstaltung und Tag, alle auf einmal; POST /api/stundenplan/haken/setzen mit veranstaltungId, tag und erledigt setzt oder nimmt einen. Aufgehoben werden sie unter stundenplan.haken. Ein Haken an einer Veranstaltung im Papierkorb wird nicht gelesen. MCP: stundenplan_haken, stundenplan_haken_setzen.

Seit dem 24.09.2026 tragen die Zeilen auch ort und, an einem Sporttermin, sport: true (BE56, N228). ort ist das Feld „Ort“ des Termins, null heißt „keiner eingetragen“. Sport ist, was in der Kategorie landet, auf die die aktive Regel art = sport zeigt (Seitendatei calendar.md, „Ort und Sport“); fehlt sport, ist der Termin keiner. Das Raster und die Warnung zeigen den Ort noch nicht — die Felder sind die Quelle für Briefing und Losfahrzeit (BE18).

Die Eule sieht die Woche durch (KI18, 27.09.2026). In der schwebenden Eule steht „Die Woche durchsehen“ als Knopf. Er schickt nur die Kennung des Angebots an BEGLEITER_ANGEBOT. Gelesen werden dieselben Termine wie bei „Die Woche in einem Satz“ im Kalender — heute bis in sechs Tagen, eigene, Stundenplan und eingeschaltete fremde Kalender, ohne Dubletten (calendar.md); der Leser gehört dem Kalender, und ohne Kalender gibt es das Angebot nicht. Die Anweisung ist eine andere: höchstens vier Sätze dazu, wo Zeit frei bleibt und wo es eng wird. Ein Klick zählt als freie Frage; was dahinter steht, sagt docs/seiten/begleiter.md, Abschnitt „Die Angebote der Eule“.

Als Baustein im Wiki (WI-261008-bausteine-artikel)

Stumm und mit festen Beispieldaten; Form und Wortlaut stehen in wiki.md unter „Bausteine im Artikel“. Zwei Bausteine: das Wochenraster (stundenplan.week-grid, Block) mit drei Veranstaltungen in der Woche vom 05.10.2026 und der Knopf „Lernzeiten“ (stundenplan.study-times, im Satz).

Was fehlt

  1. Die Gruppe hat keine Übersicht. Welche Gruppen ein Modul hat und ab wann welche gilt, steht nur verteilt in den Veranstaltungen. Eine Zeile „Analysis I: G3 bis 03.12., dann G1" gibt es nirgends — und das wäre die Auskunft, die man bei der Wahl der Gruppe braucht.
  2. Keine Farbe zur Wahl. farbe wird gespeichert und angezeigt, aber nirgends gesetzt; alle Blöcke tragen die Bereichsfarbe — auch die eigenen (Sport, Arbeit, Lernen), die sich im Raster deshalb nicht von einer Vorlesung unterscheiden. Ein Farbwähler ist eine ästhetische Entscheidung (Grundsatz 9) und gehört Christian.
  3. Eine Ausnahme lässt sich nicht verschieben. Eintragen geht seit dem 21.09.2026 auch für eine Spanne, aufheben ebenfalls — aber „derselbe Block, eine Woche später" heißt: alte Spanne aufheben, neue eintragen. Ein „Verschieben" gibt es nicht, und bei einer Blockwoche merkt man das.
  4. Der Weg zum Kalender ist einseitig. Seit dem 21.09.2026 fragt der Stundenplan die Kalendertermine ab (A23) — umgekehrt weiß /calendar weiterhin nichts von den Vorlesungen. Für jemanden, der zwölf Wochen lang dieselben vier Blöcke hat, ist das ein halber Kalender. Die Rückrichtung ist mehr Arbeit: Eine Veranstaltung ist eine Regel, und der Kalender müsste sie auflösen oder als Wiederholungsregel schreiben. Die Rechnung gibt es seit dem 22.09.2026 — @shared/handlers/stundenplan/serien.ts macht aus jeder Veranstaltung eine Wiederholungsregel mit Endtag und Takt, den Ausfalltagen als Ausnahmedatum (EXDATE nach RFC 5545) und den Verlegungen als Überschreibung statt als zweitem Termin; gemessen am Bestand sind das 22 Serien. Was weiterhin fehlt, ist der Zielkalender: Kalendertermin.art kennt keinen Wert für den Stundenplan, und bis das über die Kategorie statt über die Art entschieden wird, geht nichts hinaus (BE37).
  5. Keine Losfahrzeit (BE18). „Um 10:15 Analysis" sagt nicht, wann man aufbrechen muss; dafür bräuchte es die Wege zwischen den Orten. Das Briefing nennt die Veranstaltungen des Tages seit dem 20.09.2026, aber ohne diese Rechnung. Eine gerechnete Fahrzeit wird es auch nicht geben: Es gibt in Denotato keinen Kartendienst, und ort ist Freitext. Was ginge, ist eine eingetragene Zeit je Kategorie — der Kalendervertrag bildet sie als Ableitung ab.
  6. Keine Woche in der Adresse. ?woche= gibt es nicht; wer den Schirm aufruft, landet immer in dieser Woche. Ein Verweis auf eine bestimmte Woche ist damit nicht möglich.
  7. Überschneidungen werden gemeldet, aber nicht aufgelöst. Das Formular warnt vorher (20.09.2026), über beide Quellen (21.09.2026), und im Raster stehen die Blöcke seit dem 21.09.2026 nebeneinander. Was fehlt, ist der Weg aus der Kollision heraus. Seit dem 15.10.2026 nennt das Formular einen Ausweg (BE16, W7): Gruppen desselben Moduls, die man mit dem Haken „Besuche ich“ aus als Ausweg eingetragen hat (gewaehlt = false, Migration 327), und welche davon frei ist; ist keine frei, die freien Zeiten derselben Länge über die zwölf Wochen, Rhythmus mitgerechnet. Eine nicht besuchte Gruppe steht in keinem Raster, Kalender, Briefing oder Rückblick, nur in der Liste mit „· nicht besucht“. Was bleibt: Die Fahrzeit (BE18) fehlt ganz. Zwei Termine, die sich nicht überschneiden, können trotzdem unmöglich sein, wenn eine halbe Stadt dazwischenliegt.
  8. Kein Import. Seit dem 24.09.2026 gibt es das Einfügen (BE52, N222): die aus AGNES kopierte Tabelle oder ein .ics-Export, mit Vorschau und Abgleich gegen den Bestand — Abschnitt „Stundenplan einfügen“. Was bleibt: Der Abgleich läuft nur, wenn man einfügt; dass Denotato selbst merkt, wenn sich AGNES ändert, ist BE45. Seit dem 24.09.2026 merkt Denotato es selbst (BE45, N235): Eine Veranstaltung mit AGNES-Adresse wird einmal am Tag abgeglichen, Abschnitt „Der Abgleich mit dem Vorlesungsverzeichnis“. Die Feiertage werden weiter abgetippt, außer sie stehen im eingefügten Text — sie stehen in jedem Bundesland-Kalender und ließen sich holen.
  9. Keine Sicht auf das Semester. „Gilt ab" und „Gilt bis" werden ausgewertet, aber nirgends zusammengefasst: Es gibt keine Anzeige, in welcher Semesterwoche man ist oder wie viele noch kommen. Die freien Tage wüssten es jetzt mit.
  10. Das Raster ist nicht bedienbar. Verschieben oder in der Länge ziehen geht nicht; jede Änderung läuft über das Formular. Für einen Plan, den man einmal einträgt, ist das richtig — beim ersten Umstellen merkt man es.
  11. Lernzeiten sind nicht einstellbar und werden nicht gemerkt. Seit dem 24.09.2026 sind Bens Zahlen und der Schalter Einstellungen (W22, Schritt 1) — unter Einstellungen → Lernen, mit seinen Werten als Vorgabe; Abschnitt „Lernblöcke als Vorschlag". Was bleibt: Das Weggewischte vergisst sich beim Neuladen (W22, Schritt 6). Ein Tag ohne Termin bekommt keinen Vorschlag. Mit Wochenziel bekommt er seit dem 24.09.2026 seine Blöcke ab „Ohne Termin ab" (W22, Schritt 2; Abschnitt „Die Woche nach dem Wochenziel").
  12. Der Dozent des Moduls lässt sich hier nicht setzen. Seit BE57 (24.09.2026) steht an der Veranstaltung ein eigener, wenn jemand anderes sie hält; der des Moduls wird weiter nur angezeigt, und wer ihn ändern will, geht nach /study — ein Verweis vom Formular aus wäre ein Klick statt dreier. Wer im Stundenplan als eigener Dozent gewählt wird, bekommt nicht das Merkmal „Dozent“ der Person (is_lecturer): Das gehört dem Personenbereich, und der Stundenplan schreibt nicht hinüber.
  13. Die Kalendertermine fallen nicht zurück — mit Absicht, weil sie zu einer Woche gehören. Richtig wäre ein Schlüssel je Woche; heute sieht man bei einem Ausfall das Raster und darin keine Termine (G03, Rahmen 7).
  14. Der Stundenplan steht erst nach einer neuen Freigabe in einem fremden Kalender (BE37, seit 23.09.2026 abends). Der Schreibweg ist gebaut: Kalendertermin.art ist für eine Veranstaltung null, ihr Zielkalender kommt allein aus der Kategorie (N157), und das Buch steht in life.calendar_entries statt in life.calendar_links. Hinaus geht er aber nur über eine schreibende Kategorie, die seit dem 24.09.2026 freigegeben ist (STUNDENPLAN_FREIGABE_AB in calendarSync.ts); eine ältere Freigabe galt einem Probelauf, der ihn nicht schreiben konnte, und der Bericht stellt ihn dann unter zurueckgestellt. Bei Ben stehen Uni und Sport heute auf „schreibt nicht" — nichts geht hinaus, bis er nach dem Probelauf umstellt und freigibt. Eine Zeile ohne passende Kategorie geht nie hinaus.
  15. Fünf Veranstaltungen haben keinen Anfang. Gemessen am 22.09.2026: 17 von 22 tragen ab, fünf nicht. „Schon immer" hat keinen ersten Tag, und eine Serie braucht einen — heute nimmt der Sammler ersatzweise den Montag der laufenden Woche, und damit wandert der Serienanfang dieser fünf jede Woche weiter. Sauber löste das erst ein Semesterbeginn am Konto; gesucht in study.veranstaltungen und study.semester — ein Bezug zwischen beiden gibt es nicht.
  16. Die schon eingetragenen Feiertage sind noch vorlesungsfrei. Feiertag und vorlesungsfrei sind dasselbe. Gebaut am 23.09.2026 (C37, Christians Entscheidung N149): study.freie_tage.art (Wanderung 115, feiertag oder vorlesungsfrei, mit Prüfung in der Datenbank), die Auswahl im Fach, art an Route und MCP und die eine Regel in @shared. Was bleibt, ist mit Absicht Handarbeit: Jede Zeile von vor Wanderung 115 ist vorlesungsfrei, auch ein eingetragener 25. Dezember — geraten wird nicht, auch nicht am Titel. Bis jemand ihn im Fach auf „Feiertag" stellt, bleibt dort der Sport stehen.
  17. Abgabetermine je Modul gibt es nicht. Der häufigste Termin des Semesters — Blatt dienstags, Abgabe montags, vierzehnmal — hat in Denotato keine Ablage. Gesucht in study.exercises: kein Ausgabetag, kein Abgabetag; study.exercise_attempts.due_again_on ist die Wiedervorlage eines Versuchs, nicht der Rhythmus eines Moduls. BE39.
  18. Anmeldeschluss und Rücktrittsfrist fehlen. Gesucht in study.exams (sechzehn Spalten, gemessen) und per grep über packages/ nach einer festen Drei-Wochen-Regel: Es gibt weder ein Feld noch eine Regel, die zu ersetzen wäre. Eine abgeleitete Frist ohne hinterlegte Vorlaufzeit wäre eine erfundene Zahl, und auf eine erfundene Frist verlässt man sich. BE38.
  19. Ausfälle und Verlegungen gehen über CalDAV hinaus, die Kalenderadresse führt den Stundenplan gar nicht. Die Serie trägt je Ausfall, freiem Tag und verlegtem Tag ein EXDATE im Werttyp ihres DTSTART (DTSTART;TZID=… samt VTIMEZONE); eine Verlegung steht als eigener Termin mit eigenem Raum daneben, ohne RECURRENCE-ID (N157). Nachgewiesen in verify:caldav und verify:kalenderanbieter (Abschnitt m); an einem echten Konto geprüft ist es erst nach Bens Freigabe — BE42. Die ICS-Adresse (ausgabe.ts) sammelt nur Prüfungen und Fristen.
  20. Die Zuordnung der Ausnahmezeichen steht doppelt. Der Wunschname verlegt, bis hierher der Kopf dieses Punkts, ist seit dem 30.09.2026 gezeichnet (E12): Stundenplan und Studienteil tragen ihn statt des geliehenen weiter. Offen bleibt die Doppelung: Die Zuordnung selbst — ARTZEICHEN/ARTTON in Ausnahmefach.tsx — verdoppelt inhaltlich, was der Studienteil für den Zusatztermin schon hat (AUSNAHMEZEICHEN in study/client/HeuteFachlich.tsx); ein Import quer über zwei abschaltbare Bereiche ginge nicht (Grundsatz 43), ein gemeinsamer Platz in @shared/types/stundenplan.ts schon.
  21. Der freie Tag trägt kein Zeichen — mit Absicht. Fläche und Wort sind eindeutig genug; kalender ist schon an „Woche" vergeben, und mond passt ohne einen zweiten Blick nicht sicher auf „vorlesungsfrei". Ein Zeichen kommt erst, wenn eines in der Registry eindeutig dafür steht.
  22. Ein gespiegelter Termin sieht im Raster aus wie ein eigener. Die Anfrage liefert herkunft: "spiegel" und den Kalendernamen mit (BE43), das Raster zeichnet beide gleich blass und nennt den Kalender nicht.
  23. Zwischen den zwei Arten gibt es nichts. Seit C37 wählt man je freiem Tag „alles" (Feiertag) oder „nur die Lehre" (vorlesungsfrei); was an einem vorlesungsfreien Tag entfällt, steht weiter als Eigenschaft je Art im Code (ENTFAELLT_AN_FREIEN_TAGEN). Wer an einem Tag die Lehre und den Sport streichen, die Arbeit aber behalten will, hat keinen Weg außer einem Feiertag und einem Zusatztermin für die Arbeit. Eine feinere Wahl wäre eine Liste je freiem Tag statt einer Art — nicht gebaut, und bisher von niemandem verlangt.
  24. Eine einzelne Veranstaltung kann nicht sagen „ich finde auch am freien Tag statt". Ein Feld je Veranstaltung wäre eine neue Spalte in study.veranstaltungen — eine Entscheidung für Christian, nicht gebaut. Für einen einzelnen Tag gibt es den Weg schon: einen Zusatztermin; er gilt am freien Tag auch für eine Vorlesung.
  25. Ob ein vorlesungsfreier Tag Lernvorschläge bekommt, ist nicht entschieden. Entschieden am 24.09.2026 (N279): Ein freier Tag ist für die Lernvorschläge ein Tag wie jeder andere, ein Feiertag eingeschlossen. Was dasteht, setzt die Grenze. Seit dem 23.09.2026 bleibt der Sport an einem vorlesungsfreien Tag stehen (E2), und damit schlägt das Raster am dies academicus nach der Sporteinheit drei Stunden Lernen vor. An einem Feiertag fällt der Sport seit C37 weg und mit ihm ohne Wochenziel meist der Vorschlag; ein Kalender- oder Zusatztermin zieht dort weiter einen nach sich. Mit Wochenziel bekommt ein freier Tag, der Lerntag ist, seine Blöcke wie jeder andere — steht dort nichts, ab „Ohne Termin ab" —, ein Feiertag ohne Sport also seinen vollen Anteil am Ziel. Christian hat das so gewählt, gegen die Empfehlung, den Feiertag freizuhalten und sein Ziel auf die übrigen Lerntage zu verteilen. Wer an einem freien Tag nicht lernen will, wischt die Blöcke weg; bis W22, Schritt 6, kommen sie nach dem Neuladen wieder. Ein Test des Rasters hält die Regel fest.
  26. Im Raster sieht ein Feiertag aus wie ein vorlesungsfreier Tag. Beide tragen dieselbe Schraffur und nur den Grund im Spaltenkopf; die Art steht allein im Fach „Freie Tage". Was sie bewirkt, sieht man an dem, was fehlt — am Feiertag auch der Sport. Ein eigenes Zeichen oder ein Wort im Kopf wäre eine Gestaltungsfrage (Punkt 21, Grundsatz 9) und ist nicht gebaut.
  27. Das Raster färbt Kalendertermine nicht nach ihrer Kategorie. Seit dem 23.09.2026 trägt jede Zeile kategorie und farbe (AP5, BE41), das Raster zeichnet trotzdem alle Kalendertermine im selben blassen Ton. Die Farbe hineinzunehmen ist eine sichtbare Änderung am Raster und braucht einen eigenen Blick (Kontrast der Kategoriefarbe gegen den Hintergrund einer Vorlesung); nicht gebaut.
  28. Ein eigenes Ereignis zur Minute einer Vorlesung kollidiert mit ihr. Wer in Denotato ein Ereignis „Erste Vorlesung: Fach" neben die Vorlesung „Fach (VL)" legt, sieht im Raster eine Überschneidung, die keine ist, und in kommende beide. Die Dublettenprüfung vergleicht nur Spiegel mit Denotato, nie zwei eigene Termine (AP4, 23.09.2026) — ob sie das künftig tun soll, ist eine Entscheidung für Christian. Bis dahin ist so ein Ereignis ein Kandidat zum Löschen.
  29. Das Raster sagt nicht, was es ausgeblendet hat. Fällt ein Termin aus einem Exportkalender als Dublette einer Vorlesung weg, steht davon nirgends ein Wort; wer den Termin im Telefon sieht und hier nicht, muss wissen, dass er als Vorlesung dieses Plans dasteht.
  30. Eine Vorlesung aus dem Export an einem freien Tag steht als Kalendertermin da. Der freie Tag nimmt das Vorkommen aus diesem Plan; der Export weiß davon nichts, und sein Termin hat nichts mehr, gegen das er fallen könnte. Er steht blass im Raster — an dem Tag, an dem die Vorlesung ausfällt.
  31. Ein wiederkehrender fremder Termin zur Minute einer Vorlesung fällt im Exportkalender weg. Steht in einem Uni-Kalender, der als Export dieses Plans gilt, jede Woche etwas genau mit Beginn und Ende einer Vorlesung und ohne widersprechendes Wort, hält Denotato es für deren Abschrift; im Raster fehlt dann die Kollision. Ein einzelner Eintrag bleibt seit der Prüfung vom 23.09.2026 stehen.
  32. In der vorlesungsfreien Zeit erkennt das Raster keinen Export. Ob ein Kalender ein Export dieses Plans ist, misst Denotato eine Woche zurück und vier voraus, gerechnet ab heute — für jede Woche, die man ansieht, dasselbe Urteil. Wer mehr als vier Wochen vor dem Semesterbeginn schon dessen erste Woche öffnet, bekommt nur den Titelvergleich: Ein Kurscode ohne gemeinsames Wort („MAT-2 VL" neben „Algebra II (VL)") kollidiert dann mit der Vorlesung, bis das Semester im Fenster liegt.
  33. Der Haken an Kalendersport hängt an keinem Fremdschlüssel. Geht der Termin aus dem Kalender oder aus der Sportkategorie, bleibt die Zeile in study.calendar_event_checks liegen und zählt nicht mehr, weil kein Soll zu ihr gehört. Ein eigenes Ereignis aus Denotato trägt im Briefing kein sport; die Zahl allein, ohne Plan des Tages, nennt das Briefing deshalb nur an einem Tag mit gespiegeltem Sport (BE-261007-sport-ohne-stundenplan).
  34. Der Haken ist keine Messung. Er kostet nichts, und niemand sieht zu (BE29, „Was es aufgibt"). Dauer, Strecke und Puls gibt es nicht; sie gehören zu Strava und damit zu NB07.
  35. Ein abonnierter Stundenplan gleicht sich nicht von selbst ab. Seit dem 09.10.2026 lässt sich ein Abo im Fach „Stundenplan einfügen“ wählen (VA-261009-stundenplan) — aber nur auf Klick. Dass Denotato ein Abo als Quelle des Stundenplans markiert und es wie die Seiten des Vorlesungsverzeichnisses regelmäßig abgleicht, fehlt; das wäre die volle Fassung des Vorgangs, mit einer Spalte am Abo oder am Konto und einem Zeitgeber.