Co to znamená
Lease pod .ai/local/state/mcp/ je jediné, co sdílený server zapisuje, a jediné, co se může mezi klienty pokazit. Ať obsahuje při dalším startu majordomus mcp cokoli, ten proces dostane server: živý se připojí, zastaralý (server byl zabit), poškozený (není dokument leasu), prázdný (vlastník zemřel mezi vytvořením a zápisem) nebo opuštěný (po lhůtě pro bind bez URL) se převezme a log uvede, který to byl. Když soubor nelze vůbec zapsat ani nahradit nebo sdílený server nelze spustit, klient je obsloužen sám, přesně jak by ho obsloužil --standalone, s cannot use the shared server a důvodem v logu; klienta odmítnou jen chyby samotné vrstvy. Ctrl-C, klient zabíjející svůj server nebo zavírající se terminál odstraní lease dříve, než proces zemře.
Princip
src/lease.rs při každém pokusu klasifikuje existující lease (živý, zastaralý, poškozený, prázdný, opuštěný, stále platný), převezme každý nepoužitelný a pokus omezuje časem, ne počtem kol; handler SIGTERM, SIGINT nebo SIGHUP odlinkuje zaznamenanou cestu leasu a znovu vyvolá signál. src/commands/mcp.rs promění selhání volby nebo startu v samostatnou relaci (Backend::Alone), a to pro nového klienta i pro most, který nemůže ani převzít, ani se znovu připojit. src/http/server.rs varuje, když vázaná adresa není loopback.
Jak to vidět
just build
# in a checkout where no shared server is running (cat .ai/local/state/mcp/server.json says so)
mkdir -p .ai/local/state/mcp && printf '{not a lease' > .ai/local/state/mcp/server.json
apps/majordomus-cli/target/debug/majordomus mcp < /dev/null
# stderr: corrupt lease: not JSON (...); taking it over ... then: shared server listening on http://127.0.0.1:8741 ...
chmod 555 .ai/local/state/mcp
apps/majordomus-cli/target/debug/majordomus mcp < /dev/null
# stderr: cannot use the shared server: .../server.json: Permission denied ...; serving this client alone ...
chmod 755 .ai/local/state/mcpCo nepokrývá
kill -9 nelze zachytit, takže lease zůstane k převzetí dalším procesem, což je zastaralý případ výše. Most, který převezme po smrti svého serveru, začíná s prázdnou nástěnkou peerů: oznámení jsou paměť jednoho procesu. Klient HTTP, který odejde bez DELETE /mcp, nechá server, jehož vlastník už odešel, naživu až do idle timeoutu. Klient obsluhovaný sám nemá žádné peery, žádné Swagger UI a žádné URL ve svém initialize, protože není nic sdíleného, na co by ukázal.
Proč existuje
Adversariální sondy sdíleného serveru 2026-09-05 zjistily, že poškozený lease vyřadil všechny klienty s exit 13 a že nezapisovatelný adresář leasů udělal totéž, obojí tiše z pohledu klienta. Pravidlo project.shared-server-resilience a dodatek k .ai/repo/adrs/0003-shared-mcp-server-peers-and-client-autostart.md činí záruku doktrínou; apps/majordomus-cli/tests/mcp_shared.rs dokazuje každou cestu nad skutečnými procesy, rourami a sockety a test/cases/90_mcp_shared_server.sh zasadí poškozený lease za bin/majordomus-mcp a sleduje, že relace uspěje a lease potom zmizí.