Agent im Loop (Teil 5): Wenn der Loop lügt
Explodierende Würfel und Vorteil/Nachteil zeigen, wie grüne Tests täuschen können: Overfitting, geschwächte Tests, unvollständige Semantik und Hänger. Property-Based Testing macht die Schleife robuster.
ls -lt posts/
Über Systeme, Tooling und das gelegentliche Yak-Shaving.
Explodierende Würfel und Vorteil/Nachteil zeigen, wie grüne Tests täuschen können: Overfitting, geschwächte Tests, unvollständige Semantik und Hänger. Property-Based Testing macht die Schleife robuster.
Die ersten portierten Zeilen: der Zufallsgenerator, der in Python exakt dieselben Zahlen liefern muss wie in C++. Teil 4 zeigt, warum die Testvektoren aus der Referenz kommen, was Seeds 0, 1 und INT_MAX gemeinsam haben und was Python-Zufall an Laufzeit kostet.
Recursive Descent ist die zugänglichste Art, einen Parser zu bauen: eine Funktion pro Grammatikregel, Präzedenz fällt aus der Verschachtelung. Gezeigt an einem kleinen Taschenrechner.
Der naive String-Zerteiler stößt bei 4d6kh3 an seine Grenzen. Wir trennen Tokenizer, Parser und Evaluator – unter Testschutz, der Regressionen sichtbar macht, aber nicht jede ungetestete Änderung erkennen kann.
Wasser, so weit das Auge reicht – und kein Tropfen trinkbar. Warum Meerwasser tödlich ist, wie eine Solardestille funktioniert und warum Regen Dein bester Freund auf See ist.
Bevor die erste Zeile portiert wird, braucht der Port einen Richter: ein Harness, das die C++-Referenz auf festen Szenarien spielt und Verhalten statt Formatierung vergleicht. Teil 3 zeigt, wie es entsteht und warum es sich erst gegen die Referenz selbst beweisen muss.
Modifikatoren und mehrere Würfelgruppen. Die eigentliche Arbeit ist nicht der Code – den schreibt der Agent –, sondern die Edge Cases zu enumerieren und als parametrisierte Tests festzuhalten.
Bevor eine Zeile portiert wird, braucht es eine Karte: Welche der 71 C++-Dateien tun was, wovon hängen sie ab, und was davon wird portiert, ersetzt oder weggelassen? Teil 2 zeigt, wie der Agent diese Karte baut – und wo er beim ersten Versuch nach Dateinamen ging statt nach Inhalt.
Zufall, Zeit und I/O machen Tests schnell unzuverlässig. Wie Du externe Einflüsse per Dependency Injection, monkeypatch und tmp_path kontrollierst und Deine Logik deterministisch prüfst.
Aus dem Akzeptanzkriterium wird ein Prompt: Wir verallgemeinern auf NdM, schreiben mit einer kontrollierten Zufallsquelle den ersten exakten Test und lassen den Agenten die Schleife selbst drehen.