Approvals: the pending card now shows its full origin — flow, step, run id (previously dropped at the Dart mapping layer), project, and requested-at — under an ORIGIN heading, led by a one-line intro strip that says what the inbox is and what Approve/Reject do. Approve/Reject buttons carry tooltips; the history dialog gains project + run id. Fixes the approvals doc drift (title/details/reviewer -> prompt/show/timeout_seconds). Guard: approvals_origin_test renders the card via the hermetic fake hub and pins every origin fact. Runs: the "hub too old" state now leads with an in-place update button (same `chain update apply` path as the Diagnose page), the Diagnose deeplink demoted to secondary, with a CLI-absent fallback. Guard: two new RunsLoadErrorView widget tests. Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2.8 KiB
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. Das prompt ist der Satz, den der
Reviewer sieht; show wählt die Daten, die ihm vorgelegt
werden (der Output eines vorherigen Steps).
So deklariert ein Flow eine Freigabe
steps:
- id: classify
use: text.classify@^1
- id: review
use: system.approval@^0
with:
prompt: "Klassifikations-Output prüfen"
show: "$classify.response"
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. Jede
Karte zeigt ihre Herkunft (Flow, Step, Lauf, Projekt,
Anforderungszeit), das prompt und die show-Daten. Lesen,
dann entscheiden:
- Freigeben — der Flow läuft ab diesem Step weiter, das
payloadder 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 Prompt + show-Daten-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.