← Alle Beiträge Technik

Warum wir KI YAML schreiben lassen und nicht Code

Warum wir KI YAML schreiben lassen und nicht Code

In unserem Beispielordner liegen acht Apps. Diese Woche haben wir über alle acht die Zeilen gezählt, Quelltext auf der einen Seite, erzeugte Anwendung auf der anderen. Der Grund: Wir behaupten seit Monaten dasselbe in Gesprächen, ohne die Zahl dahinter je geprüft zu haben.

Die Behauptung war, dass eine App zu beschreiben nur einen Bruchteil davon kostet, sie zu bauen. So etwas klingt oft richtig und ist es dann nicht.

Das Ergebnis

Quelltext ist Cord, unser YAML-Format. Die zweite Spalte ist das, was diese App kostet, wenn sie bei einem leeren Ordner anfängt: das für die App erzeugte C# und Vue, plus die Laufzeitumgebung darunter. Beide Spalten sind Tokens und keine Zeilen, gezählt mit Anthropics eigenem Tokenizer, weil Tokens das sind, wofür du tatsächlich bezahlst. Die letzte Spalte ist das, was die Differenz beim heutigen Ausgabepreis von Claude Opus 5 kosten würde.

AppQuelltextbei null angefangengesparte Tokensnicht ausgegeben
Spesen3.245204.551~98,4 %~4,34 €
Aufgaben5.825313.519~98,1 %~6,63 €
CRM14.570377.295~96,1 %~7,82 €
Zeit und Urlaub45.425495.013~90,8 %~9,69 €
Budgetplanung45.296483.818~90,6 %~9,45 €

Die Preise sind die von Anthropic veröffentlichten Sätze vom 3. September 2026: Claude Opus 5 zu 25 US-Dollar je Million Ausgabe-Tokens, umgerechnet zu 1 USD gleich 0,8624 EUR an diesem Tag. Die Tokenzahlen sind gemessen, nicht geschätzt. Jede Datei oben ist durch Anthropics eigenen count_tokens-Endpunkt gelaufen, jede App einzeln und die Laufzeitumgebung einmal. Die Euro-Spalte zählt nur Ausgabe-Tokens und ist damit eine Untergrenze: ein sauberer Durchlauf, nichts noch einmal gelesen, nichts wiederholt.

Die Behauptung hält also, und zwar deutlicher, als wir behauptet hatten. Bei Spesen sind es dreiundsechzig zu eins, bei den Aufgaben vierundfünfzig zu eins.

Fast hätten wir diese Spalte ohne die Laufzeitumgebung veröffentlicht, also nur mit dem Domänenmodell und dem Code der jeweiligen App, mit der Begründung, dass niemand pro App eine Laufzeit erzeugt.

Das stimmt für Cordango und für sonst nichts. Ein Agent, der bei einem leeren Ordner anfängt, bekommt keine Laufzeit als Paket, weil es kein Paket gibt. Er schreibt die Anmeldung, den Datenzugriff, die Rechteprüfungen und das Audit-Log in diese App hinein. Und dann schreibt er sie noch einmal in die nächste App, weil die nächste App wieder ein leerer Ordner ist. Diese 8.152 Zeilen sind 141.596 Tokens auf Anthropics eigenem Tokenizer, und sie werden genau einmal geteilt, von uns. Dieses Teilen ist das ganze Produkt. Sie wegzulassen hat die kleinen Apps um fast das Dreifache untertrieben.

Würde ein Modell wirklich alle 8.152 Zeilen schreiben? Beim ersten Durchgang nicht. Es würde eine dünnere Fassung schreiben, das Audit-Log weglassen, weil niemand danach gefragt hat, und eine Rechteprüfung in eine Vue-Komponente legen, wo jeder daran vorbeigehen kann. Das ist derselbe Vergleich, nur mit einer schlechteren App am Ende.

(Wir haben zweimal gezählt. Der erste Durchlauf hat node_modules mitgenommen und behauptet, das CRM habe 1,3 Millionen Zeilen. Das wäre eine deutlich bessere Überschrift gewesen und eine komplett falsche.)

Was das Modell nie schreibt

Öffnest du die erzeugte Budgetplanung, liegen unter api/ die Ordner Identity, Migrations, Controllers, Data, Security, Seed, Hooks, Computed, Commands, Workflows und Resources. Beschrieben hat davon niemand etwas. In allen acht Apps haben sie dieselbe Form, weil sie aus demselben Compiler kommen.

Allein Migrations/00000000000001_InitialCreate.Designer.cs hat 2.126 Zeilen. Sie sind vollkommen uninteressant, sie müssen exakt stimmen, und lesen wird sie kein Mensch.

Das hier ist alles, was der Quelltext darüber sagt, wer ein Finanzplaner ist:

role: planner
name: Finance Planner
description: Builds and maintains the plan but cannot archive
  scenarios or change app settings.
grants:
  hiring_line:
    create: true
    read: true
    update: true
    delete: true
    commands:
      - approve_hire
      - open_recruiting
      - mark_filled

Daraus werden Rollen auf dem Server, Prüfungen je Entität in den Controllern und eine Oberfläche, die keine Schaltflächen anbietet, die der Benutzer ohnehin nicht drücken darf. Auf der Plattform wird daraus überhaupt nichts kompiliert, weil Identität und Rechte längst da sind, bevor die App existiert.

Dazu haben wir eine Meinung, die wir auch verteidigen. Ein Agent, der den Rechte-Code schreibt, besitzt danach auch jeden Fehler darin, und zwar dauerhaft. Niemand prüft 27.000 Zeilen erzeugtes C# Zeile für Zeile. Wer so tut, landet bei einer Rechteprüfung, die in einer Vue-Komponente wohnt. Die Branche misst KI-Werkzeuge weiter daran, wie viel Code sie ausspucken. Das ist ungefähr so sinnvoll, wie einen Bauunternehmer daran zu messen, wie viel Beton er vergießt.

Wir hatten die Form davon falsch im Kopf

Schau noch mal in die Tabelle. Das Verhältnis bleibt nicht stabil, es bricht ein.

Aufgaben: 5.825 Tokens Quelltext, 313.519 bei null angefangen, vierundfünfzig zu eins. Budgetplanung: 45.296 und 483.818, eher elf zu eins. Fast achtmal so viel Quelltext und nur das 1,5-fache an Anwendung.

Wir waren davon ausgegangen, dass eine größere App mehr spart. Sie spart weniger, und der Grund liegt auf der Hand, sobald man ihn sieht. Der größte Teil des Quelltexts der Budgetplanung ist gar keine Struktur, sondern Rechnerei, die uns niemand hätte erraten können:

loaded_cost_per_head:
  type: money
  currency: EUR
  calculate:
    expression: gross_salary * (1 + employer_cost_rate / 100)
      + other_cost_per_head

Mit 21 als Vorgabewert für employer_cost_rate, weil deutsche Arbeitgeberbeiträge ungefähr so viel auf das Brutto draufschlagen. Diese Zeile ist die eigentliche Arbeit. Kein Format der Welt hätte sie kürzer gemacht, und wir wären beunruhigt, wenn eines es täte.

Die ehrliche Fassung unserer Behauptung ist also enger als die, die wir vorher erzählt haben. Die Kosten für das Gerüst gehen gegen null. Die Kosten für die Fachlichkeit bleiben genau da, wo sie waren. Was sich ändert, ist das Verhältnis zwischen beidem.

Die Tokens sind die kleinere Hälfte

Schau noch mal auf die Euro-Spalte, denn das ist die unbeeindruckendste Zahl in diesem Text. Neun Euro fünfundvierzig bei der größten App. So viel sind vierhundertachtunddreißigtausend gesparte Tokens wert, wenn man nur das Schreiben zählt.

Wir hätten die Spalte weglassen können. Sie verkauft uns unter Wert. Nur sind ausgegebene Tokens der billige Teil, und wer von einer Messung die schmeichelhafte Hälfte zitiert, landet bei einer Zahl, die ihm jemand an einem Nachmittag widerlegt.

Teuer wird es bei einem Agenten, der eine Anwendung schreibt, überall dort, wo er gerade nicht schreibt. Dateien noch einmal lesen, um sich zu erinnern, was er getan hat. Den Build starten. Die Compiler-Ausgabe lesen. Den Typfehler finden. Drei Dateien erneut lesen, um ihn zu beheben. Den Build noch einmal starten. Diese Schleife läuft über die 483.818 Tokens, nicht über die 45.296, und sie läuft oft.

Bei Cord gibt es keine Codebasis, die im Kontext gehalten werden müsste, weil die Codebasis noch gar nicht existiert. Es gibt ein kurzes Dokument und einen Befehl, der mit einer Diagnose antwortet und mit dem genauen Pfad in der Datei, der sie ausgelöst hat. Als wir ChatGPT im letzten Monat die Kommandozeile gegeben haben, brauchte es vier Runden dieser Schleife, auf einem Abo, ohne Repository, durch das es sich hätte fressen müssen.

Darauf würden wir zeigen. Nicht darauf, dass das Modell weniger tippt. Sondern darauf, dass das Modell ausschließlich über die Fachlichkeit nachdenkt, weil alles, was in jeder Geschäftsanwendung gleich ist, aus seinem Weg geräumt und in einen Compiler verlegt wurde, der es jedes Mal auf dieselbe Art richtig macht.

Zweimal dieselbe App

Beide Spalten in dieser Tabelle beschreiben dieselbe App. Gleiche Absicht, gleiche Bildschirme, ungefähr dasselbe Verhalten. Anders ist alles darunter, und es ist bei jedem Lauf wieder anders.

Frag ein Modell zweimal nach einer Spesen-App und du bekommst zwei Anwendungen. Beide plausibel. Andere Dateistruktur, andere Namen, eine andere Meinung darüber, wo die Rechteprüfung hingehört, und in der einen ein Fehler, den die andere nicht hat. Vorgegeben war zwischen den beiden Läufen nichts davon anders. Das Modell hat einen anderen Weg durch dieselbe Anfrage genommen, und genau das heißt Sampling.

cordango build sampelt nicht. Dieselbe Definition, dieselbe Ausgabe, Byte für Byte, und es gibt eine Testsuite, die nichts anderes tut. Two_runs_produce_byte_identical_trees gibt dem Generator dieselben Dateien in anderer Reihenfolge und vergleicht die Fingerabdrücke beider Bäume. The_build_metadata_carries_no_clock_and_no_machine durchsucht den Bauvermerk nach Zeitstempel, aktuellem Jahr, Rechnernamen und Temp-Pfad und schlägt fehl, sobald eines davon auftaucht, denn ein Bauvermerk mit einer Uhr darin passt nie zweimal.

Das ist mehr wert, als es klingt. Ein Diff zwischen zwei Builds zeigt genau das, was du geändert hast, und sonst nichts. Was im März durch die Prüfung ging, ist das, was im September läuft. Jemand kann die App auf einem anderen Notebook neu erzeugen und bekommt deine App und nicht ihre Cousine.

Wir behaupten nicht, dass das eine App richtig macht. Eine falsche Definition kompiliert sehr zuverlässig zu einer falschen App. Die Behauptung ist enger. Die Schicht, die niemand liest, sollte nicht bei jedem Lauf ein neuer Entwurf sein, und wenn ein Modell den Code schreibt, ist sie genau das.

Wo das nichts bringt

Wenn du in einer großen bestehenden Codebasis arbeitest, nimm einen Coding-Agenten. Cord hat dir dort nichts anzubieten, und wir tun auch nicht so.

Wenn deine App eine Bildschirmform braucht, die das Format nicht ausdrücken kann, hält der Generator an und nennt dir den Code, statt dir still etwas Kleineres zu bauen, als du verlangt hast. Das ist das richtige Verhalten und trotzdem eine Wand. Unsere Liste der Targets sagt ehrlich, was nicht gebaut wird.

Und die ganze Werkzeugkette ist Pre-Alpha. Sie funktioniert von Anfang bis Ende, und stabil ist daran nichts.

Zähl selbst nach

Die Zahlen oben sind in etwa einer Minute nachvollziehbar. Installier die Kommandozeile, starte cordango new, beschreib etwas Kleines, das du wirklich brauchst, dann cordango build, und zähl, was herauskommt.

Interessant fänden wir eine App mit wirklich sperrigen Regeln, also die Sorte mit einer Ausnahme, die im Unternehmen nur drei Leute kennen. Unsere Beispiele sind alle vernünftige Apps. Vernünftige Apps sind nicht die, die sechs Wochen internes Projekt auffressen. Wenn du eine unvernünftige baust und der Compiler verweigert sie, schick uns den Diagnose-Code. Diese Liste ist es, an der wir entscheiden, was als Nächstes drankommt.

Sehen Sie Cordango im eigenen Unternehmen

Am schnellsten versteht man es, wenn man live zusieht, wie ein Unternehmen aufgesetzt und eine App ergänzt wird.

Demo buchen →

Ähnliche Beiträge

Wir haben ChatGPT eine Kommandozeile gegeben, und es hat eine echte Zeiterfassung gebaut
Technik · 28. August 2026

Wir haben ChatGPT eine Kommandozeile gegeben, und es hat eine echte Zeiterfassung gebaut

ChatGPT kann unsere Kommandozeile nicht selbst installieren. Gib ihm das Linux-Paket, dann schon. Es hat eine Zeiterfassung nach deutschem Arbeitszeitrecht geschrieben, mit dem Compiler gestritten, bis sie durchging, und sie auf die Plattform veröffentlicht, während wir zugesehen haben.

Lesen →
Technik · 25. August 2026

Was bei uns offen ist, und was nicht

Am 20. August haben Compiler und Kommandozeilen-Werkzeug unser privates Repository verlassen, unter Apache-2.0. Was du damit machen kannst, was nicht, und warum die Grenze dort verläuft, wo sie verläuft.

Lesen →