Quick answer: DeepSeek Harness liefert ein kurzes Dokument mit Defensivmustern, jedes als allgemeine Regel formuliert und mit dem konkreten Fehler, der sie ausgelöst hat. Es ist die übertragbarste Datei im...

Sieben Defensivmuster aus der DeepSeek-Harness-Dokumentation

Updated August 16, 2026 · first published August 16, 2026

DeepSeek Harness liefert ein kurzes Dokument mit Defensivmustern, jedes als allgemeine Regel formuliert und mit dem konkreten Fehler, der sie ausgelöst hat. Es ist die übertragbarste Datei im Repository: Nichts davon setzt voraus, dass man das Harness übernimmt, und jeder Punkt entspricht einem Fehlermodus, der in selbstgebauten Agentenlaufzeiten auftaucht.

1. Orthogonale Ergebnisse getrennt melden

Niemals die Meldung eines Flags in die Bedingung eines anderen verschachteln. Ein Prozess kann in ein Timeout laufen und mit Null beenden, weil er das Signal abgefangen und sauber heruntergefahren hat. Wird das Timeout nur im Zweig für Nicht-Null-Exit gemeldet, verschwindet dieser Ausgang. Timeout, Signal und Exit-Code sind unabhängige Fakten und brauchen unabhängige Felder.

Kostenrelevanz: still verschluckte Timeouts sind die Art, wie Retry-Schleifen entstehen. Der Aufrufer sieht Erfolg, bekommt nichts Brauchbares und versucht es erneut.

2. Öffentliche Verträge auf beiden Seiten einhalten

Wo ein Ergebnis mehrere gültige Darstellungen hat, normalisieren Sie sie, bevor Sie sie nach außen geben. Das Beispiel sind Fehler bei Modellanfragen: Implementierungen können werfen oder einen Fehler-Finish-Chunk senden, und die API-Grenze normalisiert alles auf einen terminalen Finish-Chunk. Ohne das kann ein Aufrufer, der eine Ausnahme fängt, nicht unterscheiden, ob sie vom Anbieter, von Middleware, vom Logging oder aus eigenem Code stammt.

3. Asynchroner Zustand ist kein synchroner Zustand

Statusabfragen sind nicht kausal an bestimmte asynchrone Operationen gekoppelt. Auf den Idle-Zustand eines Agenten als Abschlusssignal für eine Nachricht zu warten, ist falsch, weil mehrere eingereihte Operationen sich Ausführungsintervalle teilen — Idle kann eintreten, bevor die eigene lief, oder nachdem die eines anderen lief.

Der vorgeschriebene Weg: Ein Automatisierungsaufrufer, dem ein Lauf gehört, definiert sein Intervall explizit, vom Eingang im Posteingang bis zum nächsten ganzheitlichen Idle des Agenten, und ordnet Ausgaben diesem Intervall zu statt einzelnen Nachrichten. Behandeln Sie auch den Zweig, in dem es nichts zu warten gibt, sonst hängt der Aufrufer endlos.

Ein Automatisierungs-Harness, das auf das falsche Idle-Signal wartet, hält eine Sitzung und ihre Kinder am Leben. Die Rechnung dafür ist nicht das Hängen, sondern alles, was dahinter noch läuft.

4. Dispose muss Ruhe erreichen, nicht nur anfordern

Terminierung anzufordern heißt nicht, sie zu erreichen. Dispose wartet auf die tatsächliche Beendigung der Kinder, bevor es zurückkehrt. Und Listener-Registries schließen vor dem Senden der Kill-Signale, damit späte Abschlüsse still landen statt in ein halb abgebautes System zu feuern.

Das ist das Muster mit der klarsten finanziellen Kante. Ein Dispose, das zu früh zurückkehrt, lässt verwaiste Subprozesse und ungeschlossene Sandboxes laufen, und abgerechnete Rechenzeit hört nicht auf, nur weil ihr Elternteil sie vergessen hat.

5. Callback-Ausnahmen im Dispatcher einfangen

Umschließen Sie Dispatch-Schleifen mit try/catch. Ein fehlschlagender Abonnent darf das Dispatch-Promise nicht ablehnen oder die dahinter eingereihten Listener aushungern. In einer Agentenlaufzeit ist der ausgehungerte Listener häufig genau der, der abrechnet — so verschwinden Nutzungsdaten, ohne dass ein Fehler sichtbar wird.

6. Nie die Umgebung oder vorhersagbare Pfade an nicht vertrauenswürdige Ausgaben geben

Die stärkste Regel des Dokuments und die zuerst zu übernehmende. Bereinigen Sie die Umgebung gestarteter Kommandos: Entfernen Sie vor dem Start Variablen, die auf key, secret, token und password passen. Nutzen Sie private Verzeichnisse mit Rechten nur für den Eigentümer, zufällige Dateinamen und exklusive Öffnungen statt vorhersagbarer Pfade.

Zwei verschiedene Bedrohungen. Die Bereinigung verhindert, dass Harness-Zugangsdaten in Subprozess-Ausgaben lecken, die das Modell dann liest — und einmal gelesen, stehen sie im Sitzungsprotokoll und im Kontextfenster. Zufällige Namen und exklusives Anlegen schließen Symlink-Rennen in gemeinsamen Temp-Verzeichnissen.

7. Link-förmige Pfade entlinken

Prüfen Sie vor dem Löschen, ob ein Pfad ein symbolischer Link ist, und löschen Sie den Link, statt ihm zu folgen. Rekursives Entfernen bleibt bestätigten echten Verzeichnissen vorbehalten, weil es über Symlinks in deren Ziele laufen kann und an Junctions wirft. Aufräumcode, der mehr löscht als er angelegt hat, ist ein Fehlermodus ohne obere Schadensgrenze.

Wie man diese Liste nutzt

  1. Nehmen Sie Muster 1 und 4 heute in Ihren Subprozess- und Sandbox-Abbau. Dort leckt das Geld.
  2. Nehmen Sie Muster 6 überall dorthin, wo Sie einen Prozess starten, dessen Ausgabe das Modell liest.
  3. Nehmen Sie Muster 3 in Ihre Automatisierungsschicht, besonders dort, wo ein Warten als "bis der Agent idle ist" formuliert ist.
  4. Nehmen Sie Muster 5 in Ihre Telemetrie-Pipeline und prüfen Sie, dass ein fehlschlagender Listener den abrechnenden nicht aushungern kann.

Related


Want this applied to your own LLM spend? FinOps LLM runs a free audit of your AI costs and shows where the savings are. Book free audit →

Back to research