piątek, 25 września 2026

Protokół Komunikacji - koperta wiadomości

Komunikacja

Orkiestrator komunikuje się z agentami za pomocą określonych struktur json

Każda wiadomość to jeden obiekt JSON o stałym zestawie 11 pól. Koperta jest wspólna dla wszystkich typów; zmienia się tylko zawartość `payload`. Zawartość jest standardowa dla wszystkich kroków i całej komunikacji, różnica jest w paylodz-ie


Ogólna struktura wiadomości

Wartości są przykładowe

{

  "msg_id": "numer wiadomości",

  "corr_id": "numer wiadomości powiązanej",

  "type": "request | dispatch | response | event",

  "from": "nadawca wiadomości",

  "to": "odbiorca wiadomości",

  "action": "akcje do wykonania",

  "status": "blocked | in_progress | done | failed | needs_user",

  "requires_user_ack": true,

  "user_message": "Tekst zmiany, szczegóły komunikatu.",

  "payload": { },

  "timestamp": "<data i godzina>"

}


Opis pól:

  • msg_id - identyfikator wiadomości składa się z przedrostka określającego skąd pochodzi np orc - orkiestrator, potem jest liczba 001 itd..
    •  `orc-NNN` — wiadomości orkiestratora (`orc-014`, `orc-022`),
    •  `e2-k1-007` — etap 2, krok refaktoru 1, numer kolejny
    •  `e1s1-i2-done` / `e1s2-i2-done` — etap1.step1 / step2, iteracja 2, `step.done`.

  • corr_id - identyfiaktor korelacji, czyli na którą wiadomość odpowiada,
  • type - typ wiadomości (stosowane request i event):
    • request - etap/krok -> orkiestrator - etap czegoś potrzebuje
    • dispatch - orkiestrator -> krok - polecenie z orkiestratora
    • response - etap/krok -> orkiestrator - odpowiedz na dispatch
    • event - etap/krok -> orkiestrator - polecenie np stage.start, step.stop
  • from - nadawca
  • to - odbiorca
  • action  - etap/krok -> orkiestrator:
    • test.update - istniejący test wymaga aktualizacji
    • test.add - trzeba dodać nowy test
    • test.remove - usunąć test
    • test.mock.enable - włącz obsługę mockow,
    • test.mock.add - trzeba dodać mock/stub
    • user.input - potrzebna infromacja od użytkownika,
    • user.approval - plan gotowy,
    • stage.done - etap zakończony, orkiestrator sprawdza bramę
    • step.done - krok zakończony
    • stage.aborted - użytkownik przerwał
    • error.critical - sytuacja blokująca

Akcje test. są wysyłane do etapu 1 bo tylko etap 1. Etap 1 krok 1 przygotowanie testu krok 2 implementacja testu.
  • status - stan nadawcy w chwili wysłania
    • blocekd - nadawca stoi i czeka na obsłużenie requestu
    • in_progress - praca trwa
    • done - zkończenie z powodzeniem
    • failed - wykonanie nie powiodło się
    • neeed_user - do zakończenie potrzebna ingerencja użytkownika
  • requires_user_ack - czy pokazać użytkownikowi
    • true - 
    • false
  • user_message - tekst dla użytkownika - nie może być pusty gdy user_ack = true,
  • payload - treść merytoryczna, wartość zależy od action
  • timestamp - znacznik czasu dla wiadomości
Podsumowanie

Wygląd koperty wiadomości jest dla wersji 0.2.2, w kolejnych wersjach mogą zajść drobne zmiany
Ten tryb sprawdza się w testach, jako całość zostanie. To jest ewolucja tego co jest w wersji 0.1.0.

Budowa tego protokołu komunikacji polegała na podawaniu LLM-owi ogólnego przebiegu komunikacji, zachowania i informacji jakie będę potrzebne na poszczególnych etapach procesu. Model na podstawie moich instrukcji stworzył powyższy model komunikacji, który został przetestowany już kilkukrotnie na wersji 0.1.0.

Do repozytorium dodany jest plik z dokładnym opisem pól oraz miejsc gdzie były wzmianki na temat sposobu komunikacji.

Ten post zapoczątkuje serie opisującą szczegóły rozwiązania, przy okazji będzie to też dokumentacja dla mnie. Przez ostatni czas narobiło się sporo zmian, czas sobie przypomnieć szczegóły, bo zaczynają mi umykać.

wtorek, 22 września 2026

Harness Warsztaty

W tym roku na BB4IT wróciły warsztaty jednym z tematów był harness enginering. Uznałem, że warto się tam pojawić żeby poszerzyć wiedzę na ten temat. W końcu od maja próbuje coś takiego stworzyć a idzie jak po grudzie.

Krótki opis tego co było na warsztatach

Na wstępie zaliczyłem wpadkę, hm, zapomniałem laptopa ( człowiek idzie na warsztaty i zapomina laptopa- szczyt, szczytów) za to miałem zeszyt, którego kilka stron zostało zapełnionych, dzięki temu powstanie ten wpis i mój kolejny projekt dotyczący harnessa zostanie zapgrejdowany.

Czego nie mam u mnie a co powinno być?

AI jako maszyna do robienia softwaru, czemu nie, taki był jeden z motywów przewodnich tego warsztatu. Coś co stanie się deterministycznym narzędziem umożliwiającym:
  • zbudowanie
  • testowanie
  • kontrolowanie

Problemem LLM-ów jest niedeterministczność, brak powtarzalności, taki hareness może to zmienić poprzez włączenie w proces punktów które nie są ejajowe, są wywołaniem deterministycznych skryptów które umożliwią kontrole wyprodukowanej treści. 

No to było by na tyle.

Co wyniosłem dla siebie (nie był to czyiś laptop, były całkiem nie złe porównując do mojego)? Zrozumiałem, że zbłądziłem, sam warsztat wyznacza cel pokazuje jak do niego dotrzeć poprzez zastosowanie tego co jest w np w moim przypadku w dokumentacji klaudiusza, ale reszta to jest moja praca która włożę w implementacje zdobytej wiedzy.

Tym o to sposobem powstała wersja 0.2.0 mojego chomąta, tak zmieniłem numeracje, zmieniłem wiele rzeczy.
Na początek postanowiłem że odejdę od quality gate w formie mojej osoby, na rzecz automatów, to był temat szeroko omawiany na warsztacie czyli jak zadbać o jakoś, jak sprawdzić czy kolega AI (ajaj) wykonuje zadanie dobrze?

Quality Gates

W moim przypadku jest to i proste i nie co trudniejsze, dlaczego?
Tematem mojego projektu jest refaktoryzacja no i wprowadzenie zmian, stworzenie bram jakościowych jest proste bo jednym z zadań refaktoryzacji jest stworzenie testów czyli mamy gotową bramę typu sprawdz czy testy są zielone.
Trudne, ponieważ ja podzieliłem każdy etap na kroki analiza - implementacja to quality gate do analizy jest dla mnie wyzwaniem, nie implementacja.
Jak sprawdzić że analiza czyli propozycja zmian jest właściwa?
Jeżeli chodzi np  o zaproponowanie testów do istniejacego kodu, to nie jest tak źle, ale np zmiany żeby te testy można było wprowadzić, i jak sprawdzić czy te zmiany są właściwe? owszem to może być sprawdzone po implementacji zmian. Ale jak wspominałem, ja mam podział analiza czyli wytworzenie zmian jako instrukcja oraz implementacja jako wprowadzenie zmian w kodzie, to nie wydaje mi się już takie proste, na razie jest to rozwiązane poprzez sprawdzenie czy posiadam pliki wynikowe czy one składają się z odpowiednich sekcji, sam etap1 i krok poświęcony analizie jest oparty o to co zaproponował Feathers w swojej książce więc mam jakieś oparcie o istniejące infrormacje.
Podział taki daje mi możliwość przełączania między modelami, analiza Opus, implementacja Sonet.
(tak na marginesie poprawiam to kilka dni po tym jak napisałem wersje pierwszą niniejszego tekstu i już mam rozwiązanie jak zrobić quality gate do analizy ;-), opis później, jak przetestuje).

Jak najmniej AI w AI - zdanie które padło podczas warsztatów

Hooki - to coś co motywuje klaudiusza do bezwględnego posłuszeństwa, nie miałem tego, ale już mam (tylko nie przetestowane na chwilę tworzenia posta), dzięki temu mogę wymusić na modelu zachowanie określone np za pomoca eventów np w czasie startu (`SessionStart` ),  czy np w czasie startu agenta (`SubagentStart`) i wiele innych tyle, że hooki nie są przenaszalne między dostawcami, są zależne od modelu na którym pracuje.

Co do samych hook-ów, uczę się jak to zastosować, mam już jeden w moim harnasiu ale jeszcze nie jestem pewny jego.

Za pomniałem dodać, hooki i quality gates można ze sobą powiązać, ale nie trzeba. Najważniejsze to sprawdzenie jakości wypluwanych odpowiedzi.

Agenci

To też ważny aspekt harnessa, to tu odsyłam zadania poprzez orkiestratora, to tu idą zlecenia pracy, dla poszczególnych agentów. Agent ma to do siebie, że działa na swoim kontekście ma swoją pamięć i po zakończeniu działania poprostu jest wyłączony więc nie zabiera kontekstu orkiestratora.

Ja podeszłem źle do moich agentów, zresztą do hook-ów też. Klaudiusz wprowadził mnie w błąd, nie po raz pierwszy zresztą, dlatego od dziś będę dokładniej sprawdzał dokumentacje bo sam LLM lubi błądzić i udowadnia to co chwilę, a ja błądzę razem z nim z powodu mojej nie wiedzy.
 
MCP

O tym nic nie powiem, bo na tę chwilę nic nie wiem, nie korzystam z tego w moim projekcie, chyba że nie wiem że korzystam ale to inna sprawa.

I koniec... no nie zupełnie na koniec posumowanie.

Podsumowanie

HM? Warto było na warsztaty przyjść, (ale z laptopem ehhh), informacje podane na tacy plus kontakt z prowadzącymi i możliwość otrzymania szybkiego fedbacku gdy coś robie dobrze lub źle. Podejście od zera do tematów zaawansowanych też było właściwe jak dla mnie, bo nawet taki ktoś jak ja który już przed warsztatem coś próbował wyskrobać samemu, widział, że mogłem rzeźbić lepiej.
A na koniec, bez własnych prób to i tak wiedza taka nie przetrwa za długo, to jak z programowaniem trzeba próbować implementować zdobytą wiedzę, i to właśnie robię, czy dobrze, czy źle? to jest inna kwestia ale uzyskana wiedza z warsztatów prowadzi do tej drugiej opcji. 

Na koniec linki do mojego nowego harness
P.S.
Zapomniałem napisać kto prowadził warsztaty:
  • Michał Michaluk
  • Artur Dorda





niedziela, 6 września 2026

Projekt harnesa związanego z event stormingiem, został zakończony. 

Uznałem, że nie ma sensu go kontynuować, nie panuje nad zmianą, rozrósł się do niebotycznych rozmiarów. Doświadczenia przy nim zebrane pchnęły mnie w objęcia nowego projektu, tym razem harness do refaktoryzacji.

Bogatszy o poprzednie doświadczenia, i potrzebę chwili rozpocząłem generowanie nowego projektu. Tym razem postanowiłem wziąć na warsztat temat pracy z legacy kodem, który intensywnie eksploatuje od jakiegoś czasu. Potrzebowałem ustrukturyzować i zautomatyzować kroki, które są potrzebne do bezpiecznej zmiany.  

Wersje

Aktualnie mam wersje trzecią tego projektu.

  1. Ta wersja to był po prostu skill, w którym zaczołem opisywać zasady w jaki sposób będę podchodził do refaktoru.
  2. W tej wersji wprowadziłem orkiestratora, bo się skill rozrósł i naturalnie poszedłem w kierunku harnessa.
  3. Tutaj aktualnie jestem, wprowadziłem opcje testowania - jeszcze nie przetestowana.
Oczywiście to nie koniec, pomysły mam kolejne ale muszę się powstrzymywać bo te pomysły w poprzednim projekcie spowodowały jego niepokojący rozrost.

Krótki opis tego co mam.

Całość to jest pięć plików:
  • orkiestrator - zarządca niewolników,
  • etap 0 - ten etap jest od sprawdzenia czy harness był już uruchamiany,
  • etap 1 - etap analizy i wprowadzania testów
  • etap 2 - etap właściwej zmiany
  • etap 3 - niegotowy/niezaimplementowany
Szczegółowy opis

Ten mój mały harness opisuje podejście do refaktoru, na początek kierowałem się bardziej Feathrsem i to jego podejście było główną przyczyną do tego żeby to powstało, ale później uznałem, że LLM ma też kierować się innymi "wielkimi", także są tam jakby cztery konteksty w których się ma poruszać. 
Uznałem, że ten harness  w pierwszym etapie swojego istnienia będzie działał w oparciu o decyzje użytkownika. Dlaczego tak a nie automatycznie jak we wcześniejszym projekcie? To ze względu na to że nie ufam LLM-om, nadmiar zmian jest nie doogranięcia (przeze mnie) więc uznałem że na razie nie będzie automatu póki nie napiszę jakieś sensownej weryfikacji zmian to weryfikował to będzie człowiek.
Twarda zasada jest taka, że nie ma komitowania, uruchamiania przez AI to człowiek musi robić.

Etap 0

Podstawą działania tego harnesa jest wznowienie pracy po np wyczyszczeniu kontekstu co jest też kolejną podstawą w tym projekcie, tych podstaw to będzie kilka, może filar to lepsze słowo.
No to podstawowe założenie, to jedno z nich właśnie takie, że harness ma działać po tym jak  z jakiegoś powodu zakończy, przerwie działanie ma wznowić w tym samym miejscu. Od tego jest etap 0 żeby to zweryfikować. W wersji 3 weszły jeszcze testy wiec etap 0 oprócz normalnego odpalania bada czy był też test uruchamiany.
Ten etap wykonuje agent, żeby nie marnować cennego kontekstu. Wynikiem jest json i tylko tyle. Orkiestrator otrzymuje wiadomość czy kontynuować sesje czy robić od nowa całą konfigurację. Etap 0 sprawdza też plik refactor-session.md który zapisuje start poprzedniej sesji jeżeli jest więcej niż godzina różnicy orkiestrator nie kontynuuje sesji, zaczyna nową. Ten warunek nie jest jeszcze definitywny, na razie taki czas jest ustawiony na podstawie testów będzie go można zmienić. Mam też taki pomysł żeby dodać plik konfiguracji do harnesa z opcjami, które wpłyną na zmianę zachowania, bez potrzeby ingerencji w defincje samego projektu. Ale to w późniejszych wersjach.

Orkiestrator

Nim przejdę do etapu pierwszego słów kilka o orkiestratorze, tym razem zarządca niewolników pełni inna rolę, tylko zarządza, a przynajmniej na razie tak mu się wydaje. We wcześniejszym projekcie orkiestrator miał znacznie szersze kompetencje, on sterował procesem i był pośrednikiem między różnymi etapami, przygotowywał informacje i przekazywał różnym etapom. Tym razem jest inaczej z powodu specyfiki tematu nie potrzebuje poprzez orkiestratora przekazywać informacji, etapy z definicji działają w izolacji, wyniki jest dostępny w kodzie, bo na kodzie poszczególne etapy bazują, żerują.
Wracając do miszcza ceremoni, orkiestrator bardziej skupia się na zarządzaniu, czyli po odpowiedzi z etapu 0 następuje konfiguracja czyli użytkownik musi odpowiedzieć na kilka pytań, co orkiestrator skrzętnie zapisuje i pamięta, oraz przesyła do poszczególnych etapów. 
Dlaczego tak, ponieważ zauważyłem, że czasami mi się konfiguracja traciła i co jakiś czas muszę przypominać ją jak pracuje z LLM-em. Teraz konfiguracja jest w pliku i jest przekazywana do etapu, po za tym orkiestrator ma ją zapamiętać w swoim kontekście i po zakończeniu każdego etapu sprawdzić czy to co zapamiętał zgadza się ze stanem zapisanym w pliku, to takie zabezpieczenie na wypadek wystąpienia "piątek kolumny". Jeżeli coś takiego wystąpi to jest to sygnał na natychmiastowe przerwanie działania harnessa, dla mnie to kritikal error.
Orkiestrator ma jeszcze kilka dodatkowych funkcji, może np przełączyć etap drugi na pierwszy jeżeli dostanie takiego requesta, np zaistniał refaktor albo zmiana w kodzie i trzeba zmienić testy, a testami zajmuje się etap 1 nie 2, więc idzie request do orkiestratora który go przepycha do etapu 1.
Ogólne funkcje orkiestratora:
  • inicjuje cały proces - co sobie omówiliśmy,
  • ustala tryb uruchomienia - normalny czy test, - o tym później, bo się tworzy dopiero,
  • przekazuje plik konfiguracji - o tym wspominałem
  • czuwa w trakcie trwania - o tym wspominałem przy okazji requestów z etapów,
  • pilnuje integralności - sprawdzanie konfiga, 
  • pilnuje poprawnego wykonania etapów, o tym potem,
  • prowadzi log - tu za bardzo nie ma co omawiać
Co też istotne, wspominałem o tym to, że ja chcę bazować na częstym resetowaniu kontekstu, czyli jeżeli chodzi o clude code, to funkcja /clear. Z tego co wiem to nie da się jej wywołać automatycznie więc na razie jest prośba o ręczne wykonanie tej metody i póki co monit o to nie będzie powiązany ze zużyciem. Na tę chwilę pomysł jest taki żeby po każdej iteracji (o tym przy omawianu etapu 1) wysłać monit o reset. Dlatego tak istotne żeby pamiętać stan i decyzje, po takim resecie wykona się etap 0.
Poprzedni projekt też miał takie zabezpieczenia, znaczy takie które pozwalały wrócić, do kontekstu.
Teraz jednak chciałbym to bardziej rozbudować, pomysł jest taki żeby nad orkiestratorem wprowadzić jeszcze jednego zarządce, a sam orkiestrator pracował by jako agent, czyli wykonał by zadanie i zwolnił zasoby, ale to będzie wymagało doprecyzowania i jakiegoś planu, to w kolejnych wersjach.

Przy okazji wspomnę że zmiany w projekcie też powstają inaczej niż w poprzedniej wersji, są dwa pliki changes.md i changes-test.md. Pliki te służą za wprowadzenie moich pomysłów i realizacje ich przez Klaudiusza, są też swoistą historią, tego jak to powstawało, oprócz gita.

Na razie tyle o orkiestratorze, nadmienię że jest on dość obszerny już, jak w poprzedniej wersji.

Etap 1.

Etap tworzenia testów, przygotowania kodu, na przyjęcie testów. Z tym kodem z którym ja mam styczność bywa różnie ale znacząca większość nie pozwala uruchomić testów, więc trzeba zadbać żeby się dało. Od tego jest ten etap, przygotowanie kodu do utworzenia testów, ale bez jego modyfikacji, czyli minimalna zmiana. Coś takiego właśnie pokazywał Michael Feathers w swojej książce.

Szczegóły

Komunikacja odbywa się za pomocą json, czyli na wejściu i wyjściu generowany jest odpowiedni komunikat, nie przekazuje stanu etapu, tylko polecenie lub info o zakończeniu.
Ten etap pracuje w pętli analiza - implementacja, ale każda faza zaczyna się od wczytania pliku z konfiguracją. Tak jak wspominałem to jest zabezpieczenie, przed tym, że LLM zapomni co zostało we wstępnej fazie ustalone.

Cykl analiza - implementacja może powtarzać się wielokrotnie ale może też być tylko raz, analizę zatwierdza człowiek. W późniejszych wersjach chcę  to zrobić też w pełni automatycznie ale nim to będzie tak działać potrzebuje testów i czegoś co pozwoli mi zweryfikować poprawność wyniku, teraz jeszcze nie mam tego, na razie jest człowiek. Implementacja będzie mogła być robiona przez słabsze modele jeżeli będzie ona dobrze zrobiona, na razie też jeszcze tego nie ma.

 Ogólnie etap dzieli się na kroki:
  • ocena testowalności,
  • identyfikacja zależności blokujących testy,
  • propozycja minimalnego odsprzęgnięcia,
  • gdy odprzęgnięcie nie jest możliwe:
    • zakończenie działania,
    • zakończenie z decyzją użytkownika,
    • opakowanie dodatkową abstrakcja,
    • pytanie o kierunek zmian
  • napisanie testu - obecnego kodu,
  • wydzielenie dużych metod - w zależności od ilości kodu którego obejmuje refaktor,
  • sprawdzenie wyniku przez użytkownika
W tym etapie znajduje się również opis tego co wspominałem wcześniej czyli przykładu że etap drugi potrzebuje zmiany testu. Ja przyjąłem warunek że tylko etap 1 zmienia piszę, zmienia testy, etap kolejny będzie puszczał requesta z monitem zmiany, szczegóły są opisane właśnie w etapie 1 w sekcji Tryb zadaniowy.

Etap pierwszy ma również opis loga, co jest istotne gdyż dzięki temu można stwierdzić co zastało zrobione, liczę też że dzięki temu będzie  możliwe wznowienie po przerwaniu procesu. 

Ogólnie pracę nad etapami wciąż trwają, coś poprawiam coś dodaje więc ta wersja nie jest ostateczna,  a testy mogą przynieść weryfikacje w poszczególnych punktach.

Etap 2


 Ten etap jest uruchamiany przez orkiestratora, użytkownik akceptuje etap pierwszy. Ten etap to konkretne zmiany, mamy testy jesteśmy bezpieczni.
Ten etap docelowo będzie miał dwie funkcje zmiana funkcjonalności i refaktor, oraz sam refaktor. Na razie zaimplementowana jest opcja druga tylko refaktor, ale nie przetestowana.

Wariant refaktor składa się z kilku kroków, opisałem je według moich wytycznych, w późniejszych wersjach będzie można je zmienić i wpisać swoje.

  • czytelność (nazewnictwo),
  • magic numbery,
  • przerwanie zależności
kolejne kroki są jeszcze w budowie, czyli jeszcze nie są zdefiniowane. Cały harnes nie jest skończony, w miarę przechodzenia przez kolejne etapy testów części harnessa będą uzupełniane.

Podsumowanie


Tak jak wspominałem, część etapów jest w budowie, nie wszystko jest zaimplementowane. Aktualnie skupiłem się nad zaimplementowaniem orkiestratora głównych etapów oraz testów narzędzia z możliwością mockowania, tę opcje muszę przetestować i stworzyć system ocenny, scenariusze testowe. 
Jak będzie to gotowe to można znowu przejść do rozbudowy poszczególnych etapów.
A w ramach testów samego narzędzia mogę uruchomić etap pierwszy i częściowo drugi, co pozwoli na weryfikacje działania poza trybem testowym.

Na koniec link do repo projektu :

Nowe chomąto

kilka dni temu zaliczyłem debiut na meetupie w Bielsku. Nie był do końca udany, źle przygotowałem prezentacje, wniosek z tego taki, że powin...