Context Engineering¶
Aktive Steuerung des Context-Budgets durch strukturierte MD-Dateien.
Das Problem mit CLAUDE.md¶
Eine gewachsene CLAUDE.md von 400+ Zeilen wird bei jeder Session vollständig geladen –
MTU-Troubleshooting-Anleitungen, Migrations-Guides, Security-Architektur – egal ob du nur
eine Variable in einem Playbook änderst.
Typischer Ist-Zustand:
CLAUDE.md: 6.900 Tokens (bei jeder Session)
→ Davon tatsächlich gebraucht: ~15%
Context Engineering löst das: Minimaler Persistent-Context, Rest on-demand.
Dispatcher-Pattern¶
Statt einer monolithischen CLAUDE.md wird sie zum schlanken Dispatcher:
projekt/
├── CLAUDE.md # Dispatcher – max 40 Zeilen / ~500 Tokens
└── .claude/
└── context/
├── always/
│ └── infrastructure.md # Immer geladen – Quick Reference
└── lazy/
├── architecture.md # On-demand: Design-Entscheidungen
├── coding.md # On-demand: Konventionen, Patterns
├── security.md # On-demand: Firewall, Auth, Certs
└── troubleshooting.md # On-demand: Debug-Commands
CLAUDE.md als Dispatcher¶
# Projektname – Claude Code
Ein Satz was das Projekt macht.
## Deployment
ansible-playbook -i inventory/hosts.yml deploy.yml --ask-vault-pass
## Quick Reference
@.claude/context/always/infrastructure.md
## Lazy-Load – bei Bedarf lesen
| Aufgabe | Datei |
|------------------------------|-----------------------------------------|
| Architektur / Design-Fragen | .claude/context/lazy/architecture.md |
| Code-Konventionen | .claude/context/lazy/coding.md |
| Security / Firewall | .claude/context/lazy/security.md |
| Debugging / Fehlersuche | .claude/context/lazy/troubleshooting.md |
## Verhalten
- Deutsch immer
- Commits nur auf explizite Anfrage
- Patches only – kein Rewrite außer bei "Baseline"
Der @-Operator lädt infrastructure.md direkt beim Start. Die lazy-Dateien
werden nur geladen wenn der Task es erfordert – Claude Code liest sie per
Read-Tool-Call on-demand.
always/ vs. lazy/¶
| Kriterium | always/ | lazy/ |
|---|---|---|
| Wird in >50% aller Sessions gebraucht | ✅ | ❌ |
| Ändert sich selten (< 1x/Monat) | ✅ | – |
| Fakten, keine Erklärungen | ✅ | – |
| Domänen-spezifisches Wissen | ❌ | ✅ |
| Debug-Anleitungen, Runbooks | ❌ | ✅ |
Faustregel: Im Zweifel → lazy/.
always/infrastructure.md – Inhalt¶
Nur Fakten, keine Erklärungen. Ziel: ≤ 1.500 Tokens.
# Infrastructure Quick Reference
## Hosts
| ID | Hostname | Funktion | IP (Frontend) | IP (Mgmt) | Port |
|-----|------------|------------------|---------------|---------------|-----------|
| 210 | wg1 | WireGuard server | 10.10.0.1 | 172.16.0.210 | 51515/UDP |
| 220 | jumphost | Admin | 10.11.0.1 | 172.16.0.220 | 51516/UDP |
## Netzwerke
| Netz | Subnetz | Zweck |
|------------|------------------|------------|
| Frontend | 10.10.0.0/24 | Daten |
| Management | 172.16.0.0/24 | Admin |
## Wichtige Pfade
- Configs: /etc/projekt/
- Vault: ansible/vault/secrets.yml
Token-Ersparnis messen¶
Nach dem Umbau Verifikation in einer frischen Session (kein /resume):
Erwartetes Ergebnis:
| Kategorie | Vorher | Nachher | Ersparnis |
|---|---|---|---|
| CLAUDE.md | ~6.900 | ~500 | -6.400 |
| Memory files | ~7.000 | ~1.800 | -5.200 |
| Pro Session | – | – | ~5k Tokens |
Lazy-Loading testen¶
Neue Session starten, dann eine Frage stellen die nur mit einer lazy-Datei beantwortet werden kann:
Erwartetes Verhalten:
Read 1 file (ctrl+o to expand) ← lazy/troubleshooting.md wird gezogen
→ Antwort mit konkreten Werten
Gegenteil-Test: Frage die aus always/infrastructure.md beantwortet wird:
Agents vs. lazy/ Dateien¶
Für komplexere Domänen ist ein Sub-Agent die sauberere Lösung:
| lazy/ Dateien | Sub-Agents | |
|---|---|---|
| Eigenes Context Window | ❌ | ✅ |
| Kontext-Isolation | ❌ | ✅ |
| Parallelisierbar | ❌ | ✅ |
| Overhead | minimal | Agent-Spawn |
| Gut für | kurze Referenz-Infos | komplexe, abgeschlossene Tasks |
Entscheidung: Ist die Domäne groß genug für einen eigenen Agent (z.B. doc-generator, playbook-builder)? → Agent mit eigenem Context Window. Alles andere → lazy/ Datei.
Projekt-Override für globale Agents¶
Globale Agents kennen keine projektspezifischen Dateipfade. Lösung: Projekt-Override
in .claude/agents/<name>.md:
---
name: doc-generator
---
# doc-generator – Projekt-Override
## Projekt-Dateien
- SECURITY.md, FIREWALL.md, POC.md – Ziel-Dateien für Updates
## Regeln
- Nur exakte Deltas: "Alt: X → Neu: Y"
- Bei Sicherheitsänderungen: .claude/context/lazy/security.md lesen
## Priorität
SECURITY.md + FIREWALL.md zuerst bei sicherheitsrelevanten Änderungen
Token-Budget Richtwerte¶
| Datei | Ziel | Warnschwelle |
|---|---|---|
| CLAUDE.md | ≤ 500 Tokens | > 800 → kürzen |
| always/infrastructure.md | ≤ 1.500 Tokens | > 2.000 → aufteilen |
| lazy/*.md | ≤ 1.000 Tokens je | > 1.500 → aufteilen |
| agents/*.md (Override) | ≤ 300 Tokens | > 500 → kürzen |
Anti-Patterns¶
| Anti-Pattern | Problem | Besser |
|---|---|---|
| Code-Style in CLAUDE.md | Linter-Job, frisst Tokens | .editorconfig / Linter |
| Komplette Playbooks als Kontext | Viel zu groß | Nur Rollenübersicht in lazy/ |
| Duplicate Content in mehreren Dateien | Veraltet schnell | Eine Quelle, Rest referenziert |
| Changelogs in CLAUDE.md | History gehört in Git | Weglassen |
| "Always be helpful" | Bringt nichts | Weglassen |
Praktischer Einstieg¶
Den Umbau muss man nicht manuell machen. In Claude Code (Plan Mode):
Analyze the current project structure and CLAUDE.md.
Design a context engineering setup:
- Lean CLAUDE.md as dispatcher (<40 lines)
- always/ for genuine quick reference
- lazy/ for domain-specific context
Present the proposed structure first, implement after confirmation.
Claude Code analysiert die bestehende CLAUDE.md, schlägt die Aufteilung vor
und setzt sie nach Bestätigung um – inklusive Token-Analyse vorher/nachher.