Academy · Kapitel 3 von 11 · ~55 Minuten

Kontext ist alles.

Ein Agent kennt dein Projekt nicht. Er kennt nur das, was in seinem Kontextfenster landet. In diesem Kapitel lernst du, welcher Kontext einen Agenten gut macht, wie du ihn knapp und widerspruchsfrei hältst und wie die Fabrik ihn aus Projektdefinition, Artefakten, Guardrails, Memory und Teams bei jedem Run neu und nachvollziehbar zusammensetzt.

~55 Min Theorie ↔ Praxis Wizard · Artefakte · Guardrails

Lernziele

Nach diesem Kapitel kannst du …

  • erklären, warum der Kontext die wichtigste Stellschraube für die Ergebnisqualität eines Coding-Agenten ist und was „Müll rein, Müll raus“ bei Agenten konkret bedeutet.
  • unterscheiden, welche Arten von Kontext es gibt: Projektbeschreibung, Konventionen, Leitplanken, Gedächtnis, Auftrag und Akzeptanzkriterien.
  • einschätzen, wie ein begrenztes Kontextbudget deine Entscheidungen beeinflusst: was hineingehört, was nicht, und wie Widersprüche entstehen.
  • beschreiben, was AGENTS.md als werkzeugübergreifende Konvention leistet und warum eine Quelle mit mehreren Projektionen besser ist als eine Kopie je Werkzeug.
  • in der Fabrik ein Projekt mit dem Projekt-Assistenten anlegen, die 13 Felder der Projektdefinition sinnvoll füllen, die generierten Artefakte prüfen und bearbeiten, Project-Memory pflegen und ein Team aus Agentenrollen zusammenstellen.
  • nachvollziehen, wie die Engineering-Guardrails in jeden Run gelangen, wie sie gegenüber Projektvorgaben gewichtet werden und wie ihr Einsatz attestiert wird.

3.1 Warum Kontext über Qualität entscheidet

Ein Sprachmodell hat kein Gedächtnis zwischen zwei Aufrufen und kein Wissen über dein Projekt, das nicht im Aufruf selbst steht. Was es über deine Anwendung „weiß“, stammt aus genau zwei Quellen: aus seinem allgemeinen Training (Sprachen, Frameworks, verbreitete Muster) und aus dem, was im Kontextfenster dieses einen Laufs liegt. Ein Coding-Agent erweitert das Kontextfenster zwar selbst, indem er Dateien liest, Befehle ausführt und Ergebnisse auswertet (siehe Kapitel 2). Aber was er liest, wonach er sucht und wie er das Gefundene gewichtet, hängt davon ab, womit du ihn startest.

Das klingt banal, hat aber weitreichende Folgen. Stell dir vor, du gibst einem erfahrenen Entwickler, der deine Firma nie betreten hat, nur einen Satz: „Bau eine Benutzerverwaltung.“ Er wird etwas Vernünftiges bauen — aber eben sein Vernünftiges. Vielleicht mit einem anderen Framework, einem anderen Paketschema, einer eigenen Passwort-Logik statt eurem SSO, englischen Kommentaren in einem deutschsprachigen Team. Nichts davon ist „falsch“ im Sinne von kaputt. Alles davon ist falsch im Sinne von „passt nicht zu uns“. Ein Agent verhält sich genauso, nur schneller und ohne nachzufragen.

Müll rein, Müll raus — in drei Varianten

Bei klassischen Programmen meint „Garbage in, garbage out“ fehlerhafte Eingabedaten. Bei Agenten gibt es drei typische Ausprägungen:

  • Fehlender Kontext. Der Agent rät. Er wählt plausible Standards — die nicht deine sind. Das Ergebnis ist in sich stimmig, aber fremd: falscher Stack, falsche Struktur, falsche Sprache.
  • Widersprüchlicher Kontext. In der README steht „Java 21“, in der Projektbeschreibung „Java 25“, in einer alten Anleitung „Java 17“. Der Agent entscheidet sich für eine Variante — welche, ist kaum vorhersehbar. Widersprüche sind schlimmer als Lücken, weil sie das Ergebnis zufällig machen.
  • Überladener Kontext. Zwanzig Seiten Firmenrichtlinien, alte Protokolle und ganze Wikis „zur Sicherheit“. Das Wichtige geht im Unwichtigen unter, das Kontextbudget ist verbraucht, bevor der Agent die eigentliche Aufgabe angeht, und jede zusätzliche Zeile erhöht die Chance auf Widersprüche.

Guter Kontext ist deshalb nicht viel Kontext, sondern zutreffender, knapper und widerspruchsfreier Kontext. Diese drei Eigenschaften ziehen sich durch das ganze Kapitel.

Merksatz: Ein Agent setzt unklare Formulierungen sehr ehrlich um. Was du im Kontext schlampig beschreibst, findest du später in den Commits wieder.

3.2 Welche Arten von Kontext es gibt

Es hilft, Kontext nicht als einen großen Textblock zu denken, sondern als Schichten mit unterschiedlicher Lebensdauer und unterschiedlichem Zweck. Je stabiler eine Information ist, desto weiter „unten“ gehört sie hin — und desto seltener sollte sie sich ändern.

SchichtFrage, die sie beantwortetLebensdauerBeispiel
ProjektbeschreibungWas bauen wir, für wen, warum?Monate bis JahreVision, Zielgruppe, Domäne, Nicht-Ziele
Technische KonventionenWomit und wie bauen wir?MonateStack, Architekturstil, Paketstruktur, Commit-Konventionen
LeitplankenWie soll sich der Agent grundsätzlich verhalten?sehr stabil„Kleine, chirurgische Änderungen“, „Erfolg prüfbar machen“
GedächtnisWas haben wir unterwegs gelernt und entschieden?wächst laufend„Wir nutzen Testcontainers statt H2“, „Modul X ist Altlast“
AnforderungenWas genau muss gelten, damit es fertig ist?je FeatureSpec mit Akzeptanzkriterien (Kapitel 4)
AuftragWas soll dieser Lauf tun?ein Lauf„Implementiere den Auftrags-CRUD gemäß PROJECT.md“

Zwei Beobachtungen dazu. Erstens: Der Auftrag ist die einzige Schicht, die sich bei jedem Lauf ändert. Wer alles in den Auftrag packt, schreibt bei jedem Lauf dieselben Grundlagen neu — und jedes Mal ein bisschen anders. Zweitens: Die Schichten haben eine natürliche Rangfolge. Eine projektspezifische Entscheidung („wir verwenden hier bewusst keine Lombok-Annotationen“) sollte eine allgemeine Leitplanke übersteuern können, nicht umgekehrt. Diese Rangfolge muss irgendwo ausdrücklich stehen, sonst entscheidet der Agent sie selbst.

Konventionen als Kontext

Viele Teams haben Konventionen, die nirgends aufgeschrieben sind: wie Tests heißen, wo DTOs liegen, ob Commit-Nachrichten Deutsch oder Englisch sind, welche Bibliotheken unerwünscht sind. Menschen lernen das durch Code-Reviews und Mitlesen. Ein Agent kann das nur, wenn er genug repräsentativen Bestandscode liest — und selbst dann übernimmt er Fehler der Vergangenheit ebenso bereitwillig wie gute Muster. Aufgeschriebene Konventionen sind deshalb für Agenten wertvoller als für Menschen. Sie sind ein Hebel mit langer Wirkung: einmal sauber formuliert, wirken sie in jedem Lauf.

Gedächtnis als Kontext

Ein Agent startet jeden Lauf bei null. Alles, was in Lauf 1 mühsam herausgefunden wurde — dass ein bestimmter Test flackert, dass ein Modul nicht angefasst werden soll, dass man sich gegen eine Bibliothek entschieden hat — ist in Lauf 2 vergessen, wenn es nicht irgendwo festgehalten wird. Ein gepflegtes Projektgedächtnis ist die Antwort darauf: eine kuratierte, kurze Liste von Entscheidungen und Erkenntnissen, die jedem Folgelauf mitgegeben wird. Kuratiert heißt: Ein Mensch entscheidet, was dauerhaft gilt. Ein Gedächtnis, in das jeder Lauf ungefiltert hineinschreibt, wächst zu genau dem überladenen Kontext, vor dem 3.1 warnt.

In der Fabrik

Der Projekt-Assistent baut die unterste Schicht

In der Fabrik beginnt jedes Vorhaben mit einem Projekt. Es gibt zwei Wege, eines anzulegen:

  • Projekt-Assistent unter /wizard — geführt, empfohlen für den Einstieg.
  • Schnell anlegen unter /projects/new — ein knappes Formular mit Titel und Produktname; danach füllst du alles im Editor selbst.

Der Assistent führt in sechs Schritten durch die Anlage und denkt dabei in drei voneinander unabhängigen Dimensionen: Zielplattform × Backend × Frontend(s). Damit lassen sich auch Produkte ausdrücken, die ein Backend und mehrere Clients haben.

SchrittInhaltKontext, der dabei entsteht
1 – Zielplattform & ProjekttypWeb, Mobile, Desktop (Mehrfachauswahl) oder „bestehendes Repo importieren“Wofür wird gebaut? Greenfield oder Bestand?
2 – Backendz. B. Spring Boot, Quarkus, ASP.NET, FastAPI/Flask, Node — oder „kein Backend“Technologie-Grundentscheidung
3 – Frontend(s)Mehrfachauswahl, gefiltert nach Plattform und BackendClients und ihre Stacks
4 – FragenBasisdaten und stack-spezifische Felder (z. B. Java-Version, Datenbank, Architekturstil)Konventionen und Vision
5 – Quality-Gatesoptionale Toggles (z. B. ArchUnit, OWASP Dependency-Check, Trivy, ESLint, Playwright); wo freigeschaltet, zusätzlich der Spec-ModusWas später geprüft wird
6 – ZusammenfassungReview, lokale Token-/Kostenschätzung, Vorschau des Initial-PromptsDer erste Auftrag

Am Ende legt der Assistent ein Projekt im Status Entwurf an und leitet in den normalen Projekt-Editor; dort bleiben alle Felder editierbar. Der Filter in Schritt 3 warnt übrigens nur, wenn eine Zielplattform von keinem Frontend abgedeckt ist — er blockiert nicht. Eine reine API ohne Frontend ist also ausdrücklich möglich.

Der Spec-Modus in Schritt 5 (AUS, LEICHT, STRENG; Voreinstellung AUS) erscheint nur, wenn Spec-Driven Development freigeschaltet ist (Feature-Flag und, bei aktivem Lizenzsystem, Tier Professional oder Enterprise). Was die Modi bewirken, lernst du ausführlich in Kapitel 4.

Tipp: Auch wenn du den Assistenten nicht brauchst, lohnt sich beim ersten Mal ein einziger Durchgang. Du siehst in Schritt 6, was die Fabrik aus deinen Antworten macht, bevor ein einziges Token für einen Agenten ausgegeben wird.

3.3 Eine gute Projektbeschreibung schreiben

Die Projektbeschreibung ist die Charta des Vorhabens. Sie beantwortet die Fragen, die ein neues Teammitglied in der ersten Woche stellen würde. Für Agenten gelten dabei ein paar Regeln, die über normales „gutes Schreiben“ hinausgehen.

Konkret statt wohlklingend

„Moderne, skalierbare, sichere Architektur“ ist für einen Agenten wertlos — jede Architektur hält sich selbst für modern, skalierbar und sicher. Wertvoll ist: „Hexagonal (Ports & Adapters), Basis-Paket io.beispiel.maint, REST unter /api/v1, keine JPA-Annotationen in der Domäne.“ Faustregel: Wenn ein Satz für jedes beliebige Projekt stimmen würde, trägt er nichts bei.

Versionen und Namen ausschreiben

Agenten kennen viele Versionen eines Frameworks und mischen sie gern. Schreib die Version hin, die du willst, und den Build-Befehl, der grün sein muss. Je näher eine Angabe an etwas Prüfbarem ist, desto zuverlässiger wird sie eingehalten.

Nicht-Ziele benennen

Agenten neigen zu Übererfüllung: Sie fügen „der Vollständigkeit halber“ Features, Konfigurationsoptionen oder Abstraktionen hinzu. Ein Abschnitt, der klar sagt, was nicht gebaut wird („kein Mehrmandantenbetrieb in Version 1“, „keine eigene Benutzerverwaltung, Login nur über OIDC“), ist eine der wirksamsten Maßnahmen gegen Scope-Creep. In Specs ist der Abschnitt „Nicht-Ziele“ deshalb Pflicht (Kapitel 4).

Domänensprache festlegen

Heißt es „Auftrag“, „Ticket“ oder „Job“? „Kunde“ oder „Mandant“? Wenn die Beschreibung die Begriffe festlegt, übernimmt der Agent sie in Klassennamen, Tabellen und Oberflächen. Wenn nicht, erfindet er eigene — und du hast ab dem zweiten Lauf zwei Begriffe für dieselbe Sache.

Sicherheits- und Qualitätsanforderungen gehören dazu

Dass Passwörter nicht im Klartext gespeichert werden, „weiß“ jedes Modell. Dass ihr ausschließlich über OIDC anmeldet, die Rollen ADMIN und DISPONENT habt und WCAG 2.1 AA einhalten müsst, weiß es nicht. Projektspezifische Anforderungen sind genau die, die ohne Aufschreiben verloren gehen.

Schwach:  "Eine sichere, moderne Web-App für Wartungsaufträge."

Stark:    "Web-Portal + REST-API zur Verwaltung von Wartungsaufträgen.
           Disponenten planen im Web; die API bedient später eine Mobile-App.
           Backend Spring Boot / Java 21 / PostgreSQL / Maven, hexagonal,
           Basis-Paket io.beispiel.maint, REST unter /api/v1.
           Login nur OIDC, Rollen ADMIN und DISPONENT.
           Nicht in Version 1: Mobile-App, Mehrmandantenbetrieb."
Dieselbe Idee, zweimal beschrieben. Nur die zweite Fassung lässt dem Agenten keine Grundsatzentscheidungen offen.

In der Fabrik

Die 13 Felder der Projektdefinition

Im Projekt-Editor (/projects/{id}/edit) pflegst du die Projektdefinition. Sie ist das Herzstück, aus dem die Fabrik die Eingabe-Artefakte für den Agenten erzeugt. Neben den Stammdaten Titel und Produktname hat sie 13 inhaltliche Felder:

FeldBedeutungWorauf du achten solltest
shortDescriptionEin- bis ZweizeilerMuss das Projekt eindeutig von anderen unterscheiden
visionZielbild2–4 Sätze: Was ist am Ende anders als heute?
targetAudienceWer nutzt das ProduktRollen nennen, die später in Berechtigungen auftauchen
technologyPreferencesStack und VersionenVersionen ausschreiben, Build-Werkzeug nennen
architecturePreferencesArchitekturstil, Schichten, PaketeBasis-Paket und Schichtregeln konkret angeben
securityRequirementsSicherheitsanforderungenAnmeldeverfahren, Rollen, Datenklassen
accessibilityRequirementsBarrierefreiheitNorm und Stufe, z. B. WCAG 2.1 AA
nonfunctionalRequirementsNFRs, Quality-GatesMessbare Werte statt Adjektive
gitWorkflowPreferencesBranching, Commit-Konventionenz. B. Conventional Commits, trunk-based
documentationRequirementsgewünschte DokuREADME, ADRs, OpenAPI — was genau?
languagePreferenceSprache für Kommentare und Dokude oder en
sectorContextBranchen- und DomänenkontextRegulatorik, Fachbegriffe, Datenschutzrelevanz
freeTextalles WeitereHier landet auch der Prompt aus dem Assistenten

Leere Felder erscheinen im generierten Prompt als offene Platzhalter. Das ist bewusst sichtbar gemacht: Du kannst sie im Editor nachziehen, bevor du den ersten Run startest. Ein leeres Feld ist kein Fehler — aber ein Hinweis, dass der Agent an dieser Stelle raten wird.

Weiterlesen: Drei vollständige Beispiel-Definitionen (Spring-Boot-API mit React, FastAPI-Service ohne Frontend, statische Landingpage) findest du im Benutzerhandbuch, Abschnitt 3.4.

3.4 Das Kontextbudget: was hineingehört und was nicht

Jedes Modell hat ein begrenztes Kontextfenster, gemessen in Tokens. Was hineinpasst, ist zwar mit den Modellgenerationen gewachsen, aber zwei Dinge bleiben: Erstens kostet jedes Token Zeit und — je nach Abrechnung — Geld, und zwar in jedem Schritt der Agenten-Schleife erneut, weil der bisherige Verlauf immer wieder mitgeschickt wird (Caching mildert das, siehe Kapitel 10). Zweitens werden Modelle mit sehr langen Kontexten nicht automatisch besser: Informationen in der Mitte langer Texte werden erfahrungsgemäß weniger zuverlässig berücksichtigt als am Anfang oder Ende, und jede zusätzliche Information konkurriert mit der eigentlichen Aufgabe um Aufmerksamkeit.

Daraus ergibt sich eine einfache Haushaltsregel: Der feste Kontext, der in jeden Lauf geht, soll klein und hochwertig sein. Der variable Kontext — Bestandscode, Logs, Dokumentation — soll der Agent sich bei Bedarf selbst holen, indem er Dateien liest und sucht.

Kontext in vier Schichten: System und Regeln (stabil), Projektdefinition (versioniert), aktuelle Aufgabe (fokussiert), Dateien und Logs (bei Bedarf); kleiner fester Kontext, gezieltes Nachladen. Kontext in vier Schichten: System und Regeln (stabil), Projektdefinition (versioniert), aktuelle Aufgabe (fokussiert), Dateien und Logs (bei Bedarf); kleiner fester Kontext, gezieltes Nachladen.

Grafik in voller Größe öffnenGrafik in voller Größe öffnen

Gehört in den festen Kontext

  • Zielbild und Nicht-Ziele in wenigen Sätzen
  • Stack, Versionen, Build- und Testbefehl
  • Architekturregeln, die nicht aus dem Code ablesbar sind
  • Verhaltensleitplanken (kleine Änderungen, Annahmen offenlegen, Erfolg prüfbar machen)
  • kuratierte Entscheidungen aus dem Gedächtnis
  • die Akzeptanzkriterien dieses Auftrags — nicht die aller Features

Gehört nicht in den festen Kontext

  • ganze Wikis, Protokolle, E-Mail-Verläufe
  • Informationen, die im Code stehen und dort gelesen werden können
  • veraltete Anleitungen „zur Sicherheit“
  • Geheimnisse jeder Art (API-Keys, Passwörter, Tokens) — mehr dazu in Kapitel 8
  • Wiederholungen derselben Regel in leicht unterschiedlicher Formulierung

Widersprüche aktiv suchen

Die gefährlichste Form schlechten Kontexts ist der Widerspruch, den niemand bemerkt. Er entsteht fast immer, wenn dieselbe Information an mehreren Stellen gepflegt wird: im Wiki, in der README, in einer Werkzeug-spezifischen Konfigurationsdatei, im Prompt. Die wirksamste Gegenmaßnahme ist strukturell: eine Quelle, mehrere Projektionen. Jede Information wird an genau einer Stelle gepflegt und von dort automatisch dorthin verteilt, wo sie gebraucht wird. Genau dieses Prinzip verfolgt die Fabrik mit ihren Artefakten und Guardrails.

In der Fabrik

Prompt-Artefakte: aus der Definition werden Dateien

Auf der Projektseite erzeugst du per „Markdown-Artefakte generieren“ aus der Projektdefinition versionierte Markdown-Dateien. Die Übersicht dazu findest du unter /projects/{id}/artifacts, jedes einzelne Artefakt unter /projects/{id}/artifacts/{kind}.

ArtefaktInhalt
PROJECT.mdDie Charta: nummerierte Abschnitte, 1:1 aus den Feldern (Zielbild, Stack, Architektur, Security, NFRs, Git, Doku, Sprache, Sektor, Freitext)
INSTRUCTIONS.mdArbeitsweise, Architektur- und Security-Leitplanken, Build/Test, Git-Disziplin, verbotene Abkürzungen
AGENTS.mdDie aktiven Agentenrollen; bei Runs zusätzlich mit den Engineering-Guardrails als Kopf
WORKFLOW.mdPhasenmodell und Freigabepunkte
DEFINITION_OF_DONE.mdWann ein Run fertig ist: Build und Tests grün (mvn verify, Coverage), dazu die Projektanforderungen zu NFRs, Sicherheit, Barrierefreiheit und Doku
README.mdLese-Einstieg in den Workspace
Aus der Projektdefinition entstehen sechs versionierte Dateien im Repository: PROJECT.md (Ziel), INSTRUCTIONS.md (Regeln), AGENTS.md (Rollen), WORKFLOW.md (Ablauf), DEFINITION_OF_DONE.md (wann fertig) und README.md (Einstieg). Aus der Projektdefinition entstehen sechs versionierte Dateien im Repository: PROJECT.md (Ziel), INSTRUCTIONS.md (Regeln), AGENTS.md (Rollen), WORKFLOW.md (Ablauf), DEFINITION_OF_DONE.md (wann fertig) und README.md (Einstieg).

Grafik in voller Größe öffnenGrafik in voller Größe öffnen

Drei Eigenschaften sind wichtig:

  • Versioniert und editierbar. Du kannst jedes Artefakt im Browser anpassen. Jede Änderung erzeugt eine neue Version (nichts wird überschrieben) und einen Audit-Eintrag PROMPT_EDITED; das Generieren selbst wird als PROMPTS_GENERATED festgehalten. Bearbeiten dürfen Nutzer ab Rolle DEVELOPER.
  • Im Workspace und im Aufruf. Beim Run werden die Dateien in den Workspace geschrieben und committet. PROJECT.md und INSTRUCTIONS.md gehen zusätzlich direkt in den Agenten-Aufruf.
  • Nicht destruktiv. Der Workspace gehört dem Projekt, nicht dem Run; die Artefakte werden bei jedem Run aktualisiert, ohne den Code des Agenten anzutasten.
Lies die Artefakte einmal durch, bevor du den ersten Run startest. Ein Tippfehler in PROJECT.md ist billig zu korrigieren — derselbe Tippfehler, verteilt über zwanzig generierte Klassen, nicht.

Im Datenmodell existiert außerdem der Artefakttyp UX_CONCEPT; der Generator erzeugt ihn in der aktuellen Version aber nicht. Rechne in der Oberfläche also mit den sechs genannten Dateien.

3.5 AGENTS.md: eine Konvention für alle Werkzeuge

Fast jedes Coding-Werkzeug liest beim Start eine Projektdatei mit Hinweisen ein — aber jedes hat historisch seine eigene: Claude Code liest CLAUDE.md, Gemini CLI GEMINI.md, andere Werkzeuge eigene Dateien oder Konfigurationsverzeichnisse. Wer mehrere Werkzeuge einsetzt, pflegt schnell drei Dateien mit fast demselben Inhalt — und hat nach wenigen Wochen drei leicht unterschiedliche Wahrheiten.

AGENTS.md hat sich als werkzeugübergreifende Konvention dafür etabliert: eine schlichte Markdown-Datei im Repository-Wurzelverzeichnis, die beschreibt, wie in diesem Projekt gearbeitet wird — Build- und Testbefehle, Konventionen, Verbote, Hinweise. Viele Werkzeuge lesen sie direkt, andere lassen sich per Konfiguration darauf verweisen oder bekommen eine kleine eigene Datei, die nur auf AGENTS.md zeigt.

Was in eine gute AGENTS.md gehört

  • Befehle: wie man baut, testet, formatiert — exakt, kopierbar.
  • Struktur: wo was liegt, welche Module tabu sind.
  • Konventionen: Benennung, Testmuster, Commit-Format.
  • Grenzen: was der Agent nicht tun darf (z. B. bestehende Datenbank-Migrationen ändern).
  • Verweise: wo ausführlichere Dokumente liegen, statt sie einzukopieren.

Was nicht hineingehört

Alles, was eine eigene, bessere Heimat hat: Anforderungen gehören in Specs, Entscheidungen mit Begründung in ADRs, Lernerfahrungen in ein Gedächtnis. AGENTS.md ist die Bedienungsanleitung des Repositorys für Agenten, kein Sammelbecken.

Wichtig zu wissen: Ob und wie ein Werkzeug solche Dateien beim Start automatisch einliest, unterscheidet sich je Werkzeug und Version (Dateinamen, Größenbeschränkungen, Konfiguration). Wer sich darauf verlässt, dass „das Werkzeug die Datei schon lesen wird“, hat einen stillen Fehlerpunkt. Eine Steuerungsebene, die den wesentlichen Kontext selbst in den Auftrag legt, ist robuster.

3.6 Leitplanken: Verhalten statt Inhalt

Projektbeschreibung und Konventionen sagen dem Agenten, was und womit er bauen soll. Leitplanken (Guardrails) sagen ihm, wie er sich dabei verhalten soll — unabhängig vom Projekt. Typische Fehlverhalten von Coding-Agenten sind erstaunlich konstant über Modelle und Werkzeuge hinweg:

  • Stilles Raten: Bei Mehrdeutigkeit wird eine Interpretation gewählt, ohne sie zu nennen.
  • Übererfüllung: zusätzliche Features, Abstraktionen „für später“, unnötige Konfigurierbarkeit.
  • Kollateralschäden: Nebenbei wird benachbarter Code umformatiert, refaktoriert oder „aufgeräumt“, was Diffs aufbläht und Reviews erschwert.
  • Unprüfbarer Erfolg: „Fertig, sollte funktionieren“ — ohne Test, der es belegt.

Gute Leitplanken adressieren genau diese Muster, sind kurz und gelten für jedes Werkzeug gleich. Sie sind Standardverhalten: Ein Projekt darf sie übersteuern, wenn es einen Grund hat. Diese Rangfolge — Projekt vor Leitplanke — muss in den Leitplanken selbst stehen, damit der Agent bei Konflikten nicht abwägen muss.

Ein Detail verdient besondere Aufmerksamkeit: Ein Agent, der autonom läuft, hat niemanden, den er fragen kann. Eine Leitplanke wie „frag nach, wenn etwas unklar ist“ ist für einen Headless-Lauf deshalb sinnlos. Besser ist: „Lege Annahmen offen, wähle bei mehreren Deutungen die konservativste und mach Entscheidungen, die Umfang, Kosten oder Risiko verändern, im Plan und in der PR-Beschreibung unübersehbar.“ Das ist die Idee hinter surface, don't ask.

In der Fabrik

Engineering-Guardrails: eine Quelle, jeder Adapter

Die Fabrik bringt eine vendor-neutrale Verhaltens-Policy mit, die Engineering-Guardrails. Sie fließen bei jedem Run in den Kontext jedes Coding-Agenten — egal ob Claude Code, Codex, Gemini oder ein lokales Modell. Die vier Leitplanken (im Original englisch):

  1. Think first — surface, don't ask: Annahmen festhalten, bei mehreren Deutungen die konservativste wählen und die Alternativen begründen, folgenreiche Entscheidungen im Plan und in der PR-Beschreibung markieren.
  2. Simplicity first: minimaler Code, der das Ziel erfüllt; nichts Spekulatives.
  3. Surgical changes: Jede geänderte Zeile muss auf das Ziel zurückführbar sein; benachbarten Code nicht „verbessern“.
  4. Make it verifiable: Die Aufgabe vor dem Coden als prüfbare Erfolgskriterien formulieren und den Test oder die Prüfung mitliefern — die Verifikationsschleife selbst ist Sache der Pipeline.

Wie sie in den Run kommen

Die Fabrik verlässt sich nicht darauf, dass ein Werkzeug eine bestimmte Datei automatisch einliest. Stattdessen setzt sie den Guardrails-Text als stabilen Kopf vor das Ziel (Objective) des Runs — das einzige Feld, das alle Adapter verarbeiten. Zusätzlich projiziert sie aus derselben Quelle ins Repository:

  • AGENTS.md — Guardrails als Kopf über der Rollen-Doku,
  • CLAUDE.md — nur ein minimaler Verweis auf AGENTS.md,
  • .gemini/settings.json — verweist Gemini auf AGENTS.md als Kontextdatei.

Niemand dupliziert den Inhalt von Hand. Das ist das Prinzip „eine Quelle, mehrere Projektionen“ aus 3.4 in Reinform.

Rangfolge, Schalter, Nachweis

  • Präzedenz: Die Guardrails sind Default-Leitplanken. Projektspezifische Vorgaben in INSTRUCTIONS.md oder MEMORY.md haben bei Konflikt Vorrang; der Guardrails-Kopf sagt das ausdrücklich.
  • Schalter: run.guardrails.mode (Voreinstellung on), wirksam mit der Präzedenz Projekt > Benutzer > Global. off schaltet Injektion, Projektion und Attestierung gemeinsam ab.
  • Nachweis: Die Version der Guardrails ist ein SHA-256-Kurzhash ihres Inhalts. Jeder Run hält sie als RUN_GUARDRAILS_ANGEWENDET in der signierten Audit-Kette fest; der Warum-Trace des Runs zeigt sie an (mehr in Kapitel 9).
Was hinter den Guardrails folgt: Arbeitet ein Run im Spec-Modus gegen eine freigegebene Spec, hängt die Fabrik die gebundenen Akzeptanzkriterien (ID und Text) direkt hinter die Guardrails in den Objective-Kopf — ohne den Guardrails-Text oder seinen Hash zu verändern. AGENTS.md erhält dann zusätzlich einen markierten Spec-Index (ID, Titel, Status, Pfad). Details in Kapitel 4.
Objective eines Build-Runs (vereinfacht)
---------------------------------------
[1] Engineering-Guardrails          (fest, versioniert, Hash attestiert)
[2] Akzeptanzkriterien AC-…         (nur bei Spec-Bezug)
[3] Ziel dieses Runs                (frei, bis 4000 Zeichen)

Workspace (zusätzlich vom Agenten lesbar)
-----------------------------------------
PROJECT.md  INSTRUCTIONS.md  AGENTS.md  WORKFLOW.md
DEFINITION_OF_DONE.md  README.md  MEMORY.md  specs/…  (Code)
Schichtung des Kontexts in einem Run. Der feste Teil ist klein, der Rest liegt als Datei im Workspace und wird bei Bedarf gelesen.

3.7 Gedächtnis: lernen über Läufe hinweg

Ein Projektgedächtnis schließt die Lücke zwischen zwei Läufen. Es ist kein Protokoll (was ist passiert?), sondern ein Destillat (was gilt seitdem?). Drei Arten von Einträgen haben sich bewährt:

  • Entscheidungen: „Wir verwenden Testcontainers mit PostgreSQL statt H2, weil H2 die JSONB-Abfragen nicht unterstützt.“
  • Fallstricke: „Der Integrationstest ImportIT braucht eine freie Portrange; nicht parallelisieren.“
  • Grenzen: „Das Paket legacy.billing wird abgelöst; nur Fehlerbehebungen, keine neuen Features.“

Gute Einträge sind kurz, datiert oder versioniert und enthalten eine Begründung. Ohne Begründung kann niemand — weder Mensch noch Agent — später entscheiden, ob die Regel noch gilt. Und das Gedächtnis braucht Pflege: Veraltete Einträge sind widersprüchlicher Kontext mit Ansage.

Wer schreibt ins Gedächtnis?

Hier gibt es eine echte Abwägung. Lässt du nur Menschen schreiben, bleibt das Gedächtnis sauber, aber es veraltet, weil niemand Zeit hat. Lässt du Agenten frei schreiben, wird es aktuell, aber es wuchert und enthält bald Halbwahrheiten. Ein guter Mittelweg: Agenten dürfen Vorschläge ergänzen, ein Mensch kuratiert regelmäßig — streicht, präzisiert, fasst zusammen.

In der Fabrik

Project-Memory: kuratiert in der Datenbank, gespiegelt als MEMORY.md

Jedes Projekt hat ein Project-Memory, das du in der Oberfläche unter Memory (/projects/{id}/memory) bearbeitest. Der Ablauf:

  1. Vor jedem Run spiegelt die Fabrik den Inhalt als MEMORY.md in den Workspace.
  2. Während des Runs kann der Agent die Datei lesen — und aktualisieren.
  3. Nach dem Run liest die Fabrik eine vom Agenten aktualisierte MEMORY.md zurück in die Datenbank (Rück-Ingest).

Die Datenbank ist die Quelle, die Datei die Projektion. Dadurch ist das Memory adapterunabhängig: Ein Folge-Run mit einem anderen Agenten bekommt dasselbe Gedächtnis, weil es nicht in einer werkzeugspezifischen Konfiguration steckt.

Praxisregel: Schau nach jedem größeren Run kurz unter Memory nach, was der Agent ergänzt hat. Streiche, was nur für diesen einen Lauf galt, und präzisiere, was dauerhaft gelten soll. Fünf Minuten Kuratieren sparen dir in den nächsten Läufen viele Korrekturschleifen.

Beachte die Präzedenz aus dem vorigen Kasten: Vorgaben in MEMORY.md gehen den allgemeinen Guardrails vor. Das Memory ist damit auch der richtige Ort für bewusste Ausnahmen („In diesem Projekt bitte bestehende Tests nicht umbenennen, auch wenn sie unglücklich heißen“).

3.8 Rollen und Teams als Kontext

„Du bist ein erfahrener Security-Reviewer“ ist mehr als eine Höflichkeitsformel. Eine Rolle bündelt Erwartungen: worauf geachtet wird, was erlaubt ist, wann eskaliert wird. Für Menschen ist das selbstverständlich — ein Reviewer schreibt keinen Feature-Code, ein Architekt plant, bevor gebaut wird. Für Agenten muss es ausdrücklich gesagt werden.

Rollen als Kontext haben zwei Vorteile. Erstens werden Verantwortungen getrennt: Wer schreibt, gibt seine Arbeit nicht selbst frei. Zweitens werden Regeln wiederverwendbar: Die Sicherheitsregeln eines Security-Reviewers schreibst du einmal, nicht in jeden Auftrag neu.

Eine wichtige Einschränkung: Eine Rolle im Prompt ist eine Bitte, keine technische Grenze. Ob ein Reviewer wirklich nichts schreiben kann, entscheiden die Werkzeugrechte, mit denen er gestartet wird, nicht seine Rollenbeschreibung. Rollen und Rechte gehören zusammen — das vertiefen Kapitel 6 (read-only Reviewer) und Kapitel 8 (Permissions).

In der Fabrik

Agentenrollen, Teams und die Skill-Bibliothek

Die Fabrik modelliert Agenten nicht als Promptfragmente, sondern als konfigurierte Rollen. Unter /agents werden Agentendefinitionen verwaltet, unter /teams daraus Teams zusammengestellt. Beide sind globale Bausteine und nur für die Rolle ADMIN bearbeitbar; beim Anlegen eines Runs wählst du ein vorhandenes Team aus.

Rollentypen

ARCHITECTDEVELOPERREVIEWERQASECURITY_REVIEWERDOCUMENTATIONMERGE_RELEASE

Felder einer Agentendefinition

Name, Rolle, Kurzbeschreibung, Mission, Standardinstruktionen, Qualitätsregeln, Security-Regeln, Build-Regeln, Git-Regeln, Sprachpräferenz, erlaubte Werkzeuge, Grenzen, Eskalationshinweise, ein optionales Wunschmodell (preferredModel) und ein Aktiv-Status. Aus den aktiven Agenten erzeugt die Fabrik die Rollen-Doku in AGENTS.md.

Teams im Run

Beim Anlegen eines Runs (/runs/new) wählst du neben Adapter und Ziel ein Team. Das Team beeinflusst unter anderem die Modellwahl: Ist kein Routing-Override gesetzt, gilt das Wunschmodell des Developer-Agenten im Team (sonst das des ersten Agenten mit Modell), danach der Rollen-Default. Die tatsächliche Auflösung wird als RUN_MODELL_AUFGELOEST mit ihrer Quelle attestiert — Einzelheiten in Kapitel 10.

Skill- und Plugin-Bibliothek

Unter /skills (nur ADMIN) werden versionierte, mandanten-gescopte Skills und Plugins (Herkunft CATALOG, INSTALLED oder FORKED). Vor jedem Run materialisiert die Fabrik sie in den Workspace:

<workspace>/.claude/skills/<name>/SKILL.md
<workspace>/.claude/agents/<rolle>.md
<workspace>/.claude/settings.local.json
Materialisierung der Bibliothek in den Workspace vor jedem Run.

Damit ist später beantwortbar, welche Erweiterung in welcher Version zum Zeitpunkt eines Laufs im Kontext des Agenten war — die Frage, an der Reproduzierbarkeitsdiskussionen sonst scheitern. Die Engineering-Guardrails sind davon bewusst getrennt: Sie sind keine optionale Erweiterung, sondern die Grundhaltung jedes Laufs.

Abgrenzung: Plugins aus deiner eigenen Claude-Code-Installation wirken in Agentenläufen nicht — jeder Lauf startet mit einem frischen, leeren Home-Verzeichnis. Plugins schaltest du gezielt über Policy-as-Code → Erlaubte Plugins frei. Warum das so ist, erklärt Kapitel 8.

3.9 Zusammenfassung

  • Ein Agent weiß über dein Projekt nur, was in seinem Kontext liegt. Fehlender, widersprüchlicher und überladener Kontext sind die drei Formen von „Müll rein, Müll raus“.
  • Denk Kontext in Schichten: Projektbeschreibung, Konventionen, Leitplanken, Gedächtnis, Anforderungen, Auftrag. Stabile Information gehört nach unten, nur der Auftrag ändert sich je Lauf.
  • Der feste Kontext soll klein und hochwertig sein; variablen Kontext holt sich der Agent selbst.
  • „Eine Quelle, mehrere Projektionen“ verhindert Widersprüche: AGENTS.md als werkzeugübergreifende Datei, aus einer gepflegten Quelle erzeugt.
  • In der Fabrik entsteht der Kontext aus Projektdefinition (13 Felder), Prompt-Artefakten, Engineering-Guardrails im Objective-Kopf, Project-Memory und Teams — versioniert, editierbar und attestiert.

Übung

Übung: Vom Einzeiler zur belastbaren Projektdefinition

Ausgangslage: Deine Fachabteilung schickt dir folgenden Auftrag: „Wir brauchen eine kleine App, mit der Mitarbeitende Räume buchen können. Sollte modern und sicher sein.“

  1. Lücken finden: Schreib zu jedem der 13 Felder der Projektdefinition auf, was du aus dem Auftrag ableiten kannst und was du raten müsstest. Markiere die geratenen Felder.
  2. Annahmen offenlegen: Formuliere für jedes geratene Feld eine ausdrückliche Annahme (z. B. „Annahme: Login über bestehendes OIDC, Rollen MITARBEITER und ADMIN“) und eine Rückfrage an die Fachabteilung.
  3. Nicht-Ziele: Schreib mindestens drei Nicht-Ziele für Version 1 auf.
  4. Gedächtnis vorbereiten: Formuliere zwei Einträge, die du nach dem ersten Lauf vermutlich ins Project-Memory schreiben würdest — jeweils mit Begründung.
  5. In der Fabrik (optional, kostenlos): Stell den Adapter auf mock, lege das Projekt mit dem Assistenten unter /wizard an, übertrage deine Felder im Editor, generiere die Artefakte und lies PROJECT.md und INSTRUCTIONS.md unter /projects/{id}/artifacts. Finde mindestens eine Stelle, an der der generierte Text noch einen Platzhalter enthält, und schließe die Lücke.
Selbstkontrolle: Lies deine fertige Definition und frage dich bei jedem Satz: Würde dieser Satz auch für ein beliebiges anderes Projekt stimmen? Wenn ja, ersetze ihn durch etwas Konkretes oder streiche ihn.

Kapitelfragen

  1. Nenne die drei Formen von „Müll rein, Müll raus“ bei Agenten und erkläre, warum widersprüchlicher Kontext oft schlimmer ist als fehlender.

    Musterantwort

    Fehlender Kontext (der Agent rät plausible, aber fremde Standards), widersprüchlicher Kontext (mehrere Quellen sagen Verschiedenes) und überladener Kontext (das Wichtige geht unter, Budget wird verbraucht). Widersprüche sind tückischer, weil das Ergebnis zufällig wird: Welche Variante der Agent wählt, ist kaum vorhersehbar und kann von Lauf zu Lauf wechseln. Eine Lücke führt wenigstens reproduzierbar zum selben Standardverhalten und fällt eher auf.

  2. Warum sollte der feste Kontext eines Laufs klein sein, obwohl moderne Modelle sehr große Kontextfenster haben?

    Musterantwort

    Jedes Token kostet Zeit und gegebenenfalls Geld, und zwar in jedem Schritt der Agenten-Schleife erneut. Außerdem konkurriert jede zusätzliche Information mit der Aufgabe um Aufmerksamkeit; Informationen in langen Texten werden nicht gleichmäßig zuverlässig berücksichtigt. Mehr Text erhöht zudem die Wahrscheinlichkeit für Widersprüche. Variablen Kontext wie Bestandscode holt sich der Agent ohnehin selbst.

  3. Was bedeutet das Prinzip „eine Quelle, mehrere Projektionen“, und wie setzt die Fabrik es bei den Engineering-Guardrails um?

    Musterantwort

    Jede Information wird an genau einer Stelle gepflegt und automatisch dorthin verteilt, wo sie gebraucht wird, statt mehrere Kopien zu pflegen. Die Guardrails liegen als eine versionierte Quelle vor; die Fabrik setzt sie als Kopf vor das Objective jedes Runs (für alle Adapter) und projiziert daraus AGENTS.md, eine minimale CLAUDE.md mit Verweis und .gemini/settings.json, das auf AGENTS.md zeigt. Niemand kopiert den Text von Hand.

  4. Warum verlässt sich die Fabrik nicht darauf, dass ein Coding-Werkzeug AGENTS.md oder CLAUDE.md selbst einliest?

    Musterantwort

    Die Autoload-Logik unterscheidet sich je Werkzeug und Version (Dateinamen, Größengrenzen, Konfiguration). Wer sich darauf verlässt, hat einen stillen Fehlerpunkt. Das Objective ist das einzige Feld, das alle Adapter verarbeiten; dort eingesetzter Kontext erreicht deterministisch jeden Agenten. Die Dateien im Repository sind zusätzlich da, damit Agent und Mensch dieselbe Grundlage lesen können.

  5. In INSTRUCTIONS.md steht „Kommentare auf Englisch“, die Guardrails enthalten keine Sprachregel, im Memory steht „Kommentare auf Deutsch, Entscheidung vom März“. Was passiert, und was solltest du tun?

    Musterantwort

    Projektvorgaben in INSTRUCTIONS.md und MEMORY.md gehen beide den Guardrails vor, aber untereinander widersprechen sie sich — der Agent muss raten. Das ist genau der widersprüchliche Kontext aus 3.1. Du solltest die Quelle bereinigen: Wenn die Märzentscheidung gilt, das Feld languagePreference in der Projektdefinition auf de setzen, Artefakte neu generieren bzw. INSTRUCTIONS.md korrigieren und den Memory-Eintrag behalten oder streichen, damit es nur noch eine Aussage gibt.

  6. Wie funktioniert das Project-Memory technisch, und warum ist es adapterunabhängig?

    Musterantwort

    Das Memory liegt in der Datenbank und wird unter Memory (/projects/{id}/memory) gepflegt. Vor jedem Run spiegelt die Fabrik es als MEMORY.md in den Workspace; nach dem Run liest sie eine vom Agenten aktualisierte Datei zurück. Weil die Quelle die Datenbank ist und nicht eine werkzeugspezifische Konfiguration, bekommt jeder Adapter dasselbe Gedächtnis — auch nach einem Adapterwechsel.

  7. Ein Kollege schlägt vor, das komplette Team-Wiki (300 Seiten) als freeText in die Projektdefinition zu kopieren, „damit der Agent alles weiß“. Wie argumentierst du?

    Musterantwort

    Das erzeugt überladenen Kontext: hohes Tokenvolumen in jedem Lauf, wichtige Regeln gehen unter, veraltete Seiten erzeugen Widersprüche. Besser: die wenigen projektrelevanten, stabilen Regeln destillieren und in die passenden Felder schreiben (Architektur, Security, NFRs), Entscheidungen ins Memory, Anforderungen in Specs. Auf ausführliche Dokumente im Repository verweisen, damit der Agent sie bei Bedarf liest.

  8. Warum ist eine Rolle wie „Reviewer“ im Prompt allein keine Sicherheitsgarantie, und was gehört ergänzend dazu?

    Musterantwort

    Die Rollenbeschreibung ist eine Bitte an das Modell, keine technische Grenze. Ob ein Reviewer schreiben kann, entscheiden die Werkzeugrechte, mit denen er gestartet wird. In der Fabrik laufen Reviewer deshalb technisch read-only (eingeschränkte Werkzeugrechte, kein Schreiben in den Workspace). Rolle und Rechte gehören zusammen.

  9. Du übernimmst ein bestehendes Projekt in die Fabrik, in dessen Repository bereits eine handgepflegte CLAUDE.md mit wichtigen Konventionen liegt. Wie gehst du vor, damit diese Konventionen künftig in jedem Lauf wirken — auch mit anderen Adaptern?

    Musterantwort

    Die Fabrik projiziert bei aktivierten Guardrails eine eigene minimale CLAUDE.md, die auf AGENTS.md verweist; eine nur dort gepflegte Konvention ist also keine verlässliche Quelle mehr und wäre ohnehin Claude-spezifisch. Die Inhalte gehören in die werkzeugneutralen Quellen der Fabrik: dauerhafte technische Konventionen in die Projektdefinition (Architektur, Git, Doku), daraus generiert in INSTRUCTIONS.md/PROJECT.md; gelernte Entscheidungen ins Project-Memory. Danach wirken sie für jeden Adapter, und Projektvorgaben gehen den allgemeinen Guardrails vor.