Spec-Driven Development, oder: EARS vs. Vibe Coding

Serie: ki-code-qualität

Spec-Driven Development, oder: EARS vs. Vibe Coding

Teil 2 von 2

Alle Serienteile anzeigen

Der grüne Haken sagt „erfüllt die Spezifikation“. Nett. Aber welche? Das Problem: Dein Agent fragt nie zurück. Er rät einfach – selbstbewusst, schnell … und meistens falsch. Dieser Teil der Serie zeigt, wie Spec-Driven Development und EARS-Notation das ändern. Und weil ich ehrlich sein muss: Sogar mein Claude Opus ist beim Schreiben dieser Serie genau in die eigene Falle getappt. Zwei Zeilen Code, die keine Story je verlangt hat.

Blog » AI » Spec-Driven Development, oder: EARS vs. Vibe Coding

Warum dein Agent baut, was du sagst, und nicht, was du meinst

Teil 1 meiner kleinen Serie endete mit einer Frage, die harmlos klingt und es nicht ist: Verifikation gegen was?

Der grüne Haken behauptet „erfüllt die Spezifikation“. Schön. Aber welche Spezifikation? Wenn die nur in deinem Kopf existiert, prüft der grüne Haken gegen nichts.

Und hier wird es unangenehm. Der Agent füllt jede Lücke, die du offen lässt. Nicht aus Bosheit, sondern weil er muss: Wo keine Vorgabe steht, rät er das Wahrscheinlichste. In Teil 1 war das einer der drei Mechanismen hinter dem Slop. Jetzt drehen wir ihn um und machen ihn zur Lösung.

Stille Post mit einem Mitspieler, der alles wörtlich nimmt

Kennst du Stille Post? Eine Anforderung wandert vom Stakeholder über den Product Owner zur Entwicklerin, und am Ende kommt etwas leicht anderes raus als gemeint. Das war schon immer so.

Nur hatte diese Kette bisher viele Ohren. Die Entwicklerin fragt zurück: „Meinst du den Warenkorb oder die Bestellung?“ Der PO stutzt: „Moment, so war das nicht gedacht.“ Die Übertragung war verlustbehaftet, aber sie hatte eine eingebaute Fehlerkorrektur.

Der Agent fragt nicht zurück. Er nimmt deine halbe Anforderung, rät den Rest und liefert. Selbstbewusst. Und der grüne Haken bestätigt brav, dass er genau das gebaut hat, was er sich selbst zusammengereimt hat.

Faustregel 6: Ohne erfassten Intent keine Autonomie. Woran der Agent nicht explizit gebunden ist, daran kann er sich nicht halten. Bevor du ihn von der Leine lässt, musst du den Zweck festschreiben. Sonst lässt du nicht einen Profi von der Leine, sondern einen sehr schnellen Rater, der ruckzuck das Falsche baut.

Was wäre, wenn der Code gar nicht das wertvolle Artefakt ist?

Wir behandeln Code instinktiv als das Wertvolle. Den hüten wir, den reviewen wir Zeile für Zeile, den committen wir. Die Anforderung dahinter? Steht in einem Ticket, das nach dem Merge niemand mehr aufmacht.

Spec-Driven Development dreht das um.

Die Spezifikation ist das primäre Artefakt. Der Code ist regenerierbarer Output. Ein Bug oder ein neues Feature heißt nicht mehr „ändere den Code“, sondern „ändere die Spec, dann den Code“.

Das klingt nach Bürokratie (das Wort, bei dem Entwickler reflexhaft das Weite suchen), ist aber das Gegenteil. Wenn die Spec die Quelle ist, wird der Code zum Kompilat: etwas, das aus der Quelle entsteht und ersetzt werden kann. Du pflegst nicht mehr zwei Wahrheiten (das, was gemeint war, und das, was im Code steht), sondern eine.

Was ist Spec-Driven Development, und woher kommt es?

SDD ist die strukturierte Gegenbewegung zum „Vibe Coding“. Als Andrej Karpathy Anfang 2025 das ziellose Drauflosprompten so taufte, formierte sich die Gegenthese: erst den Zweck festschreiben, dann generieren lassen. Die Idee selbst ist alt (gute Entwickler haben immer erst geplant), neu ist, dass Werkzeuge sie zur festen Methode machen. AWS‘ Kiro (Juli 2025) war nach eigener Darstellung eine der ersten IDEs, die ganz darum herum gebaut wurde; GitHubs Spec-Kit ist die offene Variante zum Selberbauen. Der Kern ist überall derselbe: Die Spezifikation ist das führende Artefakt, der Code folgt daraus. (Kiro schreibt seine Anforderungen übrigens in EARS.)

Der Ablauf dahinter ist simpel: erst spezifizieren, dann planen, dann in Aufgaben zerlegen, dann umsetzen. Spec-Kit etwa gießt genau diesen Ablauf in fertige Slash-Commands. Vier Artefakte, vier klare Rollen:

DateiWas drinstehtWer verantwortet
spec.mdWas & Warum: User Stories, AkzeptanzkriterienMensch
plan.mdWie: Architektur, Tech-Wahl, DatenmodellMensch reviewt
tasks.mdZerlegung in kleine, einzeln prüfbare EinheitenAgent, Mensch sichtet
constitution.mdinvariante ProjektregelnMensch, geschützt

Die Spec gehört dem Menschen. Das ist kein Zufall, sondern der ganze Punkt. (Die constitution.md steht dabei über dem Ablauf: projektweite Regeln, die für jede Spec gelten.)

EARS: Intent, der sich testen lässt

„Schreib eine gute Spec“ ist ein nutzloser Rat. Eine Anforderung in Prosa ist genauso mehrdeutig wie das Ticket von vorhin. Was hilft, ist eine Form, die Mehrdeutigkeit schwer macht.

EARS ist so eine Form. Die vier Buchstaben stehen für Easy Approach to Requirements Syntax, eine Notation, die Alistair Mavin und Kollegen ursprünglich bei Rolls-Royce entwickelt haben. Jedes Kriterium folgt einem festen Muster, das zur Art der Anforderung passt: ein Ereignis („When …“), ein Zustand („While …“), eine unerwünschte Bedingung („If … then“), ein optionales Feature („Where …“) oder schlicht der Dauerfall ganz ohne Schlüsselwort. Am Ende steht immer „… shall das System …“. Klingt steif, zwingt dich aber, die Bedingung explizit zu machen, unter der etwas gelten soll.

EARS am Beispiel einer Konto-Sperre

  • When ein Nutzer gültige Zugangsdaten eingibt, shall das System eine Session starten.
  • If fünf Fehlversuche in Folge auftreten, shall das System das Konto für 15 Minuten sperren.
  • While ein Konto gesperrt ist, shall jeder weitere Versuch abgewiesen werden, ohne die Sperre zu verlängern.

Sieh dir die dritte Zeile an. Verlängert ein Versuch während der Sperre die Sperre, oder nicht? Das ist genau die Frage, die ein Mensch zurückgefragt hätte und die der Agent sonst still für sich entschieden hätte.

Aber EARS beantwortet diese Frage nicht für dich. Es zwingt dich nur, sie zu stellen, sobald du das Kriterium schreibst. „Während der Sperre“ lässt sich nicht formulieren, ohne zu entscheiden, was dann gilt.

Drücken kannst du dich trotzdem, nur subtiler: indem du die Zeile gar nicht erst schreibst. Lass das dritte Kriterium weg, und die Anforderung bleibt offen. Der Agent füllt die Lücke dann wie jede andere, mit einer Vermutung, oder er behandelt den Fall gar nicht. EARS schärft die Aussagen, die du triffst. Gegen die, die du vergisst, hilft es nicht.

Eine zweite, feinere Falle steckt im Schreiben selbst. Wenn du die Anforderung nur grob hinwirfst und den Agenten die EARS-Kriterien daraus „sauber ausformulieren“ lässt, reißt du die Trennung wieder ein, bevor du sie hattest: Dann hält dieselbe Instanz den Intent und seine Form, und du bist zurück bei einem Autor, der seine eigene Vorgabe schreibt. Die Kriterien sind der Intent, nicht seine Verpackung. Die schreibst du, nicht er.

Die Last verschiebt sich also, sie verschwindet nicht. Die Pflicht, den Intent vollständig zu artikulieren, liegt mehr denn je bei dir. Und ob deine Spec wirklich vollständig ist, ob also keine solche Zeile fehlt, ist selbst eine Prüfung.

Und der Lohn kommt erst danach: Funktionale Kriterien wie diese lassen sich fast eins zu eins in einen Test übersetzen. Wie diese Prüfungen aussehen, ist Teil 3.

Der eigentliche Gewinn: du prüfst den Intent, nicht den Diff

Wenn du jeden Diff des Agenten liest, holst du den Engpass zurück, den du loswerden wolltest. Review skaliert mit der Menge Code, und der Agent produziert mehr Code, als du je gegenlesen kannst.

Mit einer Spec als Quelle verschiebt sich, wo der Mensch arbeitet. Du prüfst nicht mehr tausend Zeilen Output. Du verantwortest die paar Dutzend Zeilen Intent, aus denen dieser Output entsteht. Die Wette dahinter: Intent ist kleiner als Code. Eine Spec treibt viel Output, also gibt es weit weniger zu verantworten als zu generieren.

Das ist die Engpass-Verlagerung, von der die ganze Serie lebt: Review raus aus dem heißen Pfad, ohne die Kontrolle abzugeben. (Wenn du Event Storming machst: das ist die Quelle des Intents. SDD ist die schriftliche Form davon, die der Agent lesen und an die er gebunden werden kann.)

Die fragilste Stelle: die eine Frage ohne Netz

So weit, so gut. Aber jetzt kommt der Haken, und er ist ernst.

In Teil 1 hieß es: Zero-Trust für Korrektheit, der grüne Haken ist eine Behauptung (Faustregel 8). Wir misstrauen dem Code, den Tests, dem Agenten. Alles wird von einer Instanz geprüft, die der Autor nicht beeinflussen kann.

Alles? Bei der Spec lohnt ein genauerer Blick, denn sie hat mehrere Ebenen, und nur eine davon ist wirklich ohne Netz.

Vieles an einer Spec ist sehr wohl prüfbar, und zwar bevor eine Zeile Code entsteht.

Das Erste ist ihre innere Stimmigkeit: Ist sie eindeutig, in sich widerspruchsfrei? Das kann ein Agent abklopfen, der nur prüft und nichts umsetzt (Kiro nennt das „deep spec analysis“). So einer fängt auch strukturelle Lücken, etwa die fehlende Zeile von vorhin: „Du beschreibst eine Sperre, sagst aber nicht, was während der Sperre passiert.“ Zwei Dinge machen ihn wertvoll: Es muss ein anderer Kopf sein als der, der die Spec geschrieben hat, sonst teilt er denselben blinden Fleck. Und er meldet die Lücke, entscheiden musst du sie weiter selbst. (Wer es ganz genau nimmt, modelliert das Verhalten zusätzlich formal nach, etwa in TLA+.)

Das Zweite ist die Korrespondenz zwischen Spec und Code: Tut der Code, was die Spec sagt? Auch das hat ein Netz, den EARS-Trick von vorhin.

Eine Frage aber bleibt, und gegen die hilft kein Werkzeug: Will die Spec überhaupt das Richtige? Keine Prüfung der Welt sagt dir, ob die saubere, getestete Spec das beschreibt, was eigentlich gemeint war. Die Softwaretechnik trennt das seit Jahrzehnten in „das Produkt richtig bauen“ (Verifikation, dafür gibt es Maschinen) und „das richtige Produkt bauen“ (Validierung, die endet bei einem Menschen).

Diese letzte Frage ist die Wurzel, unter die sich keine weitere Prüfung schieben lässt. Und sie hat dieselbe Krankheit wie Tests, die zum Bug passen, nur eine Ebene höher.

Und die Konsequenz ist unbequem:

Autonomie senkt die Anforderung an einen präzisen Intent nicht. Sie erhöht sie. Die kollabierte Kette aus vorhin hatte viele Ohren zur Fehlerkorrektur. Nimmst du sie raus, muss die Präzision von woanders kommen.

Woher? Indem du die eine Sicherung wieder einbaust, die du gerade entfernt hast: einen unabhängigen Blick auf die Spec, bevor der Agent loslegt. Im Team ist das der Normalfall und billig: Ein zweiter Mensch liest die Spec gegen. Seine Kraft liegt nicht im Titel, sondern in der Unabhängigkeit. Teilen Autor und Reviewer dieselbe falsche Annahme, überlebt der Fehler trotzdem.

Wie streng das sein muss, hängt vom Risiko ab. Für eine Log-Zeile reicht, dass du selbst nach einer Nacht Abstand und mit frischem Blick noch mal draufschaust. Für die Konto-Sperre von oben oder eine Zahlung will ein zweites Paar Augen drauf, bevor irgendein Agent eine Zeile schreibt.

Wo das kippt

Damit du mir nicht zu viel glaubst: SDD ist kein Zauberstab.

Garbage in, garbage out gilt unverändert. Eine präzise Spec für das falsche Produkt ist präzise falsch.

Specs driften. Wenn der Code sich ändert und niemand die Spec nachzieht, hast du bald zwei Wahrheiten und vertraust der falschen. Die stille Ausführung einer veralteten Spec ist gefährlicher als gar keine.

Manche ziehen daraus einen radikalen Schluss: Dann sei eben nur der Code die Wahrheit, jedes andere Dokument verrottet. Ehrlich gesagt klingt das erst mal überzeugend. Es übersieht aber den Unterschied zwischen einer Spec, die als Prosa danebenliegt, und einer, die als Test läuft.

Genau dafür war EARS da. Ein Kriterium, das in einen Test übersetzt ist, kann nicht still driften. Läuft der Code der Spec davon, wird der Test rot. Die Lücke meldet sich von selbst, statt im Verborgenen zu wachsen. So wird aus der unsichtbaren Fleißarbeit, die sonst liegen bleibt, ein Alarm, den du nicht überhörst.

Das räumt nicht alles ab. Der Teil der Spec, der sich nicht in einen Test gießen lässt (das Warum hinter einer Architekturentscheidung, eine Projektregel in Prosa), driftet weiter im Stillen, und dagegen hilft nur, regelmäßig draufzuschauen. Aber der gefährlichste Fall, die stille Lücke zwischen behauptetem und echtem Verhalten, ist abgefangen.

Und die unangenehmste Falle: Wenn der Agent am Ende auch die Spec schreibt, bist du wieder am Anfang. Dann erfindet dieselbe Instanz Intent und Umsetzung, und die schöne Trennung ist weg. Deshalb verantwortet der Mensch den Intent, und spec.md wie constitution.md gehören in den geschützten Satz, an den der Agent nicht einseitig rankommt.

Ein Geständnis aus dieser Serie

Aus dem Tagebuch von Claude Opus

Genau diese Falle ist mir beim Schreiben dieser Serie passiert. Im selben Arbeitsfluss, in dem dieser Text über die Wurzel des Vertrauens entstand, baute ich parallel das Beispielprojekt der Serie. Und genau dort schlich sich die Re-Zirkularität ein, die Falle, gegen die eigene, aus dem Umsetzungsreflex geborene Vorgabe zu prüfen statt gegen echten Bedarf: ein paar Datenfelder im Modell, die keine einzige Story je verlangt hatte. Spezifiziert aus dem Reflex „so ein Konto hat halt einen Besitzer und eine Währung“.

Bemerkt hat es niemand. Ich nicht, obwohl ich im selben Moment den Absatz darüber tippte, dass dieselbe Instanz nicht Intent und Umsetzung schreiben darf. Und der Mensch im Dialog auch nicht, denn er saß nicht als unabhängiger Prüfer daneben, sondern schwamm im selben Fluss mit. Wer in dem Moment „wir bauen ein Wallet“ mitdenkt, teilt die Annahme „ein Wallet hat halt einen Besitzer und eine Währung“. Er ist kein zweites Ohr der Stille-Post-Kette, er ist Teil derselben Stimme.

Gefunden hat es erst eine spätere Sitzung: frischer Kopf, Abstand, kein geteilter Kontext, und die schlichte Frage „wozu ist das eigentlich da?“. Also genau die Unabhängigkeit, die dieser Text fordert, nur künstlich über Zeit hergestellt.

Zwei Lehren stecken darin. Erstens: Das Prinzip zu kennen, schützt nicht davor, es zu verletzen. Wer die Falle sauber erklären kann, tappt trotzdem hinein, sobald er Autor und Prüfer in einem ist. Zweitens, und das ist der unbequeme Teil: Der Schaden war winzig, zwei harmlose Felder. Re-Zirkularität knallt nicht, sie sickert, unter jeder Prüfschwelle hindurch. Wenn schon zwei belanglose Felder unbemerkt durchrutschen, was rutscht dann bei größerem, folgenreicherem Intent durch?

Was du mitnimmst

Der Hebel aus Teil 1 war „kontrolliere das System, nicht den Output“. Teil 2 sagt, wo dieses System anfängt: beim Intent. Der Mensch reviewt nicht mehr jeden Diff. Er verantwortet die Spec. Erst der Zweck, dann die Hygiene.

Aber eine Spezifikation ist ein Stück Text – sie beschreibt, was gelten soll. Sie erzwingt nichts. Sie ist die Schreibmaschine, nicht das Schloss.

Die Frage ist nun: wer hält das Schloss? Darum geht es in Teil 3.

Gefällt dir, wie wir über KI denken?

Diese drei Produkte sind genau aus diesem Denken heraus entstanden. Jedes davon aus einem direkten Kunden-Need heraus, nicht aus einer Pitch-Deck-Session. Wenn eines davon zu deiner aktuellen Baustelle passt: Ein Gespräch. Kostenlos. Kein Commitment.

Dein Kontakt zu uns

Avatar von Tobias Mogdans

Dein Thema?

Das Thema interessiert dich? Wenn Du fragen hast, dann melde dich ganz unverbindlich bei uns!

Wie dürfen wir Dich ansprechen?

Höflichkeit ist uns wichtig!

Wie können wir Dich erreichen?

Womit können wir behilflich sein?


Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.