
Im Jahr 256 v. Chr. sah sich ein Gouverneur namens Li Bing einem Fluss gegenüber, der jeden Frühling über die Ufer trat und die Ernte vernichtete. Die offensichtliche Lösung war ein Damm. Den baute er nicht.
Er teilte den Min-Fluss mit einem Steindeich in Fischmaul-Form und ließ die Teilung die Arbeit erledigen — der größte Teil des Stroms zu den Feldern in trockenen Monaten, der Überschuss bei Überschwemmung zurück ins Flussbett abgeleitet, der Schlamm mitgespült. Keine Schleusen, keine Mannschaft. Der Fluss regulierte sich selbst und bewässert die Chengdu-Ebene bis heute — dreiundzwanzig Jahrhunderte später.
Ich dachte in diesem Monat viel an Li Bing. Mein schwierigster Test hatte die Krankheit des Flusses: Er trat bei jedem Durchlauf über die Ufer.
Der Fluss, den ich nicht simulieren konnte
OwlMeans ist eine KI-Entwicklungs-Pipeline: Du beschreibst ein Produkt als User Stories, und spezialisierte KI-Rollen bauen daraus eine vollständige App, die dir gehört. Um das end-to-end zu testen, kann man nicht mocken — man startet das Echte.
Der Test registriert einen Nutzer, gibt einen Prompt ein, wartet auf eine Spezifikation, bestätigt sie — und dann kommt der schwierige Teil: für dieses Projekt wird eine brandneue Kubernetes-Sandbox gestartet, ein Agent entwickelt die erste Story darin, und der Test wartet, bis die Story fertig ist. Zehn bis vierzig Minuten, jede Art von Asynchronität dazwischen — und jede Art von Instabilität. Übrig gebliebener Zustand, eine halb bereitgestellte Sandbox, ein hängender Agent, eine UI, die sich vor deinen Augen verändert. Die naive Version ist ein Achtzig-Minuten-Timeout und ein Gebet.
Die Hälfte, die ich nicht schrieb
Erster Teil des Tricks: Den Großteil davon habe ich nicht selbst gebaut.
Die Browser-Seite läuft auf unserem eigenen Harness, @owlmeans/test-ui — einer der gemeinsamen OwlMeans-Bibliotheken, auf denen jedes Projekt hier aufbaut. Er startet einen Browser, meldet sich über unsere Supervisor-Schlüssel statt über ein echtes Google-Login an und umhüllt die Playwright-Hydraulik so, dass mein Test wie Absicht klingt.
Die Sandbox brauchte mich auch nicht. Der ephemere Kubernetes-Slot — Namespace, Storage, Deployment, Netzwerkrichtlinie — wird von einer anderen gemeinsamen Bibliothek bereitgestellt und am Leben gehalten, @owlmeans/kephemeral: Sie beobachtet den Pod und heilt ihn, wenn er abstürzt. Sie wusste schon, wie man sich hält.
Nur ein Fluss blieb zu zähmen: Wie hängt man von einem Fluss ab, der legitim vierzig Minuten dauert, ohne ihn zu überwachen?
Das Fischmaul
Ein kurzes Timeout geht nicht — der Agent denkt wirklich vierzig Minuten lang nach, und das ist in Ordnung. Achtzig Minuten zu warten, um zu erfahren, dass er in Minute drei gestorben ist, geht auch nicht. Ein fester Timer ist ein Damm: Zu niedrig und er überläuft, zu hoch und er ist nutzlos.
Also hörte ich auf, die Zeit des Flusses zu messen, und begann, seinen Puls zu lesen. Der Agent verbraucht Tokens während er arbeitet — das ist kein Proxy für Fortschritt, das ist der Fortschritt. Also beobachtet der Test das Token-Guthaben. Alle zwanzig Sekunden: Sinkt es noch? Wenn ja, lebt der Agent — warte, wie lange es auch dauert. Wenn es zehn Minuten lang flach bleibt, hat der Agent gehangen, und der Test schlägt sofort fehl — anstatt noch eine Stunde gegen die Wand zu starren.
Das ist die ganze Idee: Das eigene Verhalten des Flusses sagt mir, ob er gesund ist, genau wie die Strömung Li Bings Deich sagt, wie viel er durchlassen soll. Dreißig Zeilen Code verwandelten meinen instabilsten Test in meinen zuverlässigsten.
Saubere Ausgangslage hinein, saubere Ausgangslage heraus
Noch ein Leck. Ein mittendrin abgebrochener Durchlauf hinterlässt eine komplette Sandbox — Deployment, Storage, Zertifikate, Routen, Namespace — und der nächste Durchlauf stolpert über die Trümmer und will nicht starten.
Die Lösung ist langweilig und vollständig: Vor jedem Durchlauf und danach vernichtet der Test jedes Projekt des einen wiederverwendeten Profils. Wie auch immer der letzte Durchlauf endete — sauberer Exit, Absturz, zugeklappter Laptop — der nächste startet von einem bekannten, leeren Zustand. Kein manuelles Aufräumen, niemals — ein sauberer Ausgangszustand pro Durchlauf ist das Beste, was man gegen instabile Tests tun kann, und hier ist es kostenlos.
Das Aquädukt

Ein letztes Problem blieb — das, das die meisten nie sauber lösen: Der Cluster läuft auf einem Server zu Hause — ohne öffentliche IP, hinter einem Anbieter, der keinen eingehenden Datenverkehr akzeptiert. Um ihn von überall zu testen und Cloudflare davor zu schalten, musste ich den Fluss aus dem Haus bringen.
Das ist ein kleines eigenständiges Projekt, flt-pf-tnl: eine günstige Cloud-VM mit einer reservierten statischen IP, die WireGuard und einen Nginx-Proxy betreibt. Der Weg ist einfach — Cloudflare → Relay → verschlüsselter Tunnel → Heimserver → Kubernetes-Sandbox. Zwei Befehle starten es — nur Terraform, Ansible und ein paar Shell-Skripte. Ein Watchdog überprüft alle sechzig Sekunden die Firewall und behebt Drift; die statische IP überlebt Teardowns, sodass die öffentliche Adresse sich nie ändert.
Einmal konfiguriert. Läuft seitdem. Ein Aquädukt: einmal gebaut, läuft durch Schwerkraft.
Du kannst es einfach haben
Tritt einen Schritt zurück. Nichts davon ist exotisch — eine selbstheilende Sandbox, eine Feedback-Schleife, die den eigenen Puls des Flusses liest, ein Tunnel, der einen privaten Cluster in die Welt trägt. Ein paar Tage der richtigen Struktur um einen Fluss herum, der meine Nachmittage gefressen hat. Diese Struktur ist das Produkt — dasselbe Versprechen, das OwlMeans jeder App gibt, die es ausliefert: ein typisiertes Monorepo und die Infrastruktur drumherum, dauerhaft in deinem Besitz.
Also hier das ehrliche Angebot.
Wenn du etwas Echtes baust, wirst du auf diese Wand stoßen — langsame Flüsse, externe Abhängigkeiten, eine Sandbox, die man hoch- und wieder herunterfahren muss, Tests, die montags bestehen und dienstags fehlschlagen. Du kannst tun, was ich getan habe: Wochen damit verbringen zu lernen, dass ein längeres Timeout einen instabilen Fluss nie heilt, dass man stattdessen seinen Puls liest, dass man für den Zugriff auf den eigenen Cluster ein Aquädukt braucht. Für mich lohnte es sich; das ist meine Arbeit.
Das ist nicht deine Arbeit.
Das ist Teil von OwlMeans Services: Wir nehmen genau diesen Harness, diese Sandbox und diesen Tunnel, passen sie an deinen Stack an und deployen sie in Tagen. Alles gehört dir — Code, Infrastruktur, kein Vendor Lock-in, wartbar mit jedem Coding-Agent.
Ein Fluss, der sich selbst reguliert — so wie ein Fluss das seit dreiundzwanzig Jahrhunderten tut. Überspringe den Monat, den ich verbracht habe — du kannst es einfach haben.
OwlMeans baut Full-Stack-TypeScript-SaaS aus deinen User Stories — typisiert, SSO-ready und dir gehörend, um es mit jedem Agenten weiterzuentwickeln. Sieh, was es kann →