计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
circuit-breaker-pattern【效率与协作】Circuit-Breaker-Logik fuer agentische Tool-Aufrufe implementieren — Tool-Gesundheit tracken, zwischen Closed/Open/Half-Open-Zustaenden wechseln, Aufgabenumfang bei Tool-Ausfaellen reduzieren, ueber Faehigkeitskarten zu Alternativen routen und Fehlerbudgets durchsetzen, um Fehlerakkumulation zu verhindern. Trennt Orchestrierung (entscheiden was versuc…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Graceful Degradation bei Tool-Ausfaellen. Ein Agent, der fuenf Tools aufruft und eines defekt ist, sollte nicht vollstaendig versagen — er sollte das defekte Tool erkennen, aufhoeren es aufzurufen, den Umfang auf das verbleibend Erreichbare reduzieren und ehrlich berichten, was uebersprungen wurde. Dieser Skill kodifiziert diese Logik mit dem Circuit-Breaker-Muster aus verteilten Systemen, angepasst an agentische Tool-Orchestrierung.
Die Kernidee, aus kirapixelads' "Kuechen-Brandproblem": Der Expeditor (Orchestrierungsschicht) darf nicht selbst kochen. Die Trennung von Belangen zwischen dem Entscheiden was versucht werden soll und wie es versucht werden soll verhindert, dass der Orchestrator in der Wiederholungsschleife eines fehlerhaften Tools gefangen wird.
Dokumentieren, was jedes Tool bereitstellt und welche Alternativen existieren. Diese Karte ist die Grundlage fuer Umfangsreduzierung — ohne sie laesst ein Tool-Ausfall den Agenten raten, was als naechstes zu tun ist.
capability_map:
- tool: Grep
provides: content search across files
alternatives:
- tool: Bash
method: "rg or grep command"
degradation: "loses Grep's built-in output formatting"
- tool: Read
method: "read suspected files directly"
degradation: "requires knowing which files to check; no broad search"
fallback: "ask the user which files to examine"
- tool: Bash
provides: command execution, build tools, git operations
alternatives: []
fallback: "report commands that need to be run manually"
- tool: Read
provides: file content inspection
alternatives:
- tool: Bash
method: "cat or head command"
degradation: "loses line numbering and truncation safety"
fallback: "ask the user to paste file contents"
- tool: Write
provides: file creation
alternatives:
- tool: Edit
method: "create via full-file edit"
degradation: "requires file to already exist for Edit"
- tool: Bash
method: "echo/cat heredoc"
degradation: "loses Write's atomic file creation"
fallback: "output file contents for the user to save manually"
- tool: WebSearch
provides: external information retrieval
alternatives: []
fallback: "state what information is needed; ask user to provide it"
Fuer jedes Tool dokumentieren:
Erwartet: Eine vollstaendige Faehigkeitskarte, die jedes vom Agenten genutzte Tool abdeckt. Jeder Eintrag hat mindestens einen Fallback, auch wenn keine Tool-Alternative existiert. Die Karte macht explizit, was sonst implizit ist: welche Tools kritisch (keine Alternativen) und welche substituierbar sind.
Bei Fehler: Wenn die Tool-Liste unklar ist, mit den allowed-tools aus dem Skill-Frontmatter beginnen. Wenn Alternativen unsicher sind, als degradation: "unbekannt — vor Verwendung testen" markieren statt sie wegzulassen.
Den Zustandstracker fuer jedes Tool einrichten. Jedes Tool startet im CLOSED-Zustand (gesund, normaler Betrieb).
Circuit-Breaker-Zustandstabelle:
+------------+--------+-------------------+------------------+-----------------+
| Tool | Zustand| Aufeinanderfolgend | Letzter Fehler | Letzter Erfolg |
+------------+--------+-------------------+------------------+-----------------+
| Grep | CLOSED | 0 | — | — |
| Bash | CLOSED | 0 | — | — |
| Read | CLOSED | 0 | — | — |
| Write | CLOSED | 0 | — | — |
| Edit | CLOSED | 0 | — | — |
| WebSearch | CLOSED | 0 | — | — |
+------------+--------+-------------------+------------------+-----------------+
Fehlerbudget: 0 / 5 verbraucht
Zustandsdefinitionen:
Zustandsuebergaenge:
Erwartet: Eine Zustandstabelle fuer alle Tools mit CLOSED-Zustand und null Fehleranzahlen initialisiert. Fehlerschwelle und Budget explizit deklariert.
Bei Fehler: Wenn die Tool-Liste nicht im Voraus enumeriert werden kann (dynamische Tool-Entdeckung), Zustand beim ersten Verwenden jedes Tools initialisieren. Das Muster gilt weiterhin — die Tabelle wird nur inkrementell aufgebaut.
Wenn der Agent ein Tool aufrufen muss, diese Entscheidungssequenz befolgen. Dies ist die Expeditor-Logik — sie entscheidet ob der Aufruf versucht werden soll, nicht wie er ausgefuehrt werden soll.
VOR jedem Tool-Aufruf:
1. Tool-Zustand in der Circuit-Breaker-Tabelle pruefen
2. Wenn OPEN:
a. Pruefen ob Zeit fuer Half-Open-Sonde ist
- Ja → zu HALF-OPEN wechseln, mit Sonden-Aufruf fortfahren
- Nein → Tool ueberspringen, zu Alternative routen (Schritt 4)
3. Wenn HALF-OPEN:
a. Einen Sonden-Aufruf machen
b. Erfolg → zu CLOSED wechseln, aufeinanderfolgende Fehler auf 0 zuruecksetzen
c. Fehler → zu OPEN wechseln, Fehlerbudget erhoehen
4. Wenn CLOSED:
a. Aufruf normal durchfuehren
NACH jedem Tool-Aufruf:
1. Erfolg:
- Aufeinanderfolgende Fehler auf 0 zuruecksetzen
- Zeitstempel letzten Erfolgs aufzeichnen
2. Fehler:
- Aufeinanderfolgende Fehler erhoehen
- Zeitstempel letzten Fehlers und Fehlermeldung aufzeichnen
- Verbrauchtes Fehlerbudget erhoehen
- Wenn aufeinanderfolgende Fehler >= Schwelle:
zu OPEN wechseln
protokollieren: "Schaltkreis OFFEN fuer [Tool]: [Fehlerzahl] aufeinanderfolgende Fehler"
- Wenn Fehlerbudget erschoepft:
PAUSE — Aufgabe nicht fortsetzen
Nutzer berichten (Schritt 6)
Der Expeditor wiederholt einen fehlgeschlagenen Aufruf nie sofort. Er zeichnet den Fehler auf, prueft Schwellen und macht weiter. Wiederholungen erfolgen nur durch den HALF-OPEN-Sondenmechanismus in einem spaeteren Schritt.
Erwartet: Eine klare Entscheidungsschleife, die der Agent vor und nach jedem Tool-Aufruf befolgt. Tool-Gesundheit wird kontinuierlich getrackt. Die Expeditor-Schicht blockiert nie bei einem fehlerhaften Tool.
Bei Fehler: Wenn Zustand ueber Aufrufe hinweg nicht praktikabel getrackt werden kann (z. B. zustandslose Ausfuehrung), zu einem einfacheren Modell degradieren: Gesamtfehler zaehlen und bei Budget pausieren. Der Drei-Zustands-Circuit-Breaker ist ideal; ein Fehlerzhaler ist das Minimum-viable-Muster.
Wenn der Schaltkreis eines Tools OPEN ist, die Faehigkeitskarte (Schritt 1) konsultieren und zur besten verfuegbaren Alternative routen.
Routing-Prioritaet:
Beispiel-Routing-Entscheidung:
Benoetiges Tool: Grep (Schaltkreis OPEN)
Aufgabe: Alle Dateien mit "API_KEY" finden
Route 1: Bash mit rg Befehl
→ Degradierung: verliert Greps eingebaute Formatierung
→ Entscheidung: AKZEPTABEL — diese Route verwenden
Wenn Bash auch OPEN:
Route 2: Vermutete Konfigurationsdateien direkt lesen
→ Degradierung: erfordert Raten welche Dateien; keine breite Suche
→ Entscheidung: PARTIELL — nur bekannte Konfigurationspfade versuchen
Wenn Read auch OPEN:
Route 3: Nutzer fragen
→ "Ich muss Dateien mit 'API_KEY' finden, aber meine Such-
Tools sind nicht verfuegbar. Koennen Sie ausfuehren: grep -r 'API_KEY' ."
→ Entscheidung: FALLBACK — Nutzer stellt die Information bereit
Wenn Nutzer nicht verfuegbar:
Route 4: Umfangsreduzierung
→ "API-Schlussel-Suche" aus Aufgabenumfang entfernen
→ Dokumentieren: "UEBERSPRUNGEN: API-Schlussel-Suche — keine Tools verfuegbar"
Erwartet: Wenn ein Tool-Schaltkreis oeffnet, routet der Agent transparent zu einer Alternative oder reduziert den Umfang. Routing-Entscheidung und eventuelle Degradierungen sind in der Aufgabenausgabe dokumentiert.
Bei Fehler: Wenn die Faehigkeitskarte unvollstaendig ist (keine Alternativen gelistet), standardmaessig auf Umfangsreduzierung zurueckfallen und berichten. Arbeit nie still uebergehen — immer dokumentieren, was uebersprungen wurde und warum.
Wenn Tools offen-geschaltet sind und Alternativen erschoepft sind, die Aufgabe auf das reduzieren, was noch mit funktionierenden Tools erledigt werden kann. Das ist kein Versagen — es ist ehrliches Umfangsmanagement.
Umfangsreduzierungsprotokoll:
Umfangsreduzierungsbericht:
Urspruenglicher Umfang: 5 Unteraufgaben
[x] 1. Konfigurationsdateien lesen (Read: CLOSED)
[x] 2. Nach veralteten Mustern suchen (Grep: CLOSED)
[ ] 3. Testpakete ausfuehren (Bash: OPEN — keine Alternative)
[x] 4. Dokumentation aktualisieren (Edit: CLOSED)
[ ] 5. In Staging deployen (Bash: OPEN — keine Alternative)
Reduzierter Umfang: 3 Unteraufgaben erreichbar
Zurueckgestellt: 2 Unteraufgaben benoetigen Bash (Schaltkreis OPEN)
Empfehlung: Unteraufgaben 1, 2, 4 jetzt abschliessen.
Unteraufgaben 3 und 5 benoetigen Bash — im naechsten Zyklus
sondieren oder Nutzer kann Befehle manuell ausfuehren.
Zurueckgestellte Unteraufgaben nicht versuchen. Open-geschaltete Tools nicht wiederholt aufrufen in der Hoffnung, sie werden funktionieren. Der Circuit Breaker existiert genau dafuer — seinem Zustand vertrauen.
Erwartet: Eine klare Aufteilung der Aufgabe in erreichbare und zurueckgestellte Arbeit. Der Agent schliessst alle erreichbare Arbeit ab und berichtet zurueckgestellte Elemente mit Grund und was sie entsperren wuerde.
Bei Fehler: Wenn Umfangsreduzierung alle Unteraufgaben entfernt (jedes Tool ist defekt), direkt zu Schritt 6 uebergehen — pausieren und berichten. Ein Agent ohne funktionierende Tools sollte keinen Fortschritt vortaeuschen.
Wenn ein Tool Daten zurueckgibt, die moeglicherweise veraltet sind (gecachte Ergebnisse, veraltete Snapshots, zuvor abgerufene Inhalte), diese explizit kennzeichnen statt sie als aktuell zu behandeln.
Veraltungsindikatoren:
Kennzeichnungsprotokoll:
Bei der Praesentation moeglicherweise veralteter Daten:
"[VERALTETE DATEN — abgerufen um {Zeitstempel}, spiegelt moeglicherweise nicht aktuellen Zustand wider]
Dateiinhalte des letzten erfolgreichen Lesens:
..."
"[GECACHTES ERGEBNIS — Grep gab identische Ergebnisse zum vorherigen Aufruf zurueck;
Dateisystem koennte sich seitdem geaendert haben]"
"[NICHT VERIFIZIERT — WebSearch-Ergebnis vom {Datum}; aktueller Status unbekannt]"
Veraltete Daten nie still als aktuell praesentieren. Der Nutzer oder nachgelagerte Agent muss die Datenqualitaet kennen, um fundierte Entscheidungen zu treffen.
Erwartet: Alle Tool-Ausgaben, die moeglicherweise veraltet sind, tragen explizite Kennzeichnungen. Frische Daten werden nicht gekennzeichnet (Kennzeichnung ist fuer Unsicherheit reserviert, nicht fuer Bestaetigung).
Bei Fehler: Wenn Veraltung nicht bestimmt werden kann (keine Zeitstempel, keine Vergleichsbasis), die Unsicherheit vermerken: "[AKTUALITAET UNBEKANNT — keine Vergleichsbasis]". Unsicherheit ueber Aktualitaet ist selbst Information.
Gesamtfehler ueber alle Tools hinweg tracken. Wenn das Budget erschoepft ist, pausiert der Agent und berichtet statt weiter Fehler anzusammeln.
Fehlerbudget-Durchsetzung:
Budget: 5 Fehler pro Zyklus
Aktuell: 4 / 5 verbraucht
Fehler 1: Bash — "Berechtigung verweigert" (Schritt 3)
Fehler 2: Bash — "Befehl nicht gefunden" (Schritt 3)
Fehler 3: Bash — "Timeout nach 120s" (Schritt 4)
Fehler 4: WebSearch — "Verbindung abgelehnt" (Schritt 5)
Status: 1 Fehler verbleibend vor obligatorischer Pause
→ Naechster Tool-Aufruf erfolgt mit erhoehter Vorsicht
→ Wenn er fehlschlaegt: PAUSE und Statusbericht generieren
Bei Budget-Erschoepfung:
FEHLERBUDGET ERSCHOEPFT — PAUSIERE
Abgeschlossene Arbeit:
- Unteraufgabe 1: Konfigurationsdateien lesen (ERFOLG)
- Unteraufgabe 2: Nach veralteten Mustern suchen (ERFOLG)
Unvollstaendige Arbeit:
- Unteraufgabe 3: Testpakete ausfuehren (FEHLGESCHLAGEN — Bash Schaltkreis OPEN)
- Unteraufgabe 4: Dokumentation aktualisieren (NICHT VERSUCHT — pausiert)
- Unteraufgabe 5: In Staging deployen (NICHT VERSUCHT — pausiert)
Tool-Gesundheit:
Grep: CLOSED (gesund)
Read: CLOSED (gesund)
Edit: CLOSED (gesund)
Bash: OPEN (3 aufeinanderfolgende Fehler — Berechtigung/Befehl/Timeout)
WebSearch: OPEN (1 Fehler — Verbindung abgelehnt)
Fehler: 5 / 5 Budget verbraucht
Empfehlung:
1. Bash-Fehler untersuchen — wahrscheinlich Umgebungsproblem
2. Netzwerkkonnektivitaet fuer WebSearch pruefen
3. Aufgabe nach Behebung von Unteraufgabe 4 fortsetzen
Die Pause-und-Bericht-Funktion erfuellt dieselbe Funktion wie ein Sicherungsautomat in elektrischen Systemen: Sie verhindert die Anhaefung von Schaeden. Ein Agent, der weiterhin kaputte Tools aufruft, verschwendet Kontextfenster, verwirrt den Nutzer mit wiederholten Fehlern und kann inkonsistente Teilergebnisse produzieren.
Erwartet: Der Agent stoppt sauber, wenn das Fehlerbudget erschoepft ist. Der Bericht umfasst abgeschlossene Arbeit, unvollstaendige Arbeit, Tool-Gesundheit und handlungsrelevante naechste Schritte.
Bei Fehler: Wenn der Agent keinen sauberen Bericht generieren kann (z. B. Zustandstracking ging verloren), alle verfuegbaren Informationen ausgeben. Ein partieller Bericht ist besser als stille Fortsetzung.
Pruefen, dass die Orchestrierungslogik (Schritte 2–7) sauber von der Tool-Ausfuehrung getrennt ist.
Was der Expeditor (Orchestrierung) tut:
Was der Expeditor NICHT tut:
Wenn der Expeditor "kocht" (Tool-Aufrufe macht, um andere Tool-Fehler zu umgehen), ist die Trennung gebrochen. Der Expeditor sollte zu einem alternativen Tool routen oder den Umfang reduzieren — nicht versuchen, das defekte Tool zu reparieren.
Erwartet: Eine klare Grenze zwischen Orchestrierungsentscheidungen und Tool-Ausfuehrung. Die Expeditor-Schicht kann beschrieben werden ohne auf spezifische Tool-APIs oder Fehlertypen zu verweisen.
Bei Fehler: Wenn Orchestrierung und Ausfuehrung verflochten sind, durch Extrahieren der Entscheidungslogik in einen separaten Schritt refaktorieren, der vor jedem Tool-Aufruf laeuft. Der Entscheidungsschritt produziert eine von vier Ausgaben: AUFRUFEN, UEBERSPRINGEN, SONDIEREN oder PAUSIEREN. Der Ausfuehrungsschritt handelt auf diese Ausgabe.
Wenn mehrere Tools Infrastruktur teilen (Netzwerk, Dateisystem, Berechtigungen), kann eine einzelne Ursache mehrere Sicherungsautomaten gleichzeitig ausloesen. Dieses korrelierte Muster erkennen und behandeln statt jeden Sicherungsautomaten unabhaengig zu behandeln.
Indikatoren fuer kaskadende Fehler:
Antwortprotokoll:
Backoff-Compounding: Bei kaskadierenden Fehlern exponentielle Verzoegerung fuer Half-Open-Sonden verwenden: bei Schritt 3 sondieren, dann Schritt 6, dann Schritt 12. Maximales Intervall bei 20 Schritten kappen, um permanente Schaltkreissperrung zu verhindern. Das verhindert, dass schnelle Sonden ein sich erholendes System ueberstrapazieren.
Erwartet: Korrelierte Fehler werden als einzelnes systemisches Ereignis erkannt und behandelt statt als N unabhaengige Sicherungsautomaten-Ausloesungen. Das Fehlerbudget zaehlt das systemische Ereignis einmal, nicht N-mal.
Bei Fehler: Wenn Korrelationserkennung nicht praktikabel ist (Fehler haben unterschiedliche Fehlersignaturen trotz gemeinsamer Ursache), auf unabhaengige Einzel-Tool-Sicherungsautomaten zurueckfallen. Das System degradiert weiterhin graceful — es verbraucht das Budget nur schneller.
Bevor die Circuit-Breaker-Schleife (Schritt 3) eingesetzt wird, optional pruefen, ob ein Tool verfuegbar ist und wahrscheinlich erfolgreich sein wird. Das reduziert unnoetige Sicherungsautomaten-Ausloesungen durch vorhersehbare Fehler.
Pre-Call-Pruefungen:
| Pruefung | Methode | Aktion bei Fehler |
|---|---|---|
| Tool existiert | Pruefen ob Tool in allowed-tools-Liste ist | Ueberspringen — nicht mal versuchen |
| MCP-Server-Gesundheit | Server-Prozess/Verbindungsstatus pruefen | Sofort zu Alternative routen |
| Ressourcenverfuegbarkeit | Pruefen ob Zieldatei/URL/Endpunkt existiert | Routen oder Umfang reduzieren |
Entscheidungstabelle:
Pre-Call-Bewertung:
VERFUEGBAR → mit Circuit-Breaker-Schleife fortfahren (Schritt 3)
DEGRADIERT → mit Vorsicht fortfahren, Fehlerschwelle um 1 verringern
NICHT VERFUEGBAR → Tool ueberspringen, zu Alternative routen (Schritt 4) ohne Budget zu verbrauchen
Pre-Call-Pruefungen sind beratend, nicht massgeblich. Ein Tool, das Pre-Call-Pruefungen besteht, kann waehrend der Ausfuehrung immer noch fehlschlagen. Der Circuit Breaker bleibt der primaere Zuverlaessigkeitsmechanismus.
Erwartet: Vorhersehbare Fehler (fehlende Tools, nicht erreichbare Server) werden abgefangen, bevor sie das Fehlerbudget verbrauchen. Der Circuit Breaker behandelt nur echte Laufzeitfehler.
Bei Fehler: Wenn Pre-Call-Pruefungen nicht verfuegbar sind oder zu viel Overhead hinzufuegen, diesen Schritt vollstaendig ueberspringen. Die Circuit-Breaker-Schleife in Schritt 3 behandelt alle Fehler — Pre-Call-Auswahl ist eine Optimierung, kein Erfordernis.
fail-early-pattern — komplementaeres Muster: fail-early validiert Eingaben vor Arbeitsbeginn; circuit-breaker verwaltet Fehler waehrend der Arbeitescalate-issues — wenn das Fehlerbudget erschoepft oder die Umfangsreduzierung erheblich ist, an einen Spezialisten oder Menschen eskalierenwrite-incident-runbook — wiederkehrende Tool-Ausfall-Muster als Runbooks fuer schnellere Diagnose dokumentierenassess-context — bewerten ob der aktuelle Ansatz angepasst werden kann, wenn mehrere Tools degradiert sind; paart mit Umfangsreduzierungsentscheidungendu-dum — Zweig-Uhr-Architektur trennt Beobachtung von Entscheidung; komplementaeres Muster zur Reduzierung der Beobachtungskosten in Agentschleifen