# Freigaben

Eine Freigabe ist ein bewusster Human-in-the-Loop-Checkpoint
innerhalb eines Flows. Wenn ein Step eine menschliche
Entscheidung benötigt, pausiert der Flow an dieser Stelle, bis
ein Reviewer freigibt oder ablehnt.

## Wann nutzen?

Setze eine Freigabe vor:

- Schreibzugriffe auf Bestandssysteme (Akten, Verträge,
  Versand)
- Geldausgaben (LLM-Tokens jenseits einer Schwelle, API-Quotas)
- destruktiven Aktionen (löschen, archivieren, senden)
- alles, was dein Compliance-Verantwortlicher abgesichert sehen
  möchte

Die Freigabe ist ein protokolliertes Ereignis — jeder
Freigabe-Vorgang landet im Audit-Log mit Reviewer,
Entscheidung und Begründung.

## So deklariert ein Flow eine Freigabe

```yaml
steps:
  - id: classify
    use: text.classify@^1

  - id: review
    use: system.approval@^0
    with:
      title: "Klassifikations-Output prüfen"
      details: "$classify.response"
      reviewer: "$inputs.reviewer"
      timeout_seconds: 600

  - id: write
    use: erp.write@^1
    with:
      record: "$review.payload"
```

`system.approval` ist eine eingebaute Capability — keine
Modul-Installation nötig. Sie blockiert den Flow-Lauf, bis der
zugehörige Freigabe-Eintrag eine `decision` erhält
(freigegeben / abgelehnt) oder das konfigurierte
`timeout_seconds` ausläuft.

## So beantwortet der Operator eine Freigabe

Die Freigaben-Seite listet jede ausstehende Freigabe. Klick
auf einen Eintrag, Titel + Details lesen, entscheiden:

- **Freigeben** — der Flow läuft ab diesem Step weiter, das
  `payload` der Freigabe wird zum Step-Output.
- **Ablehnen** — der Flow scheitert an diesem Step mit der
  Begründung des Reviewers; die Ablehnung wird im Audit-Log
  protokolliert.

## Timeouts

Wenn keine Entscheidung innerhalb `timeout_seconds` eintrifft,
liefert die Engine `ApprovalTimedOut` und der Flow scheitert.
Setze einen Timeout, der zeigt wie lange ein Reviewer
realistisch brauchen darf.

## Was protokolliert wird

Jeder Schreibvorgang einer Freigabe landet im Audit-Log:

- Freigabe angefordert (mit Titel + Details-Snapshot)
- Reviewer-Entscheidung aufgezeichnet (mit Begründung bei
  Ablehnung)
- Payload + Signatur bei Freigabe

Die Hash-Chain fängt Manipulationen ab — ein gestern
freigegebener Eintrag kann nicht heimlich heute auf
"abgelehnt" gedreht werden, ohne die Kette zu brechen.

## Architektur-Abwägung

Freigaben liegen in derselben SQLite-Audit-DB wie die
Ereignisse. Für Deployments mit höherem Sicherheitsbedarf
spiegelt man die Audit-DB auf eine WORM-Senke (Compliance-Gap
3, Option 2). Der Freigabe-Kontrakt bleibt gleich — die
WORM-Senke macht den Audit-Trail nur tamper-evident gegenüber
externen Prüfern, nicht nur für den Hub selbst.
