Awesome Testing

Markdown document

Podsumowanie sesji Codex

Lekcja 21: Subagenci Luna i finalne pokrycie API

Historical artifacts may name disposable training credentials and environments. Do not reuse credentials, target course systems, or execute archived prompts without authorization.

Podsumowanie sesji Codex

Zakres sesji

Sesja rozpoczęła się w folderze l16, który zawierał 135 zielonych testów API. Celem było sprawdzenie aktualnego api-test-plan.md, historycznego planu oraz api-docs.json, znalezienie rzeczywistych luk w pokryciu i uzupełnienie ich z użyciem równoległych subagentów. Użytkownik wskazał model Luna jako domyślnego wykonawcę, ponieważ zależało mu na możliwie ekonomicznym podziale pracy. Główny agent zachował odpowiedzialność za kontrakt, eksplorację live API, integrację, review oraz pełny run regresji.

Audyt wykazał, że w kontrakcie są 42 operacje. Czterdzieści z nich miało już osobne testy operacji. Brakowało dedykowanego pokrycia dla:

  • POST /api/v1/email,
  • DELETE /api/v1/users/{username}/right-to-be-forgotten.

Drugi endpoint był używany pośrednio przez fixture do cleanupu, ale nie miał własnego pliku spec opisującego jego kontrakt. Po implementacji pokrycie operacji wzrosło do 42/42, a gotowy stan został zachowany jako kolejny checkpoint w folderze l17.

Główny prompt użyty w Codex

Pracuję w folderze L16, najnowszym. Odpowiadaj mi po angielsku. No i zobacz
sobie na API test plan i ten stary test plan, jakie mamy endpointy. I chciałbym,
żebyśmy pracowali równolegle i chciałbym, żebyś używał subagentów, czyli
delegował pracę do subagentów i chciałbym, żebyś tych subagentów delegował do
Luny. Tak żeby to było maksymalnie wydajne kosztowo. Także chciałbym, żebyś
prompty dał takie dosyć szczegółowe dla Luny, żeby było jasne, co ma zmieniać,
jak to sprawdzić. Niech Luna napisze testy, sprawdzi, tylko że te testy napisane
działają i później ty zrobisz połączenie tego wszystkiego i sprawdzisz, że cała
test suite jest zielona. Także chciałbym, żebyś zrobił też review kodu z tej
Luny, zrobił konflikty ogarnął, w sensie żeby nie było jakichś problemów, żeby
to było spójne z projektem, żeby nie było jakiegoś kodu, który jest poza
kontekstem. Więc na początku sprawdź sobie, co możemy zrównoleglić, później
wydeleguj pracę. Myślę, że mogą to być trzy albo nawet cztery agenty, jeżeli
widzisz taką potrzebę. I każdy agent jak skończy, no to zrób odbiór tej pracy,
review i połącz to w coś spójnego jako jeden increment.

W trakcie pracy pojawiły się trzy krótkie doprecyzowania. Użytkownik zapytał, czy można uruchomić więcej niż dwóch agentów, zaproponował wykorzystanie kolejnego agenta do naprawy problemów znalezionych przez audyt oraz poprosił o raport błędu dla odpowiedzi HTTP 500 zauważonej przy right-to-be-forgotten. Te doprecyzowania zmieniły trzeci strumień z samego audytu w naprawę konwencji, a później uruchomiły osobny etap triage błędu backendu.

Co sprawdził główny agent przed delegacją?

Najpierw zostały przeczytane instrukcje repozytorium oraz dwa workflow: repozytoryjny skill testów API i skill nadzorowania floty modeli. Z tych zasad wynikał konkretny podział odpowiedzialności:

  • główny agent ustala kontrakt i granice plików,
  • Luna implementuje jasno ograniczone fragmenty,
  • każdy writer uruchamia tylko swój test zakresowy,
  • główny agent niezależnie sprawdza diff, uruchamia testy łączone i pełny suite,
  • niepewne zachowanie musi być sprawdzone przez curl przed zapisaniem asercji regresyjnej.

Następnie agent przeczytał aktywny api-test-plan.md, api-test-plan-history.md, wszystkie ścieżki z api-docs.json, istniejące specy, klientów HTTP, typy i fixture. Baseline npm test zakończył się wynikiem 135/135. Audyt ujawnił też nieaktualny fragment planu, który nadal opisywał brakujące testy koszyka i zamówień mimo ich wcześniejszej implementacji.

Jak podzielono pracę pomiędzy subagentów Luna?

Uruchomiono trzy subagenty gpt-5.6-luna z poziomem rozumowania medium. Każdy otrzymał szczegółowy kontrakt, zakazane działania, dozwolone pliki i komendę akceptacyjną.

SubagentPierwsza fazaFaza implementacjiWłasna walidacja
email_contractOdczyt OpenAPI, kontrolera, DTO, serwisu email, rate limitu i lokalnych wzorców testowych.Nowy EmailClient, typy email oraz spec dla POST /api/v1/email.3/3 testy zakresowe.
forget_contractOdczyt autoryzacji, usuwanych danych zależnych, zachowania błędów i ryzyka cleanupu.Metoda unauthenticated w UsersClient, fixture forgettableUser oraz spec dla right-to-be-forgotten.4/4 testy zakresowe.
coverage_auditNiezależne porównanie wszystkich 42 operacji z plikami spec oraz audyt Given–When–Then.Komentarzowa naprawa brakujących sekcji // given w dziesięciu istniejących plikach.Statyczny skan faz testu i git diff --check.

Pierwsza faza wszystkich trzech agentów była tylko do odczytu. Dzięki temu główny agent mógł porównać trzy niezależne raporty przed dopuszczeniem zapisów. Dopiero po zamrożeniu kontraktu subagenci email_contract i forget_contract dostali niepokrywające się ścieżki zapisu. Plik planu pozostał wyłączną własnością koordynatora.

Co sprawdzono na live API przed implementacją?

Główny agent wykonał eksplorację curl na autorytatywnym środowisku https://awesome.byst.re. Wszystkie utworzone konta były unikalne i zostały usunięte odpowiedzią 204.

Dla POST /api/v1/email potwierdzono:

  • poprawny request z JWT zwraca 200, pustą odpowiedź i Cache-Control zawierający no-store,
  • email event pojawia się jako GENERIC ze statusem początkowym QUEUED, maskowanym odbiorcą i dynamicznymi znacznikami czasu,
  • niepoprawny odbiorca oraz puste subject i message zwracają 400 z dokładnymi błędami pól,
  • brak JWT zwraca 401 { "message": "Unauthorized" },
  • test 429 nie powinien trafić do normalnego suite, ponieważ wymaga wyczerpania stanowego limitu użytkownika i zanieczyszcza jego bucket na piętnaście minut.

Dla DELETE /api/v1/users/{username}/right-to-be-forgotten potwierdzono:

  • usunięcie własnego konta zwraca 204, a kolejne logowanie zwraca 422,
  • brak JWT zwraca 401,
  • klient próbujący usunąć innego klienta dostaje 403,
  • poprawnie uwierzytelniony klient wskazujący nieistniejącą nazwę dostaje 404,
  • cleanup użytkowników eksploracyjnych kończy się 204.

Wyniki eksploracji zostały zapisane w planie przed przekazaniem implementacji writerom. Dzięki temu Luna nie musiała zgadywać treści odpowiedzi ani podejmować decyzji kontraktowych.

Co zaimplementowali subagenci?

Strumień email dodał jeden spec operacji z grupami kodów 200, 400, 401, minimalny klient HTTP i typy requestu. Test sukcesu nie próbuje udowadniać zakończenia asynchronicznej dostawy. Sprawdza wyłącznie stabilny kontrakt endpointu: status, pustą odpowiedź i cache headers. Walidacja pól oraz błąd autoryzacji mają dokładne asercje zgodne z live API.

Strumień right-to-be-forgotten dodał grupy 204, 401, 403, 404. Scenariusz 204 nie kończy się na statusie: wykonuje ponowne logowanie i oczekuje 422, dzięki czemu test obserwuje faktyczne usunięcie konta. Osobna fixture tworzy wyłącznie dane jednorazowe i obsługuje sytuację, w której test celowo usunął użytkownika przed teardownem.

Trzeci subagent uzupełnił brakujące komentarze // given w istniejących testach. Ten fragment nie zmieniał requestów ani asercji. Był niezależny od dwóch nowych endpointów, dlatego mógł zostać wykonany równolegle bez konfliktu plików.

Jak wyglądała integracja i review?

Po zakończeniu writerów główny agent przeczytał każdy zmieniony plik, sprawdził kolejność statusów, inicjalizację klientów w beforeEach, sekcje Given–When–Then, typy DTO, autoryzację i cleanup. Nie wystąpił konflikt zapisu, ponieważ ownership ścieżek został ustalony przed implementacją.

Niezależny, połączony run nowych speców zakończył się wynikiem 7/7. Playwright wykrył 142 testy w 47 plikach. Następnie coverage_audit został ponownie użyty jako read-only critic dla obu nowych fragmentów. Critic nie znalazł błędów w kontrakcie endpointów, ale wykrył średnie ryzyko w nowej fixture: jeżeli signup zakończyłby się sukcesem, a signin lub parsowanie odpowiedzi przerwałoby setup przed zapisaniem tokenu, użytkownik mógł pozostać bez cleanupu.

Ta uwaga została przekazana do forget_contract jako pojedyncza, ograniczona naprawa. Fixture zaczęła śledzić zakończenie signup, próbować odzyskać token przy błędzie setupu, wykonywać cleanup, gdy ma użyteczne credentials, oraz zachowywać pierwotny błąd testu zamiast maskować go wtórnym błędem teardownu. Po naprawie test zakresowy ponownie zakończył się wynikiem 4/4.

Jak wykryto i opisano błędy backendu?

Podczas teardownu po poprawnym self-delete subagent raz zobaczył 500 dla ponowionego requestu right-to-be-forgotten z JWT usuniętego już użytkownika. Główny agent nie uznał pojedynczej wzmianki za wystarczający dowód. Odtworzył sekwencję signup -> signin -> DELETE -> ponowiony DELETE trzema niezależnymi użytkownikami. Każda próba zakończyła się kodami 201/200/204/500.

Powstał raport bug-reports/right-to-be-forgotten-repeat-returns-500.md z krokami curl, tabelą 3/3 reprodukcji, wpływem, porównaniem z OpenAPI i hipotezą opartą na kodzie backendu. Najbardziej prawdopodobna ścieżka to UsernameNotFoundException podczas odtwarzania principal z JWT, przechwycony przez ogólną gałąź filtra jako 500. Raport nie narzuca przypadkowej asercji 500 w Playwright; preferowanym zachowaniem jest obsłużone 401 albo jawnie wybrane 404.

Niezależnie ponownie sprawdzono istniejący błąd GET /api/v1/traffic/logs/{correlationId}. Request detail dla correlation ID zwróconego wcześniej przez listę nadal zwracał 500. Istniejący raport został uzupełniony o świeży identyfikator sesji, correlation ID i wynik reprodukcji z 2026-08-30.

Wynik testów

EtapWynik
Baseline l16 przed zmianami135/135
Spec email uruchomiony przez Lunę3/3
Spec right-to-be-forgotten uruchomiony przez Lunę4/4
Połączony run dwóch nowych speców wykonany przez głównego agenta7/7
Pełny suite l16 po integracji142/142 w 1,8 minuty
Odkrycie testów w nowym l17142 testy w 47 plikach
Pierwszy pełny run l17 w sandboxiezablokowany przez DNS ENOTFOUND; requesty nie dotarły do API
Pełny network-enabled suite l17142/142 w 1,9 minuty
git diff --checkbez błędów

Nie skopiowano sekretów ani lokalnych plików .env do l17. Nowy checkpoint nie zawiera również node_modules, test-results ani innych artefaktów uruchomieniowych.

Finalny efekt sesji

Sesja zamknęła dwie ostatnie luki na poziomie operacji OpenAPI i doprowadziła suite do 42/42 pokrytych operacji. Najważniejszym rezultatem procesu nie jest jednak tylko siedem nowych testów. Powstał powtarzalny model współpracy:

  1. główny agent audytuje kontrakt i ustala ownership,
  2. kilka subagentów Luna równolegle zbiera dowody,
  3. koordynator wykonuje obowiązkową eksplorację live i aktualizuje plan,
  4. writerzy zmieniają wyłącznie własne ścieżki i uruchamiają testy zakresowe,
  5. koordynator integruje diff i uruchamia wspólną walidację,
  6. osobny critic szuka problemów niewidocznych w self-authored tests,
  7. znaleziony problem wraca jako jedna ograniczona naprawa,
  8. pełny suite pozostaje finalnym dowodem regresji.

Luna wykonała pracę implementacyjną i audytową, ale decyzje o kontrakcie, pominięciu stanowego testu 429, klasyfikacji błędów backendu i finalnej akceptacji pozostały po stronie głównego agenta. Nie były dostępne wiarygodne dane o tokenach ani koszcie agentów, dlatego sesja nie przypisuje delegacji zmyślonych oszczędności. Gotowy, ponownie zweryfikowany rezultat znajduje się w folderze l17.