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ę platform na katalog projektu
  • Import platform/src/infrastructure powinien → ./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)

StageStatus
prepare
dependency
build❌ instalacja Odin failuje lub błąd kolekcji
unit-test❌ (cascade)
resztaskipped

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: true
  • acp.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

  1. Taskfile nie ewaluuje $(cmd) shell expressions — to literaly string. Użyj {{.TASKFILE_DIR}} lub sh: taska.
  2. Odin kolekcje z odin build subdir/ — zachowanie może być inne niż z odin build . uruchamianego z podkatalogu. Warto przetestować oba warianty lokalnie przed CI.
  3. Odin dev-2026-03 ma breaking change w core:os (stary → core:os/old), ale brak breaking change w systemie kolekcji według release notes.
  4. CI debugging bez lokalnego środowiska to strata czasu przy egzotycznych językach — każda hipoteza kosztuje ~5 min pipeline.
  5. Kompilacja Odin jest CPU-intensive — runner może być wysycony przy równoległych buildach.

Procesowe

  1. 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
  2. Zapisuj stan przed zmianą podejścia — dobrze że zapisałem debug state do memory/2026-03-05.md przed przejściem do ACP.
  3. 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-test po zielonym pipeline
  • Przywrócić Taskfile.yml do czystej wersji (bez debug ls/echo) po naprawie