Ein n8n-Workflow mit Modellaufruf wirkt fertig, sobald der Normalfall einmal funktioniert. Im Produktivbetrieb scheitert er jedoch an der zweiten Zustellung desselben Webhooks, an einem Zeitlimit, nach dem ein bereits erfolgreicher Aufruf wiederholt wird, oder an einem automatisch versendeten Entwurf, weil niemand für die Freigabe zuständig war.
Die folgenden Maßnahmen härten Workflows mit KI-Schritten: Idempotenz, Regeln für Wiederholungsversuche, menschliche Freigaben und Protokollierung. Sie ergänzen Ihr erster KI-Agent in n8n und die Prüfmuster aus Human-in-the-Loop-Design.
Wenn Sie einen Wiederholungsversuch für einen Node aktivieren, der möglicherweise bereits eine CRM-Notiz angelegt, eine Nachricht versendet oder eine E-Mail eingereiht hat, können externe Wirkungen doppelt auftreten, sobald das Ergebnis unbekannt ist. Behandeln Sie jeden externen Schreibvorgang als nicht wiederholbar, bis das Idempotenz- oder Abgleichverhalten des Anbieters nachgewiesen wurde.
Warum KI-Schritte eine andere Fehlerbehandlung benötigen
Gewöhnliche HTTP- und Modellaufrufe können an Statuscodes, Zeitüberschreitungen, fehlerhaften Antworten oder einem unbekannten Commit-Zustand scheitern. Schritte mit Modellen bringen weitere Fehlerarten mit sich:
- Timeouts bei langsamer lokaler Inferenz (lokale OpenAI-kompatible Endpunkte).
- Fehler beim Parsen, wenn das Modell Fließtext statt JSON liefert.
- Inhaltliche Fehler: formal gültiges, aber sachlich falsches JSON.
- Teilerfolge: Das Modell hat geantwortet, doch ein späterer Schreibvorgang durch ein Tool ist fehlgeschlagen.
Ein ungeprüfter Wiederholungsversuch behebt manche Zeitüberschreitungen, verschärft aber andere Fehler. Trennen Sie Wiederholungen auf Transportebene, die sicher sind, wenn der Server keine Arbeit übernommen hat, von fachlichen Wiederholungen, die nur mit einem Idempotenzschlüssel sicher sind.
n8n ermöglicht es dem Betriebspersonal, fehlgeschlagene Läufe aus der Ausführungshistorie erneut zu starten (n8n-Dokumentation zu Ausführungen). Diese Funktion belegt nicht, dass eine externe Wirkung gefahrlos wiederholt werden kann. Der Workflow benötigt weiterhin die unten beschriebenen Kontrollen für Reservierung, Abgleich und Outbox.
Idempotenz beginnt mit einer atomaren Reservierung
Wählen Sie einen stabilen Schlüssel so früh, wie es der Trigger zulässt:
| Trigger | Möglicher Schlüssel |
|---|---|
| Webhook von Formular/CRM | Vom vorgelagerten System vergebene lead_id / ticket_id |
| Normalisierte Message-ID | |
| Zeitplan über eine Warteschlange | (job_id, logical_period) oder Primärschlüssel der Zeile |
| Manueller Neustart | Bestehender Schlüssel; eine echte Korrektur oder Ersetzung ist ein neues, ausdrücklich verknüpftes Geschäftsereignis |
Implementieren Sie nicht SELECT key mit anschließendem INSERT key, und verwenden Sie keine Tabellenzeile als Sperre. Zwei n8n-Worker können gleichzeitig feststellen, dass der Eintrag „fehlt“, und beide fortfahren. Verwenden Sie eine Eindeutigkeitsbedingung in der Datenbank und eine einzige atomare Anweisung. PostgreSQL dokumentiert Unique Constraints als den Mechanismus, der die Eindeutigkeit von Schlüsseln garantiert (PostgreSQL-Constraints).
Minimale PostgreSQL-Struktur (Typen, Aufbewahrung und Migrationen an Ihr System anpassen):
CREATE TABLE workflow_runs (
idempotency_key text PRIMARY KEY,
state text NOT NULL CHECK (state IN (
'processing', 'awaiting_human', 'approved',
'completed', 'failed_retryable', 'failed_terminal'
)),
payload_hash text NOT NULL,
lease_owner uuid,
lease_expires_at timestamptz,
version bigint NOT NULL DEFAULT 0,
result jsonb,
updated_at timestamptz NOT NULL DEFAULT now()
);
Erzeugen Sie für jede n8n-Ausführung eine zufällige lease_owner-UUID. Reservieren Sie einen neuen Schlüssel oder übernehmen Sie ausschließlich eine ausdrücklich wiederholbare beziehungsweise abgelaufene Lease, und zwar in einer einzigen Anweisung:
INSERT INTO workflow_runs (
idempotency_key, state, payload_hash, lease_owner, lease_expires_at
)
VALUES ($1, 'processing', $2, $3, now() + interval '5 minutes')
ON CONFLICT (idempotency_key) DO UPDATE
SET lease_owner = EXCLUDED.lease_owner,
lease_expires_at = EXCLUDED.lease_expires_at,
state = 'processing',
version = workflow_runs.version + 1,
updated_at = now()
WHERE workflow_runs.payload_hash = EXCLUDED.payload_hash
AND (workflow_runs.state = 'failed_retryable'
OR (workflow_runs.state = 'processing'
AND workflow_runs.lease_expires_at < now()))
RETURNING idempotency_key, lease_owner, version;
Werden keine Zeilen zurückgegeben, besitzt eine andere Ausführung den Schlüssel oder der Lauf hat bereits einen nicht wiederholbaren Zustand erreicht. Fragen Sie den Status ab und führen Sie keine Aktion aus beziehungsweise geben Sie das frühere Ergebnis zurück. Trifft derselbe Schlüssel mit einem anderen payload_hash ein, halten Sie den Ablauf zur Untersuchung an. Veränderte fachliche Eingaben stillschweigend als dasselbe Ereignis zu behandeln, verschleiert fehlerhafte Daten aus dem vorgelagerten System.
Die Lease muss zeitlich begrenzt sein und darf nur von ihrem Besitzer verlängert werden. Jeder Zustandsübergang verwendet Compare-and-Set (CAS):
UPDATE workflow_runs
SET state = $4, version = version + 1, updated_at = now()
WHERE idempotency_key = $1
AND lease_owner = $2
AND version = $3
AND lease_expires_at > now()
RETURNING version;
Wenn keine Zeile zurückgegeben wird, hat diese Ausführung die Zuständigkeit verloren und darf nicht handeln. Bemessen Sie die anfängliche Lease anhand der gemessenen Arbeitsdauer, verlängern Sie sie rechtzeitig, begrenzen Sie ihre gesamte Lebensdauer und alarmieren Sie bei wiederholter Übernahme. Eine Lease verhindert, dass abgebrochene Arbeit dauerhaft blockiert. Sie macht einen nicht idempotenten externen Versand nicht sicher.
Webhook-Zustellung und Worker-Ausführung erfolgen üblicherweise mindestens einmal. Eine Reservierung in der Datenbank stellt bei konkurrierenden Ausführungen eine eindeutige Zuständigkeit her. Sie erzeugt über eine Netzwerkgrenze hinweg keine Exactly-once-Wirkung für E-Mail, Zahlung oder CRM. Dafür ist ein Idempotenzschlüssel beim nachgelagerten Dienst oder eine Outbox mit Dispatcher erforderlich, die ein unbekanntes Ergebnis abgleichen kann.
Richtlinie für Wiederholungsversuche bei KI-Nodes
Verwenden Sie eine kurze Matrix und bilden Sie sie im Workflow ab, statt sie informellem Teamwissen zu überlassen:
| Fehler | Wiederholen? | Hinweise |
|---|---|---|
| HTTP 429 / 503 vom Modellserver | Meist ja, wenn die Operation gefahrlos wiederholbar ist | Retry-After beachten, sofern vorhanden; begrenztes exponentielles Backoff mit Jitter verwenden und bei anhaltender Überlastung alarmieren |
| Zeitüberschreitung bei unbekanntem Commit-Zustand | Nur bei einem rein lesenden oder mit Schlüssel versehenen Aufruf | Statusabfrage einer ungeprüften Wiederholung vorziehen |
| Ungültiges JSON vom Modell | Begrenzte erneute Aufforderung (1–2) | Danach mit Rohausgabe an einen Menschen weiterleiten |
| Fachliche Validierung fehlgeschlagen (falsches Enum, leerer Entwurf) | Keine unbemerkte Wiederholungsschleife | Prompt oder Schema korrigieren oder eskalieren |
| Konflikt 409 im nachgelagerten CRM | Prüfen, bevor er als Erfolg gilt | Ressource abrufen oder abgleichen und bestätigen, dass derselbe Idempotenzschlüssel und der beabsichtigte Zustand übernommen wurden |
| Fehler 500 im nachgelagerten CRM bei unklarem Schreibstatus | Untersuchen; E-Mail nicht automatisch erneut senden |
Begrenzen Sie die maximale Zahl der Iterationen in Agenten-Nodes. Ein zusätzlicher Wiederholungsmechanismus um einen Agenten, der bereits Tools in einer Schleife aufruft, lässt Tokenkosten und doppelte Tool-Aufrufe schnell anwachsen.
Bemessen Sie Zeitlimits für lokale Endpunkte anhand gemessener Latenz. Legen Sie nicht „drei Wiederholungen zu je 60s“ auf einen synchronen Kunden-Webhook.
Menschliche Freigaben, die externe Wirkungen blockieren
Eine menschliche Freigabe ist keine Slack-Nachricht mit „FYI“. Sie ist ein Zustand, in dem keine für Kunden sichtbare oder unumkehrbare Aktion ausgeführt wird, bevor eine ausdrückliche Freigabe vorliegt.
Drei Muster, die in n8n funktionieren:
1. Vor der Ausführung freigeben
KI-Node → Schema validieren → Entwurf und Schlüssel speichern → eine einmalig nutzbare Freigabeanforderung erzeugen → nur eine authentifizierte, noch gültige Freigabetransaktion darf den Versand einreihen.
2. Ausführen mit Widerrufsfenster
Den Versand mit einem Widerrufsfenster verzögert einreihen. Verwenden Sie dieses Muster nur, wenn die Aktion so weit umkehrbar ist, dass ein später Widerruf noch Wirkung hat.
3. Nur Ausnahmen freigeben
Führen Sie ausschließlich eng begrenzte, umkehrbare Fälle automatisch aus, deren deterministische Eignungsregeln und kalibrierte Evaluierungsnachweise einen genehmigten Schwellenwert erfüllen. Prüfen und überwachen Sie Stichproben; bei Unsicherheit wird eskaliert oder nicht gehandelt. Die vom Modell selbst angegebene Konfidenz ist keine technisch durchgesetzte Kontrolle.
Wählen Sie das Freigabemuster nach den möglichen Folgen, entsprechend demselben Entscheidungsmodell wie im Human-in-the-Loop-Design. Kunden-E-Mails, Erstattungen, Konto- oder CRM-Änderungen und gewöhnliche operative Finanzaktionen müssen vor der Ausführung freigegeben werden, bis gemessene Evidenz und Richtlinien etwas anderes zulassen. Medizinische Behandlung, Rechtsberatung, regulierte Finanzberatung, Entscheidungen zum Kinderschutz sowie statische und bauliche Entscheidungen erfordern eine qualifizierte Fachperson. Automatisierung darf Unterlagen vorbereiten oder weiterleiten, diese Prüfung aber nicht ersetzen.
Beispiel für eine Checkliste auf der Freigabekarte:
- Idempotenzschlüssel
- Link zum Quelldatensatz
- Modellausgabe (Entwurf / Label / Scores)
- Validierungsfehler falls vorhanden
- Zu protokollierende Identität der freigebenden Person
- Ablaufzeit für den wartenden Zustand
Freigabelinks sind Bearer-Zugangsdaten
Senden Sie niemals https://n8n.example/webhook/approve?id=ticket-42&action=approve. Wer diese URL errät, weiterleitet, scannt oder erneut verwendet, kann die Aktion auslösen. Erzeugen Sie mindestens 256 Bit kryptografisch zufälliges Tokenmaterial, übertragen Sie das undurchsichtige Token ausschließlich über HTTPS und speichern Sie nur seinen SHA-256-Hash zusammen mit:
- dem Schlüssel des Laufs und der erlaubten Entscheidung;
- der vorgesehenen freigebenden Person, Zielgruppe oder SSO-Richtlinie;
- einem absoluten Ablaufzeitpunkt;
consumed_at, Entscheidung und Identität der freigebenden Person;- einer Bedingung für die einmalige Nutzung.
Eine GET-Anfrage sollte eine Bestätigungsseite anzeigen und keinen Zustand verändern. Übermitteln Sie die Entscheidung nach der Authentifizierung per POST und mit CSRF-Schutz. In einfachen Fällen können aktuelle n8n-Nodes pausieren und eine Freigabe anfordern; für komplexere Freigaben empfiehlt n8n selbst den Wait-Node (n8n-Gmail-Freigabeoperation). Prüfen Sie die tatsächlichen Regeln der eingesetzten Node-Version zu Authentifizierung, Ablauf, Weiterleitung und Audit. Ein per E-Mail versendeter Button ist nicht automatisch für die Freigabe einer Zahlung oder rechtlichen Entscheidung geeignet.
Legen Sie einen Freigabedatensatz an, der mit dem unveränderlichen fachlichen Idempotenzschlüssel verknüpft ist:
CREATE TABLE approvals (
approval_id uuid PRIMARY KEY,
idempotency_key text NOT NULL REFERENCES workflow_runs(idempotency_key),
token_hash bytea NOT NULL UNIQUE,
allowed_decisions text[] NOT NULL,
expires_at timestamptz NOT NULL,
consumed_at timestamptz,
decision text,
approver_subject text,
created_at timestamptz NOT NULL DEFAULT now()
);
Hashen Sie das ursprüngliche Token in der Anwendung und übergeben Sie nur den Hashwert als $1. Verbrauchen Sie ihn atomar:
UPDATE approvals
SET consumed_at = now(), decision = $2, approver_subject = $3
WHERE token_hash = $1
AND consumed_at IS NULL
AND expires_at > now()
AND $2 = ANY (allowed_decisions)
RETURNING idempotency_key;
Werden keine Zeilen zurückgegeben, ist das Token abgelaufen, ungültig, bereits verwendet oder für die Entscheidung nicht zugelassen. Versenden Sie nichts. Führen Sie die Anweisung in einer Transaktion aus, die anschließend die passende Zeile in workflow_runs sperrt, den Zustand awaiting_human bestätigt, ihn auf approved setzt und die eindeutige Outbox-Zeile einfügt. Schlägt ein Schritt fehl, setzen Sie die gesamte Transaktion zurück. Verlangen Sie für Aktionen mit hoher Tragweite eine Anmeldung per SSO sowie Rollen- und Funktionstrennungsprüfungen; der bloße Besitz eines E-Mail-Links reicht nicht aus.
Lassen Sie das Modell nicht
auto_replywählen und übernehmen Sie diese Wahl nicht ohne einen im Workflow durchgesetzten Schwellenwert. Prompts schlagen vor; Nodes setzen Regeln durch.
Transaktionale Outbox für externe Wirkungen
Das Verbrauchen der Freigabe, die Änderung des Laufzustands und das Erfassen der beabsichtigten externen Wirkung müssen in einer einzigen Datenbanktransaktion erfolgen. Versenden Sie nichts direkt aus dem Freigabe-Webhook. Eine minimale Outbox-Bedingung lautet:
CREATE TABLE effect_outbox (
effect_id uuid PRIMARY KEY,
idempotency_key text NOT NULL REFERENCES workflow_runs(idempotency_key),
effect_type text NOT NULL,
target text NOT NULL,
payload jsonb NOT NULL,
state text NOT NULL CHECK (state IN ('pending', 'sending', 'completed', 'unknown', 'failed')),
lease_owner uuid,
lease_expires_at timestamptz,
provider_id text,
created_at timestamptz NOT NULL DEFAULT now(),
UNIQUE (idempotency_key, effect_type, target)
);
Ein Outbox-Worker reserviert ausstehende Zeilen mit einer zeitlich begrenzten Lease. PostgreSQL FOR UPDATE SKIP LOCKED ist für warteschlangenartige Verbraucher vorgesehen; siehe Dokumentation der Locking-Klausel. Der Worker ruft den Anbieter, sofern unterstützt, mit demselben Idempotenzschlüssel auf, speichert dessen externe ID und markiert die Zeile anschließend per Compare-and-Set als abgeschlossen.
Erreicht der Worker das Zeitlimit, nachdem der Anbieter eine nicht idempotente Aktion möglicherweise bereits angenommen hat, markieren Sie die Wirkung als unknown und gleichen Sie sie vor einem erneuten Versuch mit dem Anbieter ab. Ein SMTP-Versand lässt sich durch eine lokale Datenbanktransaktion beispielsweise nicht zu einer Exactly-once-Wirkung machen. Ein automatischer Neuversand nach unbekanntem Ergebnis führt zu doppelten Kunden-E-Mails.
Protokollierung, die auch nach einem Vorfall nutzbar bleibt
Die n8n-Ausführungshistorie ist ein Anfang, aber für sich allein kein Compliance-Archiv. Protokollieren Sie für KI-Schritte je Schlüssel ein strukturiertes Ereignis:
- Zeitstempel und Workflow-Version / Commit-ID, falls Sie Workflows versionieren
- Idempotenzschlüssel und Trigger-Quelle
- Hash der bereinigten Eingabe oder zulässige Felder, keine ungeschützten Geheimnisse
- Freigegebene Anbieter-/Endpunktklasse sowie Modell- und Revisionsidentität; vermeiden Sie es, interne Hosts oder Zugangsdaten in breit zugänglichen Protokollen offenzulegen
- Freigegebene, minimierte Felder der Modellausgabe oder ein kontrollierter Zeiger; die Erfassung der Rohausgabe erfordert eine eigene Entscheidung zu Zweck, Zugriff und Aufbewahrung
- Validierungsergebnis
- Freigabeentscheidung und handelnde Person
- Nachgelagerte Schreibvorgänge mit externen IDs
- Fehlerklasse und Zahl der Wiederholungsversuche
Speichern Sie keine privaten Chain-of-Thought-Ausgaben „zum Debuggen“ in einem gemeinsam genutzten Kanal. Halten Sie stattdessen Entscheidungszusammenfassungen und Tool-Argumente fest, die Sie auch in einer Prüfung offenlegen würden.
Ausführungsprotokolle enthalten häufig personenbezogene Daten aus Tickets und E-Mails. Legen Sie Aufbewahrung, Zugriff und Bereinigung fest, bevor Sie eine ausführliche Protokollierung für produktive KI-Nodes aktivieren. Lokale Modelle befreien Sie bei der Verarbeitung personenbezogener Daten nicht von der Rechenschaftspflicht nach der DSGVO oder vergleichbaren Vorschriften.
Wenn etwas schiefläuft, müssen Sie beantworten können: Haben wir diesen Schlüssel verarbeitet? Haben wir versendet? Wer hat freigegeben? Welche Modellversion hat den Entwurf erstellt?
Referenzsequenz für einen Lead- oder Ticket-Pfad
- Webhook empfängt Nutzlast → Schema validieren, entsprechend der Freigabestufe aus Ihr erster KI-Agent in n8n.
- Schlüssel und Nutzlast-Hash berechnen → atomar eine zeitlich begrenzte
processing-Lease reservieren. - KI-Node / Agent mit strukturiertem Ausgabevertrag aufrufen.
- JSON validieren (Enum, Pflichtfelder, max. Länge).
- Wenn nach begrenzter Korrektur ungültig →
failed_terminal+ Benachrichtigung an einen Menschen. - Wenn gültig und die Aktion risikoreich ist → per CAS auf
awaiting_humansetzen; eine gehashte, ablaufende und einmalig nutzbare Freigabeanforderung erzeugen. - Bei authentifiziertem Freigabe-POST → Freigabeanforderung atomar verbrauchen, Zustand aktualisieren und die eindeutige Outbox-Wirkung einfügen.
- Der Dispatcher reserviert die Outbox-Zeile, ruft den Anbieter, sofern unterstützt, mit demselben Schlüssel auf, speichert die Anbieter-ID und markiert Wirkung und Lauf per CAS als abgeschlossen.
- Bei Ablehnung → mit Begründung als endgültig markieren; nicht einreihen.
- Bei doppelter Zustellung → vorheriges Ergebnis zurückgeben oder aktuellen Zustand melden; niemals still den Modell- oder Sendepfad wiederholen.
Optional können Sie Entwürfe mit hohem Ermessensanteil über den per Bearer-Token authentifizierten API-Server an Hermes übergeben. Verwenden Sie den separaten Webhook-Adapter nur dann, wenn sein Vertrag für Ereigniseingang und konfigurierte Zustellung zum Workflow passt. In beiden Fällen verbleiben dauerhafte Schlüssel, Freigaben und Konnektoren bei n8n oder im Geschäftssystem. Siehe die beispielhafte n8n → Hermes-Webhook-Übergabe.
Erzwungene Neustarts, ohne die Idempotenz zu verletzen
Das Betriebspersonal wird fehlgeschlagene Ausführungen über die n8n-Oberfläche erneut starten. Das ist sinnvoll, solange der Neustart nicht unbemerkt eine zweite CRM-Notiz erzeugt, weil der Schlüssel nach einem Teilerfolg bereits completed ist, oder sogar eine E-Mail erneut versendet, weil der Schlüssel nie gespeichert wurde.
Definieren Sie ein eindeutiges Protokoll für Neustarts:
- Wiederholbare Wiederherstellung: Nur
failed_retryableoder eine abgelaufeneprocessing-Lease darf durch die oben gezeigte atomare Reservierung übernommen werden. Der fachliche Schlüssel bleibt unverändert. - Neustart abgeschlossener Zustände verboten: Schlüssel in
failed_terminal,awaiting_human,approvedundcompletedgeben ihren früheren oder aktuellen Zustand zurück und starten nicht erneut. - Bewusste Korrektur oder Ersetzung: Legen Sie ein neues Geschäftsereignis mit einem eigenen, vom vorgelagerten System vergebenen Idempotenzschlüssel an. Verknüpfen Sie es mit dem ursprünglichen Schlüssel und externen Ergebnis, dokumentieren Sie die ausführende Person und den Grund und führen Sie es durch einen neuen Freigabe- und Outbox-Ablauf. Erfinden Sie kein spontanes Suffix und verändern Sie den ursprünglichen Lauf nicht nachträglich.
Zeigen Sie dieses Protokoll auf der Freigabekarte an, damit das Betriebspersonal in der Nachtschicht nicht unter Druck eigene Regeln erfinden muss.
Sinnvolle Observability-Metriken
Sie brauchen am ersten Tag keine volle Observability-Plattform. Verfolgen Sie wöchentlich:
- Rate doppelter Webhooks (derselbe Schlüssel zweimal empfangen)
- Wartezeit bis zur Freigabe (p50 / p95, als eigene Messung gekennzeichnet)
- Validierungsfehlerrate nach dem KI-Node
- Verhältnis automatisch ausgeführter zu menschlich freigegebenen Aktionen
- Zahl ausgeschöpfter Wiederholungsversuche
Spitzen bei Validierungsfehlern erfordern eine Untersuchung von Änderungen an Modell, Prompt, Schema, Eingabeverteilung oder Integration. Bei auffällig vielen Duplikaten sollten Sie erneute Zustellungen aus vorgelagerten Systemen, fehlgeschlagene Reservierungen, Wiederholungen und unklare Anbieterergebnisse prüfen. Die Metrik allein bestimmt die Ursache nicht.
Abschaltschalter und Zuständigkeit
Setzen Sie einen standardmäßig sperrenden Abschaltschalter an der Grenze zu externen Wirkungen oder im Dispatcher durch, nicht nur am ersten Workflow-Node. AI_ACTIONS_ENABLED=false muss jeden externen Versand verhindern, selbst wenn ein Lauf in der Mitte fortgesetzt wird oder eine frühe Verzweigung umgeht. Testen Sie den deaktivierten Zustand mit eingereihten und laufenden Wirkungen, legen Sie fest, was weiterhin protokolliert wird, und benennen Sie eine autorisierte Person, die diese Kontrolle bedienen und prüfen darf.
Definieren Sie außerdem:
- Wer freigeben darf
- Wer einen Neustart erzwingen darf und wie ein Ersatzereignis einen neuen, vom vorgelagerten System vergebenen Schlüssel erhält, der ohne behelfsmäßiges Suffix mit dem Original verknüpft ist
- Was „fertig“ für Support-SLAs bedeutet, solange die Freigabe aussteht
Checkliste vor der Freigabe
- Idempotenzschlüssel gewählt und vor dem KI-Aufruf dauerhaft gespeichert
- Zehn gleichzeitige Zustellungen desselben Schlüssels erzeugen genau eine aktive Lease
- Wiederherstellung nach abgelaufenem Lease und CAS-Ablehnung veralteter Besitzer getestet
- Regeln für Wiederholungsversuche je Fehlerklasse dokumentiert
- Freigabe-Token-Hash, Ablauf, SSO/Rolle, POST/CSRF und Einmalnutzung gegen erneute Verwendung getestet
- Menschliche Freigabe fügt eine Outbox-Zeile ein und kann den Sende-Node nicht direkt aufrufen
- Anbieter-Timeout nach möglicher Annahme führt in den Zustand
unknownund sendet nicht automatisch erneut - Strukturierte Protokolle enthalten Schlüssel, Validierung, freigebende Person und externe IDs
- Abschaltschalter getestet
- Datenschutzkonforme Aufbewahrungsfrist für Protokolle festgelegt
KI-Nodes rechtfertigen ihren Einsatz, wenn sie sich auch bei Fehlern vorhersehbar verhalten. Idempotenz verhindert irreführende Wiederholungen. Menschliche Freigaben verhindern, dass falsche Ausgaben zu Aussagen gegenüber Kunden werden. Protokollierung macht beide Behauptungen überprüfbar.



