KI-News · Werkzeuge
Caveman gegen die
eingebauten Ausgabestile.
EN Read in English
Claude Code bringt vier eingebaute Ausgabestile mit: Default, Concise, Explanatory und Learning. Caveman ist ein separat installierter Skill mit demselben Ziel wie Concise, weniger Tokens in der Antwort. Ich habe dieselbe kleine Aufgabe an echtem PlantWiz-Code fünfmal beantwortet, einmal je Stil, und Zeichen sowie Wörter gezählt.
SKILL.md des npm-Pakets caveman-skill, wörtlich befolgt. Die
fachliche Lösung ist in allen fünf Antworten identisch, nur Formulierung und Umfang des
Fließtexts unterscheiden sich, damit der Vergleich auf den Stil zielt, nicht auf
unterschiedliche Lösungsansätze.
Die Aufgabe
backend/scripts/import-trefle.ts ruft bei einem Rate-Limit (HTTP 429) der
Trefle-API die Funktion trefleGet nach 5 Sekunden Wartezeit rekursiv erneut auf,
ohne Obergrenze. Hält die API das Limit dauerhaft, läuft der Import unbegrenzt weiter, ohne
sichtbaren Fehler. Auftrag an den Agenten: „Begrenze die Anzahl der Wiederholungen bei
Rate-Limits, damit das Skript nach ein paar Versuchen mit einer klaren Fehlermeldung
abbricht.“
Fünf Stile, eine Aufgabe
Proaktiv (Default)
Claude Code, eingebauter Standardstil · „hilft, Software-Engineering-Aufgaben effizient abzuschließen“
Erklärt die Ursache, setzt um, fasst danach zusammen, moderate Länge, keine besondere Formatierung.
Ich schaue mir die Funktion trefleGet an: Bei einem 429 (Rate-Limit) wartet
sie 5 Sekunden und ruft sich selbst erneut auf, ohne Obergrenze. Hält die
Trefle-API das Limit dauerhaft, läuft der Import unbegrenzt weiter, ohne
sichtbaren Fehler.
Ich ergänze einen Zähler-Parameter, der bei jedem Rate-Limit-Treffer hoch-
gezählt wird, und breche nach fünf Versuchen mit einer Fehlermeldung ab.
Die bestehende Wartezeit bleibt unverändert.
[... Code ...]
Ich habe trefleGet um den Parameter retries erweitert, Standardwert 0. Ab
dem sechsten Versuch wirft die Funktion einen Fehler statt weiter zu
rekursieren, die Meldung nennt die Anzahl der Versuche. Bestehende Aufrufe
der Funktion sind nicht betroffen, weil der neue Parameter optional ist.
Prägnant (Concise)
Claude Code, eingebauter Stil · „Ergebnis zuerst, keine Nacherzählung, kurz antworten“, ab Version 2.1.237
Ergebnis zuerst, keine Vorrede, keine Zusammenfassung danach, gleiche technische Tiefe wie Default.
trefleGet bricht jetzt nach fünf Rate-Limit-Versuchen mit Fehler ab, statt
endlos zu rekursieren.
[... Code ...]
Wartezeit zwischen Versuchen bleibt bei 5s.
Explanatory
Claude Code, eingebauter Stil · Bildungs-Insights vor und nach der Umsetzung, Format „★ Insight“
Wie Default, ergänzt um kurze Einordnungen: warum dieses Muster ein Problem ist, welche Trade-offs bewusst nicht umgesetzt wurden.
★ Insight ─────────────────────────────────────
Unbegrenzte Rekursion bei Rate-Limits wirkt harmlos, kann ein Skript bei
einer länger anhaltenden API-Störung aber stundenlang ohne sichtbaren
Abbruch blockieren. Eine feste Obergrenze macht den Fehlerfall sichtbar.
Ein wachsendes Zeitintervall zwischen Versuchen (exponentielles Backoff)
wäre der nächste sinnvolle Schritt, hier bewusst weggelassen, um die
Änderung klein zu halten.
─────────────────────────────────────────────────
[... Code ...]
★ Insight ─────────────────────────────────────
Der neue Parameter retries ist optional mit Standardwert 0, bestehende
Aufrufe von trefleGet bleiben unverändert lauffähig. Dieses Muster, ein
optionaler Zähler-Parameter für rekursive Hilfsfunktionen, taucht in
PlantWiz noch an anderen Stellen auf und lohnt sich als wiederkehrendes
Erkennungsmerkmal für ähnliche Fehlerklassen.
─────────────────────────────────────────────────
Learning
Claude Code, eingebauter Stil · lässt an Entscheidungspunkten 5–10 Zeilen selbst schreiben, markiert mit TODO(human)
Setzt Rahmen und Kontext, überlässt die eigentliche Design-Entscheidung dem Nutzer, mit Begründung der Alternativen.
Die Anzahl maximaler Versuche und die Reaktion danach sind eine Design-
Entscheidung mit mehreren vertretbaren Antworten. Dafür überlasse ich
Ihnen die Kernzeile.
async function trefleGet(url: string, retries = 0): Promise<any> {
...
if (res.status === 429) {
// TODO(human): Abbruchbedingung nach zu vielen Rate-Limit-Versuchen
console.warn('\nRate-Limit erreicht, warte 5s...')
await sleep(5000)
return trefleGet(url, retries + 1)
}
...
}
In backend/scripts/import-trefle.ts, in der markierten Zeile: Entscheiden
Sie, wann trefleGet aufgeben soll. Zwei vertretbare Richtungen: nach einer
festen Anzahl Versuche mit Fehler abbrechen (einfach, verliert aber alle
restlichen Pflanzen bei einer kurzen API-Störung), oder nur die aktuelle
Pflanze überspringen und mit der nächsten weitermachen (robuster,
verschleiert aber eine dauerhafte Störung im Log). Beides ist in der
bestehenden Codebasis vertreten, schauen Sie sich zum Vergleich an, wie
fetchDetail mit einzelnen Fehlern umgeht.
Caveman
npm-Paket caveman-skill, Version 1.0.0 · Stufe „full“, wörtlich nach SKILL.md
Artikel weg, Füllwörter weg, Fragmente erlaubt, Code und Fehlermeldungen bleiben exakt zitiert.
trefleGet: infinite retry on 429, no cap. Risk: dauerhaft rate-limited →
endless loop, kein Fehler sichtbar.
Fix: retries param, default 0. Cap 5. Über Cap: throw.
[... Code ...]
Wait 5s unchanged. Backoff wachsend: nicht drin, extra Schritt.
Gemessen
Fachlich ist der Code in allen fünf Antworten identisch, deshalb zählt die folgende Tabelle den Fließtext getrennt vom Codeblock, sowie zusätzlich beides zusammen als Gesamtlänge der Antwort:
| Stil | Fließtext (Zeichen) | Fließtext (Wörter) | Gesamt inkl. Code (Zeichen) |
|---|---|---|---|
| Proaktiv (Default) | 726 | 104 | 1.368 |
| Explanatory | 911 | 97 | 1.553 |
| Learning | 707 | 92 | 1.270 |
| Caveman | 230 | 35 | 872 |
| Prägnant (Concise) | 143 | 19 | 785 |
Fließtext-Länge je Stil
Nur der Text, ohne Codeblock. Reihenfolge nach Länge.
Caveman und Concise verfolgen sichtbar dasselbe Ziel, kurzer Fließtext, landen aber nicht auf demselben Niveau: Concise ist mit 143 Zeichen noch einmal deutlich knapper als Caveman mit 230 Zeichen. Der Unterschied liegt am Muster selbst: Concise lässt Übergänge ganz weg, wo sie nichts zur Sache beitragen, Caveman kürzt jeden Satz, behält aber die Satzstruktur als Fragment bei, „Fix: retries param, default 0“ statt nur „retries param“.
SKILL.md bei jedem Aufruf
mit, 3.466 Zeichen, umgerechnet grob 860 bis 900 Tokens. Bei einer einzelnen kurzen Antwort
wie in diesem Test ist das mehr, als die knappere Antwort selbst einspart. Erst über mehrere
Antworten in derselben Sitzung amortisiert sich die einmalig geladene Regel, und selbst dann
bleibt Concise ohne jeden Zusatzaufwand die knappere Option, wo beide zur Wahl stehen.
Wofür Explanatory und Learning trotzdem etwas Eigenes bringen
Weder Concise noch Caveman ersetzen Explanatory oder Learning, weil sie ein anderes Ziel verfolgen. Explanatory erklärt warum eine Lösung so aussieht, in diesem Beispiel den Unterschied zwischen einer festen Obergrenze und echtem exponentiellem Backoff, eine Einordnung, die in der Caveman- oder Concise-Fassung schlicht fehlt. Learning geht weiter und überlässt die Design-Entscheidung, ob bei zu vielen Fehlversuchen die ganze Aktion abbricht oder nur einzelne Elemente übersprungen werden, bewusst dem Nutzer, mit Verweis auf ein bestehendes Vergleichsmuster im selben Code. Beide Stile kosten mehr Text, weil sie etwas anderes leisten als reine Kürzung.
Wann welcher Stil
Alltägliche Aufgaben, Ergebnis zählt mehr als Herleitung
Prägnant (Concise), eingebaut, kein Zusatzaufwand, kürzester Fließtext in dieser Messung.
Onboarding, Code-Reviews, unbekannte Codebasis
Explanatory, wenn die Begründung hinter einer Entscheidung genauso wichtig ist wie die Entscheidung selbst.
Lernkontext, eigenes Team soll mitschreiben
Learning, wenn Design-Entscheidungen bewusst beim Menschen bleiben sollen, statt automatisch getroffen zu werden.
Caveman zusätzlich sinnvoll bei
Werkzeugen ohne eigene Stilkonfiguration, oder wenn die dreistufige Eskalation (lite/full/ultra) je nach Situation gebraucht wird. Wo Concise zur Verfügung steht, ist es in dieser Messung die knappere und kostenlosere Wahl.
Welcher Ausgabestil für Ihr Team passt?
Ich richte Claude Code in Entwicklerteams ein, inklusive der Frage, welcher Ausgabestil zu welcher Aufgabe passt. 30 Minuten Erstgespräch, kostenlos.