# #040 M24 – Vier-Augen-Freigabe **Status:** offen **Im Tracker:** – **Meilenstein:** v0.3.0 **Labels:** phase-3, backend, frontend **Geschätzt:** 8 h **Tatsächlich:** – ## Ziel Manche Arbeiten soll nicht derselbe abschließen, der sie gemacht hat: ein Firewall-Rollout, ein Restore-Test, das Löschen eines Kontos. Heute kann jeder `TECHNIKER` jeden Lauf abschließen und archivieren. Gebraucht wird: eine Vorlage kann sagen „dieser Lauf braucht eine Freigabe“, und dann schließt ihn ein **Zweiter** ab — nachweisbar im Protokoll. ## Zu entscheiden - [ ] **Freigabe am Lauf oder am Schritt?** Empfehlung: **am Lauf**, gesetzt von der Vorlage. Am Schritt wäre feiner und verführt zu Checklisten, in denen an fünf Stellen jemand warten muss; am Lauf ist es eine Aussage über die Arbeit als Ganzes und erklärt sich von selbst. Schritt-Freigaben bleiben möglich, wenn sich der Bedarf zeigt — `VorlagenSchritt.konfig` ist ein Json. - [ ] **Wer darf freigeben?** Empfehlung: ein eigenes Recht `freigeben`, standardmäßig bei `ADMIN` und `REDAKTEUR` — **nicht** bei `TECHNIKER`. Begründung: die Vier-Augen-Regel soll nicht davon abhängen, dass zufällig ein zweiter Techniker greifbar ist; und wer sie umgehen will, braucht dann ein zweites Konto mit mehr Rechten, was im Protokoll steht. - [ ] **Darf der Bearbeiter sich selbst freigeben?** **Nein**, und das ist der ganze Sinn. Geprüft wird gegen `Schrittergebnis.aktualisiertVonId` **und** `Lauf.erstelltVonId`: wer irgendetwas daran getan hat, gibt nicht frei. Ein `ADMIN`, der allein im Haus ist, kommt damit nicht weiter — das ist eine bewusste Härte, und die Anleitung sagt es. - [ ] **Was, wenn die Freigabe verweigert wird?** Empfehlung: ein Zustand „zurückgewiesen“ mit Pflichtnotiz. Der Lauf geht zurück auf `IN_ARBEIT`, die Notiz steht im Protokoll und an der Abarbeitungsansicht. Kein eigener `LaufStatus` — das wäre eine Änderung an einem Enum, das vier Jahre halten soll; es genügt ein Feld plus Protokolleintrag. ## Aufgaben - [ ] Migration: `freigabePflicht Boolean` an `VorlagenVersion`, dazu `freigegebenVonId`, `freigegebenAm` und `freigabeNotiz` am `Lauf`; CHECK, dass `freigegebenVonId` und `freigegebenAm` zusammen gesetzt sind (wie bei `abgeschlossenAm`) - [ ] CHECK: `freigegebenVonId` ist **nicht** `erstelltVonId` — die Regel gehört in die Datenbank, nicht nur in den Dienst (CLAUDE.md) - [ ] Recht `freigeben` in `RECHTE`, Rollenmatrix-Test erweitern - [ ] Dienst: `laufFreigeben(laufId, benutzer, notiz?)` und `laufZurueckweisen(laufId, benutzer, notiz)`; Abschluss verlangt die Freigabe, wenn die Version sie fordert - [ ] Die Prüfung „wer hat daran gearbeitet“ an **einer** Stelle, wie `laufMussVeraenderbarSein` - [ ] Benachrichtigung: ein neuer `Meldeanlass` `LAUF_FREIGABE_OFFEN` an die Rollen mit dem Recht — sonst wartet ein Lauf, von dem niemand weiß - [ ] Oberfläche: Hinweis am Lauf („wartet auf Freigabe durch einen Zweiten“), Knöpfe für Freigeben und Zurückweisen, Notizfeld; die Übersicht bekommt einen Filter „wartet auf meine Freigabe“ - [ ] Editor: Häkchen „dieser Lauf braucht eine Freigabe“ an der Version - [ ] Druckansicht und PDF nennen Freigeber und Zeitpunkt - [ ] Anleitung: Kapitel 02 (Läufe abarbeiten) und 04 (Vorlagen), mit dem Hinweis, dass ein Einzelkämpfer sich nicht selbst freigeben kann ## Akzeptanzkriterien - [ ] Test: ein Lauf mit Freigabepflicht lässt sich nicht abschließen, solange keine Freigabe steht - [ ] Test: der Bearbeiter kann **nicht** freigeben — auch nicht als `ADMIN` - [ ] Test: die Datenbank weist es ebenfalls ab (CHECK), nicht nur der Dienst - [ ] Test: eine Rolle ohne `freigeben` wird abgewiesen, über jede Server Action - [ ] Test: Zurückweisen verlangt eine Notiz und setzt den Lauf auf `IN_ARBEIT` - [ ] Test: die Meldung geht an die Rollen mit dem Recht und nicht an alle - [ ] Test: ein Lauf **ohne** Freigabepflicht verhält sich unverändert — bestehende Läufe und Vorlagen merken nichts - [ ] Am Handy kein horizontales Scrollen