Po co test dymny przed pierwszym sprintem?
Sprint z pętlami łączy kilka mechanizmów: połączenie z platformą, strażnika komend, zgody w pliku ustawień, stronę toolchain, branch sprintu i narzędzie glab albo gh. Błąd w jednym z nich przy dziesięciu ticketach wychodzi w dziesięciu sesjach naraz. Test dymny pokazuje go na jednym tickecie, w kilkanaście minut.
Test idzie od rzeczy najtańszych do najdroższych. Trzy kontrole nie uruchamiają żadnej sesji w tle. Dopiero po nich dyspozytor startuje jedną sesję ticketu, a kolejka prowadzi jeden merge request.
flowchart LR
A["Kontrola 1: projekt"] --> B["Kontrola 2: strażnik komend"]
B --> C["Kontrola 3: zgody w repozytorium"]
C --> D["Jeden tick dyspozytora"]
D --> E["Sesja ticketu kończy pracę"]
E --> F["Jeden tick kolejki"]
F --> G["Ticket Gotowy"]Test zakłada, że projekt przeszedł jednorazową konfigurację, a jeden ticket zrobiłeś już ręcznie. Jeśli nie, zacznij od wpisu Zacznij tutaj: czym jest Monolynx i czego potrzebujesz.
Kontrola 1: czy komenda widzi Twój projekt?
Komendy pluginu znajdują projekt po slugu. Slug biorą ze zmiennej MONOLYNX_PROJECT_SLUG, potem z konfiguracji klienta albo z pliku .env projektu. Gdy nie ma go nigdzie, komenda nie zgaduje, tylko pyta o slug i zatrzymuje pracę. W sesji w tle nikt na to pytanie nie odpowie, dlatego slug musi być zapisany, zanim uruchomisz dyspozytora.
> /monolynx:setup
| Punkt | Stan |
| 1. Slug projektu | OK (sklep, źródło: środowisko) |
| 2. Strona wiki toolchain | OK |
| ...| Objaw | Przyczyna | Co zrobić |
|---|---|---|
| komenda pyta o slug | slug nie jest nigdzie zapisany | ustaw MONOLYNX_PROJECT_SLUG w polu env śledzonego .claude/settings.json |
| komenda zgłasza, że projekt nie istnieje albo nie jesteś jego członkiem | slug z literówką albo z innego projektu | ustaw MONOLYNX_PROJECT_SLUG na slug z adresu panelu, czyli z /dashboard/<slug>/ |
| agent nie ma narzędzi Monolynx albo prosi o logowanie | połączenie MCP nie jest zalogowane | w Claude Code otwórz /mcp i zaloguj połączenie monolynx |
odpowiedź Brak uprawnienia scrum:write |
Twoja rola w projekcie tylko czyta | właściciel zmienia rolę w ustawieniach projektu, w sekcji członków |
linia TRANSPORT: mode=mcp ... auth=missing |
CLI monolynx jest zainstalowane, ale niezalogowane |
to nie błąd, komendy idą przez MCP; monolynx auth login włączy szybszy kanał |
Kontrola 2: czy strażnik komend działa?
Strażnik komend to hook pluginu, który przed każdym poleceniem powłoki odmawia agentom pomocniczym zapisu w git i testów, a sesję główną pyta o zgodę. Sama instalacja pluginu go nie włącza: klient musi go załadować, a Ty musisz nadać zaufanie. Bez strażnika zgody pilnuje tylko rozmowa z agentem.
Strażnik zostawia ślad po każdym poleceniu, które sprawdził. Ten ślad jest najprostszym dowodem, że działa.
- Otwórz sesję w repozytorium
Uruchom
claudew katalogu projektu. Przy pierwszym uruchomieniu klient pyta o zaufanie do katalogu. - Wywołaj komendę, która czyta repozytorium
Na przykład
/monolynx:next. Uruchamia ona kilka poleceń git, a każde przechodzi przez strażnika. - Sprawdź ślad w drugim terminalu
Katalog
~/.cache/monolynx/hook-active/powinien zawierać plik z bieżącą godziną.
$ ls -lt ~/.cache/monolynx/hook-active/
-rw-r--r-- 1 ty staff 78 10 paź 09:14 3f6c1a2e-...
$ cat ~/.cache/monolynx/hook-active/3f6c1a2e-...
{"subagent_identification": false, "checked_at": "2026-10-10T09:14:02"}| Stan | Co widać | Co to znaczy |
|---|---|---|
| potwierdzona | plik ze znacznikiem "subagent_identification": true |
strażnik działa i rozpoznał już agenta pomocniczego; twarde odmowy są pewne |
| niepełna | plik jest, ale ze znacznikiem false |
strażnik działa, ale w tej sesji żaden agent pomocniczy nie uruchomił jeszcze polecenia; to normalny stan w tej kontroli i na starcie każdej komendy |
| brak potwierdzenia | brak pliku po pierwszym poleceniu | strażnik nie jest załadowany albo nie ma zaufania |
Komendy work, work-simple i mr-queue czytają ten sam ślad dwa razy: na starcie i po pracy agentów pomocniczych. Stan końcowy wpisują do podsumowania. Sesja w tle, której stan końcowy nie jest "potwierdzona", nie udaje blokady. W chwili, gdy potrzebna byłaby zgoda, kończy turę linią SPRINT-RUN STOP: brak potwierdzonej ochrony hooka.
Kontrola 3: czy zgody dotrą do sesji ticketu?
Sesja ticketu pracuje w osobnym katalogu roboczym. Katalog ten zawiera tylko pliki śledzone przez git, w wersji z commita, na którym stoi główny katalog repozytorium. Stąd dwie zasady, które sprawdzasz jedną komendą.
| Co ustawiasz | Wspierane miejsce | Dlaczego tam |
|---|---|---|
zgody MONOLYNX_AUTOTEST, MONOLYNX_AUTOCOMMIT, MONOLYNX_AUTOPUSH, MONOLYNX_AUTOMR |
śledzony .claude/settings.json albo środowisko procesu, który uruchamia tick |
mają obowiązywać każdą sesję w każdym katalogu roboczym; kontrola wstępna dyspozytora szuka ich tylko tam |
branch sprintu MONOLYNX_MR_TARGET |
export w terminalu albo .claude/settings.local.json |
to ustawienie tymczasowe; w pliku śledzonym trafiłoby na gałąź główną |
$ git branch --show-current
sprint/platnosci
$ git status --short
$ git show HEAD:.claude/settings.json
{
"env": {
"MONOLYNX_AUTOTEST": "true",
"MONOLYNX_AUTOCOMMIT": "true",
"MONOLYNX_AUTOPUSH": "true",
"MONOLYNX_AUTOMR": "true"
}
}
$ echo $MONOLYNX_MR_TARGET
sprint/platnosciTrzy rzeczy muszą się zgadzać. Stoisz na branchu sprintu. Katalog jest czysty, czyli git status --short nic nie wypisuje. Commit, na którym stoisz, zawiera plik ustawień ze zgodami.
Jak uruchomić jeden ticket na jednym slocie?
Dyspozytor czyta wszystkie tickety aktywnego sprintu, dlatego na czas testu w sprincie ma być tylko jeden.
- Wybierz mały ticket
Jeden lub dwa story pointy, bez migracji bazy i bez etykiety
needs-local. - Zostaw resztę poza sprintem
Do aktywnego sprintu przypisz tylko ten ticket i ustaw mu status Do zrobienia. Pozostałe dopiszesz po teście.
- Uruchom jeden tick z jednym slotem
Liczba po nazwie komendy to liczba slotów.
- Sprawdź sesję
Komenda
claude agentspokazuje ją z nazwą złożoną ze sluga, klucza ticketu i modelu.
> /monolynx:sprint-run 1
| Ticket | Sesja | Werdykt | Działanie |
| SKL-12 | a1b2c3d4 | free -> running | start sesji |
SPRINT-RUN: remaining=0 running=1 waiting=0 done=0$ claude agents
sklep-SKL-12-opus a1b2c3d4 running
$ git worktree list
/home/ty/sklep 4f2a9c1e [sprint/platnosci]
/home/ty/sklep/.claude/worktrees/SKL-12 4f2a9c1e [worktree-SKL-12]
$ claude logs a1b2c3d4
...
BRANCH_MODE=ticket AUTOTEST=true AUTOCOMMIT=true AUTOPUSH=true CONTRACT=ask SPRINT_RUN=1 AUTOMR=true ...Linia konfiguracji na początku logu jest drugim dowodem z kontroli 3. Wartości true przy czterech zgodach i SPRINT_RUN=1 znaczą, że sesja widzi to, co ustawiłeś. Wartość false przy którejkolwiek zgodzie oznacza, że commit z plikiem ustawień nie jest na branchu sprintu.
Jak doprowadzić ticket do końca?
Bez pętli tick uruchamiasz sam, co kilka minut. Każdy tick kończy się jedną z trzech sytuacji.
| Ostatnia linia | Co się dzieje | Co robisz |
|---|---|---|
running=1 |
sesja pracuje | czekasz i ponawiasz tick |
waiting=1 |
sesja pyta albo stoi | wchodzisz przez claude attach <id> i odpowiadasz |
done=1 |
sesja skończyła, ticket ma status Review | przechodzisz do kolejki |
> /monolynx:mr-queue
!42 SKL-12: eksport zamówień do CSV
CI: zielone | konflikt: brak | zatwierdzenie: brak
Approve !42 (SKL-12: eksport zamówień do CSV, SHA 4f2a9c1e)? tak / nie
> tak
MR-QUEUE: remaining=1 current=!42 verdict=needs_approval done=0Drugi tick kolejki merguje merge request i ustawia ticket jako Gotowy. Gdy CI jeszcze biegnie, kolejka czeka: ponów tick po zakończeniu pipeline'u.
Co oznacza inny wynik niż oczekiwany?
Każde odstępstwo w teście ma jedną najczęstszą przyczynę. Tabela prowadzi od objawu do poprawki.
| Objaw | Przyczyna | Poprawka |
|---|---|---|
| tick kończy się przed startem sesji komunikatem o brakujących flagach | zgód nie ma w pliku śledzonym ani w środowisku | kontrola 3 |
sesja kończy turę linią SPRINT-RUN STOP o lincie albo testach |
brak strony toolchain albo jej sekcji ## Worktree |
/monolynx:project-toolchain |
linia konfiguracji w logu pokazuje AUTOTEST=false |
commit ze zgodami nie jest na branchu sprintu | dodaj commit na branchu sprintu i wypchnij |
sesja od razu ma werdykt waiting z pytaniem o zgodę |
tryb auto odrzucił polecenie albo strażnik nie jest potwierdzony |
claude attach <id>, przeczytaj powód, wróć do kontroli 2 |
| merge request celuje w gałąź główną zamiast w branch sprintu | zmienna MONOLYNX_MR_TARGET nie była ustawiona w terminalu dyspozytora |
ustaw zmienną, zmień cel merge requesta na platformie |
| komentarz ticketu mówi, że merge request nie powstał | brak glab, niezalogowany glab albo repozytorium na GitHubie |
otwórz merge request albo pull request sam |
kolejka daje werdykt needs_human z prośbą o uruchomienie CI |
merge request nie ma pipeline'u | uruchom CI na branchu albo zmerguj sam |
remaining większe od zera i nic nie biegnie |
ticket ma niezamknięty bloker albo etykietę needs-local |
zdejmij bloker albo zrób ticket ręcznie |
Sytuacje spoza tabeli opisuje wpis Gdy coś nie działa w Monolynx.
Ile kosztował jeden ticket?
Test dymny daje pierwszy własny pomiar. Wpisy nie podają kwot, bo zależą od planu, modelu i wielkości ticketu, ale sposób pomiaru jest zawsze ten sam.
- Zapisz zużycie przed testem
W Claude Code komenda
/usagepokazuje, ile limitu planu zostało wykorzystane. - Zrób test
Jeden ticket, od ticku dyspozytora do statusu Gotowe.
- Zapisz zużycie po teście
Różnica to koszt jednego ticketu razem z tickami dyspozytora i kolejki.
- Odczytaj czas
Moduł Pipelines w panelu pokazuje czas każdego etapu:
research,codingiwrap-up. - Przemnóż
Liczba ticketów razy koszt jednego daje górne oszacowanie sprintu. Czas całości dziel przez liczbę slotów i dodaj czas CI.
Najczęstsze pytania
Czy test dymny trzeba powtarzać przed każdym sprintem?
Nie. Powtórz go po zmianie komputera, po aktualizacji klienta albo pluginu i po zmianie strony toolchain. Przed zwykłym kolejnym sprintem wystarczy kontrola 3.
Czy mogę zrobić test bez brancha sprintu?
Tak. Bez zmiennej MONOLYNX_MR_TARGET merge request trafia do domyślnego brancha repozytorium. Test jest wtedy prostszy, ale nie sprawdza ustawienia, którego użyjesz w sprincie.
Co zrobić z ticketem testowym po teście?
Nic. To zwykły ticket sprintu ze statusem Gotowe. Dopisz do sprintu pozostałe tickety, ustaw im status Do zrobienia i uruchom pętle.
Czy test działa w Codex?
Kontrole 1 i 3 są takie same. Ślad strażnika komend powstaje także w Codex, ale ten klient nie przekazuje informacji o agencie pomocniczym, więc stan zostaje "niepełna". Sesję ticketu uruchamia tam skrypt sprint_run.sh ze zmienną MONOLYNX_SPRINT_RUNTIME=codex.
Słownik i następny krok
- Test dymny
- krótki przebieg całej ścieżki na jednym tickecie, który sprawdza, czy wszystkie elementy są połączone
- Strażnik komend
- hook pluginu sprawdzający każde polecenie powłoki agenta
- Ślad strażnika
- plik w katalogu
~/.cache/monolynx/hook-active/, zapisywany po każdym sprawdzonym poleceniu - Slot
- miejsce na jedną równoległą sesję ticketu
- Tick
- jedno uruchomienie komendy dyspozytora albo kolejki
- Linia konfiguracji
- pierwsza linia logu sesji ticketu z wartościami zgód, które sesja widzi
Test przeszedł, więc pora na pełny sprint. Kroki w jednej liście podaje wpis Sprint od zera: lista kontrolna i tabela zgodności. Pracę ręczną nad ticketem przy działających pętlach opisuje wpis Praca ręczna w trakcie sprintu.
Chcesz zobaczyć czas każdego etapu pracy agentów nad ticketem?
Zobacz moduł Pipelines w Monolynx