172. Klient vždy dostane server a otevřená relace začíná připojením ke clusteru
Kontext
Dne 2026-10-16 vlastník v tomto repozitáři otevřel claude a zeptal se, proč se relace nepřipojila k mesh přes hook a nezačala pracovat. Platily dvě oddělené věci a obě už ADR 0156 pojmenovalo jako způsob, jakým relace skončí pracující sama.
- Server se nikdy nespustil.
.mcp.jsonspouštíbin/majordomus-mcp, který spustí vlastní spustitelný soubor crate a postaví ho, pokud chybí. Checkout nikdy žádný nepostavil a na svazku bylo 4,5 GB volných proti spodní hranici buildu 5120 MB, takže launcher build odmítl a skončil s kódem 12. Klient ohlásilmajordomus (CONNECTION_CLOSED)a pokračoval bez serveru, a tím i bez nástrojůmajordomus_peers,majordomus_announceamajordomus_mesh_*. Vedle něj stál nainstalovaný release mluvící stejným protokolem, který už tento checkout obsluhoval na:8741.project.shared-server-resilienceslibuje, že klient vždy dostane server; launcher tento slib dodržel pro všechno, co může zlomit zámek, ale ne pro samotný spustitelný soubor. - Nic nezahájilo tah. Hook SessionStart proběhl, mesh byl aktivní a celý briefing byl v kontextu relace. Hook může jen přidat kontext. Relace, která je pouze otevřená, čeká na první zprávu, takže na nástěnce nebyla, dokud člověk něco nenapsal, což je stav, který ADR 0156 popisuje jako „choval se jako jediný pracovník“.
Rozhodnutí
mcp obsluhuje nainstalovaný release, když tento checkout nemá nic, co by mohl spustit. bin/majordomus-cli mcp — jediný příkaz, který klient spustí a pak na něj čeká — nikdy neodmítne klienta kvůli chybějícímu spustitelnému souboru, který mohl spustit. Když spustitelný soubor crate chybí nebo ho nelze sestavit (není cargo, méně volného místa než práh, neúspěšné sestavení), spustí nainstalovaný release (MAJORDOMUS_INSTALLED_BIN, ve výchozím stavu majordomus v ~/.local/bin) a na stderr jmenuje release a důvod. Záloha platí jen pro mcp: každý jiný příkaz stále končí s 12, protože jiný release odpovídající na generate nebo check neohlášeně je jiné selhání. Zastaralý spustitelný soubor, který lze přebudovat, se přebuduje jako dřív a přispěvatel, který chce sestavení pro mcp, nastaví MAJORDOMUS_MCP_BUILD=1. Soubor uvnitř repozitáře se nikdy nebere za nainstalovaný release, stejně tak ten, který neodpovídá na --version: launcher, který by našel sám sebe, by nechal klienta čekat ve smyčce.
Holý start relace dostane vlastní první zprávu repozitáře. .ai/repo/prompts/session-start.md je prompt, prompt asset jako continue: zorientovat se, říct, jak jste připojeni (MCP nebo CLI a proč), přečíst nástěnku před jakýmkoli claimem, najít dluženou práci, zkontrolovat kolize, oznámit a pracovat v rozsahu úlohy se vším drženým lokálně. share/shell/session-start.sh obaluje claude, v bashi i zsh, takže holé claude uvnitř repozitáře s vrstvou .ai/ začne s majordomus prompt render session-start. Jakýkoli argument, spuštění mimo takový repozitář, opt-out MAJORDOMUS_NO_AUTOSTART=1 a prompt, který nelze vykreslit, nechají relaci přesně jak byla: nepřítomnost mechanismu je stav, nikdy důvod, proč člověk nemůže pracovat. Prompt žije v repozitáři, takže jeho změna je commit a aktualizuje se každý checkout, který pulluje; wrapper je dodáván v share/ a putuje s releasem (ADR 0161).
Autonomie je v promptu omezena, ne předpokládána. První zpráva říká pracovníkovi, aby zůstal v rozsahu aktivní úlohy a vše držel lokální: žádný commit, push, merge ani pull request, nemazat, co nevytvořil, nedokončit úlohu jako completed, dokud člověk neřekne jinak. Připojit se k nástěnce a pokračovat v oznámené úloze je výchozí; publikovat není.
Důsledky
- Checkout na plném stroji nebo stroji bez nástrojů stále dostane MCP, s jeho nástroji, a briefing může říct, že slouží nainstalovaný release, ne sestavení checkoutu.
- Pracovník na starším nainstalovaném releasu může být obsluhován jím, zatímco zdroje checkoutu jsou novější. Řádek na stderr jmenuje release; blok
desiredserveru (ADR 0035) a následování releasu z ADR 0161 udržují nainstalovaný aktuální. - Kdo soubor načte přes source, dostane chování v každém repozitáři pod dohledem na každém stroji, jehož checkout udržuje aktuální; kdo ne, nedostane nic nového.
Zde nerozhodnuto
- Instalace obalu. Smlouva instalátoru je, že se nic mimo jeho prefix a launchery nedotkne (
docs/DISTRIBUTION.md). Shellová integrace, která připisuje do~/.zshrc, to porušuje, takže je to rozhodnutí vlastníka, s vlastním přepínačem opt-in a případem v85_installer, ne vedlejší efekt tohoto. Do té doby se soubor sourcuje ručně. - Codex a Gemini. Každý bere počáteční prompt jinak; každý je obalen, až když je dokázán proti skutečnému nástroji (milník
every-session-joins-the-mesh). - Čtyři fakta ADR 0156 (aktuální, připojený, ohlášený, užitečný) jako odvozený blok
majordomus contexta odmítnutí vstart/check/finish. To je schopnost, kterou ADR 0156 popisuje a toto ADR ji nepředbíhá; prompt mezitím žádá workera o stejné kroky ručně.
Zamítnuté alternativy
- Sestavit na pozadí a servírovat, až bude hotovo. Klient nečeká na build, který může potřebovat minuty a gigabajty; záložní odpověď hned je celý smysl.
- Udělat z
MAJORDOMUS_BINvýchozí hodnotu ve sledovaném.mcp.json. Jmenuje cestu jednoho člověka. Nastavuje ji osobní vrstva; launcher si nainstalovaný release najde sám. - Nechat práci zahájit hook SessionStart. Nemůže: poskytovatel přidá výstup hooku do kontextu, který se chystá sestavit, a čeká na zprávu.
Ověření
Případ 3177 zastubuje cargo, práh volného místa a nainstalovaný release a dokazuje, že mcp je servírován nainstalovaným releasem, když spustitelný soubor chybí, když build selže a když není místo; že jiný příkaz stále končí exit 12; že soubor uvnitř repozitáře a ten, který neodpovídá na --version, se odmítají; že čerstvý spustitelný soubor běží sám za sebe; a že MAJORDOMUS_MCP_BUILD=1 build ponechává. Selhává na launcheru, jak stál 2026-10-16, s exit 12. Případ 3221 dokazuje v bash i zsh, že holé claude dostane přesně jeden argument, vykreslený prompt, a že argument, obyčejný repozitář, opt-out, selhané nebo prázdné vykreslení a stav ukončení relace zůstávají nedotčeny. Tvrzení mcp-client-always-served a session-start-prompt.