Letzten März ließ ich einen Agenten über Nacht laufen. Ich kam zurück und fand 4.200 Werkzeugaufrufe und eine Rechnung von 90 Dollar vor. Er "reparierte" einen fehlschlagenden Test, indem er den Test bearbeitete, ihn bestehen sah, die Datei neu las, entschied, dass die Datei falsch aussah, und sie wieder zurückbearbeitete. Für immer. Ein perfektes Hamsterrad, angetrieben von Opus.
Wenn Ihr Claude Code Agent endlos schleift, liegt das fast nie daran, dass das Modell dumm ist. Das Problem ist, dass Sie nie definiert haben, was "fertig" bedeutet — auf eine Weise, die der Harness durchsetzen kann. Lassen Sie mich die drei Schleifenmuster zeigen, die ich wirklich in der Produktion sehe, und wie ich jedes davon beende.
Die Flip-Flop-Schleife
Das ist das Hamsterrad von oben. Der Agent nimmt Änderung A vor, beobachtet ein Problem, nimmt Änderung B vor, die A rückgängig macht, beobachtet das ursprüngliche Problem, nimmt Änderung A erneut vor. Jeder Schritt erscheint lokal vernünftig. Das Modell hat kein Gedächtnis dafür, dass es das bereits versucht hat.
Das Erkennungszeichen: Grep Sie Ihr Transkript nach wiederholten Werkzeug-Eingaben. Wenn dasselbe edit mit demselben old_string dreimal auftaucht, haben Sie einen Flip-Flop.
jq -r 'select(.type=="tool_use") | .input.file_path' run.jsonl | sort | uniq -c | sort -rn
Wenn ein Dateipfad 40 Bearbeitungen hat, das ist Ihre Schleife. Die Lösung ist kein besserer Prompt. Es ist ein Stop-Hook, der Bearbeitungen pro Datei zählt und den Lauf anhält, wenn er einen Schwellenwert überschreitet. Ich begrenze auf 8 Bearbeitungen einer einzelnen Datei, bevor der Agent zu mir eskalieren muss. Acht ist willkürlich. Wählen Sie Ihre eigene Zahl. Der Punkt ist, dass der Harness das durchsetzt, nicht die guten Absichten des Modells.
Die Pause_Turn-Schleife
Diese erwischt Leute, die serverseitige Werkzeuge verwenden — Websuche, Code-Ausführung. Die API führt ihre eigene interne Schleife aus, und wenn sie das Iterationslimit erreicht, gibt sie stop_reason: "pause_turn" zurück. Sie sollen den Assistenten-Turn erneut senden, damit der Server weitermacht. Viele handgestrickte Schleifen behandeln pause_turn stattdessen wie end_turn, halten an, und der Benutzer gibt erneut "weiter" ein, was einen neuen Turn startet, der wieder pausiert.
Die Lösung ist todleicht, aber alle machen es falsch:
if response.stop_reason == "pause_turn":
messages.append({"role": "assistant", "content": response.content})
# erneut senden — KEINE "Weiter."-Benutzernachricht hinzufügen
response = client.messages.create(model="claude-opus-4-8", messages=messages, tools=tools)
Fügen Sie keine gefälschte Benutzernachricht "Weiter." hinzu. Die API erkennt den abschließenden server_tool_use-Block und setzt selbst fort. Das Hinzufügen des Benutzer-Turns verwirrt sie. Und setzen Sie einen max_continuations-Zähler — 5 reicht — damit ein wirklich feststeckender Turn nicht drehen kann.
Die Context-Rot-Schleife
Die hinterhältigste. Der Agent läuft lange genug, dass sein früher Kontext veraltet, vergisst, dass er Teilaufgabe drei bereits gelöst hat, liest dieselben Dateien erneut, leitet denselben Plan erneut ab und verbrennt Token, um einen Zustand wiederherzustellen, den er bereits hatte. Er macht keinen Flip-Flop bei einer einzigen Datei. Er konvergiert einfach nie, weil er in jedem Turn halb seine eigene Erinnerung neu aufbaut.
Das erkennen Sie an den Nutzungszahlen, nicht am Transkript. Wenn input_tokens weiter steigt, während der tatsächliche Fortschritt flach bleibt, zahlt das Modell dafür, seine eigene Geschichte erneut zu lesen. Bei Opus 4.8 mit dem 1M-Fenster kann das lange laufen, bevor es zusammenbricht — was es schlimmer macht: Es stürzt nicht ab, es stellt Ihnen nur still die Rechnung.
Zwei Lösungen. Erstens, aktivieren Sie Kompaktierung (compact-2026-01-12 Beta), damit die API alten Kontext serverseitig zusammenfasst, anstatt das vollständige Transkript zu schleppen. Kritischer Fallstrick: Sie müssen den vollständigen response.content in jedem Turn zurückanhängen, nicht nur den Text — die Kompaktierungsblöcke befinden sich dort, und wenn Sie auf Text reduzieren, verlieren Sie stillschweigend den Kompaktierungszustand und die Verrottung kehrt sofort zurück. Zweitens geben Sie dem Agenten eine Gedächtnisdatei und weisen Sie ihn an, den Fortschritt dort zu schreiben. Ein Notizbuch auf der Festplatte überlebt die Schleife; der Gesprächsverlauf nicht.
Der Sicherheitszaun, der alle drei abfängt
Schleifen-spezifische Fixes sind gut, aber das Auffangnetz, das mir am meisten Geld gespart hat, ist stupide einfach: eine Wanduhr- und Werkzeugaufruf-Obergrenze, die außerhalb des Modells durchgesetzt wird. Ich führe den Agenten unter einem Watchdog aus. Wenn er N Werkzeugaufrufe oder M Minuten überschreitet, tötet der Watchdog ihn und gibt die letzten 20 Ereignisse aus. Das Modell hat kein Stimmrecht.
Warum außerhalb des Modells? Weil in jeder Schleife, die ich beschrieben habe, das Modell glaubt, Fortschritte zu machen. Sie können sich nicht per Prompt aus "der Agent ist zuversichtlich falsch darüber, fertig zu sein" herausarbeiten. Der Hook muss im Harness leben — ein Stop-Hook in Claude Code oder ein Zähler in Ihrer eigenen Agentenrunde. Token-Countdowns, die Sie dem Modell zeigen, zählen nicht; bei den Langzeithorizontmodellen macht dieser Countdown es tatsächlich ängstlich und es wird vorschlagen, eine neue Sitzung zu starten, anstatt fertig zu werden.
Das ist es, was niemand Ihnen sagt, wenn Sie anfangen, Agenten zu bauen. Ihr Prompt-Engineering stößt schnell an seine Grenzen. Die Zuverlässigkeit kommt von den langweiligen Dingen rund um die Schleife — Zähler, Watchdogs, Bearbeitungsobergrenzen, ein hartes max_continuations. Das Modell ist der einfache Teil. Die Leine ist die Arbeit.
Schreiben Sie zuerst die Leine. Dann lassen Sie es über Nacht laufen.
