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.

Klient vždy dostane server a otevřená relace začíná připojením ke clusteru

Klient vždy dostane server a otevřená relace začíná připojením ke clusteru

majordomus://adr/adr-0172navrženo koordinacemeshmcpvynucování

odkazuje na

  • put_in_force share/shell/session-start.sh (soubor)
  • put_in_force adr-0043
  • put_in_force adr-0161
  • put_in_force docs/MCP.md (dokument)
  • put_in_force bin/majordomus-cli (implementace)
  • put_in_force every-session-joins-the-mesh
  • put_in_force project.shared-server-resilience@1
  • put_in_force test/cases/3177_a_client_always_gets_a_server.sh (test)
  • put_in_force test/cases/3221_a_bare_session_start_joins_the_cluster.sh (test)

odkazuje na něj

Nic ve vrstvě to nejmenuje. Zpětné odkazy se odvozují, takže prázdný seznam je odpověď, ne opomenutí.

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.

  1. Server se nikdy nespustil. .mcp.json spouš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ásil majordomus (CONNECTION_CLOSED) a pokračoval bez serveru, a tím i bez nástrojů majordomus_peers, majordomus_announce a majordomus_mesh_*. Vedle něj stál nainstalovaný release mluvící stejným protokolem, který už tento checkout obsluhoval na :8741. project.shared-server-resilience slibuje, ž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.
  2. 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 desired serveru (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 v 85_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 context a odmítnutí v start/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_BIN vý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.

Odkud to pochází

kanonický soubor
.ai/repo/adrs/0172-a-client-always-gets-a-server-and-a-session-starts-by-joining.md
identity
adr-0172
dostupné také jako
Zdroj MCP majordomus://adr/adr-0172 · majordomus entity show adr/adr-0172 · GET /api/v1/entity?uri=majordomus://adr/adr-0172
v Cockpitu
/cockpit/objects/adr/adr-0172

Tato stránka je generována z výše uvedeného souboru pomocí scripts/generate-site-data; úprava stránky nic nemění, úprava souboru změní všechna rozhraní. Výše uvedené vztahy jsou hrany docs/generated/graph.json, které spustitelný program zapisuje ze stejného indexu.

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