Glossar
Begriffe, die in Prilog-internen Diskussionen vorkommen — kurze Definitionen, damit beim Onboarding niemand raten muss.
A
ADR — Architecture Decision Record
Markdown-Dokument das eine architektonische Entscheidung festhält: Kontext, Optionen, Entscheidung, Konsequenzen. Hilft, später nachzu- vollziehen warum etwas so gebaut ist. Format-Skeleton in 05-templates.md.
Audience
Generische Klassifikation einer Person: staff, guardian, minor, external. Tenant-unabhängig, im Gegensatz zum userType (= Schul- spezifische Bezeichnung wie „Lehrkraft").
Audit-Log
Append-only-Tabelle, in der alle schreibenden Aktionen protokolliert werden. Pflicht für DSGVO-Compliance. Pro Eintrag: Tenant, Actor (mit optional pseudonymisiertem Hash), EventType, EntityRef, Before/After-JSON.
B
Break-Glass
Notfall-Zugriff auf eine Resource für die der User normalerweise keine Berechtigung hat. Pflicht-Begründung ≥ 20 Zeichen, max. 24h gültig, voll auditiert. Beispiel: Admin braucht Zugriff auf Zeugnis eines kranken Lehrers vor Zeugnisausgabe.
C
Capability-Flag
Boolean-Flag an einer Rolle (FunctionalRoleType), das einen Endpoint oder eine UI-Aktion freischaltet. Beispiele: canWriteSubjectReports, canApproveReports, manageUsers. Wir prüfen sie in Endpoint-Pre- Handlern (requireWorkspaceAdmin etc.).
Canary Deployment
Neuer Code geht zuerst auf 1 Tenant (oder 5 %), dann nach Zeit X ohne Vorfall auf alle. Begrenzt Schaden, wenn ein Deploy schief geht.
Compliance-Gate
Karte in der DSB-Konsole pro Datenschutz-Pflicht (DSFA, AVV, TOMs etc.). Schule muss vor Aktivierung eines Moduls die Karte „freigeben" — sonst darf der Modul-Endpoint nicht laufen. Implementiert in compliance.service.ts.
ContactView
Vereinheitlichtes Datenmodell im Frontend, das Mitglieder (UserAccount), externe Personen (Person) und Organisationen (Person.kind=organization) über das gleiche Layout darstellbar macht.
CRM-Foundation
Wir migrieren von einem alten UserDirectoryEntry-Modell zu einem neuen Person + UserAccount-Modell. „CRM v2" ist der neue Stand, isCrmV2(tenantId) zeigt ob ein Tenant migriert ist.
D
DoD — Definition of Done
Liste von Bedingungen, die erfüllt sein müssen, bevor ein Sprint als „done" markiert werden darf. Bei uns = die Pflicht-Checkliste in 01-pflicht-checkliste.md.
DoR — Definition of Ready
Liste von Bedingungen, die erfüllt sein müssen, bevor ein Ticket in einen Sprint aufgenommen werden darf (Spec klar, Akzeptanzkriterien existieren, …).
DSFA — Datenschutz-Folgenabschätzung
Pflicht-Anlage nach Art. 35 DSGVO bei riskanten Verarbeitungen (personenbezogene Daten von Minderjährigen, KI-Verarbeitung etc.). Prilog liefert Muster, Schule unterzeichnet + lädt hoch.
DSB-Konsole
Tab in Settings → Datenschutz, in dem der/die Datenschutzbeauftragte der Schule alle Datenschutz-Gates aktiviert/sperrt und Audit-Log durchsieht.
E
Event Sourcing
Pattern, bei dem nicht der aktuelle Zustand gespeichert wird, sondern jede Zustandsänderung als unveränderliches Event. Aktueller Zustand = Reduktion über alle Events.
F
Feature Flag
Schalter, der ein Feature ein/aus schaltet ohne Deploy. Pro Tenant unterschiedlich setzbar. Nützlich für Beta-Releases und Notfall-Kill.
Funktions-Rolle (FunctionalRoleType)
Schul-spezifische Rolle (z. B. „Klassenleitung", „Schulleitung", „Sekretariat"), an der die Capability-Flags hängen. Eine Person kann mehrere Funktions-Rollen haben (FunctionalRoleGrant).
G
GradeBand
Tenant-spezifisches Klassenstufen-Band (z. B. „Unterstufe 1-4", „Mittelstufe 5-8"). Wird im Stundenplaner für Lehrer-Präferenzen und für Klassenlehrer-Befähigung verwendet.
I
Idempotency Key
Vom Client generierte UUID, die bei wiederholtem POST-Aufruf dafür sorgt, dass die Aktion nur einmal ausgeführt wird. Wichtig für Stripe-Payments, Mail-Versand, alles wo Doppel-Ausführung Schaden anrichtet.
InstructionGroup
Im Stundenplaner: Gruppe von Schülern, die gemeinsam Unterricht haben. Meist deckungsgleich mit der Klasse, kann aber kleiner (Halbgruppe Englisch) oder klassen-übergreifend (Wahlpflicht) sein.
J
JWT
JSON Web Token. Enthält bei uns sub (matrixUserId), tenantId, roles[], schoolId, orgId. Wird bei jedem API-Call mitgeschickt als Authorization: Bearer <token>.
L
Lessons
Erkenntnisse aus realen Vorfällen, dokumentiert in 02-lessons-aus-prilog.md. Jede Regel im Manifest hat idealerweise eine Lesson als Ursprung.
LIVE-Stempel
Ein Sprint ist „LIVE" wenn ALLE Bedingungen aus 01-pflicht-checkliste.md erfüllt sind, inkl. Phase 6 (UX-Audit per Hand). „Tests grün + Deploy erfolgreich" ist nicht LIVE.
M
Matrix
Das Chat-Protokoll, auf dem Prilog aufbaut (Synapse als Server). Jeder User hat eine matrixUserId der Form @user.name:tenant.prilog.team. Räume sind Matrix-Rooms.
Memory (Auto-Memory)
File-basierte Datenbank in ~/.claude/projects/-home-lee/memory/, in der die KI (= ich) Erkenntnisse über User, Projekt, Architektur ablegt. Wird in jeder Session geladen.
Mein Fach
Persönliches DMS-Postfach pro User. Datei-Uploads landen hier, optional mit S3-Storage pro Tenant.
O
Outbox Pattern
Pattern, bei dem externe Aktionen (Mail-Versand, Webhook-Calls) erst in eine outbox-Tabelle geschrieben werden, ein separater Worker führt sie dann aus. Vorteil: keine Verluste bei Crash, automatischer Retry.
P
P0 / P0-Freeze
„Priority 0" — das Minimal-Funktionsumfang einer Domäne, der live gehen muss. „Freeze" = die Spec ist final + es kommt nichts mehr rein bevor das gebaut ist. Pattern aus dem Lean-Startup-Buch.
Person / UserAccount / UserDirectoryEntry
Drei Konzepte für „Mensch im System":
Person: CRM-Datensatz (Name, Adresse, E-Mail). Kann ohne Login existieren.UserAccount: Login-fähiger Account, verknüpft mit einer Person.UserDirectoryEntry: Legacy-Variante von UserAccount, vor CRM-v2.
Pflicht-Checkliste
Die Liste in 01-pflicht-checkliste.md, die vor jedem LIVE-Stempel abgehakt werden muss.
Postmortem
Strukturierte Nach-Vorfalls-Analyse: Timeline, Root Cause, Lessons, Action Items. Bei Prilog blameless (Fokus auf System-Schwächen, nicht Personen). Format in 05-templates.md.
Promote (Web-Client)
promote-web-client.sh <sha> setzt den stable-Channel auf einen bestimmten Build. Der nächste Reconcile-Sweep verteilt diesen Build auf alle Tenant-Subdomains.
Pseudonymisierung
DSGVO-Pflicht: in Audit-Logs werden Actor-IDs durch einen tenant-spezifisch gesalzenen Hash ersetzt. Klarsicht-Modus (zeigt echte IDs) erzeugt eigenen Audit-Eintrag (Self-tracking).
R
Reconcile-Sweep
Cron-Job, der täglich (03:30 UTC) für jeden Tenant prüft, ob der installierte Web-Client mit dem stable-Channel übereinstimmt. Bei Drift → SCP+atomic-swap → nginx-reload.
Refresh-Token
JWT, der 30 Tage gültig ist und nur zum Holen neuer Access-Tokens dient. Lebt im HttpOnly-Cookie.
Retention-Worker
Background-Job, der periodisch (24h-Tick) prüft, ob Daten ihr Aufbewahrungsfristen-Ende erreicht haben. Setzt retentionDueAt-Marker. Eigentliche Löschung manuell oder per Bulk-Endpoint.
RPO / RTO
- RPO (Recovery Point Objective): wie viel Daten-Verlust ist akzeptabel? („max. 1 Stunde Daten weg")
- RTO (Recovery Time Objective): wie schnell muss das System wieder laufen? („innerhalb 4 Stunden")
S
Sicht-Resolver
Backend-Funktion (canReadX, canWriteX) die prüft, ob ein User Zugriff auf eine Resource hat. Liefert { allowed: boolean, via?: string }. Wird in Pre-Handlern (assertCanRead...) aufgerufen.
Slide-Over
Panel, das von rechts in den Bildschirm einfährt. Prilog-Konvention statt zentrierten Modals (Memory feedback_no_modal_dialogs).
SLO — Service Level Objective
Quantitative Erwartung an die Software, z. B. „99 % der Login-Requests in unter 800 ms". Daraus leitet sich Error Budget ab.
Solver
Im Stundenplaner: CP-SAT-basierter Constraint-Solver (läuft auf der Whisper-Box), der einen vollständigen Stundenplan-Vorschlag aus den Stammdaten berechnet.
Source (ContactView)
'member' (= UserAccount mit Login), 'person' (= externer Kontakt ohne Login), 'organization' (= juristische Person).
Space
Matrix-Raum-Konstrukt für eine Gruppe (Klasse, Kollegium, Projekt). Hat Mitglieder, kann Subspaces enthalten, hat Chat + Dateien + Kalender.
Stable-Channel
Der stable-Symlink im prilog-artifacts-Repo zeigt auf den Build, der vom Reconcile-Sweep auf alle Tenants verteilt wird. Wird per promote-web-client.sh <sha> umgesetzt.
Stammraum
Im Stundenplaner: Standard-Raum einer Klasse, in dem alle Fächer unterrichtet werden, die keinen Spezialraum brauchen (also nicht Sport, Chemie, Musik). Solver pinnt automatisch dorthin.
T
TeacherClassTeacherCapability
Waldorf-spezifisch: Klassenlehrer-Befähigung pro Lehrer × GradeBand (z. B. „Unterstufe"). Ersetzt das Pflegen von einzelnen Fach- Qualifikationen bei Klassenlehrern, die im Hauptunterricht alles machen.
TeacherQualification
Fach-Lehrbefähigung pro Lehrer × Subject. Mit qualificationLevel (full/partial/in_training) und optional gradeLevels-Filter.
Tenant
Eine Schule. Hat eigene Subdomain (z. B. leander.prilog.team), eigene DB-Records mit tenantId-Filter, eigenen S3-Bereich, optional eigenen Synapse-Server (Tenant-in-a-Box).
Tenant-in-a-Box
Architektur-Vision: jeder Tenant bekommt einen eigenen Docker-Compose- Stack mit eigenem Postgres + MinIO + Synapse, anstatt sich einen Shared- Stack zu teilen. Aktiv für Enterprise-Kunden, optional für andere.
TimetableEntry
Eine einzelne Stundenplan-Zelle: (InstructionGroup, Subject, Wochentag, PeriodSlot) + Lehrer-Zuordnungen. Hat Status (published, committed, …) und Gültigkeitsbereich (validFrom/validUntil).
U
UserType
Schul-spezifische Rolle (z. B. „Lehrkraft", „Schüler:in", „Eltern"). Hat audience (für Datenschutz-Logik), color (für UI-Tönung), canBroadcast (Infotafel-Recht) etc.
V
Visibility (Kontakt)
Wer sieht den Kontakt? tenant-wide, staff-only, space-only. Wird am UserType konfiguriert.
W
Web-Client
Das Frontend für Schul-User. Vite-React-App, deployed als statisches Bundle pro Tenant-Subdomain.
Workspace-Admin
Person mit manageModules oder analog hoher Capability. Sieht in Sicht-Resolver-Listen alle Reports (Metadaten-Bypass), aber nicht Inhalte ohne Break-Glass.
Z
Zeugnisprogramm
Modul für Textzeugnisse (Waldorf-Style + andere reformpädagogische Schulen). Aktueller Stand siehe prilog_docs/umsetzung/Zeugnis/13-status.md.