Laufzettel schreibt ein Protokoll seit dem Datenmodell — ansehen konnte es niemand. Wer wissen wollte, wer wann eine Rolle geändert hat, brauchte psql.
Die Seite
Verwaltung → Protokoll: neueste Einträge zuerst, fünfzig je Seite, Volltext über Aktion und Lauftitel, Filter nach Urheber und Zeitraum. Der bis-Tag zählt mit — sonst sucht man den Eintrag von heute vergeblich. vorher/nachher stehen eingeklappt hinter Werte, weil sie Json sind und lang werden.
Ein Eintrag ohne Urheber ist keine Lücke: dort steht „Systemlauf". Der Zeitplan des Verzeichnisabgleichs hat keinen Menschen hinter sich, und das soll man sehen.
Keine Tabelle, sondern Karten. Sieben Spalten sind bei 390 px nicht darstellbar, ohne horizontal zu scrollen — und genau das ist ausgeschlossen.
Am Lauf selbst stehen seine Einträge eingeklappt unten in der Abarbeitungsansicht. Kein eigenes Recht dafür: wer den Lauf sehen darf, darf auch sehen, was an ihm geschehen ist; die Mandantensicht hat laufHolen schon angewandt.
Protokoll trägt jetzt eine kundeId
Das war der Teil, der das Issue größer gemacht hat als geplant. CLAUDE.md verlangt die Spalte für jede kundenbezogene Zeile; das Protokoll hatte sie nicht, und damit ließ sich die Mandantensicht nicht anwenden, ohne je Eintrag die Entität nachzuschlagen.
Leer heißt global (Einstellungen, Benutzer, kundenfreie Vorlagen, Schnellstart). Zwanzig Schreibstellen setzen sie jetzt. Laufbezogene Einträge bleiben ohne — der Lauf ist die bessere Quelle, weil er seine Zuordnung nicht verlieren kann; die Abfrage prüft beide Wege.
Die Migration führt bestehende Einträge nach, über den Lauf und über die fünf kundentragenden Entitäten. An echten Daten gefahren: 59 von 733 Einträgen bekamen einen Kunden.
Im Zweifel zugemacht
414 Einträge in der Entwicklungsdatenbank zeigen auf längst gelöschte Testgeräte und lassen sich keinem Kunden zuordnen. vorher/nachher können einen Hostnamen enthalten — einem auf Kunden beschränkten Benutzer werden sie deshalb nicht gezeigt. Bei einer Mandantengrenze wird zugemacht, nicht geraten.
Das Mandanten-Kriterium ist auf der Seite heute strukturell erfüllt, weil sie verwaltung verlangt und ein ADMIN ohnehin alle Kunden sieht. Der Filter sitzt trotzdem im Lesemodell und ist dort geprüft — ein Lesemodell trägt seine Sicht selbst, und wenn das Recht je weiter gefasst wird, hält die Grenze.
Oberfläche
Im gebauten Stand durchgeklickt: Reiter da, 733 Einträge gezählt, blättern (?seite=2 → „51–100 von 733", „Seite 2 von 15", „zurück" erscheint), Filter wandert beim Blättern mit (?suche=archiviert&seite=2), Volltext findet 146 von 733, Werte klappen auf, Abschnitt am Lauf eingeklappt mit fünf Einträgen, und bei 390 px auf beiden neuen Seiten kein horizontales Scrollen.
Beim ersten Durchgang hatte mein Prüfskript einen Fehler gemeldet, den es nicht gab: networkidle kommt bei der Client-Navigation zu früh zurück, ich habe den alten DOM gelesen. Mit waitForURL nachgemessen — das Blättern war immer in Ordnung.
Tests
Zehn neue (1182 statt 1172): fremder Kunde unsichtbar, globale Einträge sichtbar, nicht zuordenbarer Eintrag verborgen, Zuordnung über den Lauf, Systemlauf ohne Urheber, alle vier Filter, Blätterung über 55 Einträge, Urheberliste je Sicht, und die Einträge eines Laufs. Dazu greift der E2E-Onboarding-Ablauf jetzt auch die Ansicht ab: das erzeugte Passwort darf dort nicht stehen.
Alle Tore grün: lint, typecheck, format:pruefen, pruefe:doku, 1182 Vitest-Tests in 54 Dateien.
Laufzettel schreibt ein Protokoll seit dem Datenmodell — **ansehen konnte es niemand.** Wer wissen wollte, wer wann eine Rolle geändert hat, brauchte `psql`.
## Die Seite
**Verwaltung → Protokoll**: neueste Einträge zuerst, fünfzig je Seite, Volltext über Aktion und Lauftitel, Filter nach Urheber und Zeitraum. Der *bis*-Tag zählt mit — sonst sucht man den Eintrag von heute vergeblich. `vorher`/`nachher` stehen eingeklappt hinter **Werte**, weil sie Json sind und lang werden.
**Ein Eintrag ohne Urheber ist keine Lücke**: dort steht „Systemlauf". Der Zeitplan des Verzeichnisabgleichs hat keinen Menschen hinter sich, und das soll man sehen.
**Keine Tabelle, sondern Karten.** Sieben Spalten sind bei 390 px nicht darstellbar, ohne horizontal zu scrollen — und genau das ist ausgeschlossen.
Am **Lauf selbst** stehen seine Einträge eingeklappt unten in der Abarbeitungsansicht. Kein eigenes Recht dafür: wer den Lauf sehen darf, darf auch sehen, was an ihm geschehen ist; die Mandantensicht hat `laufHolen` schon angewandt.
## `Protokoll` trägt jetzt eine `kundeId`
Das war der Teil, der das Issue größer gemacht hat als geplant. CLAUDE.md verlangt die Spalte für **jede** kundenbezogene Zeile; das Protokoll hatte sie nicht, und damit ließ sich die Mandantensicht nicht anwenden, ohne je Eintrag die Entität nachzuschlagen.
Leer heißt **global** (Einstellungen, Benutzer, kundenfreie Vorlagen, Schnellstart). Zwanzig Schreibstellen setzen sie jetzt. **Laufbezogene Einträge bleiben ohne** — der Lauf ist die bessere Quelle, weil er seine Zuordnung nicht verlieren kann; die Abfrage prüft beide Wege.
Die Migration führt bestehende Einträge nach, über den Lauf und über die fünf kundentragenden Entitäten. **An echten Daten gefahren:** 59 von 733 Einträgen bekamen einen Kunden.
## Im Zweifel zugemacht
414 Einträge in der Entwicklungsdatenbank zeigen auf längst gelöschte Testgeräte und lassen sich keinem Kunden zuordnen. `vorher`/`nachher` können einen Hostnamen enthalten — einem auf Kunden beschränkten Benutzer werden sie deshalb **nicht** gezeigt. Bei einer Mandantengrenze wird zugemacht, nicht geraten.
Das Mandanten-Kriterium ist auf der Seite heute strukturell erfüllt, weil sie `verwaltung` verlangt und ein `ADMIN` ohnehin alle Kunden sieht. Der Filter sitzt trotzdem im Lesemodell und ist dort geprüft — ein Lesemodell trägt seine Sicht selbst, und wenn das Recht je weiter gefasst wird, hält die Grenze.
## Oberfläche
**Im gebauten Stand durchgeklickt:** Reiter da, 733 Einträge gezählt, blättern (`?seite=2` → „51–100 von 733", „Seite 2 von 15", „zurück" erscheint), Filter wandert beim Blättern mit (`?suche=archiviert&seite=2`), Volltext findet 146 von 733, Werte klappen auf, Abschnitt am Lauf eingeklappt mit fünf Einträgen, und bei 390 px auf beiden neuen Seiten kein horizontales Scrollen.
Beim ersten Durchgang hatte **mein Prüfskript** einen Fehler gemeldet, den es nicht gab: `networkidle` kommt bei der Client-Navigation zu früh zurück, ich habe den alten DOM gelesen. Mit `waitForURL` nachgemessen — das Blättern war immer in Ordnung.
## Tests
Zehn neue (1182 statt 1172): fremder Kunde unsichtbar, globale Einträge sichtbar, nicht zuordenbarer Eintrag verborgen, Zuordnung über den Lauf, Systemlauf ohne Urheber, alle vier Filter, Blätterung über 55 Einträge, Urheberliste je Sicht, und die Einträge eines Laufs. Dazu greift der E2E-Onboarding-Ablauf jetzt auch die **Ansicht** ab: das erzeugte Passwort darf dort nicht stehen.
Alle Tore grün: `lint`, `typecheck`, `format:pruefen`, `pruefe:doku`, **1182 Vitest-Tests** in 54 Dateien.
Closes #35
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Geschrieben wurde es seit dem Datenmodell, ansehen konnte es niemand: wer
wissen wollte, wer wann eine Rolle geaendert hat, brauchte psql.
Neue Seite Verwaltung -> Protokoll: Volltext ueber Aktion und Lauftitel, Filter
nach Urheber und Zeitraum, fuenfzig Eintraege je Seite, neueste zuerst. Ein
Eintrag ohne Urheber steht als Systemlauf da und nicht als Luecke -- der
Zeitplan des Verzeichnisabgleichs hat keinen Menschen hinter sich.
Am Lauf selbst stehen seine Eintraege eingeklappt in der Abarbeitungsansicht.
Kein eigenes Recht dafuer: wer den Lauf sehen darf, darf auch sehen, was an ihm
geschehen ist.
Dafuer traegt Protokoll jetzt eine kundeId, wie CLAUDE.md es fuer jede
kundenbezogene Zeile verlangt. Ohne sie liess sich die Mandantensicht nicht
anwenden, ohne je Eintrag die Entitaet nachzuschlagen. Leer heisst global;
laufbezogene Eintraege bleiben ohne, weil der Lauf die bessere Quelle ist. Die
Migration fuehrt bestehende Eintraege nach -- an echten Daten gefahren, 59 von
733 bekamen einen Kunden.
Ein Eintrag, der sich keinem Kunden zuordnen laesst, wird einem beschraenkten
Benutzer nicht gezeigt: vorher/nachher koennen einen Hostnamen enthalten, und
bei einer Mandantengrenze wird im Zweifel zugemacht.
Keine Tabelle, sondern Karten: sieben Spalten sind bei 390 px nicht
darstellbar, ohne horizontal zu scrollen.
Im gebauten Stand durchgeklickt: blaettern, filtern, Werte aufklappen,
Abschnitt am Lauf, 390 px auf beiden Seiten ohne Scrollen.
Closes#35
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Laufzettel schreibt ein Protokoll seit dem Datenmodell — ansehen konnte es niemand. Wer wissen wollte, wer wann eine Rolle geändert hat, brauchte
psql.Die Seite
Verwaltung → Protokoll: neueste Einträge zuerst, fünfzig je Seite, Volltext über Aktion und Lauftitel, Filter nach Urheber und Zeitraum. Der bis-Tag zählt mit — sonst sucht man den Eintrag von heute vergeblich.
vorher/nachherstehen eingeklappt hinter Werte, weil sie Json sind und lang werden.Ein Eintrag ohne Urheber ist keine Lücke: dort steht „Systemlauf". Der Zeitplan des Verzeichnisabgleichs hat keinen Menschen hinter sich, und das soll man sehen.
Keine Tabelle, sondern Karten. Sieben Spalten sind bei 390 px nicht darstellbar, ohne horizontal zu scrollen — und genau das ist ausgeschlossen.
Am Lauf selbst stehen seine Einträge eingeklappt unten in der Abarbeitungsansicht. Kein eigenes Recht dafür: wer den Lauf sehen darf, darf auch sehen, was an ihm geschehen ist; die Mandantensicht hat
laufHolenschon angewandt.Protokollträgt jetzt einekundeIdDas war der Teil, der das Issue größer gemacht hat als geplant. CLAUDE.md verlangt die Spalte für jede kundenbezogene Zeile; das Protokoll hatte sie nicht, und damit ließ sich die Mandantensicht nicht anwenden, ohne je Eintrag die Entität nachzuschlagen.
Leer heißt global (Einstellungen, Benutzer, kundenfreie Vorlagen, Schnellstart). Zwanzig Schreibstellen setzen sie jetzt. Laufbezogene Einträge bleiben ohne — der Lauf ist die bessere Quelle, weil er seine Zuordnung nicht verlieren kann; die Abfrage prüft beide Wege.
Die Migration führt bestehende Einträge nach, über den Lauf und über die fünf kundentragenden Entitäten. An echten Daten gefahren: 59 von 733 Einträgen bekamen einen Kunden.
Im Zweifel zugemacht
414 Einträge in der Entwicklungsdatenbank zeigen auf längst gelöschte Testgeräte und lassen sich keinem Kunden zuordnen.
vorher/nachherkönnen einen Hostnamen enthalten — einem auf Kunden beschränkten Benutzer werden sie deshalb nicht gezeigt. Bei einer Mandantengrenze wird zugemacht, nicht geraten.Das Mandanten-Kriterium ist auf der Seite heute strukturell erfüllt, weil sie
verwaltungverlangt und einADMINohnehin alle Kunden sieht. Der Filter sitzt trotzdem im Lesemodell und ist dort geprüft — ein Lesemodell trägt seine Sicht selbst, und wenn das Recht je weiter gefasst wird, hält die Grenze.Oberfläche
Im gebauten Stand durchgeklickt: Reiter da, 733 Einträge gezählt, blättern (
?seite=2→ „51–100 von 733", „Seite 2 von 15", „zurück" erscheint), Filter wandert beim Blättern mit (?suche=archiviert&seite=2), Volltext findet 146 von 733, Werte klappen auf, Abschnitt am Lauf eingeklappt mit fünf Einträgen, und bei 390 px auf beiden neuen Seiten kein horizontales Scrollen.Beim ersten Durchgang hatte mein Prüfskript einen Fehler gemeldet, den es nicht gab:
networkidlekommt bei der Client-Navigation zu früh zurück, ich habe den alten DOM gelesen. MitwaitForURLnachgemessen — das Blättern war immer in Ordnung.Tests
Zehn neue (1182 statt 1172): fremder Kunde unsichtbar, globale Einträge sichtbar, nicht zuordenbarer Eintrag verborgen, Zuordnung über den Lauf, Systemlauf ohne Urheber, alle vier Filter, Blätterung über 55 Einträge, Urheberliste je Sicht, und die Einträge eines Laufs. Dazu greift der E2E-Onboarding-Ablauf jetzt auch die Ansicht ab: das erzeugte Passwort darf dort nicht stehen.
Alle Tore grün:
lint,typecheck,format:pruefen,pruefe:doku, 1182 Vitest-Tests in 54 Dateien.Closes #35
🤖 Generated with Claude Code