
W 256 roku p.n.e. gubernator imieniem Li Bing stanął przed rzeką, która każdej wiosny wylewała i niszczyła plony. Oczywistym rozwiązaniem była tama. Nie zbudował jej.
Podzielił rzekę Min kamiennym wałem w kształcie rybiej pyszczki i pozwolił, żeby podział sam wykonał pracę — większość przepływu na pola w suchych miesiącach, nadmiar odprowadzany z powrotem w czasie powodzi, muł wynoszony razem z nim. Żadnych bram, żadnej obsługi. Rzeka regulowała się sama i nawadnia równinę Chengdu po dziś dzień, dwadzieścia trzy wieki później.
Przez cały ten miesiąc myślałem o Li Bingu. Mój najtrudniejszy test miał chorobę rzeki: zalewał przy każdym uruchomieniu.
Przepływ, którego nie dało się podrobić
OwlMeans to pipeline AI do tworzenia oprogramowania: opisujesz produkt jako historyjki użytkownika, a wyspecjalizowane role AI budują z tego pełnowymiarową aplikację, która należy do Ciebie. Żeby przetestować to end-to-end, nie można korzystać z mocków — uruchamia się prawdziwy system.
Test rejestruje użytkownika, wpisuje prompt, czeka na spec, potwierdza go, a potem zaczyna się najtrudniejsza część: dla tego projektu wystawiany jest nowy sandbox Kubernetes, agent implementuje w nim pierwszą historyjkę i test czeka, aż historia zostanie ukończona. Od dziesięciu do czterdziestu minut, wszelkie możliwe operacje asynchroniczne pomiędzy — i wszelkie możliwe powody do niestabilności. Resztkowy stan, half-provisioned sandbox, zawieszony agent, interfejs zmieniający się na twoich oczach. Naiwna wersja to osiemdziesięciominutowy timeout i modlitwa.
Połowa, której nie napisałem
Pierwsza część sztuczki: większości tego nie budowałem sam.
Strona przeglądarki działa na naszym własnym harnesie, @owlmeans/test-ui — jednej ze wspólnych bibliotek OwlMeans, na których zbudowany jest każdy projekt. Uruchamia przeglądarkę, loguje się przez nasze klucze supervisora zamiast prawdziwego logowania Google i owija instalację Playwright tak, że mój test wygląda jak opis intencji.
Sandbox też nie potrzebował mojej pracy. Efemeryczny slot Kubernetes — namespace, storage, deployment, polityka sieciowa — jest provisionowany i utrzymywany przy życiu przez inną wspólną bibliotekę, @owlmeans/kephemeral: obserwuje pod i naprawia go, jeśli się wysypie. Już wiedziała, jak się utrzymać.
Zostało mi tylko jedno: jak zależeć od przepływu, który naprawdę trwa czterdzieści minut, bez pilnowania go?
Rybia pyszczka
Nie możesz ustawić krótkiego timeoutu — agent naprawdę może myśleć przez czterdzieści minut i to jest w porządku. Nie możesz też czekać osiemdziesiąt minut, żeby dowiedzieć się, że umarł w trzeciej minucie. Stały timer to tama: za niski — zalewa, za wysoki — bezużyteczny.
Więc przestałem mierzyć czas przepływu i zacząłem czytać jego puls. Agent zużywa tokeny podczas pracy — to nie jest wskaźnik postępu, to jest postęp. Test obserwuje więc saldo tokenów. Co dwadzieścia sekund: wciąż spada? Jeśli tak, agent żyje — czekaj, ile trzeba. Jeśli zatrzyma się na dziesięć minut, agent failuje i test pada natychmiast — zamiast wpatrywać się w ścianę przez kolejną godzinę.
Na tym polega cały pomysł: własne zachowanie przepływu mówi mi, czy jest zdrowy, tak jak prąd mówi levée Li Binga, ile ma przepuścić. Trzydzieści linii kodu zamieniło mój najbardziej niestabilny test w najbardziej niezawodny.
Czysta plansza na wejście, czysta plansza na wyjście
Jeszcze jeden wyciek. Test przerwany w locie zostawia za sobą cały sandbox — deployment, storage, certyfikaty, trasy, namespace — a kolejne uruchomienie potyka się o ten gruz i nie chce ruszyć.
Rozwiązanie jest nudne i totalne: przed każdym uruchomieniem i po nim test niszczy każdy projekt na jednym, ponownie używanym profilu. Niezależnie od tego, jak poprzedni run się skończył — czyste wyjście, crash, zamknięty laptop — następny zaczyna od pewnego, pustego stanu. Zero ręcznego sprzątania, nigdy — czysta plansza na każde uruchomienie to najlepsza rzecz, jaką możesz zrobić przeciwko niestabilnym testom, i tutaj jest darmowa.
Akwedukt

Jeden problem pozostał — ten, który większość ludzi nigdy nie rozwiązuje porządnie: klaster działa na serwerze w domu — bez publicznego IP, za operatorem, który nie akceptuje ruchu przychodzącego. Żeby testować go z dowolnego miejsca i postawić Cloudflare z przodu, musiałem wynieść przepływ z domu.
To osobny mały projekt, flt-pf-tnl: tani cloudowy VM z jednym zarezerwowanym statycznym IP, uruchamiający WireGuard i proxy Nginx. Ścieżka jest prosta — Cloudflare → relay → zaszyfrowany tunel → serwer domowy → sandbox Kubernetes. Dwie komendy go uruchamiają — Terraform, Ansible i kilka skryptów powłoki. Watchdog co sześćdziesiąt sekund sprawdza firewall i naprawia dryft; statyczne IP przeżywa teardowny, więc publiczny adres nigdy się nie zmienia.
Skonfigurowano raz. Działa. Akwedukt: zbudowany raz, działający na grawitacji.
Możesz to po prostu mieć
Cofnij się. Żadna z tych rzeczy nie jest egzotyczna — samoleczący sandbox, pętla zwrotna czytająca własny puls przepływu, tunel przenoszący prywatny klaster do świata. Kilka dni właściwej struktury wokół przepływu, który zjadał moje popołudnia. Ta struktura to produkt — ta sama obietnica, którą OwlMeans składa każdej aplikacji, którą wysyła: typowany monorepo i infrastruktura wokół niego, Twoja na własność.
Więc oto uczciwy pitch.
Jeśli budujesz coś prawdziwego, trafisz na tę ścianę — wolne przepływy, zewnętrzne zależności, sandbox do wystawienia i zniszczenia, testy, które przechodzą w poniedziałek i sypią się we wtorek. Możesz robić to, co ja: spalić tygodnie, ucząc się, że dłuższy timeout nigdy nie naprawia niestabilnego przepływu, że czytasz jego puls zamiast mierzyć czas, że dotarcie do własnego klastra wymaga akweduktu. Dla mnie było warto; to moja praca.
Nie jest to Twoja praca.
To jest część OwlMeans Services: bierzemy ten dokładny harnes, sandbox i tunel, dostosowujemy je do Twojego stacku i deployujemy w dni. Wszystko należy do Ciebie — kod, infrastruktura, żadnego vendor lock-in, możliwe do utrzymania przez dowolny agent do kodowania.
Przepływ, który uruchamia się sam, tak jak rzeka uruchamia się od dwudziestu trzech wieków. Pomiń miesiąc, który spędziłem — możesz to po prostu mieć.
OwlMeans buduje pełnostackowe aplikacje TypeScript SaaS na podstawie Twoich historyjek użytkownika — typowane, gotowe na SSO i Twoje do dalszego rozwijania z dowolnym agentem. Zobacz, co potrafi →