Forenzní zjištění, změřené 2026-09-10 proti origin/master při merge PR #147, v primárním checkoutu a v jednom linked worktree. Odpovídá na jedinou otázku: když do tohoto repozitáře vstoupí člověk nebo agent, co zkonverguje samo — sestavený spustitelný soubor, běžící sdílený server, připojená relace, peer na nástěnce, načtené pokračování — a co stále čeká, až si někdo vzpomene na příkaz.
Cíl, proti němuž se měří, je invariant, který tomuto repozitáři předložil balík promptů (balík „automatic control plane“, SPEC.md): vstup do povoleného repozitáře nebo start podporované relace agenta konverguje, idempotentně a v omezeném čase, k jednomu zdravému místnímu serveru, dohledatelným povrchům, připojené relaci, přítomnosti peerů a načtené kontinuitě, bez ručního startu či připojení. Každý nález níže uvádí soubor a řádek, z něhož byl přečten, a příkaz, který ho ukáže znovu. Nic zde není číslo, které repozitář umí spočítat; kde na čísle záleží, uvádí se místo něj příkaz, který ho spočítá.
Slovník
Balíček mluví vlastním jazykem. Tento repozitář už má slova pro většinu z něj (CONCEPTS.md) a tento dokument používá slova repozitáře.
| balíček říká | toto úložiště říká | kde |
|---|---|---|
| řídicí rovina | sdílený server a lokální služby | ADR 0003, ENVIRONMENT.md |
| požadovaný / pozorovaný stav runtime | lease a co testuje env | apps/majordomus-cli/src/lease.rs, src/environment/services.rs |
| definice služby / deskriptor endpointu | webový povrch, objevený u svého producenta | ADR 0013, src/web/discover.rs |
| identita relace | epizoda (session) otevřená událostí poskytovatele | ADR 0015, lib/session.sh |
| identita agenta, přítomnost peera | peer na nástěnce | ADR 0003, src/peers.rs |
| nárok na práci | rozsah: rozsah úlohy, nebo ten, který peer oznámil | CONCEPTS.md (tvrzení), src/peers.rs |
| deskriptor předávky | předávka, rozlišená podle worktree a větve | CONTINUITY.md |
| adaptér poskytovatele | adaptér životního cyklu v lib/capture.sh a shimy hooků | ADR 0009, ADR 0015 |
| snímek řídicí roviny | RepositoryEnvironment (služby) + health.report + peers.list + continuity.state | čtyři schopnosti dnes, jedna hodnota nikde |
Cesta od vstupu ke spolupráci, tak jak je
flowchart TD cd["cd <repo><br>direnv → .envrc → bin/majordomus-env<br>→ majordomus env export --banner --bridge<br>exports MAJORDOMUS_ROOT/SHARE/COMPLETION_BIN,<br>and MAJORDOMUS_URL only if a lease exists<br>one TCP connect to the lease's address,<br>no HTTP, no version, no identity<br>never builds, never starts anything<br>.envrc:33, src/environment/shell.rs:116-130"] agent["agent starts<br>Claude Code fires SessionStart<br>→ .claude/hooks/majordomus-session-start<br>→ majordomus capture session --event start<br>→ session start --if-open keep<br>→ briefing on stdout (episode, task,<br>blockers, handover Next Action)<br>no peer board, no server, no announce<br>lib/capture.sh:797-816"] mcp["MCP client attaches<br>.mcp.json → bin/majordomus-mcp<br>→ majordomus mcp → lease::elect<br>first process serves (lease + loopback HTTP),<br>later ones bridge<br>the only thing that starts the server<br>src/commands/mcp.rs:135, src/lease.rs:89"] peer["peer on the board<br>attach on initialize, named p<n>;<br>announce is a tool call the model<br>may or may not make<br>in memory, gone with the process<br>src/peers.rs:268, :315"] context["context loaded<br>majordomus context when somebody runs it;<br>the briefing carried the handover already"] cd --> agent agent --> mcp mcp --> peer peer --> context
Odkazováno z tohoto diagramu (2)
- agent se spustí Claude Code spustí SessionStart → .claude/hooks/majordomus-session-start → majordomus capture session --event start → session start --if-open keep → briefing na stdout (epizoda, úloha, blokátory, Next Action předávky) žádná nástěnka peerů, žádný server, žádné oznámení lib/capture.sh:797-816
- kontext načten majordomus context, když jej někdo spustí; briefing už předávku nesl
Co je dnes skutečně automatické: spustitelný soubor sestaví první launcher, který jej potřebuje (bin/majordomus-cli:36-56); první klient MCP spustí server a každý další se připojí (ADR 0003); startovací událost poskytovatele otevře epizodu a předá modelu další akci poslední předávky (ADR 0015, ADR 0017); zastaralé lease každého tvaru je převzato (project.shared-server-resilience); nahrazený spustitelný soubor ztrácí své lease (tests/shared_units.rs:147).
Co není: při vstupu nic nezajišťuje server; shell ani agent bez MCP žádný nedostane; linked worktree dostane vlastní server a nikdy nevidí server repozitáře; dvě relace v jednom checkoutu sdílejí jednu epizodu; nástěnka při restartu zapomene všechno a nikdy nic nevyprší; žádná plocha neukazuje vlastní stav serveru; jediný příkaz, který má každý worker spustit jako první, zahynul na mlčícím peeru.
Hlavní příčiny, seřazeno
P0 — invariant nemůže platit, dokud toto stojí
-
Jeden server na checkout, ne na repozitář. Lease žije v kořeni checkoutu (
src/lease.rs:63-65), kořenem je nejbližší.ai/manifest.yaml(src/repository.rs:146-160), každý worktree jeden má a identita, kterou sonda porovnává, je digest toho kořene (src/repository.rs:256-261,src/lease.rs:264). Linked worktree si tedy zvolí vlastní server na vlastním portu s vlastní nástěnkou a záložní odkazcontextna lease primárního (lib/context.sh:344-353) čte nástěnku, která patří jinému checkoutu, jehož peeři nenesou pole worktree. ADR 0003,CLAUDE.mdidocs/MCP.md:50říkají „na repozitář“. Scénář worktree v balíku nesele; je nedosažitelný. Reprodukce: v linked worktree, zatímco primární obsluhuje,bin/majordomus-cli env status --format json | jq '.services[0].availability'. -
Entry nic nezajišťuje.
.envrcsleduje lease a vyhodnotí jeden export (.envrc:24,:33);bin/majordomus-envnikdy nebuilduje (bin/majordomus-env:31-50); shim SessionStart otevře epizodu a nedotkne se žádného serveru (lib/capture.sh:797-816). Server existuje, až když klient MCP spustíbin/majordomus-mcp. Shell člověka, relace Codex nebo Gemini bez adaptéru životního cyklu nebo relace Claude, jejíž handshake MCP selhal, všechny vstupují do repozitáře, který nemá server, a nic jim to neřekne.MAJORDOMUS_URLprostě chybí (src/environment/shell.rs:116-130). Reprodukce: bez lease,bin/majordomus-env export --shell direnv | grep -c URL. Uvedení provideři jsou příklady těch, kteří adaptér životního cyklu nesou, a těch, kteří ne; který je který, není seznam, který tento dokument vede — je todocs/generated/providers.md, zapsané zshare/providers.yamlpříkazemmajordomus generate providers(ADR 0024). -
Epizoda je jedna na checkout, klíčovaná na ničem, co provider poslal.
session start --if-open keepvrací otevřenou epizodu bez ohledu na to, co říká--provider-session(lib/session.sh:157-165); záznam nemá pole providera, do kterého by se zapisovalo (share/allow/session.txt), takžecontinuity.state.providerje deklarováno a nikdy neprodukováno (src/capability/builtin/continuity.rs:157-159,:476); událost konce z libovolné relace uzavře epizodu pro všechny (lib/capture.sh:860-884). Sedm souběžných relací změřených 2026-09-09 mělo mezi sebou jeden záznam. „Relace se registruje automaticky“ z balíčku je pravda pro první relaci a tiše nepravda pro každou další. Reprodukce: pošlete dva payloady SessionStart s různými hodnotamisession_idpřes.claude/hooks/majordomus-session-startve fixture, potémajordomus session. -
Přítomnost je paměť procesu bez vypršení a nudge k opětovnému připojení nikdy nepřijde. Nástěnka umírá se serverem (
src/peers.rs:4-12); v běžné cestě vlastníkamajordomus mcpnic nevoláreap(), takže mrtvý HTTP peer zůstáváattached: true, dokud vlastník neodejde (src/shared.rs:27-71nemá žádného sběrače;src/commands/serve.rs:71-75je jediná smyčka, která ho má); oznámení nikdy nevyprší (src/peers.rs:127-135); při failoveru mostu se odpověď reinitialize — instrukce, které říkají „ještě jste nic neohlásili“ — zahodí (src/mcp/bridge.rs:205-221), takže přesný incident, kterýsrc/mcp/protocol.rs:331-343cituje, je na cestě, kde se stal, neopraven. Žurnál rozpracovaný nafeature/peer-board-survives-restart(ADR 0034, přidělené na nástěnce, v době psaní nepushnuté) odpovídá na polovinu restartu a na nic dalšího. Od té doby: vlastní čtenář serveru sbírá vypršelé relace na každé cestě a most po opětovném připojení přehraje poslední přijaté oznámení svého klienta a po převzetí ho přenese na vlastní nástěnku (fáze 03, na této větvi); vypršení u oznámení a epizoda na relaci poskytovatele zůstávají (fáze 04). Reprodukce:curl -s "$MAJORDOMUS_URL/api/v1/peers" | jq '.peers[] | {id, attached, last_seen_seconds_ago}'poté, co byl přemostěný klient zabit pomocíSIGKILL. -
Vlastní stav serveru je na disku a na žádném povrchu a „ready“ má tři definice. Lease nese
pid,url,started_ata identitu spustitelného souboru (src/lease.rs:281-291) a žádná schopnost ji nečte (grep -rn lease apps/majordomus-cli/src/capability/je prázdné).health.reportpočítá peery a o procesu neříká nic jiného (src/capability/builtin/health.rs:416-420). Připravenost rozhodují nezávisleServed::ready(výstup producenta existuje,src/http/surfaces.rs:152-159),health.ready(capabilities > 0,health.rs:480-486) a holé TCP spojeníenv(src/environment/probe.rs:74-89); sonda lease používá čtvrtou otázku,GET /plus digest identity (src/lease.rs:257-268), a žádná se neptá na verzi. Ve spustitelném souboru pro server neexistujestatus,ensure,stopaniexplain(src/cli.rs:31-71) adoctorshellového nástroje neví, že lease existuje (grep -n mcp lib/doctor.sh). Od té doby: lease je jeden typ čtený jednou aserver.statusjej servíruje, sserve status/ensure/stopna spustitelném souboru (etapa 02, 03);health.reportnese kontroluserverrozhodnutou týmž čtením, takže zpráva jmenuje adresu, verzi a zda to, co odpovídá, je kód na disku, a zastaralý lease je zjištění, nikoli mlčení (etapa 09,apps/majordomus-cli/tests/health_server.rs). Odpovědi o připravenosti jsou pojmenovány, ne sloučeny: čtyři otázky o čtyřech subjektech, každá ukázaná na svého vlastníka vdocs/MCP.md(„Four readings of „ready““) a v dokumentaci modulu, kde se těch čtyři setkávají (src/capability/builtin/health.rs).doctorshellového nástroje stále neví, že lease existuje. Reprodukce:bin/majordomus-cli --help | grep -c -E 'status|ensure|stop';curl -s "$MAJORDOMUS_URL/api/v1/health" | jq '.checks[] | select(.id=="server")'.
P1 — invariant platí jen náhodou nebo jen pro jednu relaci
-
majordomus contextskončil bez jediného slova, kdykoli nejnovější peer na nástěnce neohlásil nic. Holé[ -n "$pscope" ] &&bylo posledním příkazem smyčky výpisu (lib/context.sh:398před opravou); podset -ebyl jeho stav stavem pipeline a příkaz skončil kódem 1 bez čehokoli na obou proudech. Případ pokrývající sekci nikdy nedal tichého peera na konec (test/cases/106_context_peers.sh). Opraveno nafix/context-survives-a-silent-peer, případ rozšířen. Reprodukce (před opravou): připojte druhého klienta MCP, který nic neohlásí, pakmajordomus context; echo $?. -
Bootstrap jmenuje příkazy, které se nevyřeší.
.envrc:20dává na cestu jenbin/, takžemajordomusje shellový nástroj;AGENTS.mdaCLAUDE.mdříkají každému workeru, aby spustilmajordomus worktree,majordomus generate,majordomus mcpadocs/ENVIRONMENT.md:8říkámajordomus enva každý končí s 2 a přesměrováním nabin/majordomus-cli(bin/majordomus:87-105,:133-143). Oba bootstrapy se generují z.ai/repo/policy.yaml, takže oprava je jedna šablona. Reprodukce:majordomus worktree; echo $?. -
Volba má tři souběhy, které lease nevidí.
take_overodstraní soubor bezpodmínečně po klasifikaci, která už je stará (src/lease.rs:243-254); převzetísupersedednechá starý proces obsluhovat na jeho socketu vedle nového (src/lease.rs:227-229,src/http/server.rs:77-86); server, jehož lease byl převzat, stále držíHELDa jeho obsluha signálu odlinkuje lease aktuálního serveru přiSIGTERM(src/lease.rs:319,:383-397, přečteno, nereprodukováno); a patnáctivteřinová lhůta pro bind začíná předApp::load, takže studený start pomalejší než ta lhůta způsobí, že čekající peer prohlásí vítěze za opuštěného (src/commands/mcp.rs:169,src/lease.rs:130). Dva klienti naráz jsou otestováni (tests/mcp_shared.rs:939); tři ne; cesta timeoutu při připojení nemá test vůbec. Reprodukce:grep -n JOIN_TIMEOUT apps/majordomus-cli/tests/*.rs(prázdné). -
Dva systémy claimů, které se nikdy nepotkají. Oznámený rozsah peera žije na nástěnce; rozsah úlohy žije v
current.yamlnapříč worktrees;check --overlapčte jen druhý (lib/start.sh:84-97),peers.announcezapisuje jen první (src/capability/builtin/peers.rs:117); jediné místo, kde se kříží, je sekce peers vcontext, která je poradní, za šesti podmínek se sama vypíná (lib/context.sh:348-370) a nedokáže odlišit čtenáře od peerů.CONCEPTS.md:16definuje „claim“ jako první adocs/MCP.md:109jej používá pro druhý. Reprodukce:majordomus check --overlap, zatímco peer oznámil váš rozsah. -
Automatická cesta není to, co testy spouští. Případ 90 vyvolá samotný launcher s
--http-port 0a ručně psanými rámci; žádný test nenechá klienta přečíst.mcp.jsonani nenaváže zdokumentovaný výchozí port (test/cases/90_mcp_shared_server.sh:31-60);.envrcse kontroluje jako text (test/cases/100_environment.sh:24-57); sekce peerů je prokázána proti python stubu (106:38-53);scripts/cockpit-probe:49-84měří jakýkoli server, který klient už spustil; tvrzenímcp-lease-resiliencejmenuje případ, který dokazuje jednu větu z pěti (docs/CLAIMS.yaml:896,90:107-114); případ užitíserve-the-layer-to-ai-clientsnese čtyři tvrzení MCP a jeho scénář nespouští žádný server;project.shared-server-resiliencejmenuje úlohy CItestapages, kterévalidate.ymlnemá. Sada na úrovni crate je silná na pády (tests/mcp_shared.rs:645,:695,:734,:910) a přeskakuje se u změny, která jen vybírárust-integration(scripts/rust-check:52). Reprodukce:grep -rn "8741" apps/majordomus-cli/tests test/cases. -
Cockpit neukazuje žádné peery, žádné relace mimo tento checkout a skrývá dvě vlastní oblasti.
peers.listnemá stránku, položku navigace ani oblast (grep -n peer apps/majordomus-cli/src/cockpit/*.rs);continuityje jeden worktree, jedna větev; navigace vrací méně oblastí, než deklaruje její vlastní doc komentář, takže/cockpit/executionsa/cockpit/qualityodpovídají, ale nelze se k nim dostat a jsou mimo kontrolu sond, která prochází navigaci (src/cockpit/nav.rs:7-11proti:85-154,scripts/cockpit-probe:101-105); seznam stránek vtests/cockpit.rs:14-45a tabulka rout vdocs/COCKPIT.md:41-60jsou vedeny ručně a zaostávají. Reprodukce:curl -s "$MAJORDOMUS_URL/cockpit" | grep -c '/cockpit/executions'. -
Živý kanál nese provádění a nic jiného. Obálka je typovaná a přehratelná (
src/execution/event.rs:31-47,src/http/events.rs:236-270) a jedinými publikátory jsou úložiště provádění a sink handleru; připojení peera, předání lease nebo přechod zdraví je řádek v logu (src/http/mcp.rs:153,:168,:187). Cockpit dotazuje worktrees a aktivitu (share/cockpit/worktrees.js:4,activity.js:2). Reprodukce:curl -s "$MAJORDOMUS_URL/api/v1/executions/protocol" | jq '.events[].type'.
P2 — drift a duplicita, které opravu pokousají
- Lease se parsuje ručně na čtyřech místech bez typu
Lease:src/lease.rs:204-240,:73-78,src/environment/services.rs:120-131,lib/context.sh:356(jq),.just/serve.just:19(sed, což se rozbije v den, kdy se soubor zformátuje). docs/MCP.md:32říká, že server nespouští nic než klient;serveano (src/commands/serve.rs:53-62) a na terminálu běží donekonečna bez klienta (:70-76). ADR 0003 říká, že Swagger UI je na/docs; je na/swagger(src/http/swagger.rs:35). Převzetísupersededje zdokumentováno v komentáři kódu a unit testu a v žádném dokumentu.docs/WEB.md:30-40vynechává/events, přestože tvrdí, že nic v jeho tabulce není typováno dvakrát.docs/ENVIRONMENT.md:59vynechává--bridgea:74-75jmenuje.just/env.just, které neexistuje;just envexistuje jen v nesledovaném generovaném mostu.lib/capture.sh:709-711říká, že událost start nezapisuje nic na stdout;:784-796říká opak a je to, co běží.- Fakta zapsaná dvakrát: cesta lease v osmi souborech; výchozí port na stránkách tvrzení a v
docs/MCP.md; skládání cesty spustitelného souboru vjustfile:28-29alib/rust_bin.sh:52-66; sdílený adresář vjustfile:32alib/rust_bin.sh:105; jméno poskytovatele a klíče jeho payloadu ve dvou tabulkách adaptérů (lib/capture.sh:108,:137) a čtyřech shimech; výchozí build profil v pěti souborech. Seznam k udržování jedocs/HARDCODING_LEDGER.yaml; tyto řádky v něm nejsou. doctorse nikdy nezastaví na nálezu (lib/doctrine.sh:153-163,lib/common.sh:35) a běží nad svůj rozpočet (MJ_TIMING=1 majordomus doctor); varování o nepushnuté větvi je holémj_warnmimo registr doktríny (lib/doctor.sh:349).- Otisk workflow nepokrývá generovaný most (
src/environment/resolve.rs:596-615) a.envrcnesleduje spustitelný soubor, takže build po vstupu nic nezmění, dokud se nezmění lease.
Matice auditu
| schopnost | kanonický zdroj | startuje / registruje se | CLI | HTTP | OpenAPI | MCP | Cockpit | dokumentace | tests | status |
|---|---|---|---|---|---|---|---|---|---|---|
| spustitelný soubor je přítomen a aktuální | lib/rust_bin.sh | sestaveno prvním launcherem; nikdy při vstupu | — | — | — | — | — | ENVIRONMENT.md | případy 33, 107 | funguje, záměrně ručně na cd |
| sdílený server | src/lease.rs, src/shared.rs | jen prvním MCP klientem | mcp, serve | / | infrastruktura | inicializační instrukce | — | MCP.md | tests/mcp_shared.rs, případ 90 | částečné: po checkoutech, bez status/stop |
| stav serveru (pid, url, spuštěn, spustitelný soubor, verze) | soubor leasu | — | — | — | — | — | — | MCP.md:46 | shared_units.rs:81 | dekorativní: jen na disku |
| objevování endpointů | služby src/web/discover.rs → env | jen soubor leasu | env status | /, /api/v1/environment, /api/v1/web/surfaces | ano | ano | /cockpit/api | WEB.md, ENVIRONMENT.md | tests/environment.rs, případ 100 | funguje, se sondou TCP spojení |
| zdraví | src/capability/builtin/health.rs | — | — | /api/v1/health, /live, /ready | ano | ano | /cockpit/health | COCKPIT.md | tests/http_serve.rs | částečné: tři definice připravenosti, žádná fakta runtimu |
| epizoda (relace) | lib/session.sh | startovací událostí poskytovatele | session | /api/v1/continuity | ano | ano | /cockpit/continuity | CONTINUITY.md | případy 54, 55, 60-63 | částečně: singleton na checkout |
| přítomnost peerů | src/peers.rs | připojit se při initialize; oznámit ručně | — | /api/v1/peers | ano | majordomus_peers | žádné | MCP.md | mcp_shared.rs:247, případ 106 (zástupný) | částečně: paměť, bez expirace, bez stránky |
| tvrzení | oznámení na nástěnce / rozsah úlohy | ručně ohlásit; start --scope | check --overlap | /api/v1/peers/announce (přes HTTP zamítnuto) | ano | majordomus_announce | žádné | MCP.md, CONCEPTS.md | peers.rs jednotek, případ 106 | legacy-conflicting: dva systémy |
| předávka / checkpoint | lib/handover.sh, lib/checkpoint.sh | odvozeno událostmi end a compaction | handover, checkpoint | /api/v1/continuity | ano | ano | /cockpit/continuity | CONTINUITY.md | případy 25, 54, tests/continuity.rs | pracuje |
| načtení kontextu | lib/context.sh, lib/derive.sh | briefing při startu | context | — | — | — | — | CONTINUITY.md | případy 23, 106 | po opravě funguje; nástěnka není v briefingu |
| živé události | src/execution/event.rs, src/http/events.rs | — | executions events | /events | protokolový dokument | ano | stránky provedení | EXECUTIONS.md | tests/executions.rs, případ 100 | funguje, jen provedení |
| adaptér poskytovatele | lib/capture.sh tabulky adaptérů, .claude/hooks/* | instaluje capture install | capture | — | — | — | — | CONTINUITY.md | případy 29, 54 | funguje pro jednoho poskytovatele; ostatní unsupported |
Graf závislostí
flowchart TD a["A identity: one repository, every server of it<br>(the git repository named beside the checkout;<br>the servers of one listed from any of them)"] b["B the server's state as one typed value<br>(lease read once by a Lease type; status,<br>version, executable, peers, readiness on<br>every surface)"] c["C ensure: entry converges<br>(the start event and the MCP launcher<br>call it; a shell is told, not served;<br>bounded, idempotent, concurrency-safe)"] d["D episode keyed on the provider's session<br>(one record per session, ended by its owner)"] e["E presence: expiry, reaper, reconnect nudge,<br>claims with a lease (journal from ADR 0034)"] f["F events for peers, lease, health<br>on the existing typed channel"] g["G Cockpit: peers, sessions, server state"] h["H gates: cold start through the configured path,<br>storm, crash, two worktrees, two providers,<br>drift; rule + ADR; docs"] a --> c b --> c c --> f f --> g
D, E a H záměrně nenesou hranu. Kresba, kterou toto nahradilo, vedla od C jedinou svislou kolejnici a dotýkala se jí D, F i G, což se čte jako C → D; odstavec níže říká opak a uvádí důvod — D „je nezávislé na A–C a blokuje relace se automaticky registrují balíčku samo o sobě“. Kolejnice byla prvek rozvržení, ne závislost, a přežívá věta s odůvodněním.
A musí přistát první: každý další krok, který říká „repozitář“, myslí git repozitář, a dnes kód myslí checkout. ADR 0035 bere A a B: volba zůstává na checkout, protože server obsluhuje vrstvu checkoutu, v němž byl spuštěn, a to, co chybělo — aby se servery jednoho repozitáře daly odlišit od serverů dvou a vypsat z kteréhokoli z nich — řeší indexová routa a server.status. B před C: ensure hlásí stav, ke kterému zkonvergoval, takže stav musí mít napřed typ. D je nezávislé na A–C a samo blokuje „relace se registruje automaticky“ z balíčku. E závisí na větvi žurnálu nebo ji nahrazuje a nesmí se stavět dvakrát. F, G, H následují.
Starý kód ke smazání nebo sloučení a vlastníci k zachování
Smazat nebo sloučit:
- čtyři ruční parsery lease (položka 13): u tří spustitelných souborů hotovo díky
LeaseFile::readadva čtenáři v shellu zůstávají do fáze 09— v534e8fb7bcse přesunuli naserve statusascripts/ci/lease-reader-checkhlásí jednoho čtenáře; vlastní čtečka lease(přesunutá vlib/context.sh534e8fb7bc) a její načítání nástěnky, jakmile spustitelný soubor nástěnku hlásí a shellový nástroj se ptá jej — jedna čtečka, ne dvě..just/serve.just:12-20(mcp-status,open) parsující lease pomocísed; recepty zůstávají a volají příkaz stavu.- čtyři nezávislé odpovědi o připravenosti (P0 položka 5); jedna zůstává a ostatní ji volají.
- služby
environmentse testují jako holé TCP spojení, jakmile bude existovat typovaný stav. - systém nároků jen s oznámeními, nebo ten jen s rozsahem úlohy — ne oba; rozsah úlohy je trvalá, vynucovaná forma (
.ai/repo/features/coordination.md), takže nástěnka by měla nést ji, a ne druhou.
Zachovat a stavět na tom:
- volba jedním atomickým vytvořením a lease každého převzatého tvaru (
project.shared-server-resilience) a jeho sady testů; - snapshot prostředí jako jedna hodnota, kterou vykresluje každý povrch (
project.envrc-is-an-adapter); ensure je jeho spotřebitel, ne soupeř; - provider, který vede hranici epizody, a odvozený briefing (ADR 0015, ADR 0017);
- provádění jako typovaný kanál událostí (ADR 0033) — peeři a lease na něm publikují, nedostávají druhý socket;
- registr schopností jako jediné místo, kde se deklaruje povrch (ADR 0002, ADR 0004).
Odmítnuto a proč
- Server spuštěný na
cd.project.envrc-is-an-adapterzakazuje vstupnímu hooku cokoli spouštět a ADR 0003 odmítá daemon: bez klienta není proces. Shell není klient. Vstup shellem hlásí stav a pojmenuje příkaz; vstup agentem (startovní událost poskytovatele, MCP launcher) konverguje, protože klient přichází. - Kontrola zdraví jen podle PID. Již odmítnuto pravidlem
tests/shared_units.rs:142-146; zůstává odmítnuto. - Druhý event socket pro peery. Existuje jeden typovaný kanál; nový rozsah na něm je rozšíření protokolu, ne nový transport.
- Porty na více místech.
src/cli.rs:898je jediná deklarace; dokumenty, které ji opakují, jsou projekce k regeneraci, ne fakta k uchování.
Plán, namapovaný na fáze balíčku
| fáze | slice | větev | přistává |
|---|---|---|---|
| 01 | tento audit; oprava context | feature/entry-convergence, fix/context-survives-a-silent-peer | nyní |
| 02 | ADR 0035: server checkoutu je jedním ze serverů repozitáře (git_repository_id na indexové routě, server každého checkoutu vypsán pomocí server.status); lease čtený jednou pomocí LeaseDocument; postavení serveru — chybí, startuje, připraven, zastaralý, opožděný — servírováno jako každá jiná schopnost | feature/entry-convergence | s tímto dokumentem |
| 03 | serve status / serve ensure / serve stop na spustitelném souboru; událost start volá ensure (session.ensure_server_on_start) a briefing jmenuje server; nečinný život serveru, který nevlastní žádný klient; závody při volbě (lease udržovaný naživu při načítání, podmíněné převzetí, publikace odmítnutá po převzetí, lease uvolněný při ztrátě); reaper na každé cestě; souběžný ensure při N≥3, zabitý server, zastaralý lease, obsazený port | feature/entry-convergence | s tímto dokumentem |
| 04 | jedna epizoda na relaci poskytovatele; reaper nástěnky na cestě vlastníka; expirace oznámení; odpověď reinitialize dosáhne modelu; claimy jsou rozsahem úlohy | feature/session-per-provider, nad větví žurnálu z ADR 0034 | paralelně k 03 |
| 05 | peeři, lease a zdraví na typovaném kanálu; oblast Cockpitu pro peery a server; navigace odvozená z oblastí, které deklaruje; seznamy stránek v testech a dokumentech odvozeny | feature/entry-surfaces | po 03, 04 |
| 06 | adaptéry životního cyklu Codex a Gemini (data v share/providers.yaml, ne kód) | feature/lifecycle-adapters | paralelně |
| 07 | pravidlo project.entry-converges s kontrolou; docs/ENTRY.md; řádky HARDCODING_LEDGER.yaml pro položku 15; šablona bootstrapu jmenuje spouštěč | feature/entry-convergence | s 03 |
| 08 | studený start přes .mcp.json na výchozím portu jako výhradní případ; bouře; pád na úrovni shellu; dva worktrees, jeden server; dva poskytovatelé; vložení driftu do nástěnky | feature/entry-gates | po 05 |
| 09 | lib/context.sh a .just/serve.just534e8fb7bc, s pravidlem project.the-lease-is-read-once, kontrolou scripts/ci/lease-reader-check a případem 110); feature/health-names-the-server, s kontrolou server na health.report); dokumenty v bodě 14 | feature/entry-convergence, feature/health-names-the-server | poslední |
Co tento audit neověřil
- Souběh v obsluze signálu (položka 8, třetí klauzule) byl přečten, nikoli reprodukován.
feature/peer-board-survives-restartbylo přečteno ze svého worktree, necommitnuté; to, co přistane, se může lišit.- Čas vstupu byl měřen za tepla, na jednom stroji, třikrát;
benchje nástroj pro tvrzení.