Zurück zu den Projekten

Methode und Messung

Designwissen, auf das Agenten bauen können

Heute schreiben KI-Agenten den größten Teil des Frontend-Codes. Damit muss sich auch ändern, wie ein Designsystem ausgeliefert wird. Schwierig ist dabei nicht der Code, sondern dass die Regeln des Designsystems auf beiden Seiten der Übergabe gelten und das Team die Kontrolle behält.

Das Problem

Ein Designsystem ist meist für Menschen geschrieben: eine Doku-Website, eine Figma-Bibliothek, ein paar Konventionen, die jeder im Team einmal gelesen hat. Ein Agent hat davon nichts gelesen. Er greift zum naheliegenden Muster: dem, das in seinen Trainingsdaten am häufigsten vorkam, nicht dem, worauf sich dieses Team geeinigt hat.

Der Fehler fällt nicht auf. Der Code kompiliert, das Interface rendert und ein Review fängt nur einen Teil davon ab. Was durchrutscht, ist ein zweites Designsystem, das im ersten wächst.

Schwierig wird es, weil zwei Anforderungen zugleich gelten: Agenten müssen zuverlässig bauen, und das Team muss den Überblick behalten. Wer nur die erste erfüllt, bekommt eine Codebasis, die niemand mehr prüfen kann.

Der Contract

Ein Agent braucht die Regeln in einer Form, mit der er arbeiten kann: welche Komponenten es gibt, welche Varianten, welche Tokens. Der erste Ansatz war ein eigener Lookup-Layer für Agenten: ein MCP-Server und ein CLI-Tool. Statt zu lesen, sollte der Agent fragen.

Fragen allein reicht nicht, denn ein Agent, der fragen kann, kann es auch lassen. Deshalb greifen dieselben Regeln dort, wo der Code entsteht: Eine Lint-Regel weist einen Verstoß noch im selben Schritt zurück, Typen lassen nur die vereinbarten Varianten zu und eine hartcodierte Farbe wird gar nicht erst gerendert. Ein Verstoß fällt durch, statt diskutiert zu werden.

Wann welcher Check greift

Vom ersten Tastendruck bis zur CI. Je früher ein Check greift, desto billiger der Fix.

  1. Beim Tippen

    Typen, direkt im Editor.

    sofort

  2. Beim Speichern

    Vor einer neuen Datei: Gibt es das schon? Nach jeder Änderung: Lint für diese Datei.

    unter 1 s

  3. Am Ende eines Schritts

    Nur die Checks, die durch die Änderungen fehlschlagen könnten. Blockiert und nennt den Fix.

    1–3 s

  4. Beim Push

    Alles, was offline läuft: Typen, Lint, Tests, Key-Abgleich, Kontrast, generierte Dateien.

    ~1 Min.

  5. In der CI

    Dazu Checks im Browser: Production-Build, Barrierefreiheit, Screenshot-Vergleiche.

    Minuten

  • Während der Arbeit, im selben Schritt
  • Einmal, vor dem Push und in der CI

Wie gemessen wurde

Interessant ist nicht die Architektur, sondern ob sie trägt. Also wurde gemessen: 29 realistische Tasks wie „Füg dieses Panel hinzu“ oder „Bau diesen Screen“. Jeder Task lief in drei Setups: Der Agent konnte das Repository lesen, nur den Lookup-Layer fragen oder keins von beidem.

Jede Antwort wurde gleich bewertet: Verwendet sie die Bausteine, die der Task fordert? Besteht sie den Lint- und den Type-Check? Gewertet wurde nur die erste Antwort. Ein früherer Durchlauf hatte eine deutlich schönere Zahl ergeben und wurde zurückgezogen: Er wiederholte einen Task so lange, bis der Agent ein Tool nutzte. Gemessen hat er damit den besten von mehreren Versuchen, nicht das, was ein Agent von sich aus tut.

Das Ergebnis

Ergebnisse je nach Zugriff

29 Tasks, drei Setups, je eine Antwort, nur der erste Versuch zählt.

Gemessene Ergebnisse des Agenten je nach Zugriff
KennzahlOhne ZugriffNur Lookup-LayerMit Repository-Zugriff
Geforderte Bausteine verwendet11 %46 %76 %
Ohne Lint-Fehler7 von 2920 von 2925 von 29
Type-Check bestanden24 von 2919 von 2927 von 29
Alle drei zugleich0 von 297 von 2916 von 29

Mit Zugriff auf das Repository verwendete der Agent 76 Prozent der geforderten Bausteine, nur mit dem Lookup-Layer 46 Prozent, ganz ohne Zugriff 11 Prozent. Lesen schlug die Lookups bei 15 Tasks und verlor bei keinem.

Zu den meisten Lookups kam es nie: Der Agent hätte fragen können, tat es aber bei 25 von 29 Tasks kein einziges Mal. Pro Frage war ein Lookup um ein Vielfaches günstiger als Lesen. Pro Antwort sparte das nichts, weil die Frage nie gestellt wurde.

Eine Frage, zwei Wege

Tokens pro Frage, gemessen, solange es den Lookup-Layer gab. Die Balken sind pro Zeile skaliert.

Was macht Button?

5× weniger

Quellcode lesen

1.077

Lookup-Layer fragen

206

Welche Farbe hat warning?

72× weniger

Stylesheet lesen

7.579

Lookup-Layer fragen

105

Welche Zustände hat Button?

60× weniger

alle Stories lesen

26.113

Lookup-Layer fragen

433

Tasks, bei denen der Agent fragte: 4 von 29

Alle anderen löste er, ohne zu fragen.

Nach dem Type-Check allein sähe die Reihenfolge anders aus: Ganz ohne Zugriff bestand der Agent ihn öfter als mit dem Lookup-Layer. Deshalb zählt keine Kennzahl für sich allein.

Was sich geändert hat

Der Lookup-Layer wurde entfernt. Er war eine zweite Kopie der Regeln, und zwei Kopien laufen auseinander. Agenten, die den Quellcode öffneten, bekamen dieselbe Antwort direkt aus dem Code. Der kann nicht veralten, denn er ist das, was läuft.

Heute stehen die Regeln dort, wo Menschen und Agenten ohnehin nachsehen: in den Typen, in Doku-Kommentaren an den Komponenten und in der Storybook-Dokumentation, die aus dem Quellcode erzeugt wird. Die Checks sind geblieben. Sie fangen einen Verstoß im selben Schritt ab, in dem er entsteht.

Wie eine Frage heute beantwortet wird

Der Quellcode ist die einzige Kopie, und der Check antwortet im selben Schritt.

Eine Frage

  • Gibt es das schon?
  • Wie sieht die API aus?
  • Welche Farbe?
  • Welche Regel?

Lesen

Typen · Doku-Kommentare · Storybook

Der Quellcode selbst, keine Kopie davon

Code schreiben

Hooks prüfen den Code

im selben Schritt

Nennt, was falsch ist und was stattdessen passt

Was die Messung gezeigt hat

Auffindbar ist nicht gleich genutzt. Eine Regel besser zu beschreiben hat nichts geändert. Gewirkt hat nur der Check, der den Verstoß im selben Schritt zurückweist.

Wer nichts tut, kann besser abschneiden als jemand, der den Task löst. Ein Verbot zählt nur, wenn das Richtige überhaupt möglich war. Sonst kommt auch ein leerer Screen durch.

Eine einzelne Kennzahl kann lügen. Eine Datei, die nichts tut, kompiliert fehlerfrei.