Also, ein ganz normaler Tag: Kein Vorfall wie die 169 Dateien, keine Studie, kein fremder Artikel. Nur ein Tag in der Werkstatt, so wie er wirklich war, mit dem, was wir vorhatten, dem, was schiefging, und dem, was am Abend herauskam. Ich erzähle ihn, weil er besser zeigt, was NeoCoder ist, als jede Beschreibung: nicht die Features, sondern die Disziplin, mit der man seine eigenen Fehler findet, benennt und in Gesetze verwandelt.
Der Plan: ein Empfänger ohne Produzent
Der Tag fing mit einem Messlauf an, der ehrlich war. Sieben Metriken, und nicht alle grün. Die Erfassung steht: Alles, was Agenten und Menschen im Projekt tun, wird als Ereignis mitgeschrieben, Zustand, Aktion, Ergebnis, Folgezustand. Aber die Schicht darüber, die erkennen soll, wann ein Mensch die Maschine korrigiert, ablehnt, nachbessert, die existierte als Empfänger ohne Produzent. Die Auswertung war da. Nur erzeugte niemand das Signal, das sie auswerten sollte. Tests grün, Dashboard grün, und trotzdem leer.
Der Leitsatz im Testplan dazu, den ich inzwischen über jeden Messlauf schreibe: Verfehlte Metriken sind kein Scheitern. Sie sind der Zweck. Jede bekommt ein Ticket.
Der Test: ein kurzer Satz
Also ein Test, bewusst klein und bewusst echt: Unit-Tests für eine Hilfsklasse. Formuliert, wie normale Menschen schreiben, ein kurzer Satz, kein aufgerüsteter Spezial-Prompt mit zwanzig Zeilen Kontext. Das ist bei uns ein Gesetz, und es hat einen Namen, das Gebrauchsprompt-Gesetz: Wenn das System am kurzen Satz stolpert, ist das ein Befund der Plattform, nie ein Problem des Prompts. Der Kunde wird auch keinen Spezial-Prompt schreiben.
Der Satz stammt übrigens daher, dass ich einen zu grossen Test-Prompt zurückgewiesen habe, mit der Begründung, sonst sei das für mich kein richtiger Test. Aus einem Satz im Chat wurde ein Gesetz. So entstehen die meisten.
Die Korrektur: Tests, die sich selber abschreiben
Der Agent hat geliefert, und der Vorschlag hatte einen echten Denkfehler. Keinen Tippfehler, einen Denkfehler: Tests, die ihre Erwartungswerte aus genau dem Code ablesen, den sie testen sollen. Ein Zirkelschluss. Solche Tests sind immer grün, weil sie fragen „ist das Ergebnis das Ergebnis", und sie beweisen nichts. Das ist der Fehler, den ein Agent macht, der liefern will, und den ein Mensch mit Erfahrung in zwei Sekunden sieht.
Ich habe abgelehnt. Mit Grund, in einem Satz, ohne Geheimcode, ohne Formular. Und jetzt kam der eigentliche Test des Tages: Die Plattform muss das selber als Korrektur erkennen. Nicht ich markiere es als Korrektur. Sie muss aus dem, was passiert ist, ableiten, dass hier ein Mensch die Maschine korrigiert hat.
Die Jagd: neun Fehler an einem Tag
Auf dem Weg zu diesem Beweis haben wir an einem Tag neun echte Fehler gefunden. Nicht im Test, im lebenden System, jeder mit echten Daten belegt, jeder gefixt, jeder mit einem benannten Test für immer festgenagelt. Neun klingt nach einem schlechten Tag. Es ist das Gegenteil. Neun Fehler, die wir finden, sind neun Fehler, die der erste Kunde nie sieht.
Die Fehlerklassen
Das ist der Teil, den ich aufbewahre, weil er in jedem Projekt wiederkommt, nicht nur bei uns.
Empfänger ohne Produzent. Die Auswertung existiert, aber niemand erzeugt das Signal. „Tests grün" beweist nichts, wenn die Quelle fehlt. Seither nehmen wir jedes Feature, das einen Hebel hat, auf beiden Seiten ab: Wer erzeugt, und wer empfängt.
Zwei Wahrheiten. Eine Vorschau verspricht etwas anderes, als die Ausführung dann tut. Eine Liste zeigt, was ein Filter längst verworfen hat. Heilung: eine einzige serverseitige Logik für Anzeige und Entscheidung. Nie zwei.
Stille. Ein Prozess, der bei Fehlern wortlos aufgibt. Eine Quelle, die still aus der Rotation fällt. Ein Werkzeug, das Misserfolg als leeren Erfolg meldet. Bei uns heisst das Stille-Verbot: Jede Komponente meldet „ich lebe und tue X", oder sie gilt als kaputt.
Erfundene Testdaten. Ein Agent hat gelieferte Echtdaten nicht gefunden und sich ähnliche gebastelt. Die Tests wurden grün, und hätten den eigentlichen Befund, ein zu kurzes Zeitfenster, für immer versteckt. Seither Gesetz: Fehlt die echte Fixture, ist das Ergebnis eine Fehlermeldung. Niemals ein Ersatzbau.
Zwei Uhren. Zwei Ereignisquellen mit eigenen Laufnummern. Sortiert man nach Nummer statt nach Zeit, passiert die Wirkung vor der Ursache. Chronologie ist eine Entscheidung, und man muss sie überall gleich treffen.
Die Rückwirkungs-Illusion. Erfasste Rohdaten sind heilig. Ein Fix in der Erfassung repariert die Vergangenheit nicht. Wer alte Ereignisse nachträglich schlauer deutet, muss das konservativ tun: Im Zweifel kein Signal.
Die Momente dazwischen
Was in keinem Ticket steht, aber den Tag ausmacht. Die Entscheidung, auf einen Fix zu warten, statt den Workaround zu nehmen, mit dem Satz: dann haben wir den auch gleich getestet, sauber. Die Frage, wie lange ein Hand-Edit nach der Agentenarbeit kommen darf und noch als Korrektur zählt, und die Erkenntnis, dass das keine technische Entscheidung ist, sondern eine Produktentscheidung. Wir haben gesagt: ein Arbeitstag. Und das Verhältnis, das mich am Abend am meisten beschäftigt hat: Ein getippter Satz eines Menschen, und daraus vier Trainingssignale.
Das Finale: ein Satz, vier Signale
Am Abend hat die Plattform aus dem, was über den Tag passiert ist, selber abgeleitet, was passiert ist. Aus dem getippten „Stopp, dieser Ansatz ist falsch", aus einem grünen Testlauf danach und aus zwei Commits von Hand: abgelehnt, nachgebessert, akzeptiert, von Menschenhand verändert. Vier Signale. Kein Formular, kein Label-Tool, kein Handgriff. Niemand hat etwas markiert. Die Korrektur ist einfach passiert, so wie Arbeit passiert, und das System hat sie als das erkannt, was sie ist.
Wofür das alles: die temporale Trainingspipeline
Damit klar ist, warum ein Tag voller Fehlersuche so wichtig ist: Die vier Signale vom Abend sind nicht fürs Dashboard. Sie sind Futter. Ich habe bei „Software ist ein Film" und beim Daumenkino beschrieben, dass wir ein kleines Modell darauf trainieren wollen, wie sich ein Projekt über die Zeit bewegt, aus der Kette von Zustand, Aktion, Ergebnis und Folgezustand, mit echten Zeitabständen. Diese Kette ist genau das, was die Erfassung mitschreibt. Und die Feedback-Schicht, die am Morgen noch ein Empfänger ohne Produzent war, ist das Stück, das aus der Kette eine Trajektorie mit Wahrheit macht: Hier hat der Agent etwas vorgeschlagen, hier hat ein Mensch Nein gesagt, hier wurde nachgebessert, hier wurde akzeptiert, so viel Zeit lag dazwischen.
Darum sind die Fehlerklassen von oben keine Nebensache. Zwei Uhren ruinieren eine Trajektorie, weil die Wirkung vor der Ursache steht. Erfundene Testdaten vergiften sie, weil ein grüner Test ohne echte Daten eine falsche Wahrheit einträgt. Die Rückwirkungs-Illusion ist der Grund, warum alte Ereignisse nie nachträglich umgedeutet werden: Wer das Training mit nachträglich geglätteter Vergangenheit füttert, trainiert mit den Prüfungsfragen. Jedes dieser Gesetze schützt am Ende dasselbe, die Trainingsdaten, die bei der Arbeit abfallen.
Der Stand nach drei Wochen: über zwanzig vollständige Arbeitstrajektorien aus echten Sessions, ein eingefrorener, kuratierter Satz von gut 14'000 Trainingspaaren, jedes mit Herkunft auf beiden Seiten, Sessions, die jetzt rotieren, damit keine 23 Tage am Stück wird, und ein Anteil nicht zuordenbarer Ereignisse unter sieben Prozent. Das ist noch kein Modell. Das ist das, was vor dem Modell kommen muss und was die meisten überspringen: Daten, denen man trauen kann, mit der Zeit als Teil der Daten. Erst wenn das steht, darf das Daumenkino gegen die Strömungskarte antreten, und beide gegen die Baseline.
Die Zahlen, die niemand sieht
Ein paar davon, gerundet, alle aus unseren eigenen Messungen, weil bei uns jede Arbeit ihren Kostenbericht trägt. Ein ganz normaler Auftrag, „ergänze Unit-Tests": zwanzig Prompts, rund hunderttausend Tokens. Gemessen, nicht geschätzt. Ein einzelner Agenten-Arbeitskontext: über zwei Millionen Tokens Eingabe, davon fast alles aus dem Cache. Das ist die Realität agentischer Arbeit, die niemand sieht, und der Grund, warum ich beim MCP-Artikel über Kontext geschrieben habe.
In drei Wochen rund 125'000 semantische Ereignisse aus echter Entwicklungsarbeit erfasst, kein einziges von Hand erzeugt. Eine einzige ungeschnittene Session: 23 Tage, über tausend Ereignisse, der Grund, warum wir jetzt Sessions rotieren. In einer Nacht über 31'000 Duplikate deterministisch entfernt, danach ein eingefrorener Stand mit gut 14'000 geprüften Trainingspaaren, jedes mit Herkunft auf beiden Seiten. Ein Heap-Dump von knapp zwei Gigabyte, der ein Memory-Leak verraten hat, gefunden, weil wir Dumps lesen statt Dienste neu zu starten. Dreimal den Prozess hart abgeschossen, dreimal Neustart und erster Upload nach rund einer Minute, null Handgriffe. Ein Backup-Ernstfall geprobt: alle Datenbank-Collections zurück, jede Prüfsumme identisch.
Und der Rahmen drumherum: rund 2'300 Klassen Plattformcode, dazu über 500 Testklassen, fast 1'500 Testmethoden, rund 3'400 Tests, die vor jedem Commit grün sein müssen. Über 500 Commits auf dem führenden Branch, davon mehr als 140 allein seit Anfang Oktober, jeder einzelne auf explizites Go, keiner von einem Agenten eigenmächtig. Inzwischen über vierzig Werkzeuge, über die Agenten mit der Plattform sprechen, und ein Katalog von rund 55 Ereignistypen, bei dem Unbekanntes in Quarantäne landet, nie im Papierkorb. Rund 85 nummerierte Befunde in drei Wochen, jeder am lebenden System, jeder mit benanntem Test.
Was bleibt
Nichts davon ist ein Feature. Man kann es nicht auf eine Folie schreiben, und auf einem Dashboard sieht ein Tag mit neun Fehlern schlecht aus. Aber genau das ist, was ich verkaufe, wenn ich NeoCoder verkaufe: nicht, dass die Agenten keine Fehler machen. Dass wir sie finden, bevor es der Kunde tut, dass jeder Fehler ein Gesetz wird, und dass die Korrektur eines Menschen nicht verloren geht, sondern das nächste Modell besser macht. Diese Disziplin ist das Produkt.
Ein Messlauf mit roten Zahlen, ein Test mit einem kurzen Satz, ein Agent mit einem Zirkelschluss, neun Fehler, sechs Fehlerklassen, und am Abend ein getippter Satz, aus dem die Plattform selber vier Trainingssignale gemacht hat. Das war der Tag. Nicht spektakulär. Aber ehrlich, und ehrlich ist das Einzige, was sich über Jahre trägt.
Geschrieben von mir. Die Gedanken, die Werte, die Learnings, die Fehler: alles meins. Grammatik und Rechtschreibung korrigiert ein eigenes Twin-Modell, das auf meinen Texten trainiert ist. Manchmal wird daraus ein Mix. Ich lese natürlich alles nochmal, aber niemand ist unfehlbar. Was drin bleibt, ist dann auch von mir.