# Große Code-Projekte mit KI bauen: Ein vollständiger Leitfaden 🚀

Die zentrale Herausforderung, die du beschreibst, ist real: LLMs haben endliche Kontextfenster, keine persistente Erinnerung zwischen einzelnen Aufrufen und werden unzuverlässiger, sobald Aufgaben im Umfang wachsen. Große Projekte erfordern, dass du eine **System-Umgebung um das Modell herum** baust – statt dich nur auf das Modell allein zu verlassen. Unten ist eine detaillierte Vorgehensweise.

---

## 1. Das Kern-mentale Modell

Denk die KI nicht als Programmierer, der sich an alles erinnert, sondern als einen **extrem fähigen Auftragnehmer mit kompletter Amnesie**, der jeden Morgen frisch startet. Jeder Prompt ist ein neuer Arbeitstag. Alles, was die KI wissen muss, muss entweder:

1. **Im Prompt** (eingespeister Kontext) stecken, oder
2. **Auffindbar** sein (Dateien, die sie lesen kann, Tools, die sie aufrufen kann).

Deine gesamte Aufgabe ist *Context Engineering*: sicherzustellen, dass die richtige Information zur richtigen Zeit da ist und die Ergebnisse außerhalb des Modells persistent gespeichert werden.

Die drei Feinde großer Projekte sind:

- **Kontextfenster-Limits** — du kannst keine 200k-Zeilen-Codebasis einfügen.
- **Context Rot** — Modellqualität sinkt, sobald der Kontext sich füllt, sogar deutlich *unterhalb* des harten Limits. Zuverlässigkeit nimmt oft schon ab, bevor du die Max-Tokens erreichst.
- **State Loss** — das Modell vergisst Entscheidungen, die 10 Prompts zuvor gefallen sind.

Alles Folgende ist darauf ausgelegt, genau diese drei Probleme zu bekämpfen.

---

## 2. Die Grundlage: Spezifikationsgetriebene Entwicklung

Starte nie damit, die KI zu bitten: „Bau mir eine App.“ Starte damit, die KI zu nutzen, um **dauerhafte Artefakte** zu erzeugen, die in deinem Repository leben und über Sitzungen hinweg überdauern.

### Die Dokument-Hierarchie

Erstelle diese Dateien *bevor* du Production Code schreibst:

| Datei | Zweck |
|-------|------|
| `SPEC.md` / `PRD.md` | Was du baust und warum. Anforderungen, User Stories, Constraints. |
| `ARCHITECTURE.md` | High-Level-Design: Komponenten, Datenfluss, Tech-Stack, zentrale Entscheidungen. |
| `SCHEMA.sql` / `types.ts` | Datenmodelle — die gemeinsame Sprache des ganzen Projekts. |
| `TASKS.md` / `PLAN.md` | Zerlegte Task-Liste mit Status-Tracking. |
| `CONVENTIONS.md` | Coding Standards, Patterns, Benennung, Ordnerstruktur. |
| `DECISIONS.md` | Ein append-only Log architektureller Entscheidungen (ADRs) und *warum*. |

Du erstellst diese *mit* der KI in einer interaktiven Planungsphase. Danach werden sie zur **Single Source of Truth**, die du in zukünftigen Prompts wieder einspielst. Das ist die Praxis mit dem höchsten Hebelwirkungseffekt für große Projekte.

### Interaktive Planungs-Technik

Nutze ein starkes Reasoning-Modell (Opus, GPT-5.5) im „Architect Mode“. Fordere es explizit auf, dich zu „verhören“:

> „Du bist ein Senior Architect. Bevor du irgendeinen Code schreibst, stelle mir so lange klärende Fragen, bis es null Unklarheit über die Anforderungen gibt. Dann erstelle ARCHITECTURE.md und eine abhängigkeitsorientierte Task-Aufteilung. Schreibe noch keinen Implementierungs-Code.“

Eine **separate Plan-/Architect-Phase vom Code-Teil** zu erzwingen, ist eine der effektivsten Techniken überhaupt. Modelle liefern deutlich besseren Code, wenn sie zuerst über Struktur nachgedacht haben.

---

## 3. Zerlegung: Ein großes Projekt in kleine Prompts verwandeln

Der Kern der Technik. Du musst das Projekt in Einheiten schneiden, die in *einen* Prompt passen — und dabei noch **Luft lassen**.

### Prinzipien guter Zerlegung

- **Vertikale Slices statt horizontale Layers.** Bevorzuge „User kann end-to-end einloggen“ statt „erst komplette Datenbank bauen, dann komplette API“. Vertikale Slices sind unabhängig testbar und liefern früh funktionierende Software.
- **Jede Task braucht ein klares, überprüfbares Completion-Kriterium.** „Implementiere den `POST /users`-Endpoint mit Validierung und Tests“ — nicht „arbeite am User-System“.
- **Respektiere den Dependency Graph.** Erst Interfaces und Datenmodelle, dann Implementierungen, die davon abhängen. Die KI kann nicht korrekt einen Consumer einer API implementieren, die es noch nicht gibt.
- **Ziel: grob 200–600 Zeilen Änderung pro Task.** Klein genug zum Review, groß genug, um sinnvoll zu sein.

### Das Interface-First Pattern

Definiere Contracts, bevor du implementierst. Lass die KI zuerst alle **Type Signatures / Interfaces / API-Schemas** als Stubs generieren, commite sie, und implementiere dann jeden Stub in separaten Prompts. Da die Interfaces in Dateien „eingefroren“ sind, kann jeder nachfolgende Prompt sie lesen und konsistent bleiben — auch wenn das Modell selbst keine Erinnerung an das Schreiben hat.

```
Prompt 1: Define all interfaces/types (thin, no logic)  → commit
Prompt 2: Implement module A against interfaces         → test → commit
Prompt 3: Implement module B against interfaces         → test → commit
...
```

Das entkoppelt die Tasks so, dass jede nur die Interfaces plus ihr eigenes Modul sehen muss — nicht die komplette Codebase.

---

## 4. Kontext über Prompts hinweg managen

Hier scheitern die meisten. Konkrete Strategien:

### A. Selektives Context Injection
Nie das ganze Repo auskippen. Gib pro Task nur das mit:
- den relevanten Ausschnitt von `ARCHITECTURE.md` und `CONVENTIONS.md`
- die spezifischen Interfaces/Typen, die die Task berührt
- die 1–3 Dateien, die geändert werden
- Beispiele für *ähnlichen* bereits existierenden Code (damit das Modell deinen Stil trifft)  

### B. Repository Maps
Zur Orientierung ohne Volltext: Gib dem Modell einen **Dateibaum plus einzeilige Zusammenfassungen** jeder Datei — oder nur die Funktions-Signaturen (eine „Repo Map“). So arbeiten Tools wie Aider: Sie bauen eine komprimierte Karte aus der Code-Struktur, damit das Modell weiß, was existiert, und gezielt den kompletten Inhalt nur der benötigten Stellen anfordern kann.

### C. Summarisierung / Rolling Memory
Wenn ein Gespräch lang wird, lass das Modell den **aktuellen Session-Status** in ein Handoff-Dokument verdichten, bevor der Kontext voll ist:

> „Fasse alles, was in dieser Session entschieden und erledigt wurde, in einem HANDOFF.md zusammen, das eine frische Instanz nutzen kann, um fortzusetzen. Enthalten sein müssen: aktuelle Dateizustände, offene Fragen und nächste Schritte.“

Dann starte ein neues Gespräch, das mit dieser Zusammenfassung „geseedet“ wird. Das ist manuelles „Context Compaction“.

### D. Retrieval (RAG) für sehr große Codebases
Bei wirklich riesigen Projekten: indexiere die Codebase in einen Vector Store (Embeddings) und hole pro Query semantisch relevante Code-Chunks. Das ist mehr Setup, aber es erlaubt dem Modell, passenden Code „zu finden“, den es im Kontext nie gesehen hat. Viele Agent-Frameworks machen das automatisch.

---

## 5. Die Agentische Schleife (Der echte Unlock) 🔓

Der größte Sprung bei großen Projekten ist, von **Chat** zu **Agents** zu wechseln — gib dem Modell Tools, damit es autonom über viele interne Schritte handeln kann, ohne dass du Copy-Paste machen musst.

Eine Agent läuft eine Schleife:

```
1. Read task + relevant files (tool: read_file, search)
2. Reason about approach
3. Make edits (tool: write_file / apply_diff)
4. Run tests / build (tool: execute_shell)
5. Read the output; if failing, go to 2
6. Repeat until task's completion criterion is met
7. Commit (tool: git)
```

Die entscheidende Erkenntnis: **Das Feedback-Loop von echtem Tool-Output (Compiler-Fehler, Test-Fehlschläge, Runtime-Logs) macht KI in großem Maßstab zuverlässig.** Ein Modell, das Tests ausführen kann und sieht, dass sie fehlschlagen, korrigiert seine eigenen Fehler. Ein Modell, das nur in eine Leere schreibt, sammelt Fehler.

### Tools, die du einem Agent mindestens geben solltest
- Datei lesen/schreiben/listen/suchen (grep)
- Shell-Ausführung (build, tests, linters)
- Version Control (git diff, commit)
- Optional: Websuche, Docs-Lookup

### Fertige Agent-Harnesses
Statt alles selbst zu bauen, nutze existierende Tools, die mit OpenAI-kompatiblen Endpoints funktionieren:

- **Aider** — terminalbasiert, sehr stark beim Repo-Mapping, git-integriert, model-unabhängig.
- **Cline / Roo Code** — VS-Code-Extensions mit vollständigen agentischen Loops, zeig sie auf deine Custom Base URL.
- **OpenHands (ehemals OpenDevin)** — autonomer Software-Engineering-Agent.
- **Continue.dev** — konfigurierbar, unterstützt Custom OpenAI-kompatible Provider.
- **Claude Code / Codex CLI** — falls du sie auf deinen Endpoint routen kannst.

Alle nehmen ein benutzerdefiniertes `base_url` + `api_key`, sodass dein Multi-Model-Gateway direkt „reinschlägt“.

---

## 6. Multi-Model Orchestrierung (Nutze deine Setup-Stärke)

Da du viele Modelle hinter einer einzigen API hast, nutze ihre unterschiedlichen Stärken. Verwende nicht ein Modell für alles.

| Rolle | Best-fit Modell | Warum |
|--------|------------------|------|
| **Architect / Planner** | Opus, GPT-5.5 (High Reasoning) | Tiefe Argumentation, sieht das ganze Bild, die Kosten lohnen sich fürs Planen. |
| **Implementer** | Claude Sonnet, Mid-tier GPT | Schnell, günstig, stark bei gut spezifizierten Coding Tasks. Der Großteil eures Volumens. |
| **Reviewer / Critic** | Ein *anderes* starkes Modell | Neue Perspektive findet Bugs; nutze ein anderes Modell als den Autor, um geteilte Blind Spots zu vermeiden. |
| **Günstige Hilfsarbeiten** | Kleinstes fähiges Modell | Renaming, Boilerplate, Docstrings, Test-Scaffolding. |

### Starke Multi-Model Patterns

- **Generator–Critic Loop:** Modell A schreibt Code, Modell B reviewt gegen Spezifikation und Tests, Modell A überarbeitet. Cross-Model-Review ist erstaunlich effektiv, um Fehler zu finden, die ein einzelnes Modell wegargumentiert.
- **Plan then execute split:** Teures Reasoning-Modell erzeugt einen detaillierten Step-Plan; günstiges Modell führt jeden Step aus. Große Kosteneinsparung.
- **Ensemble / best-of-N:** Für eine harte, kritische Funktion: 2–3 Modelle lösen sie jeweils, dann wählt/synthetisiert ein Judge-Modell das beste Ergebnis. Teuer; nur für wirklich harte Probleme.
- **Escalation:** Starte mit einem günstigen Modell; wenn es bei N Versuchen fehlschlägt, eskaliere die Task zu einem stärkeren Modell – mit den Failure-Logs als Anlage.

---

## 7. Verifikation: Der nicht verhandelbare Backbone ✅

AI-Code ist mit hoher Selbstsicherheit falsch — und die Fehlerrate kannst du über tausende Zeilen nicht ignorieren. Dein Sicherheitsnetz ist **automatisierte Verifikation**, und die muss engmaschig sein.

### Baue ein „Harness“, auf das die KI sich stützen kann
- **Tests zuerst (oder früh).** Lass die KI Tests zusammen mit Code schreiben. Noch besser: definiere Acceptance Tests für eine Task *vor* der Implementierung, sodass das Completion-Kriterium wörtlich „diese Tests sind grün“ ist.
- **Types & Linting.** Nutze eine statisch typisierte Sprache oder striktes Type Checking (TypeScript strict, mypy, etc.). Der Type Checker ist ein kostenloser, ausdauernder Reviewer, der ganze Klassen von KI-Halluzinationen einfängt (z. B. Funktionen, die es nicht gibt, falsche Signaturen).
- **CI Gates.** Jeder AI-Commit läuft die komplette Suite. Nichts merged rot.
- **Kleine, reviewbare Diffs.** Weil du in kleine Tasks zerlegt hast, sind die Diffs menschlich reviewbar. **Du musst den Code trotzdem lesen.** Behandle AI-Ausgaben als PR eines talentierten, aber nicht verantwortlichen Junior-Dev.

Je enger deine Feedback-Loop, desto mehr Autonomie kannst du der KI sicher geben. Projekte mit guter Testabdeckung lassen sich viel stärker automatisieren als solche ohne.

---

## 8. State & Progress Tracking

Da Sessions stateless sind, musst du Fortschritt externisieren.

- Halte `TASKS.md` mit Checkbox-Status (`[ ]`, `[x]`, `[blocked]`). Update es am Ende jeder Task. Spiele es zu Beginn jeder Task ein, damit das Modell weiß, wo ihr steht.
- Nutze **git commits pro Task** mit aussagekräftigen Messages — dein git log wird dadurch zu einer dauerhaften, abfragbaren Projekt-Historie.
- Pflege das append-only `DECISIONS.md`, damit die KI nicht erneut ungelöste Entscheidungen verhandelt oder frühere Designs widerspricht.
- Erwäge eine `CLAUDE.md` / `AGENTS.md` Datei im Repo-Root — viele Agent-Tools laden das automatisch als persistente Projektanweisungen (Konventionen, Commands zum Testen, typische Fallstricke). Das gibt jeder neuen Session das gleiche Baseline-Briefing.

---

## 9. Ein konkreter End-to-End Workflow

So passt das alles in ein reales Projekt zusammen:

**Phase 0 — Planning (starkes Reasoning-Modell, Chat-Modus)**
1. Interaktives Q&A → erstelle `SPEC.md`.
2. → erstelle `ARCHITECTURE.md` und Datenmodelle.
3. → dekomponiere in abhängigkeitsorientierte `TASKS.md`.
4. Richte Repo, CI, Test-Framework, `AGENTS.md` ein.

**Phase 1 — Scaffolding (Mid-Modell)**
5. Generiere Projektskelett, Config, alle Interface/Type Stubs. Committen.

**Phase 2 — Iterative Implementierung (agentische Loop, cheap→mid Modell)**
Für jede Task in Dependency-Reihenfolge:
6. Frischer Kontext: konventionen + relevante Interfaces + Ziel-Dateien + Task.
7. Agent schreibt Code + Tests, führt sie aus, iteriert bis „grün“.
8. Reviewer-Modell kritisiert das Diff gegen die Spezifikation.
9. Author-Modell adressiert das Review.
10. Menschliches Review des Diffs, merge, Update `TASKS.md`. Committen.

**Phase 3 — Integration & Hardening**
11. Integrationstests über Slices hinweg.
12. Modelle lassen auf Security, Performance, Edge Cases reviewen.
13. Refactoring-Passes (jetzt, wo die Form klar ist).

**Phase 4 — Wartung**
14. Gleiche Loop für jede neue Feature/Bugfix; die Artefakte halten das Projekt auf Dauer kohärent.

---

## 10. Praktische Fallstricke & Regeln für Daumen

- **Lass den Kontext nicht über ~50–70% wachsen.** Qualität sinkt, bevor du das harte Limit erreichst. Kompakte oder starte früher neu, als du denkst.
- **Eine Task pro Conversation**, wenn die Arbeit komplex ist, um Cross-Contamination und Kontextaufblähung zu vermeiden.
- **Interfaces einfrieren, bevor du parallelisierst.** Ein Shared Type „mittendrin“ zu ändern zwingt alles zur Neuarbeit.
- **Lass die KI ihren Plan zeigen, bevor sie irgendetwas Nicht-Triviales editiert** („Erkläre deinen Ansatz, liste die Dateien, die du ändern wirst, dann warte auf mein Go“). Günstige Versicherung gegen 400 Zeilen in die falsche Richtung.
- **Achte auf silent scope drift** — das Modell könnte „hilfreich“ Dinge umschreiben, die du nicht angefordert hast. Begrenze es: „Ändere nur X; ändere keinen verwandten/unbeteiligten Code.“
- **Regenereiere statt Patch** für kleine Dateien; **surgical diffs** für große. Diff/Patch Tools sparen Tokens und reduzieren Fehler bei großen Dateien.
- **Versioniere auch Prompts/Artefakte in git** — dein Prompting ist jetzt Teil deines Engineering-Prozesses.
- **Cost Control:** Routings nach Task-Schwierigkeit, statischen Kontext cachen (system prompt, Konventionen), falls deine API Prompt Caching unterstützt, und Diffs statt Full-File-Rewrites bevorzugen.

---

## Zusammenfassung

Große, mit KI gebaute Projekte gelingen nicht, weil das Modell schlau genug ist, um alles im Kopf zu halten — das kann es nicht — sondern weil du ein **diszipliniertes System** baust: dauerhafte Spezifikations-Artefakte als Single Source of Truth, aggressive Zerlegung in überprüfbare Tasks, eine agentische Loop auf Basis echter Test-/Build-Feedbacks, selektives Context Injection und Multi-Model-Orchestrierung, die jedes Modell auf seine Stärke ausrichtet. Die KI liefert die rohe Fähigkeit; **du lieferst das Gedächtnis, die Struktur und die Verifikation.** Wenn diese drei stimmen, gibt es praktisch keine harte Grenze für die Projektgröße. 🌟