Dwa silniki na jedno zlecenie: gdzie ginie robota, gdy druga kolumna nie bierze zadania
Jeden czat wysyła zlecenie do dwóch agentów naraz przez GitHub. Dziś wynik poszedł, ale trafił do złej karty, bo terminal drugiego agenta nie był pusty.
Piszę zdanie do jednego czatu - Grok, mój orchestrator - a on rozsyła zlecenia do dwóch agentów kodujących naraz: Claude i Codex. Dziś sprawdzałem, czy to się da zrobić bez pilnowania każdego kroku. Częściowo tak. Częściowo zlecenie wróciło do złej szuflady i musiałem to złapać ręcznie.
Szyna to zgłoszenia na GitHubie
Orchestrator nie gada z agentami bezpośrednio. Zakłada zgłoszenie w prywatnym repozytorium
handoffs, przypina etykietę „do Claude” albo „do Codex”, i tyle. Program w tle (daemon)
czyta nowe zgłoszenia i wsadza treść do terminala właściwego agenta w Herdrze - narzędziu,
w którym oba silniki siedzą obok siebie w dwóch stałych kolumnach: Codex po lewej, Claude po
prawej. Agent siedzi w swojej stałej kolumnie i robi robotę bez pilnowania - cały przebieg
widać 1:1 w Claude Desktop albo Codex Desktop - a na końcu dopisuje wynik jako komentarz do
tego samego zgłoszenia.
Rano program brał po jednym zgłoszeniu na raz. Zadanie dla Codexa jechało, zadanie dla Claude czekało w kolejce, mimo że kolumny są dwie i obie wolne. Poprawiłem to w południe: teraz oba silniki dostają robotę równolegle, jedno zlecenie na silnik naraz, nie jedno zlecenie na cały system.
Test na sam koniec łańcucha: zleciłem Claude policzyć pięć plus trzy i przekazać wynik Codexowi. Claude policzył. Codex odpisał słowem „osiem”, nie cyfrą - dowód, że przekazanie między kolumnami naprawdę działa, a nie tylko wygląda na działające w logu.
Gdzie ginie robota
Dwa realne zlecenia tego dnia pokazały dwa różne sposoby, w jakie taki system się psuje.
Codex miał sprawdzić dane klienta w Pirsch Analytics. Trafił na ścianę: klucz API widział tylko panel jednej marki - dwie garści odwiedzin, kilkadziesiąt osób - bez dostępu na poziomie całego konta. Zablokował się i zgłosił to wprost, zamiast zgadywać dane.
Claude miał potwierdzić, że inna domena jest podpięta do tego samego narzędzia analityki. Była - i panel, i skrypt śledzący stał na produkcji. Ale wynik nie trafił do prawej kolumny w Herdrze, tylko do osobnej karty poza widokiem. Powód: w terminalu Claude zostało z poprzedniego zadania jedno zdanie - polecenie zapisania komentarza do innego zgłoszenia. Program odbierający wyniki uznał to za niedokończony szkic, nie pusty terminal gotowy na nowe zlecenie, i otworzył zapasową kartę zamiast wpisać robotę tam, gdzie powinna być.
Poprawka jest prostsza niż diagnoza: po każdym wysłanym komentarzu Claude czyści swój terminal do zera, tak jak Codex już wraca do pustego miejsca po swoim zadaniu. Pusty terminal to jedyny sygnał, po którym program rozpoznaje, że kolumna jest wolna.
Efekt uboczny tej poprawki: prawa kolumna czasem wygląda na pustą, choć Claude właśnie skończył robotę. To samo czyszczenie, które naprawiło przekazywanie zadań, zaraz po wyniku zamiata za sobą ekran - żeby było widać, że kolumna znowu wolna. Cały przebieg mam i tak w Claude Desktop, linia w linię z tym, co leciało w terminalu, więc nic nie ginie. Ale krótkie zadanie plus to czyszczenie łatwo przegapić na pierwszy rzut oka.
Jedno zlecenie od początku do końca
Wieczorem puściłem przez ten układ coś, co widać gołym okiem: ikonę do tej notatki. Jedno zdanie do Groka, dwa silniki w kolejce.
Grok założył zgłoszenie dla Codexa. Program w tle wsadził je do lewej kolumny razem z kontraktem odpowiedzi: stan w jednym zdaniu, dowód z żywego adresu, otwarte pętle, a gdy się nie da - słowo BLOKER na początku.
Codex pracował 4 minuty i 23 sekundy. Zapisał wynik do pliku i pingnął Groka - pierwszy ping padł na DNS, drugi przeszedł. Grok przekazał robotę Claude, a ten wstawił kozę do notatki i sprawdził ją na żywym adresie, nie w kodzie.
Moja robota w tym łańcuchu: jedno zdanie na start i jedna poprawka na końcu.