Der Agentenkurs · Der Harness
Die vier Ringe
Lernziele
- Du nennst die vier Ringe des Harness in der Bauordnung von außen nach innen und begründest die Reihenfolge.
- Du ordnest konkrete Maßnahmen wie Worktree, AGENTS.md, Testsuite und Freigabe dem richtigen Ring zu.
- Du liest einen PreToolUse-HookEin Befehl, den der Harness bei einem festen Ereignis automatisch ausführt, etwa vor oder nach jedem Tool-Aufruf. Ein Hook vor dem Aufruf kann ihn blockieren und dem Modell den Grund melden.Im Glossar und sagst voraus, welche Befehle er blockiert.
Bau den HarnessAlles, was festlegt, was der Agent erreichen darf: Tools, Berechtigungen, Sandbox, Zeitlimits und die Prüfung, bevor eine Aktion wirkt. Englisch für Geschirr oder Gestell.Im Glossar von außen nach innen: Eingrenzung, Leitplanken, Sensoren, Berechtigungen. Die Reihenfolge zählt, weil jeder Ring halten muss, wenn alle Ringe in seinem Inneren versagen. Eine Leitplanke kann der AgentEin System, in dem ein Sprachmodell seinen nächsten Schritt selbst wählt: Es ruft Werkzeuge auf, wertet das Ergebnis aus und macht weiter, bis das Ziel erreicht ist.Im Glossar überlesen, ein Sensor kann etwas übersehen, eine Freigabe kann jemand versehentlich anklicken. Eine Wand bleibt eine Wand. Deshalb steht der äußerste Ring, bevor du den ersten Prompt schreibst.
Schritt 1 von 4
Eingrenzung
Was der Agent physisch nicht erreicht: Container, Worktree, Datenbank-Rolle nur mit Leserechten, Netzwerk-Allowlist. Dieser Ring wirkt ohne jede Mitarbeit des Modells.
Ring eins: Eingrenzung
Eingrenzung ist alles, was der Agent physisch nicht erreicht. Sie ist der einzige Ring, der ohne jede Mitarbeit des Modell · engl. model, LLMDas Sprachmodell (LLM, Large Language Model). Es liest Text, schreibt Text und entscheidet in einem Agenten, was als Nächstes passiert.Im Glossar wirkt. Die Grundausstattung besteht aus vier Teilen:
- ein Container oder eine VM statt der Shell deines Laptops,
- ein Wegwerf-Branch oder ein Worktree · engl. git worktreeEin zusätzliches Arbeitsverzeichnis desselben Git-Repositorys auf einem eigenen Branch. Ein Agent arbeitet darin, ohne deinen Checkout oder main zu berühren.Im Glossar statt main,
- ein Datenbanknutzer mit reinen Leserechten statt der Zugangsdaten der Anwendung,
- eine Netzwerk-Allowlist statt des offenen Internets.
Nichts davon braucht einen Prompt. Steht die Eingrenzung vor dem ersten Lauf des Agenten, ist die schlimmste denkbare Session ein verworfener Branch und eine verschwendete API-Rechnung.
Ring zwei: Leitplanken
Leitplanken sind alles, was der Agent vor dem Handeln liest: AGENTS.mdEine Textdatei im Wurzelverzeichnis eines Repositorys mit kurzen Regeln für Coding-Agenten: Aufbau, Testbefehl, Verbote. Der Agent liest sie zu Beginn jeder Session.Im Glossar-Dateien, Tool-Beschreibungen, Beispiele. Sie sind günstig und tragen den Großteil der täglichen Qualität. Eine brauchbare AGENTS.md hat vier Zeilen:
- Monorepo: services live in services/, shared code in packages/. Run everything from the repo root.
- `make test` must pass before you call any task done.
- Never hand-edit files in migrations/ — generate them with `make migration`.
- Your database user is read-only. Ask before proposing any schema change.
Die andere Hälfte dieses Rings ist das Design der Tool · engl. toolEin Werkzeug, das das Modell aufrufen kann: eine API, eine Datenbankabfrage, ein Shell-Befehl, eine Suche. Über Tools wirkt das Modell auf die Welt.Im Glossar. Googles Whitepaper Agent Tools & Interoperability with MCP (Nov. 2025) teilt Tools in drei Arten: Function Tools, die du selbst definierst, eingebaute Tools des Modellanbieters und Agent Tools, die einen anderen Agenten aufrufen. Seine Empfehlungen sind durchweg Leitplanken:
- Dokumentier jedes Tool so gut, dass das Modell es allein anhand der Beschreibung wählen kann.
- Schneide Tools nach Aufgaben zu, auch wenn die API darunter anders gegliedert ist.
- Gib knappe Ausgaben zurück.
- Schreib Fehlermeldungen so, dass sie den Weg zur Lösung zeigen.
Nimm für Datenzugriffe ein typisiertes Tool. search_orders(customer_id) ist einer SQL-Verbindung vorzuziehen, weil das Schema selbst eingrenzt.
Für MCP · engl. Model Context ProtocolEin offenes Protokoll, über das ein Agent Tools aus externen Servern einbindet, etwa für GitHub, Slack oder eine Datenbank. Jeder Server bringt eigene Tool-Definitionen mit.Im Glossar argumentiert das Whitepaper mit Interoperabilität. Ein offenes Protokoll (JSON-RPC 2.0 über stdio oder Streamable HTTP) bedeutet: N Clients und M Tool-Server brauchen jeweils eine Anbindung statt N×M. Die ausführliche Behandlung steht im Handbuch Agent-Harnesses.
Ring drei: Sensoren
Sensoren sagen dir mechanisch, ob die Arbeit stimmt. Die günstigen lässt du auf alles laufen: Linter, Typprüfung und Testsuite nach jeder Änderung. Sie kosten Sekunden und werden nie müde. Die teuren Sensoren, ein zweites Modell für das Review des Diffs oder ein Mensch, der ihn liest, setzt du nur dort ein, wo es zählt: Authentifizierung, Migrationen, alles, was Geld bewegt. Ein Harness, der make test automatisch ausführt, fängt mehr Fehler als einer, in dem sich jemand an das Review erinnern soll.
Ring vier: Berechtigungen
Laut Anthropic bestätigen Menschen in Claude Code 93 % der Freigabe-Anfragen (Stand: März 2026). Eine Abfrage, die 93 von 100 Mal durchgewinkt wird, gewöhnt Menschen daran, sie nicht mehr zu lesen. Der eigentliche Schutz ist Ring eins: Aktionen, die gar nicht verfügbar sind. Freigaben setzt du deshalb nur für das wirklich Unumkehrbare ein, also für das Pushen auf einen gemeinsamen Branch, für alles Senden und für alles Löschen. Drei Abfragen am Tag werden gelesen, dreißig werden weggeklickt.
Hooks: Leitplanken mit Biss
Ein Hook macht aus einer Leitplanke, die das Modell überfliegen könnte, eine Regel, die der Harness durchsetzt. In Claude Code läuft ein PreToolUse-Hook vor jedem Tool-Aufruf und kann ihn blockieren. Dieser Hook setzt „niemals auf main pushen“ durch:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.command' | grep -qE 'git push.*\\bmain\\b' && { echo 'Blocked: never push to main' >&2; exit 2; } || exit 0"
}
]
}
]
}
}
Der Hook bekommt den geplanten Aufruf als JSON. jq zieht den Shell-Befehl heraus, grep sucht nach git push mit dem Wort main. Bei einem Treffer endet der Hook mit Code 2. Das blockiert den Aufruf und gibt die Meldung auf stderr an den Agenten zurück. Der Agent sieht den Grund und korrigiert seinen Kurs.
Wir haben diesen Hook in einem Wegwerf-Repository mit Claude Code 2.1.322 laufen lassen. Die Aufgabe lautete, einen fertigen Commit nach origin main zu pushen. So sah der Lauf aus, gekürzt um einige Erkundungsschritte:
- DuI committed a change to app.py. Push it to origin main.
Der Hook griff schon beim Probelauf mit --dry-run, weil er nur den Text des Befehls prüft. Umgekehrt erkennt er nur Befehle, die main ausdrücklich nennen. Ein git push ohne Branch-Namen auf main rutscht durch. Die Wand für diesen Fall ist ein Schutz des Branches auf dem Server, also wieder Ring eins.
Die Wetten laufen ab
Jedes Bauteil eines Rings ist eine Wette darauf, dass das Modell etwas nicht kann. Anthropic baute Kontext-Resets in einen Harness ein, weil Claude Sonnet 4.5 nahe an seiner Kontextgrenze Arbeit vorzeitig abschloss. Mit Opus 4.5 verschwand dieses Verhalten weitgehend, und Anthropic strich die Resets aus diesem Harness ganz. Deine Wetten laufen genauso ab. Die Lektion Harness in der Praxis macht daraus ein Ritual für jedes Quartal.
Merksätze
- Du baust den Harness von außen nach innen, weil jeder Ring halten muss, wenn alle inneren versagen.
- Eingrenzung wirkt ohne Mitarbeit des Modells und steht deshalb vor dem ersten Prompt.
- Kurze Leitplanken und gut beschriebene, typisierte Tools tragen den Großteil der täglichen Qualität.
- Günstige Sensoren laufen nach jeder Änderung automatisch, teure nur bei Code mit hohem Risiko.
- Freigaben gibt es nur für das Unumkehrbare, und ein Hook mit Exit-Code 2 setzt eine Regel durch, auch wenn das Modell sie überliest.
Prüf dich selbst
Denkfrage
Ein Team startet mit einer sorgfältigen AGENTS.md und vielen Freigabe-Abfragen, der Agent läuft aber auf dem Laptop mit den Produktions-Zugangsdaten. Was fehlt, und warum zuerst?
Es fehlt Ring eins, die Eingrenzung: Container, Worktree, Datenbank-Rolle nur mit Leserechten. Leitplanken kann das Modell überlesen, Freigaben werden zu 93 % durchgewinkt. Nur die Wand hält, wenn alles andere versagt, deshalb kommt sie vor dem ersten Prompt.
Denkfrage
Warum ist search_orders(customer_id) als Tool besser als eine SQL-Verbindung?
Das typisierte Tool erlaubt nur eine Aufgabe mit festem Schema. Das Modell kann damit keine Tabelle löschen und keine fremden Daten abfragen. Das Schema grenzt selbst ein und gehört damit halb zur Leitplanke, halb zur Wand.
Prüf dich selbst
Quellen
- Agent Tools & Interoperability with MCP
Drei Arten von Tools, Empfehlungen zum Tool-Design, MCP über JSON-RPC 2.0, das N×M-Problem.
- How we built Claude Code auto mode
Menschen bestätigen 93 % der Freigabe-Anfragen.
- Harness design for long-running apps
Kontext-Resets für Sonnet 4.5, gestrichen mit Opus 4.5.
- Hooks reference
PreToolUse, Matcher, Exit-Code 2 blockiert und meldet stderr an Claude.