Wie parallele KI-Agenten in Produktionskonten kollidieren
Parallele KI-Agenten können sich in der Produktion gegenseitig überschreiben. Definiere Eigentumsgrenzen, lehne veraltete Schreibvorgänge ab, setze Leases mit Bedacht ein und protokolliere jede Aktion.

Zwei autonome Läufe auf demselben Produktionskonto werden nicht dadurch sicher, dass jeder Lauf eine andere Aufgabenbeschreibung hat. Sie greifen auf ein veränderliches System zu, und jeder von ihnen erstellte Plan kann schon vor dem nächsten API-Aufruf veraltet sein. Wenn beide dieselbe Ressource ändern können, brauchst du eine Eigentumsgrenze, die der Dienst erzwingt.
Der typische Fehler ist leiser als ein spektakulärer Ausfall. Ein Agent fügt ein Mitglied zu einer Gruppe hinzu, während ein anderer die vollständige Gruppenmitgliedschaft auf Basis eines älteren Lesevorgangs ersetzt. Beide Anfragen werden erfolgreich beantwortet. Die spätere Anfrage entfernt das Mitglied, das der erste Agent hinzugefügt hat. Jeder Lauf hat seine Anweisungen befolgt. Deine API hat eine ungültige Abfolge akzeptiert.
Behandle einen Agentenlauf wie einen nicht vertrauenswürdigen parallelen Client mit echten Zugangsdaten und ungenauem Timing. Gib ihm einen eng begrenzten Zuständigkeitsbereich, mache Schreibanfragen von der gelesenen Version abhängig und protokolliere genügend Kontext, um später eine abgelehnte oder angenommene Änderung erklären zu können. Menschliche Prüfung bleibt sinnvoll, aber sie kann keinen Empfänger ersetzen, der veraltete Zustände erkennt.
Aufgabenbereich und Schreibbereich getrennt definieren
Ein Aufgabenbereich beschreibt, was ein Agent erreichen soll. Ein Schreibbereich beschreibt, welche veränderlichen Objekte er ändern darf. Das sind zwei verschiedene Dinge. Teams bekommen Probleme, wenn sie beides gleichsetzen.
„Das Staging-Deployment aktualisieren“ klingt eng begrenzt. Trotzdem kann die Aufgabe einen gemeinsam genutzten Image-Tag, einen Release-Zeiger, eine Traffic-Regel, einen DNS-Eintrag, ein Protokoll für Datenbankmigrationen und einen Benachrichtigungskanal berühren. Ein Agent kann den Wortlaut der Aufgabe befolgen und dabei mit einem Release-Lauf kollidieren, der eines dieser Objekte besitzt.
Definiere Eigentum in Begriffen, die der empfangende Dienst prüfen kann. Gute Grenzen nennen dauerhafte Ressourcenkennungen statt einer lose definierten Arbeitskategorie:
- eine Umgebung und einen Deployment-Eintrag
- einen Mandanten oder ein Kundenkonto
- einen Pull Request und seinen Branch
- ein Incident-Ticket und die in seinem Änderungssatz genannten Ressourcen
- ein Wartungsfenster mit einer expliziten Liste von Zielen
Vermeide Grenzen wie „Backend-Arbeit“ oder „Produktionsbereinigung“. Das sind Bezeichnungen für Menschen. Sie sagen einer API nicht, welcher Schreibvorgang fehlschlagen soll.
Ein sinnvoller Eigentumseintrag enthält die Lauf-ID, die Ressourcen-ID, die erlaubte Operation und den Ablaufzeitpunkt. Bewahre ihn in der Nähe des Dienstes auf, der die Ressource besitzt. Wenn ein Deployment-Controller den Release-Zeiger besitzt, sollte dieser Controller prüfen, wer ihn weiterbewegen darf. Eine Tabelle, eine Chatnachricht oder eine Anweisung im Prompt kann keine Anfrage blockieren, die eintrifft, nachdem die Person, die sie geschrieben hat, Feierabend gemacht hat.
Vor der Vergabe von Schreibzugriffen eine kleine Konfliktkarte erstellen
Liste für jeden automatisierten Job die Ressourcen auf, die er liest, schreibt, löscht oder als gemeinsam genutzten Standardwert verwendet. Markiere anschließend jedes Jobpaar, das dieselbe Kennung schreiben kann oder bei dem die Eingabe des einen Jobs durch den anderen verändert werden kann. Das ist keine Bürokratie. Es macht Kollisionen sichtbar, die rollenbasierte Berechtigungen verdecken.
Ein Agent, der ein Dienst-Token rotiert, und ein Agent, der die Integrationskonfiguration aktualisiert, rufen beispielsweise möglicherweise nie denselben Endpunkt auf. Der Konfigurationsschreiber kann die aktuelle Token-Referenz lesen und anschließend sein vollständiges Konfigurationsdokument veröffentlichen, nachdem die Rotation diese Referenz bereits geändert hat. Der Konflikt steckt in der Version des Dokuments, nicht in einem identischen Befehl.
Wenn du die Schreibmenge eines Laufs nicht beschreiben kannst, gib ihm keinen umfassenden Produktionsschreibzugriff. Lass ihn einen Vorschlag vorbereiten oder beschränke ihn auf einen Ressourcen-Namensraum, bis du die Grenze klar beschreiben kannst.
Eine erfolgreiche Antwort kann eine korrekte Änderung trotzdem überschreiben
„Last write wins“ ist eine Richtlinie für Datenverlust, wenn Clients vollständige Darstellungen senden. In Demos wirkt das unproblematisch, weil jeder Client sofort liest und schreibt. Agenten verbringen jedoch oft Minuten damit, Logs zu prüfen, einen Plan zu erstellen, eine Genehmigung einzuholen und nach einem Timeout eine Anfrage erneut zu senden.
Betrachte einen Dienst mit der Ressource notification-policy. Er gibt Agent A folgende Darstellung zurück:
{
"id": "prod-alerts",
"version": 41,
"destinations": ["[email protected]"],
"severity": "high"
}
Agent A plant, ein Ersatzziel hinzuzufügen. Während der Prüfung ändert Agent B severity von high zu critical und schreibt erfolgreich Version 42. Danach sendet Agent A eine vollständige Ersetzung auf Basis von Version 41:
{
"destinations": ["[email protected]", "[email protected]"],
"severity": "high"
}
Wenn der Endpunkt diese Anfrage akzeptiert, macht er die Änderung von B stillschweigend rückgängig. Keiner der beiden Agenten braucht dafür einen Fehler. Die API hat zugelassen, dass eine alte Beobachtung eine neuere Tatsache überschreibt.
Teilaktualisierungen verringern die Angriffsfläche, lösen das Problem aber nicht vollständig. Ein Patch, der ein Ziel hinzufügt, kann weiterhin gegen ein neues Kontingent, eine geänderte Routing-Richtlinie oder eine Löschung verstoßen, die nach dem Lesevorgang stattgefunden hat. Der Dienst muss entscheiden, ob der Patch anhand des aktuellen Zustands noch gültig ist.
Deshalb ist „Wir erlauben Agenten nur PATCH“ kein Konzept für Nebenläufigkeit. Es ist lediglich eine kleinere Form des Schreibvorgangs. Du brauchst weiterhin eine Bedingung, die den Schreibvorgang mit dem Zustand verbindet, den der Agent beobachtet hat.
Jede zustandsverändernde Anfrage abhängig machen
Optimistische Nebenläufigkeitskontrolle ist normalerweise die beste erste Verteidigung für Schreibvorgänge von Agenten. Der Client liest eine Version, ein ETag, eine Generierungsnummer oder ein Revisionstoken. Er sendet diesen Wert zusammen mit der gewünschten Aktualisierung zurück. Der Dienst akzeptiert den Schreibvorgang nur, wenn der aktuelle Wert noch übereinstimmt.
RFC 9110 definiert If-Match genau für diese Art von Anfrage. Ein Server prüft die Bedingung, bevor er die Methode anwendet. Wenn das Entity-Tag nicht mehr übereinstimmt, weist der Server die Methode mit 412 Precondition Failed zurück. Das ist keine Unbequemlichkeit der API. Der Server weigert sich, so zu tun, als sei ein veralteter Plan weiterhin korrekt.
Eine bedingte HTTP-Aktualisierung kann so aussehen:
GET /v1/notification-policies/prod-alerts
HTTP/1.1 200 OK
ETag: "41"
Content-Type: application/json
{"destinations":["[email protected]"],"severity":"high"}
Der Agent übernimmt dieses ETag in seinen Schreibvorgang:
PATCH /v1/notification-policies/prod-alerts
If-Match: "41"
Content-Type: application/json
Idempotency-Key: run-7f3c-add-backup
{"destinations":["[email protected]","[email protected]"]}
Wenn ein anderer Schreibender ETag "42" erzeugt hat, gib eine klare Ablehnung zurück:
HTTP/1.1 412 Precondition Failed
Content-Type: application/json
{
"error": "stale_version",
"resource": "notification-policy/prod-alerts",
"expected_etag": "41",
"current_etag": "42",
"retryable": false
}
Kennzeichne diesen Fehler nicht als wiederholbar, wenn der Agent denselben Inhalt blind erneut senden könnte. Ein Retry muss mit einem frischen Lesevorgang und einer neuen Entscheidung beginnen. Dabei kann sich herausstellen, dass das gewünschte Ergebnis bereits vorhanden ist, dass die aktuelle Richtlinie die Änderung ungültig macht oder dass ein Mensch zwischen zwei konkurrierenden Ergebnissen wählen muss.
Verwende bei Datenbanken das entsprechende Prädikat direkt in der Mutation. Eine typische Aktualisierung prüft die Version in der WHERE-Klausel und behandelt null betroffene Zeilen als Konflikt:
UPDATE notification_policy
SET destinations = :destinations,
version = version + 1
WHERE id = :id
AND version = :observed_version;
Lies niemals eine Version und führe anschließend in einer zweiten Operation eine unbedingte Aktualisierung aus. Prüfung und Zustandsänderung müssen gemeinsam bei der Instanz erfolgen, die den Zustand speichert.
Idempotenz verhindert Duplikate, nicht Uneinigkeit
Teams setzen häufig einen Idempotenzschlüssel auf einen Endpunkt und erklären damit parallele Schreibvorgänge für gelöst. Ein Idempotenzschlüssel verhindert, dass dieselbe logische Anfrage ihre Wirkung zweimal entfaltet. Er sagt dem Dienst nicht, ob zwei unterschiedliche Anfragen miteinander vereinbar sind.
Ein Netzwerk-Timeout macht diesen Unterschied deutlich. Ein Agent sendet eine Anfrage zum Erstellen eines Deployments, verliert aber die Antwort. Ein Retry mit demselben Idempotenzschlüssel sollte das ursprüngliche Ergebnis zurückgeben, statt ein zweites Deployment zu erstellen. Das ist die Unterdrückung von Duplikaten.
Nimm nun zwei Agenten, die jeweils einen anderen Release-Kandidaten für dieselbe Produktionsumgebung auswählen. Sie senden unterschiedliche Inhalte und unterschiedliche Idempotenzschlüssel. Beide Anfragen können vollkommen idempotent sein, während eine trotzdem verlieren sollte, weil sich der Release-Zeiger geändert hat.
Verwende bei wichtigen Endpunkten für Schreibvorgänge beide Kontrollen:
- Ein Idempotenzschlüssel bindet Retries und doppelte Zustellungen an eine abgeschlossene Operation.
- Eine Versionsvorbedingung weist einen Schreibvorgang zurück, dessen Entscheidung auf einem veralteten Ressourcenzustand beruht.
- Eine serverseitige Invariante prüft Regeln, die auch für einen aktuellen Schreibvorgang gelten müssen, etwa die maximal zulässige Anzahl aktiver Zugangsdaten.
Speichere den Idempotenzschlüssel zusammen mit einem Anfrage-Fingerprint und der abgeschlossenen Antwort. Wenn der Aufrufer denselben Schlüssel mit einem anderen Inhalt wiederverwendet, weise die Anfrage zurück. Die erste Antwort für eine andere Operation zurückzugeben, sorgt für ein schwer zu entwirrendes Debuggingproblem und kann einen Clientfehler verdecken.
Sei streng beim Ablauf. Ein Dienst sollte einen Schlüssel lange genug aufbewahren, um das tatsächliche Retry-Verhalten abzudecken. Ein Idempotenzspeicher ist jedoch keine dauerhafte Befehlshistorie. Die Historie gehört ins Audit-Log.
Leases nur für Arbeit verwenden, die sich nicht überschneiden darf
Manche Aktionen dauern so lange, dass allein optimistische Prüfungen zu einer schlechten Benutzererfahrung führen. Eine Datenbankmigration, ein destruktiver Abgleich oder eine Umschaltung kann viele voneinander abhängige Schreibvorgänge umfassen. Gib in solchen Fällen einem Lauf eine kurzlebige Lease für die Ressource.
Eine Lease braucht einen Besitzer, einen Ablaufzeitpunkt und einen Fencing-Wert. Der Fencing-Wert ist wichtig, weil ein abgelaufener Worker aufwachen und weitermachen kann, nachdem ein anderer Worker eine neue Lease erhalten hat. Jeder geschützte Schreibvorgang muss das monoton steigende Token der Lease mitführen. Der Dienst muss ein Token ablehnen, das älter ist als das zuletzt akzeptierte.
Ohne Fencing kann ein Lock-Dienst Agent A mitteilen, dass seine Lease abgelaufen ist. Er kann aber nicht verhindern, dass eine verzögerte Anfrage von A die Datenbank erreicht. Der Zieldienst muss sie zurückweisen. Diesen Teil überspringen Teams oft, wenn sie sagen, sie hätten einen verteilten Lock.
Halte Leases eng begrenzt und kurz. Sperre nicht für eine gesamte autonome Untersuchung die „Produktion“. Sperre migration/customer-1842 oder release/prod-eu und lass den Lauf seine Lease nur verlängern, solange er tatsächlich Fortschritte macht. Eine Lease sollte sicher ablaufen, wenn der Agentenprozess, sein Laptop oder sein Netzwerk verschwindet.
Verwende keine Lease für gewöhnliche Konfigurationsänderungen, die Versionsprüfungen unterstützen. Lange Sperren verwandeln routinemäßige Änderungen in Warteschlangen. Dann lernen Menschen, die Sperre zu umgehen. Eine 412-Antwort gefolgt von einem neuen Plan ist günstiger als ein Ausfall durch einen veralteten Sperrinhaber.
Die Identität des Agenten muss das Gateway überstehen
Ein gemeinsam genutztes Produktionstoken gibt jedem Lauf beim Dienst denselben Namen. Nach einer Kollision siehst du zwar, dass das Token gehandelt hat, kannst aber nicht feststellen, welcher Prozess die Änderung geplant hat, welche Genehmigung sie abdeckte oder welchen Lauf du stoppen musst. Das verlangsamt die Bereinigung und macht den Widerruf unnötig umfassend.
Gib jedem Agentenprozess eine eigene Sitzungsidentität und übermittle jeder Zielanfrage eine stabile Korrelationskennung. Der Zieldienst sollte die Identität, Lauf-ID, Anfrage-ID, Zielressource, beobachtete Version, Ergebnis und seine eigene resultierende Version protokollieren. Verstecke diese Informationen nicht als Fließtext in einer Commit-Nachricht.
Sallyport hält API- und SSH-Zugangsdaten während der Ausführung aus dem Agentenprozess heraus. Das hilft, eine Grenze zwischen dem Planungskontext eines Agenten und dem Geheimnis selbst zu bewahren. Seine sitzungsbezogene Autorisierung kann einen neu gestarteten Agentenprozess identifizieren, bevor dieser einen Lauf beginnt. Diese Autorisierung kontrolliert, wer handeln darf. Sie ersetzt jedoch keine Vorbedingungen auf Seiten des Zielsystems.
Lass den Agenten seine effektive Identität nicht über einen beliebigen Header selbst bestimmen. Das Gateway oder der Zieldienst muss die Identität aus einer authentifizierten Sitzung ableiten. Andernfalls kann ein Lauf nachträglich behaupten, der Deployment-Koordinator zu sein, und deine Logs werden zur Inszenierung.
Für SSH gilt dasselbe Prinzip, auch wenn sich das Übertragungsprotokoll unterscheidet. Verwende für unterschiedliche Arbeitsklassen getrennte Principals oder eingeschränkte Konten. Nimm eine Laufkennung in die Logs entfernter Befehle auf und vermeide ein einzelnes gemeinsam genutztes Shell-Konto, das jedes Anwendungsverzeichnis bearbeiten kann.
Der Zeitpunkt einer Genehmigung ist nicht der Zeitpunkt einer Transaktion
Eine Person kann die Anfrage eines Agenten genehmigen und damit trotzdem einen Schreibvorgang genehmigen, der zehn Sekunden später falsch wird. Das ist in einem parallelen System normal. Die Genehmigung bezieht sich auf Berechtigung und Absicht zum Zeitpunkt der Prüfung. Sie friert die Ressource nicht ein.
Das gefährliche Design bittet eine Person um die Genehmigung eines allgemeinen Satzes wie „Produktionskonfiguration aktualisieren“ und lässt den Agenten dann eine Folge von Lese- und Schreibvorgängen ausführen, sobald er dazu kommt. Ein sichereres Design zeigt Ziel und beabsichtigte Wirkung und lässt anschließend den Dienst die Version oder Lease beim Eintreffen des Schreibvorgangs erzwingen.
Wenn eine Vorbedingung nach der Genehmigung fehlschlägt, darf diese Genehmigung nicht automatisch für einen geänderten Plan wiederverwendet werden. Der Agent sollte den Konflikt konkret melden: welche Ressource sich geändert hat, welche Version er beobachtet hat, welches Feld sich geändert hat, sofern der Dienst das feststellen kann, und ob sein vorgeschlagenes Ergebnis noch benötigt wird. Danach kann eine Person eine neue Aktion genehmigen, oder der Agent kann nach einem erneuten Lesen sicher einen No-op ausführen.
Eine Genehmigung pro Aufruf ist für Vorgänge angemessen, bei denen jede einzelne Nutzung ein erhebliches Risiko birgt, etwa beim Löschen eines Produktionszugangs oder beim Ändern einer extern sichtbaren Routing-Regel. Für normale Batches eng begrenzter, bedingter Schreibvorgänge ist eine Genehmigung pro Lauf oft nützlicher. Der Betreiber kann so Identität und Umfang des Laufs prüfen, ohne eine gedankenlose Klickroutine zu schaffen.
Verwechsle eine Ansammlung von Genehmigungen nicht mit Kontrolle. Wenn Betreiber Ressourcen-ID, Operation und aktuelles Konfliktergebnis nicht sehen können, genehmigen sie einen Satz, während der Dienst die eigentliche Arbeit an anderer Stelle ausführt.
Für eine Konfliktantwort muss ein Verantwortlicher festgelegt sein
Ein abgelehnter veralteter Schreibvorgang ist ein erfolgreiches Sicherheitsergebnis, aber nur, wenn der Lauf weiß, was als Nächstes zu tun ist. „Bei Fehler erneut versuchen“ ist die falsche Standardeinstellung. Sie macht aus einer Uneinigkeit einen automatisierten Wettlauf.
Klassifiziere jeden Schreibpfad, bevor du autonome Ausführung zulässt. Die Klasse bestimmt, wer einen Konflikt löst:
| Änderungstyp | Bei einem Versionskonflikt | Verantwortlicher |
|---|---|---|
| Eine eindeutig benannte, unabhängige Ressource hinzufügen | Erneut lesen und wiederholen, wenn der Name weiterhin frei ist | Agent |
| Ein berechnetes Feld aus aktuellen Quelldaten aktualisieren | Erneut lesen, neu berechnen und wiederholen | Agent |
| Einen gemeinsam genutzten Release-Zeiger weiterbewegen | Anhalten und beide Kandidaten vorlegen | Release-Verantwortlicher |
| Mitgliedschaften oder Berechtigungen ändern | Anhalten und Prüfung anfordern | Kontoinhaber |
| Ein gemeinsam genutztes Konfigurationsdokument löschen oder ersetzen | Anhalten, sofern keine ausdrückliche Lease dafür gilt | Benannter Betreiber |
Es geht nicht darum, Agenten vorsichtig zu machen. Es geht darum, Neuberechnung von einer Ermessensentscheidung zu unterscheiden. Ein Agent kann einen aus aktuellen Eingaben erzeugten Bericht sicher erneut erstellen. Er sollte nicht zwischen zwei genehmigten Produktionsversionen, zwei Zugriffsentscheidungen oder zwei verschiedenen Rollback-Plänen wählen, nur weil er eine 412 gesehen hat.
Mach Konfliktantworten maschinenlesbar. Sie sollten die Identität der Ressource, die aktuelle Version, die Konfliktkategorie und die Information enthalten, ob der Endpunkt einen neuen automatischen Versuch erlaubt. Ein vages 409 mit einer HTML-Fehlerseite zwingt den Agenten zum Raten.
Die erwartete Kollision testen
Warte nicht auf Produktionsverkehr, um zu beweisen, dass deine Prüfungen funktionieren. Baue einen Test, der einen Lauf zwischen Lesen und Schreiben anhält, einen zweiten Lauf dieselbe Ressource ändern lässt und anschließend den ersten Lauf fortsetzt. Prüfe vier Ergebnisse:
- Der erste Schreibvorgang schlägt fehl, ohne die Ressource zu verändern.
- Die Antwort weist auf eine veraltete Version hin und nicht auf einen allgemeinen Serverfehler.
- Der Agent sendet seinen alten Inhalt nicht automatisch erneut.
- Deine Protokolle können beide Versuche mit ihren Laufidentitäten und Genehmigungen verknüpfen.
Führe denselben Test mit einem Timeout und einem Retry durch, um zu beweisen, dass sich das Idempotenzverhalten davon unterscheidet. Das sind unterschiedliche Fehlerpfade und sie brauchen unterschiedliche erwartete Ergebnisse.
Sowohl den Versuch als auch den resultierenden Zustand protokollieren
Ein Produktionskonto braucht nach einer Agentenkollision zwei Aufzeichnungen: den Befehlsweg und die autoritative Historie der Ressource. Gateway-Logs erklären, wer eine Aktion angefordert hat und über welche genehmigte Sitzung. Service-Logs erklären, ob sich der Zustand geändert hat, welche Version gewonnen hat und warum eine Anfrage fehlgeschlagen ist.
Gib dich nicht mit einem Aktivitätseintrag zufrieden, der nur sagt: „PATCH erfolgreich“. Erfasse die Ressourcenkennung, Methode, Anfrage-Korrelations-ID, vom Client gesendete Vorbedingung, Idempotenzschlüssel oder einen sicheren Verweis darauf, Antwortstatus und resultierendes ETag. Wenn dein Dienst eine Historie auf Feldebene führt, erfasse die geänderten Felder dort, statt sie aus einem Agententranskript abzuleiten.
Sallyport erstellt seine Journale für Sessions und Activity aus einem verschlüsselten, hashverketteten Audit-Log. Wenn du es für Agentenaktionen verwendest, führe bei der Untersuchung einer umstrittenen Abfolge diese Prüfung aus:
sp audit verify
Der Befehl prüft die Kette offline über den Chiffretext und benötigt den Tresorschlüssel nicht. Er kann belegen, ob dieses lokale Journal intakt geblieben ist. Vergleiche es mit den Anfrage-Logs des Zielsystems, bevor du behauptest, den Ablauf zu kennen.
Aufbewahrungs- und Zugriffsregeln sind hier wichtig. Ein Agententranskript kann fehlerhafte Überlegungen oder kopierte Betriebsdetails enthalten, während ein Anfragejournal eine kompakte, sachliche Aufzeichnung sein sollte. Bewahre die Belege auf, die zur Rekonstruktion von Berechtigungen und Zustandsübergängen nötig sind, und beschränke zugleich, wer sie durchsuchen darf.
Parallelität in unabhängigen Ressourcensätzen ermöglichen
Du brauchst keine globale Warteschlange für jeden autonomen Lauf. Du brauchst eine Regel, die unabhängige Arbeit zulässt und gemeinsame Mutationen ausdrücklich macht. Teile nach Mandant, Umgebung, Repository-Branch, Dienst oder einem anderen Ressourcen-Namensraum auf, den der Dienst prüfen kann.
Ein praktikables Produktionsdesign hat einen Koordinator, der jedem Lauf eine Schreibmenge zuweist und Zugangsdaten oder Gateway-Zugriff nur für diese Menge gewährt. Der Koordinator entscheidet nicht, ob jede Änderung klug ist. Er verhindert, dass zwei Worker versehentlich mit überlappenden Berechtigungen eintreffen. Die empfangenden Dienste erzwingen weiterhin Versionen und Invarianten, denn Koordinatoren fallen aus, Zuweisungen veralten und Menschen starten Notfallarbeiten außerhalb des normalen Wegs.
Wenn eine Aktion mehrere Ressourcen umfasst, widerstehe dem Drang, sie als eine atomare Änderung zu bezeichnen, wenn die Dienste nicht tatsächlich gemeinsam transaktional arbeiten können. Zeichne den gewünschten Zustand auf, ordne die Schreibvorgänge so, dass spätere Schritte frühere validieren können, und definiere vor der Ausführung eine Ausgleichsaktion. Auch eine solche Ausgleichsaktion braucht eine Prüfung des aktuellen Zustands. Ein Rollback auf einen alten Snapshot kann eine legitime Änderung löschen, die nach dem ursprünglichen Lauf erfolgt ist.
Der erste Produktionstest sollte bewusst unspektakulär sein: Wähle eine gemeinsam genutzte Konfigurationsressource, starte zwei Agentenläufe auf Basis derselben Version und lass sie inkompatible Änderungen vorschlagen. Wenn der Dienst beide akzeptiert, repariere diesen Endpunkt, bevor du einem der beiden Läufe einen größeren Zuständigkeitsbereich gibst. Autonomie wirkt nach einer Kollision weniger interessant. Genau deshalb solltest du die Kollision zuerst in einem kontrollierten Test erzwingen.
FAQ
Wann spricht man von parallelen KI-Agenten?
Sie gelten als parallel, wenn sich ihre Berechtigungszeiträume überschneiden und beide Schreibvorgänge ausführen können, die denselben Zustand in der realen Welt beeinflussen. Separate Chatverläufe, unterschiedliche Rechner und getrennte Zugangsdaten ändern daran nichts. Wenn ein Lauf auf einen Zustand zugreifen kann, den der andere Lauf zuvor gelesen hat, solltest du sie als parallel behandeln.
Können zwei Agenten kollidieren, wenn sie in unterschiedlichen Repositories arbeiten?
Ja. Ein Produktionskonto enthält häufig gemeinsam genutzte Standardwerte, Quoten, IAM-Bindings, DNS-Namen, Abrechnungseinstellungen und Deployment-Zeiger, durch die scheinbar unabhängige Aufgaben miteinander kollidieren können. Eigentumsgrenzen auf Ressourcenebene sind sicherer, als aus getrennten Projekten automatisch getrennte Schadensbereiche abzuleiten.
Reichen menschliche Genehmigungen aus, um Konflikte zwischen Agenten zu verhindern?
Nein. Eine Genehmigung belegt, dass eine Person eine Anfrage zu einem bestimmten Zeitpunkt erlaubt hat. Sie belegt nicht, dass die Anfrage noch sinnvoll ist, nachdem ein anderer Schreibvorgang den Zustand verändert hat. Der empfangende Dienst muss veraltete Schreibvorgänge anhand von Versionen, Vorbedingungen, Leases oder einer gleichwertigen Kontrolle ablehnen.
Wann sollte ich einen Idempotenzschlüssel und wann eine Versionsprüfung verwenden?
Verwende einen Idempotenzschlüssel, wenn die Gefahr in einer wiederholten Anfrage durch einen Retry, ein Timeout oder eine doppelte Zustellung liegt. Verwende eine Versionsvorbedingung, wenn die Gefahr in einer plausibel wirkenden Änderung auf Basis einer veralteten Darstellung liegt. Ausgereifte APIs für Schreibvorgänge brauchen oft beides.
Lösen verteilte Locks Schreibkonflikte zwischen Agenten?
Ein verteilter Lock hilft nur, wenn jeder Schreibende ihn beachtet und Ablauf, Besitz sowie Verhalten bei Fehlern eindeutig geregelt sind. Er repariert keinen Service-Endpunkt, der veraltete Aktualisierungen akzeptiert. Beginne mit serverseitigen Vorbedingungen und ergänze bei Bedarf kurze Leases für lang laufende, exklusive Arbeiten.
Sollte jeder KI-Agent eigene Produktionszugangsdaten haben?
Gib jedem autonomen Lauf eine eigene Identität und ein eigenes Berechtigungsset, auch wenn beide letztlich für dasselbe Team handeln. Gemeinsam genutzte Administratorzugänge zerstören die Zuordnung und machen einen Widerruf unnötig umfassend. Die Agentenidentität sollte sowohl im Aktions-Gateway als auch in den Logs des Zielsystems sichtbar sein.
Was sollte bei einer dringenden Änderung in der Produktion geschehen?
Auch ein Notfalleinsatz braucht denselben dienstseitigen Konfliktschutz, denn Dringlichkeit macht einen veralteten Zustand nicht korrekt. Richte für Betreiber einen dokumentierten Break-Glass-Weg mit engem Umfang, kurzer Gültigkeit und einer intensiveren nachträglichen Prüfung ein. Schaffe keinen dauerhaften Bypass, nur weil ein Agent einmal schnell handeln musste.
Was sollte ein Audit-Trail für Agentenaktionen erfassen?
Ein Schreibprotokoll muss die Zielressource, die Identität des Akteurs, die Anfrage-ID, die vorherige Version, die gewünschte Änderung, das Ergebnis und die vom Dienst zurückgegebene Version erfassen. Ein Transkript mit dem Eintrag, ein Agent habe „die Produktion aktualisiert“, ist für die Untersuchung einer Kollision zu ungenau. Halte die Korrelations-ID über alle Retries hinweg stabil.
Können autonome Agenten sicher parallel deployen?
Nur wenn jede Änderung eine getrennte Ressource betrifft und der Dienst diese Grenze überprüft. Unabhängige Pull Requests können beispielsweise parallel laufen, während zwei Jobs, die den Release-Zeiger einer Umgebung verändern, nacheinander ausgeführt werden sollten. Parallele Arbeit ist sinnvoll. Parallele Berechtigungen für ein veränderliches Objekt sind meist fahrlässig.
Wie kann ich ein Sallyport-Audit-Log prüfen?
sp audit verify prüft die Integrität von Sallyports verschlüsseltem, hashverkettetem Audit-Log, ohne den Tresorschlüssel zu benötigen. Der Befehl kann zeigen, ob dieser lokale Aktionsnachweis verändert wurde. Er ersetzt jedoch nicht die eigenen Anfrage- und Ressourcen-Logs des Zielsystems. Vergleiche bei der Untersuchung eines umstrittenen Schreibvorgangs beide Aufzeichnungen miteinander.