Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

Všechno, sledované

About a dozen sessions on five machines worked one repository, and none of them could see what the others were doing without writing a polling loop. What one stream of signals with the noise folded away changed, and what it measured on its first day.

Večer 10. října 2026 na tomto repozitáři pracovalo asi tucet AI relací rozložených na pět strojů. Sdílely mesh: každá relace, každý nárok na cestu, každá předávka i každá žádost o review byla podepsaná událost, replikovaná na každý stroj během jednoho heartbeatu. V zásadě mohla každá relace vidět všechno.

V praxi to nefungovalo ani v jednom případě. Na revize vyžádané od relace se hodiny neodpovídalo. Předávka publikovaná pro jeden stroj se našla náhodou. Dvě relace si ve stejné minutě vzaly stejné číslo úkolu. Všechny informace byly v žurnálu. Nikdo žurnál nečetl, a ukázalo se, že to bylo rozumné rozhodnutí.

Deník byl většinou šum

Server každého checkoutu při každém heartbeatu znovu oznamuje každého připojeného klienta jako relaci mesh. Tak se relace na jednom stroji stane viditelnou na jiném. Znamená to také, že většina žurnálu je táž věta řečená znovu.

Vzorek 1000 po sobě jdoucích událostí obsahoval 954 událostí session_opened pro relace, jejichž obsah se nezměnil. Pouze 46 událostí říkalo něco nového: osmnáct tvrzení, sedm releasů, šest žádostí o posouzení a šest odpovědí, pět uzavřených relací, čtyři předávky. Číst žurnál surový znamenalo přečíst 954 řádků, aby se našlo těch 46.

Každá relace, která potřebovala vědět, co se děje, si proto napsala vlastní smyčku. Spouštěla jq nad majordomus mesh events, držela si množinu už viděných relací, volala gh pr list pro merge a git ls-remote pro ref, na který čekala. Jedna z těchto smyček, napsaná relací, která později tuto funkci postavila, je specifikací, ze které vznikla.

Jeden stream, složený

majordomus monitor je ta smyčka, provedená jednou a vlastněná repozitářem (ADR 0133). Spojuje tři zdroje: žurnál mesh (do něhož se promítá nástěnka), stopu executoru s merge, obnovami a selháními a pull requesty a běhy workflow z GitHubu. Odpovídá jednou stránkou signálů, každý je řádek, na který může člověk nebo agent reagovat.

Čtení se vyplatí kvůli tomu, co vynechává, o čemž rozhoduje fold.

Relace je novinka, když poprvé řekne, co dělá, a znovu, když se to změní, ale ne když to jen zopakuje nebo když se posune její head. Tvrzení je novinka, pokud jeho relace už stejné neobsahovala. Krok executoru, který nic nerozhodl, novinka není. Zelený běh CI na branchi pull requestu je očekávaný výsledek a také není novinka; červený je vždy. Vše vynechané se počítá, ne skrývá, takže čtenář vidí, kolik bylo sbaleno.

Další dvě pravidla z toho dělají něco, na co se relace může spolehnout.

První je, že co pojmenovává vás, jde první. Posouzení, jehož předmět pojmenovává vašeho pracovníka, odpověď na posouzení, o které jste požádali, předávka, která vás zmiňuje, nebo neúspěšný běh na vaší větvi je označen for_you a uveden před vším ostatním.

Druhá zásada je, že mlčení musí něco znamenat. Zdroj, který nešlo přečíst (mesh neběží, chybí gh, GitHub vypršel), se uvede se svým důvodem. Nikdy se neodpoví prázdným seznamem, protože prázdný seznam se čte jako klidný repozitář.

Co změřil první den

První skutečná stránka za poslední dvě hodiny onoho večera ukázala 50 signálů a sbalila 1371 událostí. Trvalo to tři sekundy, většinu z nich dotazováním GitHubu.

Sbalení se napoprvé nedokončilo a ukázal to sám proud. Mezi 50 signály bylo šestadvacet řádků jako board-p97 (claude-code) joined: následovaných o minutu později left. Byl to klient na jednom stroji, který se každou minutu znovu připojoval, aniž kdy řekl, co dělá.

Pravidlo, které následovalo, je to, na kterém závisí název tohoto článku: spojení, které o sobě nic neříká, není novinka. Jeho příchod se ukáže, když poprvé oznámí záměr, a jeho odchod jen tehdy, byl-li ukázán jeho příchod. To je nyní test a výkyvy tohoto klienta už nikoho nedosáhnou.

Při návrhu kurzoru se objevilo něco dalšího. Stránkování vlastního žurnálu používalo samotné Lamportovo razítko, takže dvě události na dvou strojích se shodným razítkem mohly být rozděleny hranicí stránky a ta druhá se nikdy nepřečetla. Kurzor monitoru nese plnou vlastní pozici každého zdroje: pro mesh razítko, stream a pořadové číslo. Stránka po kurzoru nic neopakuje a nic nepřeskakuje.

Jak se používá

majordomus monitor --for 1b          # the last hour, with what names 1b first
majordomus monitor --follow          # keep printing what is new
majordomus monitor --follow --match '#885' --until merged --timeout 1h

Poslední řádek používají agenti nejvíc: počká na jednu událost a skončí, takže relace může čekat na merge, aniž by psala smyčku.

Tentýž proud je nástroj MCP majordomus_monitor, GET /api/v1/monitor a stránka Cockpitu /cockpit/monitor, která za otevřeného stavu přidává nové signály. Každý briefing na začátku relace z něj vypíše jeden řádek a majordomus context vypíše celou sekci. Bootstrap poskytovatele, který čte každý agent, příkaz pojmenovává, takže se o něm nová relace dozví stejně jako o všem ostatním.

Monitor nic nezapisuje a nevede žádné úložiště. Každý signál pochází ze záznamu, který už existoval, a jednání na základě signálu zůstává u schopnosti, která daný úkon vlastní. Mesh nedělá chytřejším. Dělá čitelným to, co mesh už věděl.

The manual is docs/MONITOR.md. The decision is ADR 0133, still proposed. The proof is cases 1050 to 1052, which run a server with a declared mesh and, for GitHub, a gh that prints fixtures; cases 1053 and 1054 prove the Cockpit page and what every session is told of the stream: the section in majordomus context, the briefing line and the mention in the bootstrap. Add to that the unit tests of every fold rule mentioned here.

Prohledává názvy a popisy všech stránek, které tento web publikuje.