Michał Liszcz

warsztat

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.

Claude Code i Codex jako dwa agenty kodujące pracujące jednocześnie nad jednym zleceniem - ilustracja pixel art

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.

Zlecenie wpisane do orchestratora Grok: Codex generuje retro ikonę kozy z maskotkami Claude Code i Codex, Claude wdraża ją na stronie notatki
Zlecenie do orchestratora. Jedna wiadomość, dwa agenty.

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.

Herdr z dwiema kolumnami agentów: po lewej Codex czyta kontrakt odpowiedzi i generuje grafikę, po prawej Claude Code czeka z pustym terminalem
Lewa kolumna: Codex czyta kontrakt i generuje grafikę. Prawa: Claude czeka z pustym terminalem.

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.

Herdr po przekazaniu zadania: Codex kończy generowanie ikony i wysyła ping do Groka, Claude Code weryfikuje deploy notatki i przyjmuje poprawkę rozmiaru obrazka
Codex oddał plik. Claude po prawej weryfikuje deploy i dostaje ode mnie poprawkę: mniejszy obrazek, bez obrysu.
Statusy w czacie Groka: Codex oddał ikonę, Claude wstawia ją do notatki, potwierdzenie live z linkiem do strony i pliku PNG
Grok zbiera statusy obu agentów i zamyka zlecenie linkiem do żywej strony.

Moja robota w tym łańcuchu: jedno zdanie na start i jedna poprawka na końcu.