majordomus monitor je všechno, co se kolem repozitáře děje, v jednom proudu: relace, claimy, předávky a review na každém propojeném stroji, merge a selhání executoru a pull requesty a běhy workflow z GitHubu. Co pojmenovává vás, je první, šum je sbalen a spočítán. Rozhodnutí je ADR 0133 (.ai/repo/adrs/0133-everything-is-followed-in-one-stream.md).
Proč existuje
Worker, který chtěl vědět, co se děje, četl několik povrchů, každý s vlastním kurzorem:
- žurnál mesh (
majordomus mesh events); - nástěnka tohoto checkoutu (
majordomus_peers); - stopa executoru (
majordomus prs events); - GitHub, přes
gh pr listagh run list.
Většina žurnálu je šum. Server při každém heartbeatu znovu promítá každého připojeného peera nástěnky jako relaci meshe: ve vzorku 1000 událostí z 2026-10-10 bylo 954 relací, která znovu říkala, co už řekla. Nic neříkalo, které události jsou adresovány čtenáři. Relace zameškávaly revize a předávky, o které byly hodiny žádány, a každá si ručně napsala stejnou smyčku jq.
Rychlý start
majordomus monitor # the newest signals of the last hour
majordomus monitor --for 1b,cd # ... with what names 1b or cd listed first
majordomus monitor --follow # keep printing what is new
majordomus monitor --follow --match '#885' --until merged --timeout 1h
# wait for one pull request to merge, then go on
Nastavte MAJORDOMUS_MONITOR_FOR jednou místo předávání --for pokaždé. Briefing při startu relace a majordomus context používají pro své řádky monitoru stejnou proměnnou.
Proud žije ve sdíleném serveru, protože žurnál meshe tam žije, takže příkaz se ptá běžícího serveru tohoto checkoutu. Bez serveru příkaz vypíše důvod a skončí kódem 0; majordomus serve ensure jeden spustí.
Co je signál
| pole | význam |
|---|---|
at | kdy se to stalo, v sekundách Unixu, na hodinách toho, kdo to zaznamenal |
source | mesh, executor nebo github |
kind | co se stalo (níže) |
severity | info; attention, když něco selhalo nebo čeká; action, když čeká na vás |
machine, session, actor | kde a kým; stroj jménem v meshi, když je znám |
pr, branch, issue, paths | o čem to je |
summary | jeden řádek, nejvýše 200 znaků |
for_you | zda pojmenovává čtenáře |
link | kde číst dál, když pro to existuje stránka |
Druhy podle zdroje:
- mesh:
session_joined,session_changed,session_left,claimed,released,handover,handover_taken,review_requested,review_answered,review_withdrawn. - executor:
merged,merge_failed,verification_failed,refreshed,refresh_failed,closed,close_failed,repaired,repair_refused,lane_taken,lane_released,observe_failed. - github:
pr_opened,pr_merged,pr_closed;run_failedarun_succeeded, nebodeploy_*arelease_*, když to říká název workflow.
Sloučení: co se nezobrazuje
Sbalení je ta funkce. Proud, který ukazuje všechno, je stejně nepřečtený jako šest proudů, z nichž každý ukazuje své. Čte se každý záznam; záznam, který není novinkou, se započítá do suppressed.
- Relace se zobrazí, když poprvé řekne, co dělá, a znovu jen když se změní její worker, intent, úloha, úkol, milník, větev nebo klient. Pohyb headu zprávou není.
- Spojení, které nikdy neřekne, co dělá, není novinka. Jeho příchod i odchod jsou potlačeny. To platí pro klienta, který se připojuje každou minutu bez záměru.
- Claim není novinka, když jeho relace už drží stejný claim (stejný rozsah, záměr a režim).
- Uvolnění nároku, o kterém nikdo neviděl, že byl převzat, není novinka.
- Krok executoru, který nic nerozhodl, není zpráva: pozorování, výběr, pokus před svým výsledkem, nečinný tik.
- Zelený běh na jiné větvi než
masternení novinka; úspěšné CI pull requestu je očekávaný výsledek. Neúspěšný běh je novinka vždy, stejně jako zelený běh namaster(kontroly masteru, deploy, release).
Pro vás
Signál je for_you, když platí cokoli z toho:
- review vás jmenuje jako slovo v předmětu nebo těle, nebo je adresováno tomuto runtime;
- revize, o kterou jste byli požádáni nebo na kterou jste odpověděli, je stažena;
- odpověď reaguje na review, o které jste požádali;
- tělo nebo větev předávky vás jmenuje;
- záměr tvrzení pojmenovává vás;
- detail události exekutoru vás jmenuje;
- název nebo větev pull requestu pojmenovává vás;
- neúspěšný běh je na větvi, která nese vaše jméno.
Názvy se porovnávají jako celá slova bez ohledu na velikost písmen: 1b odpovídá „ask 1b“ a fix/1b-hello, ale ne p1b.
Volající MCP je také svou vlastní relací nástěnky (board-<peer>). Textová stránka vám signály vypíše jako první, pod For you (N).
Kurzor
Každá stránka končí cursor. Opětovný dotaz s after nastaveným na něj vrátí jen to, co přišlo potom, a nic z předchozí stránky se nevrátí. Kurzor nese vlastní pozici každého zdroje:
- pro mesh úplný kauzální klíč (Lamportovo razítko, proud, pořadí), aby události sdílející razítko nikdy nerozdělila hranice stránky;
- pro executor, kolik řádků jeho stopy bylo přečteno;
- pro GitHub poslední přečtená sekunda. Signály jedné sekundy se nikdy nerozdělují mezi stránky.
Kurzor, který nelze přečíst, se odmítne s exit 10; nikdy tiše nerestartuje proud. Bez kurzoru stránka drží nejnovějších limit signálů za posledních since sekund a její kurzor stojí za vším přečteným.
Zdroje a jejich stavy
Každá stránka uvádí každý zdroj s jeho stavem:
ok;absent, s důvodem: mesh neběží, executor nic nezaznamenal,ghnešlo spustit;error, s důvodem:ghselhalo nebo trvalo déle než jeho rozpočet;skipped: nevyžádáno vsources.
Chybějící zdroj je odpověď, nikdy prázdný seznam. Ticho musí znamenat, že se nic nestalo, nikoli že se nikdo nezeptal.
GitHub je síť. Jeden fetch přečte 40 nejnovějších pull requestů a běhů. Je omezen na 4 sekundy na volání gh a sdílen každým čtenářem po dobu 30 sekund. Briefing na začátku relace a majordomus context čtou jen lokální zdroje.
Provedení (executions.events) zatím nejsou zdrojem. Jejich pořadová čísla patří jednomu provedení jednoho procesu a nic je nespojuje do jednoho feedu.
Příkaz
majordomus monitor [--follow] [--for NAMES] [--sources mesh,executor,github] [--since 30m]
[--limit N] [--after CURSOR] [--match TEXT] [--count N] [--until KIND]
[--timeout 1h] [--interval SECONDS] [--format text|json]
--followse ptá znovu každých--intervalsekund (výchozí 2) s posledním kurzorem a vytiskne jen to, co je nové. Chybějící nebo restartovaný server se ohlásí jednou a sledování pokračuje.--count Nukončí sledování po N signálech.--until KINDukončí sledování u prvního signálu tohoto druhu.--timeoutto vzdá s kódem 10.--matchponechá jen signály, jejichž shrnutí obsahuje text.--format jsonvypíše stránku tak, jak ji schopnost zodpověděla. Při sledování vypisuje jeden signál na řádek (NDJSON).- Doby trvání jsou sekundy, nebo číslo s
s,m,hnebod. - Výstupní kódy: 0, když je zodpovězeno nebo když sledování končí
--countči--until; 10, když se vstup odmítne (špatný kurzor, neznámý zdroj) nebo sledování dosáhne--timeout.
Další povrchy
- MCP:
majordomus_monitor, se stejným vstupem (after,limit,sources,for,since). Vlastní relace agenta na nástěnce se počítá jako jedno z jeho jmen. - HTTP:
GET /api/v1/monitor?after=&limit=&sources=&for=&since=. Dokument OpenAPI popisujeMonitorPageaMonitorSignal. - Cockpit:
/cockpit/monitor[?for=NAMES]ukazuje nejnovější signály a dokud je viditelný, každých pět sekund přidává nahoru, co je nové. Odkazuje na něj přehled i stránka meshe. - Začátek relace: briefing vytiskne řádek
Monitor:podMesh:s počtem za poslední hodinu, signály pro vás a těmi, které žádají o pozornost. majordomus context: sekceWHAT HAPPENEDnese tytéž řádky.
Čím není
- Nic nezapisuje a nevede žádné úložiště. Každý signál je odvozen ze záznamu, který už existuje.
- Je to pozorování, ne autorita. Merge, tvrzení nebo odpověď zůstává u schopnosti, která akt vlastní.
- Není to notifikátor. Slack, e-mail nebo push by se k tomuto streamu později přihlásily, místo aby přidaly sedmou smyčku.
Důkaz
- Unit testy:
src/monitorpokrývá kurzor, merge přes zdroje, sloučení každého zdroje a pro-vás;src/commands/monitor.rspokrývá vykreslení a cíl požadavku;src/cockpit/monitor.rspokrývá řádek.
- Cases:
1050_the_monitor_folds_the_noise: jeden server, skládání, for-you, odmítnutí a obnovení;1051_a_followed_stream_can_be_waited_on:--count,--until,--match,--timeouta NDJSON;1052_an_absent_source_is_reported: GitHub přes fixturegh.