Claude Code Harness — Referenz für AI Engineers
Stand: März 2026. Aus der täglichen Praxis mit Claude Code; Flags, Preise und Bugs können sich seitdem geändert haben. Siehe auch: Claude Code Tutorial.
Zielgruppe: Leute, die Claude Code schon nutzen. Fokus: Tuning, Config, Betrieb — kein Onboarding.
1. Architektur
Claude Code ist kein Wrapper, sondern ein natives Harness mit direktem API-Zugriff. Die Architektur besteht aus fünf Schichten:
CLAUDE.md (global + per-project) ← deklarative Verhaltenssteuerung
↓
settings.json / settings.local.json ← Permissions, Hooks, Modell
↓
Hooks (5 Lifecycle-Points) ← Prozess-Steuerung
↓
Agents / Skills / Commands ← Capability-Erweiterung
↓
MCP-Tools ← externe Tool-Integration
Lifecycle-Points:
| Hook | Zeitpunkt | Kann blocken? |
|---|---|---|
SessionStart |
Session-Init | nein |
UserPromptSubmit |
vor LLM-Call | ja (additionalContext-Injection) |
PreToolUse |
vor Tool-Aufruf | ja (Blocking-Gate) |
PostToolUse |
nach Tool-Aufruf | nein |
Stop |
Session-Ende | nein |
Config-Hierarchie (letzte Regel gewinnt nicht — Regeln akkumulieren):
~/.claude/settings.json
~/.claude/settings.local.json (Overrides)
~/.claude/CLAUDE.md (globale Verhaltensregeln)
<project-root>/CLAUDE.md (projektspezifische Regeln)
2. Konfiguration
settings.json — Hauptfelder
{
"model": "claude-opus-4-6", // Default-Modell
"env": {
"CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
},
"permissions": {
"allow": ["Edit", "Write", "Glob", "Grep", "Agent", "Bash(git*)"],
"deny": ["Bash(rm*)", "Bash(apt*)", "Bash(dd*)"]
},
"hooks": {
"PreToolUse": [
{ "matcher": "Agent", "hooks": [{"type": "command", "command": "~/.claude/hooks/enforce-background-agents.py"}] }
],
"UserPromptSubmit": [
{ "hooks": [{"type": "command", "command": "~/.claude/hooks/hook_inject.py"}] }
]
}
}
Bash-Permissions nutzen Glob-Pattern:
- Bash(git*) — alle git-Befehle
- Bash(python3 /home/*) — python3 mit absolutem Pfad
- Bash(*) — alles (gefährlich, nur in settings.local.json)
settings.local.json — Lokale Overrides
Nicht ins Git. Für Permissions die auf dem eigenen Rechner OK sind, aber nicht im Repo.
{
"permissions": {
"allow": ["Bash(gh api*)", "Bash(python3*)"]
}
}
CLAUDE.md — Verhaltenssteuerung
Nicht wie ein Config-File behandeln — ist ein Aufmerksamkeitsbudget. Jede Regel konkurriert um Kontext.
Kritische Faustregel: Weniger Regeln, schärfer formuliert > viele Regeln, weich formuliert. Ab ~50 Regeln sinkt die Compliance messbar.
3. Tuning
Hook hinzufügen
// In settings.json, hooks.[HookPoint]:
{
"matcher": "Write", // Tool-Name oder "" für alle
"hooks": [{
"type": "command",
"command": "~/.claude/hooks/my-hook.py"
}]
}
Hook-Script bekommt JSON via stdin (tool, input, session_id). Exit-Code 0 = erlaubt, non-zero = geblockt (nur PreToolUse).
Skill erstellen
~/.claude/skills/my-skill/SKILL.md
Frontmatter + Inhalt. Wird via /my-skill getriggert. Skills sind Kontext-Injektionen, keine Tools.
Agent definieren
---
name: my-agent
model: claude-sonnet-4-6
tools: [Read, Edit, Write, Bash]
subagent_type: general
---
Hier steht das System-Prompt des Agents.
Datei nach ~/.claude/agents/my-agent.md. Agents erben alle aktiven Hooks — kein selektives Gate pro Agent möglich (aktuelles Limitation).
Custom Command erstellen
~/.claude/commands/my-cmd.md
Wird via /my-cmd aufgerufen. Verhält sich wie ein Slash-Command der den Datei-Inhalt als System-Prompt setzt.
Modell wechseln
// settings.json:
"model": "claude-sonnet-4-6"
Kein Runtime-Switching ohne Session-Neustart. Subagents können über Frontmatter ein anderes Modell nutzen.
Statusline anpassen
~/.claude/statusline.sh liest JSON von stdin (Context%, Token-Usage, Git-Branch, aktive Hooks) und gibt ANSI-formatierte Ausgabe zurück. Direktes Bash/Python-Skript, editierbar ohne Neustart.
Sidecar-NG Integration (Beispiel aus meinem Setup)
Der UserPromptSubmit-Hook ruft hook_inject.py auf. Dieser klassifiziert den Prompt (Keyword-First → LLM-Fallback) und injiziert additionalContext in den Hook-Response. Die Injection landet im nächsten LLM-Call, nicht im Session-Kontext dauerhaft.
Bekannter Bug #13650: SessionStart-Injections werden verworfen. Workaround: Injection über UserPromptSubmit statt SessionStart.
4. Vor- und Nachteile
Vorteile
| Feature | Bewertung |
|---|---|
| Hook-System | Stärkstes auf dem Markt — PreToolUse-Blocking ist einzigartig |
| Subagent-System | 21 typisierte Agents, parallele Ausführung, Background-Support |
| CLAUDE.md | Deklarative Verhaltenssteuerung ohne Code |
Plan Mode (--plan) |
Strukturiertes Denken vor Implementierung |
| MCP-Integration | Externe Tools (Gemini, OpenCode) nativ einbindbar |
| Tooling-Ökosystem | Skills + Commands + Agents + Hooks + Statusline kombinierbar |
Nachteile
| Problem | Impact |
|---|---|
| Kostenstruktur | Opus ~$15/1M Tokens — teuerster Harness |
| Modell-Lock | Nur Anthropic-Modelle, kein Runtime-Switch |
| Attention Budget | >50 CLAUDE.md-Regeln → messbare Compliance-Degradation |
| Session Hoarding | Lange Sessions akkumulieren toten Kontext |
| Hook-Freeze | Hooks-Änderungen erfordern Session-Neustart |
| Kein SessionEnd-Hook | Cleanup nach Session-Ende nicht möglich |
| Bug #13650 | SessionStart additionalContext wird verworfen |
| Hook-Inheritance | Subagents erben alle Hooks — keine differenzierten Gates |
5. Referenz
Dateipfade
| Pfad | Zweck |
|---|---|
~/.claude/settings.json |
Hauptconfig: Modell, Permissions, Hooks |
~/.claude/settings.local.json |
Lokale Overrides (nicht im Git) |
~/.claude/CLAUDE.md |
Globale Verhaltensregeln |
~/.claude/agents/ |
Agent-Definitionen (21 aktive) |
~/.claude/skills/ |
Skill-Definitionen |
~/.claude/commands/ |
Custom Slash-Commands |
~/.claude/hooks/ |
Hook-Scripts |
~/.claude/statusline.sh |
Statusbar-Script |
~/.claude/usage/*.jsonl |
Token-Tracking |
~/.claude/events/*.jsonl |
Event-Logs (Telemetrie) |
Aktive Hooks (Beispiel aus meinem Setup)
| Hook | Trigger | Funktion |
|---|---|---|
enforce-background-agents.py |
PreToolUse → Agent | Blockt Agent-Calls ohne run_in_background |
coach-before.sh |
SessionStart | Rotiert Playbook-Regeln, Streak-Counter |
event_logger.py |
alle Events | JSON-Telemetrie aller Tool-Calls |
gsd-context-monitor.js |
PostToolUse | Context-Window-Überwachung |
hook_inject.py (Sidecar-NG) |
UserPromptSubmit | Prompt-Klassifikation + Context-Injection |
Wichtige Befehle
claude # Session starten (Standard-Modell aus settings.json)
claude --plan # Plan Mode — denkt vor Implementierung
/compact # Context komprimieren (lossless summary)
/status # Session-Status: Context%, Token-Usage, aktive Hooks
/my-skill # Skill triggern (Dateiname ohne .md)
Debugging
# Hook-Output testen (stdin simulieren):
echo '{"tool":"Write","input":{"file_path":"/tmp/test"}}' | ~/.claude/hooks/my-hook.py
# Event-Logs lesen:
# ~/.claude/events/YYYY-MM-DD.jsonl
# Token-Usage prüfen:
# ~/.claude/usage/YYYY-MM.jsonl