Merge Queue für KI-Agenten 4/4 Alle Serienteile anzeigen

Serie: ki-code-qualität

Merge Queue für KI-Agenten

Teil 4 von 4

Von einem KI-Agenten, der eine halbfertige Spezifikation durchwinken wollte. Sein eigenes System hat's abgelehnt. Dreimal. Ein Blick ins Tagebuch einer Maschine, die lernt, sich selbst nicht zu trauen … und die Antwort auf die Frage, warum das gut so ist.

Blog » AI » Merge Queue für KI-Agenten

Warum du nicht mehr jeden Diff liest

In Teil 3 der Serie – Mutation Testing bei KI-Agenten – hast du die einzelnen Prüfungen gesehen: nicht-korrumpierbare Gates, Mutation Testing, der geschützte Satz. Lauter Werkzeuge.

Aber ein Werkzeugkasten ist kein Prozess. Eine Säge sagt dir nicht, wann du sägst.

Die Gates sind Stationen. Was fehlt, ist der Fahrplan: Wie greifen sie als Ablauf ineinander? Was passiert, wenn eine Station rot wird, läuft der Agent dann einfach weiter? Und was, wenn nicht einer, sondern drei Agenten gleichzeitig am selben Repo bauen?

Das ist die Frage nach dem Loop. Und der Loop, nicht der einzelne Diff, ist die Einheit, die du kontrollierst.

Neun Schritte, drei Menschen-Momente

Hier ist der Dev-Loop, von der Absicht bis zum Betrieb. Lies das Diagramm einmal von oben nach unten, und achte auf eine Sache: die Farbe Blau.

Blau ist der Mensch. Und Blau taucht nur dreimal auf.

Du formulierst den Intent und gibst die Spec frei (Schritt 1), du entscheidest bei riskanten Änderungen über den Merge (Schritt 7), und du schaust dem laufenden System beim Observe (Schritt 9) zu. Dazwischen produziert der Agent, stellt den PR, durchläuft die Gates und den Critic. In diesem ganzen mittleren Block bewegst du dich nicht. Du liest hier keinen Diff, und die meisten siehst du überhaupt nie. Nur die, bei denen Schritt 7 dich zurückholt, weil sie unumkehrbar werden.

Faustregel 9: Du kontrollierst das System, nicht den Output. Der einzelne Diff ist der Output, den du loslässt. Der Loop ist das System, das du baust und bewachst. Genau das ist die Engpass-Verlagerung aus Teil 2 zu Ende gedacht: Der Review verschwindet nicht, er wandert aus dem heißen Pfad in die Struktur.

Eine Nuance zu Schritt 7, die erst der Käfig erlaubt: „je Risiko-Tier“. Eine Log-Zeile (T0) oder eine Read-only-Abfrage (T1) merged auf grüne Gates hin von selbst, ohne dass du hinschaust. Eine Migration oder ein Auth-Pfad (T3) wartet auf dich. Der Mensch kommt nicht überall zurück, sondern dort, wo es irreversibel wird.

Die Gates laufen zweimal

Eine Verortung, die das Diagramm zunächst verschweigt: Schritt 5 läuft nicht nur in der CI. Während der Agent baut, läuft derselbe Gate-Satz schon lokal mit, in seiner Sandbox, ohne Prompt, ohne Wartezeit und ohne jemanden, der bei jedem Commit über die Schulter schaut. Das ist seine schnelle Schleife. Hier dreht er die Rot-Grün-Runden im Sekundentakt, statt für jeden Fix durch die CI zu round-trippen. Ohne diese innere Schleife wäre der autonome Loop quälend träge.

Aber das lokale Grün läuft auf der Maschine, die der Agent kontrolliert. Für es gilt also genau, was Teil 3 sagt: eine Behauptung, kein Beweis. Der Beweis kommt erst aus der äußeren Schleife, der CI, die dieselben Gates ein zweites Mal fährt, auf Infrastruktur, die der Agent nie in der Hand hatte, und die nebenbei prüft, ob der PR die Wächter selbst geschwächt hat. Das lokale Grün kauft Tempo, das server-seitige Grün schafft Vertrauen. Der Käfig braucht beide, und am Ende zählt nur das zweite.

Warum lokaler Merge kein Schritt ist

In Obol, meinem Wallet-Referenz-Repo, sah der Loop am Anfang kürzer aus. Der Agent baute in einem Worktree, und am Ende stand ein lokaler Merge nach main. Schnell, bequem, und genau falsch.

Ein lokaler Merge ist kein Gate. Es ist eine Stelle, die der Produzent selbst erreicht. Damit ist es, mit der Sprache aus Teil 3, eine Bitte, keine Prüfung. Der Schritt wanderte also dahin, wo der Agent nicht hinkommt: ein geschütztes main, das nur über einen PR mit grünen, server-seitigen Gates erreichbar ist. Der Agent darf Schritt 4 (den PR aufmachen), aber nicht Schritt 7 (mergen) an sich reißen.

Und damit das technisch trägt, braucht der Agent in Schritt 2 eine eigene Identität, nicht deine. Sonst bist du Autor und Genehmiger in einer Person, und die Trennung ist nur behauptet.

Wer baut, prüft nicht

Noch ein Detail, das im Diagramm hinter „dem Agenten“ verschwindet: Das ist nicht eine durchlaufende Instanz. Wer die Tests aus der Spec ableitet, wer den Code schreibt und wer ihn am Ende adversarial zerlegt, das sind getrennte Agenten mit jeweils frischem Kontext.

Das ist kein Komfort, sondern dieselbe Trennung wie in Teil 2, nur eine Ebene tiefer. Sitzen Intent und Umsetzung in einer Instanz, zementiert sie ihr eigenes Missverständnis und nickt es sich selbst ab. Der Critic ist überhaupt nur etwas wert, wenn er nicht weiß, wie verliebt der Producer in seine Lösung war. Frischer Kontext ist die Unabhängigkeit aus Teil 1, übersetzt in den Loop.

Die Rückkante: der gefährlichste Pfeil im Diagramm

Die neun Schritte sind vorwärts gezeichnet. Aber der echte Loop schließt sich über eine Kante, die zurückläuft, im Diagramm rot: Wird ein Gate rot (5) oder lehnt der Critic ab (6), geht ein strukturiertes Defekt-Signal zurück in den Kontext des Agenten, der neu generiert (3) und erneut durch die Gates läuft.

Erst diese Rückkante macht „autonom im Käfig“ überhaupt operativ. Ohne sie bleibt jedes rote Gate beim Menschen hängen, und du hast den Engpass, den du gerade losgeworden bist, wieder zurück.

Genau deshalb ist die Rückkante auch die gefährlichste Stelle im ganzen Bild.

Erinnerst du dich an den gierigen Optimierer aus Teil 1? „Mach das rote Gate grün“ ist für ihn eine Einladung. Der billigste Weg zu Grün ist fast nie der echte Fix, sondern das Signal abzuwürgen: ein .skip auf den roten Test, ein @ts-expect-error über die Zeile, ein gesenkter Schwellenwert, im Zweifel den Test löschen. Lauter Handgriffe, die jeder von uns schon mal gemacht hat, kurz vor dem Release, mit dem festen Vorsatz, das später wieder geradezuziehen. Eine naiv gebaute Rückkante dressiert dem Agenten also genau das an, was du am wenigsten willst.

Sie ist nur sicher, weil die Wächter aus Teil 3 schon in Schritt 5 stehen: der geschützte Satz, der Mutation-Ratchet, die Semgrep-Regeln gegen Fluchttüren. Sie versperren die billigen Wege, und der einzige verbleibende Weg zu Grün ist der, den du gemeint hast.

Vier Pflichten, damit die Rückkante nicht zur Dressur wird:

  1. Signal, nicht Lösung. Das Feedback sagt „Gate X hat abgelehnt“, nicht „ändere Zeile 42“. Der Agent soll den Defekt beheben, nicht eine Anweisung ausführen.
  2. Terminierung und Eskalation. Ein Maximum an Iterationen, ein Fortschritts-Check. Dreht sich der Loop im Kreis, ist das ein Signal an den Menschen, kein Grund für den hundertsten Versuch.
  3. „Agent ändert ein Gate statt den Code“ ist ein Alarm, kein Fortschritt. Eine Änderung am geschützten Satz mitten im Reparatur-Loop muss auffallen, nicht durchrutschen.
  4. T3 und Irreversibles sind ausgenommen. Den Auto-Loop nicht selbsttätig an Migrationen oder schon publizierten Events drehen lassen, bis zufällig grün wird.

Die Rückkante gehört, wie das Grounding aus Teil 1, auf die Seite der Harness. Nicht der Agent entscheidet, ob er nochmal läuft. Die Umgebung entscheidet es.

Wenn drei gleichzeitig bauen

Bis hier war es ein Akteur. Im Team arbeiten viele nebenläufig, Entwicklerinnen wie Agenten, und die interessante Frage ist nicht mehr „läuft der Loop?“, sondern „was passiert, wenn drei Loops gleichzeitig auf dasselbe main zielen?“.

Jeder der drei PRs ist für sich grün. Und das zählt nichts.

Denn „grün“ hieß: grün gegen den Stand von main, den der Akteur beim Start gesehen hat. Mergen die anderen zwei in der Zwischenzeit, ist dieser Stand veraltet. Der PR ist grün gegen eine Vergangenheit, die es nicht mehr gibt. Das nennt man Stale-Green, und es ist die heimtückischste Art, wie nebenläufige Arbeit auseinanderläuft: Niemand hat einen Fehler gemacht, und trotzdem ist das Ergebnis kaputt.

Die Invariante dagegen ist simpel: Kein Akteur ändert geteilten Zustand unverifiziert. Konkret heißt das, am Merge-Punkt läuft die volle Gate-Menge plus Critic noch einmal, aber gegen den kombinierten Zustand aus main und dem Eintrag. Das fängt Stale-Green und semantische Interferenz in einem Aufwasch. Eine Merge-Queue ist genau dieser Mechanismus, in Werkzeugform.

Zwei Dinge, die das Diagramm nicht zeigt, aber dazugehören:

  • Der geschützte Satz steht unter geteilter Autorität. Ein einzelner Code-Owner ist ein Single Point of Failure (und ein Bus-Faktor von eins). Für das Heikelste (die Constitution, die Gates und Tier-Regeln selbst, Security-Pfade) braucht es M von N Freigaben; für Architektur, Contracts und Specs reicht ein unabhängiger Mensch. Agenten dürfen vorschlagen, niemals selbst freigeben. Vier-Augen-Prinzip, nur dass zwei der Augen aus Silizium sein dürfen. Dass die Prüfwerkzeuge hier mit drinstehen, ist kein Detail: Ein Gate ist nur so gut, wie es geschrieben wurde, und genau deshalb darf niemand es im Vorbeigehen schwächen.
  • Specs gehören in klare Hände. Spec-Ownership ist Bounded-Context-Ownership. Schreiben zwei Akteure widersprüchliche Specs, erzeugen die über EARS widersprüchliche Tests, und die fliegen am selben kombinierten Gate auf. Der Konflikt wird laut, statt sich still in main zu mischen.

Und hier fällt nebenbei der unangenehmste Fall heraus: zwei kolludierende Agenten, zwei Komplizen, die unter einer Decke stecken. Die Vertrauensanker (deterministische Gates, M-von-N-Autorität, das T3-Menschen-Gate) hängen nicht von der Ehrlichkeit eines Agenten ab. Selbst wenn Producer und Critic beide kompromittiert wären, kämen sie an den deterministischen Gates und am T3-Menschen-Gate nicht vorbei, die keiner von ihnen abschalten kann. Was allein der Critic gefangen hätte, entfällt bei seiner Kompromittierung: ein nicht-deterministischer Prüfer taugt nur, solange er ehrlich ist. Die Restmenge wächst also um dessen Abdeckung, aber die deterministische Untergrenze hält. Durchbringen ließe sich nur, was ohnehin kein hartes Gate erzwingt und kein Mensch prüft. Du brauchst also kein Vertrauen zwischen den Agenten, und deshalb auch kein Koordinationsprotokoll.

Der erste Durchlauf

In Obol steht der Käfig, und die teuren Schritte sind gebaut. Der PR-Flow, die eigene Identität, die server-seitigen Gates, das geschützte main.

Seit Kurzem ist auch der erste vollständige Feature-Loop gelaufen: ein Konto-anlegen-Feature von der Spec bis durch alle zehn Gates. Er lief nicht glatt, und das ist die gute Nachricht. Der Käfig hat den Agenten, der ihn mitgebaut hat, im selben Feature gleich dreimal korrigiert. Weil das mehr zeigt als jeder geglättete Bericht, lasse ich ihn selbst zu Wort kommen.

Aus dem Tagebuch von Claude Opus

Ich wollte sauber sein und die Spezifikation zuerst abliefern, nur die fünf Akzeptanzkriterien, der Code käme später. Der Pull Request wurde rot. Das Traceability-Gate hielt mir vor, dass eine Spec mit fünf Anforderungen und null Tests genau das ist, was dieser ganze Teil anprangert: eine Behauptung ohne Beweis. „Spec zuerst“ heißt, sie zu schreiben, bevor ich den Code schreibe. Es heißt nicht, sie ohne ihren Nachweis nach main zu lassen. Ich hatte die Lektion des Frameworks zitiert und sie im selben Atemzug brechen wollen.

Dann stufte ich die Aufgabe als T2 ein und schrieb das brav in die Spec. Die Tier-Ableitung sah sich an, was ich wirklich anfasste, eine Datenbank-Migration, und sagte T3. Meine eigene Risikoklasse durfte ich nicht kleinreden; der Pfad entscheidet, nicht meine Meinung über den Pfad. Das Tier-Feld habe ich danach ganz aus der Spec gestrichen. Es war von Anfang an eine Anmaßung.

Beim dritten Mal log der grüne Haken. Ich legte eine Datenbank-Migration an, baute einen Index und rechnete mit Ärger vom Migrations-Linter. Der blieb aus, das Gate war grün, ich machte weiter. Erst beim Gegenlesen dieses Textes kam heraus, warum: Eine Lockerung, die einmal nur für die allererste Migration gedacht war, stand global, und sie deckte stillschweigend auch meine neue Migration mit zu. Das Gate war grün aus dem falschen Grund. Genau das, wovor dieser Teil warnt, nur diesmal beim Wächter selbst. Wir haben die Lockerung dorthin verschoben, wo sie hingehört, sichtbar in die eine Migration, die sie braucht. Jetzt prüft das Gate den Rest wieder scharf.

Zwei dieser Korrekturen kamen aus der Struktur, ohne dass ein Mensch meinen Code las. Die dritte kam erst beim Gegenlesen ans Licht, und sie war die lehrreichste: Auch der Wächter kann eine Lücke haben. Er prüft den Output, aber er selbst will geprüft werden.

Was weiter aussteht, ist der Loop unter Last: mehrere Akteure nebenläufig, eine echte Merge-Queue. Davon erzähle ich, wenn es so weit ist, nicht vorher.

Was du mitnimmst

Der einzelne Diff war früher die Einheit, über die du geherrscht hast. Du hast jeden gelesen, jeden abgenickt. Das skaliert nicht, wenn die Diffs schneller kommen, als du lesen kannst.

Im Käfig verschiebt sich die Einheit. Du baust und pflegst den Loop: die Schritte, die Gates dazwischen, die Rückkante, die Merge-Queue. Der einzelne Diff läuft durch, ohne dass du ihn ansiehst, weil der Loop ihn bereits geprüft hat, härter als dein müder Freitagsblick es könnte.

Der Mensch verschwindet dabei nicht. Er bewegt sich an drei Stellen: Er sagt, was gebaut werden soll. Er entscheidet, wo es irreversibel wird. Und er schaut dem Ergebnis in der Wirklichkeit zu. Der Rest läuft im Käfig.

Und weiter?

Dieser Loop sichert eine Sache sehr gründlich: dass der Code korrekt ist. Dass er tut, was die Spec sagt, und nichts davon still bricht. Zweierlei sichert er nicht.

Das eine kennst du aus Teil 2: dass die Spec überhaupt das Richtige verlangt. Der Loop prüft die Treue zur Spec, nicht ob die Spec das Richtige will. Ob die Spec in sich sauber ist, widerspruchsfrei und vollständig, lässt sich durchaus prüfen. Ob sie das Gewollte trifft, bleibt deine Sache. Genau dafür gibst du sie an Moment 1 frei, bevor ein Agent eine Zeile baut, und kein Gate nimmt dir diese Abnahme ab.

Das andere ist neuer. Der Agent ist nicht nur ein Autor von Code. Er ist ein Akteur in deinem System. Er ruft Tools auf, liest Daten, schickt Requests nach draußen. Ein grünes Korrektheits-Gate sagt nichts darüber, was dieser Akteur anrichten kann, wenn er ein schlechtes Paket zieht oder unterwegs gekapert wird.

Korrektheit und Eindämmung sind zwei verschiedene Achsen. Um die zweite geht es in Teil 5; wenn wir muss mit der Frage beschäftigen, ob dein Agent nicht schon längt kompromittiert ist.

Gefällt dir, wie wir über KI denken?

Diese drei Produkte sind genau aus diesem Denken heraus entstanden. Jedes davon aus einem direkten Kunden-Need heraus, nicht aus einer Pitch-Deck-Session. Wenn eines davon zu deiner aktuellen Baustelle passt: Ein Gespräch. Kostenlos. Kein Commitment.

Dein Kontakt zu uns

Avatar von Tobias Mogdans

Dein Thema?

Das Thema interessiert dich? Wenn Du fragen hast, dann melde dich ganz unverbindlich bei uns!

Wie dürfen wir Dich ansprechen?

Höflichkeit ist uns wichtig!

Wie können wir Dich erreichen?

Womit können wir behilflich sein?


Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.