Po co kolejka merge, skoro MR można kliknąć ręcznie?
Ręczne mergowanie działa przy jednym MR dziennie. Gdy agenci oddają kilka zmian naraz, zaczyna się pilnowanie: ten ma konflikt po poprzednim merge, tamten czerwone CI, trzeci czeka na approve, a po każdym merge trzeba sprawdzić, czy branch docelowy nadal jest zielony. To praca, w której człowiek głównie czeka i odświeża stronę.
Skill mr-queue przejmuje czekanie. Trzyma listę MR i PR w ustalonej kolejności i przy każdym uruchomieniu przesuwa pierwszy z nich o jeden krok w stronę merge. Działa z GitLabem przez glab i z GitHubem przez gh.
# zalecane: pętla co 10 minut, kolejka układa się sama
/loop 10m /monolynx:mr-queue
# jeden tick ręcznie
/monolynx:mr-queue
# własna kolejność merge
/monolynx:mr-queue !142 !139 !145Dlaczego zalecamy pętlę co 10 minut?
Jedno uruchomienie skilla to jeden tick, a pełne przejście MR przez kolejkę wymaga kilku ticków: merge brancha docelowego, czekanie na nowe CI, merge, czekanie na CI brancha docelowego. Pętla jest celowo poza skillem. Skill robi krok i kończy turę, a o rytmie decyduje /loop.
/loop 10m /monolynx:mr-queueDziesięć minut to rytm dobrany do tego, na co kolejka czeka najczęściej, czyli do rundy CI. U nas pełna runda lintu i testów trwa kilkanaście do dwudziestu minut, więc tick co 10 minut zauważa wynik niedługo po jego pojawieniu się, a nie odpytuje serwera co chwilę bez powodu. Większość ticków kończy się werdyktem wait i niczego nie zmienia.
Pętla ma jeszcze jedną zaletę: kolejka sama rośnie. Przy każdym ticku skill dopisuje na koniec otwarte MR, których jeszcze w niej nie ma. Nowa zmiana oddana przez agenta w trakcie dnia trafia do kolejki bez żadnej komendy. Dotyczy to każdego otwartego merge requesta, także merge requesta całego sprintu do gałęzi głównej. Trzymaj go jako draft, dopóki tickety nie są zmergowane: drafty kolejka pomija.
| Cecha | Ręczne ticki | Pętla co 10 minut |
|---|---|---|
| Kto pamięta o kolejnym kroku | człowiek | pętla |
| Reakcja na zielone CI | gdy ktoś zajrzy | w ciągu jednego interwału |
| Nowe MR w ciągu dnia | po ręcznym uruchomieniu | dopisywane same |
| Kiedy przerywa człowiekowi | przy każdym ticku | tylko przy decyzji: approve albo raport "Potrzebne" |
Co dzieje się w jednym ticku?
- Kontrola wstępna
Skill sprawdza repozytorium, logowanie
glabalboghi spójność konfiguracji brancha docelowego. - Kolejka
Bez argumentów układa ją sam z otwartych MR; z argumentami przyjmuje podaną kolejność.
- Pierwszy niezmergowany element
Reszta kolejki czeka, bo kolejność jest święta.
- Werdykt
Skrypt
mr_queue_state.pyliczy go z JSON-a dostawcy. - Jedno działanie
Rozwiązanie konfliktu, poprawka CI, pytanie o approve albo merge.
- Raport i linia statusu
Ostatnia linia odpowiedzi ma zamrożony format, który czytają pętla i inne narzędzia.
Tick sprawdza kolejno konflikt, CI i approve. Konflikt prowadzi do merge brancha docelowego w tymczasowym worktree, czerwone CI do poprawki, brak approve do pytania do człowieka, a komplet warunków do merge. Po każdym działaniu tick się kończy, a następny liczy stan od nowa.
flowchart TD
A[Pierwszy MR w kolejce] --> B{Konflikt?}
B -->|tak| C[Anuluj pipeline MR i zmerguj branch docelowy]
B -->|nie| D{CI}
D -->|w toku| E[wait: koniec ticka]
D -->|czerwone| F[Poprawka w tymczasowym worktree]
D -->|zielone| G{Approve?}
G -->|brak| H[Pytanie do człowieka]
G -->|jest| I[Merge z blokadą na SHA]
C --> J[Koniec ticka]
F --> J
H --> J
I --> JJak skill układa kolejkę?
Bez argumentów skill pobiera listę otwartych MR i układa je od najstarszego. MR oparty o branch innego otwartego MR idzie zaraz po nim. Drafty i zmiany oparte o draft są pomijane, z powodem w raporcie. Kolejkę przyjmuje bez pytania, a inną kolejność można podać w każdej chwili jako argumenty: !iid dla GitLaba, #numer dla GitHuba albo pełny adres.
Plik kolejki leży we wspólnym katalogu gita, więc jest jeden dla głównego checkoutu i wszystkich worktree repozytorium.
Jakie werdykty może dać tick?
| Werdykt | Co oznacza | Co robi tick |
|---|---|---|
wait |
CI w toku albo dostawca liczy mergeowalność | nic, koniec ticka |
conflict |
branch MR koliduje z branchem docelowym | anuluje pipeline MR i merguje branch docelowy |
ci_failed |
czerwone CI na branchu MR | poprawka w tymczasowym worktree |
needs_approval |
brak zatwierdzenia | pyta człowieka |
ready |
zielone CI, approve, brak konfliktu | merge |
needs_human |
stan, którego automat nie powinien ruszać | raport "Potrzebne", kolejka stoi |
merged / closed |
zmergowany albo zamknięty poza kolejką | domyka pozycję i idzie dalej |
Dlaczego konflikt wygrywa z CI?
CI na branchu, który koliduje z branchem docelowym, nie da mergowalnego wyniku, a runda trwa i zajmuje runner innym zmianom. Dlatego przy konflikcie tick anuluje trwający pipeline MR i od razu merguje branch docelowy w tymczasowym, odłączonym worktree. Konflikty w plikach rozstrzyga subagent na modelu opus, bo musi pogodzić dwie intencje, a nie tylko poprawić składnię. Gdy intencje są sprzeczne, subagent przerywa, a pozycja czeka na człowieka.
Jak wygląda poprawka czerwonego CI?
Tick czyta ogon logu czerwonych jobów, tworzy odłączony worktree na aktualnym HEAD brancha MR i zleca poprawkę subagentowi na modelu sonnet. Commit i push robi główna sesja, zwykłym pushem na branch MR. Potem worktree znika, a nowy pipeline oceni następny tick.
Granice automatycznych poprawek
| Sytuacja | Zachowanie |
|---|---|
| Dwie rundy poprawek bez zielonego CI | pozycja zatrzymana, raport z oboma podejściami |
| Branch innego autora | push tylko po zgodzie człowieka |
| Kod wyjścia 137 bez czerwonego testu | ponowienie joba, bez liczenia rundy poprawek |
| Pipeline anulowany przez człowieka | werdykt needs_human, tick go nie ponawia |
| Push odrzucony, bo branch poszedł do przodu | worktree usunięty, następny tick liczy stan od nowa |
Co wolno automatowi, a co zostaje dla człowieka?
Skill pyta tylko o decyzje, które należą do człowieka: approve, merge bez włączonej zmiennej MONOLYNX_AUTOMERGE i push do cudzego brancha. Approve dany w rozmowie wiąże się z konkretnym SHA. Każdy nowy commit na branchu, także poprawka zrobiona przez sam skill, wymaga nowego zatwierdzenia.
Nigdy nie zatwierdzasz MR/PR i nigdy nie mergujesz bez werdyktu ready policzonego w tym samym ticku, z blokadą na ten SHA.
Gdy tick trafia na stan wymagający człowieka, nie pyta "co dalej?". Kończy się raportem z linią Potrzebne:, która mówi, co dokładnie zrobić i jaką komendą wrócić do kolejki. Po działaniu człowieka kolejka rusza sama przy następnym ticku.
Co się dzieje po merge?
Tor po merge zależy od brancha docelowego i wybiera go skrypt, nie model.
| Cecha | Domyślny branch repozytorium | Branch integracyjny, np. sprint/* |
|---|---|---|
| Następny MR wchodzi | po zielonym CI brancha docelowego | od razu po merge |
| Ticket dostaje status done | po zielonym CI commita merge | od razu, na podstawie zielonego CI samego MR |
| Pipeline brancha po merge | jest warunkiem dalszej pracy | tick go anuluje, bo blokowałby kolejny MR |
| Czerwone CI brancha | kolejka staje, raport "Potrzebne" | całość weryfikuje MR brancha integracyjnego do domyślnego |
Na koniec każdego ticka skill wypisuje linię statusu:
MR-QUEUE: remaining=3 current=!142 verdict=ready done=2Najczęstsze pytania
Czy mr-queue zatwierdza MR za mnie?
Nie. Approve zawsze daje człowiek. Skill może zapisać zgodę wyrażoną w rozmowie, ale tylko dla konkretnego SHA, i nigdy nie wywołuje zatwierdzenia w GitLabie ani GitHubie.
Czy pętla może zmergować coś bez mojej wiedzy?
Bez zmiennej MONOLYNX_AUTOMERGE ustawionej na true każda komenda merge pyta o zgodę. Z nią skill merguje sam, ale wyłącznie MR z werdyktem ready: zielone CI, approve i brak konfliktu, policzone w tym samym ticku.
Co jeśli tick trafi na coś, czego nie umie naprawić?
Kolejka staje na tej pozycji, a raport zawiera linię Potrzebne: z konkretnym działaniem i komendą powrotu. Kolejne ticki pętli niczego nie psują: liczą stan od nowa i ruszają dopiero po zmianie.
Czy mogę zmienić kolejność w trakcie?
Tak. Wywołaj skill z refami w nowej kolejności. Argumenty zawsze nadpisują kolejkę ułożoną automatycznie.
Dlaczego nie krótszy interwał niż 10 minut?
Kolejka czeka głównie na CI, a runda CI trwa dłużej niż kilka minut. Częstsze ticki dałyby więcej werdyktów wait i tyle samo merge. Jeśli Twoje CI kończy się w dwie minuty, krótszy interwał ma sens.
Słownik i następny krok
- Tick
- jedno uruchomienie skilla: odczyt stanu, jedno działanie, raport
- Werdykt
- stan MR policzony przez skrypt z danych GitLaba albo GitHuba
- Branch integracyjny
- branch docelowy inny niż domyślny branch repozytorium, na przykład branch sprintu
- Blokada na SHA
- merge przechodzi tylko wtedy, gdy HEAD brancha jest tym commitem, który tick ocenił
- Raport "Potrzebne"
- zakończenie ticka z konkretnym działaniem dla człowieka zamiast pytania
- Idempotentny
- powtórzony daje ten sam stan, bez zdublowanych skutków
Kolejka merge domyka obieg, który zaczyna skill work, prowadzący ticket od planu do merge requesta, a kończy skill sprint-end, zamykający sprint i aktualizujący wiki.
Granicę między kolejką a człowiekiem, czyli zgodę związaną z commitem i merge, opisuje wpis Zatwierdzanie i merge: co zawsze robi człowiek. Kiedy ticket po merge dostaje status Gotowe, wyjaśnia wpis Statusy ticketu w Monolynx.
Chcesz, żeby merge requesty agentów trafiały do głównej gałęzi po kolei, z zielonym CI i bez ręcznego pilnowania?
Zobacz moduł Scrum w Monolynx