Sesja: Debugowanie pipeline odin-test — 2026-03-05
Kontekst
Kontynuacja prac nad projektem platform/odin-test na labie (gitlab.para.net). Projekt to prosty REST API server napisany w języku Odin, z endpointem GET /hello zwracającym {"message": "Hello, World!"}. Projekt korzysta z centralnego pipeline (platform/arch/cicd/pipeline).
Zlecenie stworzenia projektu odin-test w czacie z Orwilem — REST API w języku Odin, agenci planują pracę i tworzą issues
Planowanie — issues i wymagania
Po zleceniu Orwil automatycznie stworzył 6 issues i rozplanował pracę między agentami (DevOps + Coding).
Lista 6 issues w GitLab dla platform/odin-test: konfiguracja technology/odin w pipeline, scaffold Clean Architecture, TDD endpoint GET /hello, Taskfile, .gitlab-ci.yml — plus issue #7 (Tester) dodany po uwadze Aleksandra
Doprecyzowanie wymagań w czacie — endpoint /hello ma zwracać JSON {"message":"Hello, World!"}. Orwil dodaje Issue #7 [Tester] po uwadze że brakowało go w planie — wytyczna trafia do AGENTS.md jako obowiązkowa.
Konfiguracja pipeline
Agenty skonfigurowały .gitlab-ci.yml z instalacją kompilatora Odin z GitHub releases.
Plik .gitlab-ci.yml — konfiguracja pipeline dla Odin: instalacja kompilatora z GitHub releases (curl → unzip → mv → ln -s), obraz bazowy debian:bookworm-slim, kolekcja Odin mapowana przez -collection:platform=.
Problem startowy
Pipeline failował na etapie build z błędem:
/builds/platform/odin-test/cmd/main.odin(3:1) Syntax Error: Path does not exist: platform/src/infrastructure
import infra "platform/src/infrastructure"
Struktura projektu używa Clean Architecture z kolekcją Odin:
-collection:platform=.— mapuje kolekcjęplatformna katalog projektu- Import
platform/src/infrastructurepowinien →./src/infrastructure/
Przebieg debugowania
Historia pipeline’ów w GitLab — seria prób #220–#228: czerwone ikony X to kolejne failed buildy (błędy importów, wersja kompilatora), zielone to etapy które przeszły przed failem. Widać iteracyjny proces: fix imports → push → czekaj 5 min → kolejny błąd.
Próba 1 — relatywna ścieżka .
Hipoteza: odin build cmd/ zmienia CWD do cmd/, przez co . = cmd/ zamiast roota projektu.
Fix: zmiana Taskfile.yml: -collection:platform=. → bez zmian (weryfikacja hipotezy).
Wynik: ❌ fail, ten sam błąd.
Próba 2 — $(pwd) w Taskfile
Hipoteza: shell expansion $(pwd) da absolutną ścieżkę w runtime.
Fix: -collection:platform=$(pwd)
Wynik: ❌ Taskfile NIE ewaluuje shell expressions w komendach — przekazuje literal string $(pwd) do Odin. Odin dostaje dosłownie -collection:platform=$(pwd).
Lekcja: W Taskfile, $(...) nie jest ewaluowane jak w bash. Użyj zmiennych Taskfile ({{.VAR}}) lub sh: dla dynamicznych wartości.
Próba 3 — {{.TASKFILE_DIR}}
Hipoteza: Wbudowana zmienna Taskfile z absolutną ścieżką do katalogu Taskfile.yml.
Fix: -collection:platform={{.TASKFILE_DIR}}
Wynik: ❌ Kolekcja dostaje /builds/platform/odin-test (absolutna i poprawna), ale błąd nadal ten sam. Znaczy to że problem jest głębszy niż ścieżka kolekcji.
Próba 4 — absolutna ścieżka do katalogu wejściowego + debug ls
Hipoteza: Może odin build cmd/ (relatywna) vs odin build /ścieżka/cmd (absolutna) różni się zachowaniem.
Fix: odin build {{.TASKFILE_DIR}}/cmd + dodanie ls do Taskfile żeby zweryfikować że pliki są na miejscu.
Wynik: ❌ Pipeline #237 — logi urwały się po apt-get install, brak outputu odin build w ogóle. Instalacja Odin z GitHub failuje cicho.
Aktualny stan (koniec sesji ręcznej)
| Stage | Status |
|---|---|
| prepare | ✅ |
| dependency | ✅ |
| build | ❌ instalacja Odin failuje lub błąd kolekcji |
| unit-test | ❌ (cascade) |
| reszta | skipped |
Ostatni pipeline: #237 (failed).
Aktualny Taskfile w repo: wersja debugowa z {{.TASKFILE_DIR}} i absolutnymi ścieżkami.
Zmiana podejścia — ACP
Problem z podejściem ręcznym
Debugowanie Odin CI było nieefektywne — każda iteracja to ~5 minut czekania na pipeline runner, brak lokalnego środowiska z Odin, trudno szybko weryfikować hipotezy.
Nowe podejście: ACP (Agent Control Protocol)
Zamiast debugować ręcznie, zadania CI/naprawy kodu mają trafiać do agentów kodujących przez ACP.
Konfiguracja (już była gotowa, tylko niezaktywizowana jako workflow):
acp.enabled: trueacp.defaultAgent: "claude"(Claude Code)- acpx v0.1.15 zainstalowany
Zasada dodana do AGENTS.md:
Przy naprawie pipeline, debugowaniu CI, pisaniu kodu → spawnnij Claude przez ACP (runtime: "acp", agentId: "claude") zamiast debugować step-by-step.
Efekt — pipeline przechodzi po interwencji ACP
Logi CI — testy Odin przechodzą: odin test tests/ -collection:platform=. → „Finished 1 test in 377.234µs. The test was successful.” Agent ACP znalazł i naprawił problem z importami który ręczne debugowanie nie mogło rozwiązać w rozsądnym czasie.
Wykres CPU runnera CI — skoki do ~100% podczas kompilacji Odin potwierdzają że kompilator jest intensywny obliczeniowo. Widoczna korelacja między uruchomieniami pipeline a skokami zużycia CPU.
Wnioski i lekcje
Techniczne
- Taskfile nie ewaluuje
$(cmd)shell expressions — to literaly string. Użyj{{.TASKFILE_DIR}}lubsh:taska. - Odin kolekcje z
odin build subdir/— zachowanie może być inne niż zodin build .uruchamianego z podkatalogu. Warto przetestować oba warianty lokalnie przed CI. - Odin
dev-2026-03ma breaking change wcore:os(stary →core:os/old), ale brak breaking change w systemie kolekcji według release notes. - CI debugging bez lokalnego środowiska to strata czasu przy egzotycznych językach — każda hipoteza kosztuje ~5 min pipeline.
- Kompilacja Odin jest CPU-intensive — runner może być wysycony przy równoległych buildach.
Procesowe
- ACP do zadań kodowania — mam narzędzie (Claude Code przez ACP), powinienem je używać zamiast debugować samodzielnie przez API GitLab. Zwłaszcza gdy:
- Problem wymaga >2 iteracji
- Brak lokalnego środowiska do testowania
- Zadanie dotyczy kodu, nie konfiguracji
- Zapisuj stan przed zmianą podejścia — dobrze że zapisałem debug state do
memory/2026-03-05.mdprzed przejściem do ACP. - Tester jest obowiązkowy — issue #7 pokazało lukę w planowaniu. Od tej sesji każdy nowy projekt = issue testera w planie.
Do zrobienia (następna sesja)
- Zamknąć issue #7 (Tester) w
platform/odin-testpo zielonym pipeline - Przywrócić Taskfile.yml do czystej wersji (bez debug ls/echo) po naprawie
