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 bez provider hooků dostane epizodu provádění z připojení MCP, po pádu naváže na vlastní a nikdy se netvrdí, že byl zachycen jeho prompt

Majordomus vede hranici epizody pod modelem, aby se epizoda, na které záleželo (ta, která skončila pádem, kompakcí nebo zavřením okna), zaznamenala, ať si model vzpomněl ji zaznamenat, nebo ne. Do ADR 0103 to bylo zapojené pro jednoho providera: Claude Code spouští SessionStart a SessionEnd, shim spustí capture session a repozitář dostane epizodu. Každý další klient nedostal vůbec nic.

deklarovaný stavdeklarovaný stav: zaručeno Deklarováno jako deterministické a blokující, implementováno a s uvedeným behaviorálním testem, který to má dokázat. Zda to zaznamenaný běh podporuje, říká verdikt důkazů zobrazený vedle.

zaznamenané důkazyzaznamenané důkazy: nespuštěno Deklarováno jako zaručené, ale nepodložené zaznamenaným během: test je pojmenován, ale žádný úspěšný běh nad současnými vstupy zaznamenán není. jak se zaznamenávají důkazy

Epizoda se otevírá na episodes.attach a nikdy na initialize, takže klient, který vrstvu jen čte, nezanechá záznam; je klíčována vnější identitou, kterou klient dodá, a nikdy id peera, které se přiděluje pro každé spojení; každá zpráva, kterou klient pošle, je jeho heartbeat; ztráta spojení epizodu odpojí, ne uzavře, a opětovné připojení pod toutéž identitou pokračuje ve stejné epizodě. Nic z toho nezapisuje záznam relace - nástěnka spouští `capture session --provider generic`, tentýž příkaz, který spouští shim hooku poskytovatele, a hlásí, co řekl. Zachycení promptu je pro spojení deklarováno jako nemožné a nepokouší se o ně: serveru MCP se předávají volání nástrojů, nikdy prompt, který je vyvolal. ADR 0103.

Co to znamená

Majordomus vede hranici epizody pod modelem, takže epizoda, na které záleželo — ta, která skončila pádem, kompakcí nebo zavřením okna — je zaznamenána, ať už si model záznam pamatoval, nebo ne. Do ADR 0103 to bylo zapojeno pro jediného providera: Claude Code spouští SessionStart a SessionEnd, shim spouští capture session a repozitář dostane epizodu. Každý další klient nedostal nic.

Klient bez hooků má hranici také a sdílený server na ní stojí. Klient mluví initialize, zavolá majordomus_session_attach se svým vlastním trvalým jménem sezení, pracuje a odejde. Epizoda se otevře při připojení, každá zpráva, kterou pošle, je heartbeat této epizody, ztráta spojení epizodu odpojí, ne uzavře, a klient, který se vrátí pod stejným jménem, dostane svou vlastní epizodu znovu — pod jakýmkoli peer id, které má teď. Záměrné majordomus_session_detach ji uzavře do záznamu relace; klientovi, který prostě zmizí, se epizoda po uplynutí odkladu pro opětovné připojení uzavře jako přerušená a rozdíl mezi těmito dvěma záznamy je jediná věc o skončené epizodě, která mění to, co kdo udělá dál.

Princip

src/episodes.rs je nástěnka: attach, touch, detach, close, reap, close_all, vedená podle externí identity, kterou dodá klient, a nikdy podle id peera. src/capability/builtin/episodes.rs deklaruje episodes.attach, episodes.detach a episodes.list jako typované deskriptory a registr je promítá jako všechny ostatní: nástroje majordomus_session_attach, majordomus_session_detach a majordomus_episodes, POST /api/v1/episodes/attach, POST /api/v1/episodes/detach, GET /api/v1/episodes, operace OpenAPI, referenci.

Nic z toho nezapisuje záznam relace. Nástěnka spouští majordomus capture session --provider generic --event start|end — tentýž příkaz, který spouští shim hooku poskytovatele, se stejným tvarem payloadu, přes stejný čtecí modul v lib/capture.sh — a hlásí, co řekl, doslova, v poli repository epizody. lib/capture.sh připouští poskytovatele, jehož deklarovaný zdroj epizod je connection, bez řádku adaptéru, protože poskytovatel, který nespouští žádnou událost, nemá žádný tvar vendorova payloadu, kterému by se přizpůsobil.

Tři události spojení tu už jsou a spojují se, nevymýšlejí znovu: mcp/protocol.rs se při každé zprávě dotkne epizody vedle peera, http/mcp.rs ji odpojí při DELETE a při odstraněné relaci a při vypnutí zavře každou, commands/mcp.rs ji odpojí, když odejde klient stdio.

Jak to vidět

just build
# a client with no hooks at all: three frames on stdin, a complete episode on the other side
printf '%s\n' \
  '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"anything","version":"0"}}}' \
  '{"jsonrpc":"2.0","method":"notifications/initialized"}' \
  '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"majordomus_session_attach","arguments":{"external_id":"my-thread"}}}' \
  '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"majordomus_session_detach","arguments":{}}}' \
  | bin/majordomus-mcp --http-port 0 | jq -r '.result.structuredContent.episode.repository // empty'
# session … opened at …
# episode closed (closed, reason detach) into .ai/repo/sessions/…
majordomus capture status        # generic:session  connection  verified

Co nepokrývá

Zachycení surového promptu, a deklarace to říká. Server MCP dostává initialize, volání nástrojů a notifikace; prompt osoby mezi nimi není nikdy, v žádné verzi protokolu. share/providers.yaml zaznamenává generic.offers.prompts: none s tímto zdůvodněním v poli důkazů a pod prompts záměrně neexistuje hodnota connection, po které by někdo mohl sáhnout. Zachycení promptu zůstává specifické pro poskytovatele.

Komprimace. Spojení ji nevidí — nic v protokolu neohlašuje, že klient se chystá zahodit svůj kontext — takže epizoda spojení má start a konec a žádnou třetí událost. Poskytovatel, který spouští PreCompact, si tuto výhodu ponechává.

Epizoda, o kterou nikdo nepožádal. initialize nic neotevírá. Klient, který otevře server, aby přečetl jedno pravidlo, je peer a nezanechává záznam, což je také to, co drží pravdivou záruku test/cases/90_mcp_shared_server.sh: obsluha repozitář nemění vůbec.

Proč existuje

Tvrzení repozitáře, že hranici vede pod modelem, bylo tak, jak bylo zapojeno, tvrzením o jednom dodavateli. Spojení je zdroj událostí, který už vytváří každý klient MCP, nástěnka peerů už sledovala attach, aktivitu a detach a capture session už otevíralo a zavíralo epizody pro providera, který pojmenuje svou relaci; ty tři se musely spojit, ne vymýšlet. test/cases/200_generic_mcp_episode.sh to celé řídí přes bin/majordomus-mcp se skutečnými JSON-RPC rámci — initialize nic neotevírá, attach dosáhne úložiště repozitáře, kill -9 nechá epizodu otevřenou k pokračování, opětovné připojení ji obnoví místo otevření druhé a ztracené spojení odpojí, nezavře — protože životní cyklus, který funguje jen tehdy, když test volá knihovnu, nic nedokazuje o klientovi, kterého někdo skutečně zavřel.

Detail vykreslený z docs/claims/connection-episode.md.

Od tvrzení k důkazu

  1. 1 · veřejné tvrzení

    Klient bez provider hooků dostane epizodu provádění z připojení MCP, po pádu naváže na vlastní a nikdy se netvrdí, že byl zachycen jeho prompt

    Vzniklo na State.

  2. 2 · kanonické tvrzení

    connection-episodedeklarovaný stav: zaručeno v docs/CLAIMS.yaml

    Definováno v přečtěte si to na tomto webu · docs/MCP.md

  3. 3 · implementace

    apps/majordomus-cli/src/episodes.rs

  4. 4 · test a scénáře

    Test: test/cases/200_generic_mcp_episode.sh

  5. 5 · zaznamenané běhy

    zaznamenané důkazy: nespuštěno jak se zaznamenávají důkazy

Ověřte si to sami

Test běží v jednorázovém dočasném repozitáři a ověřuje chování, ne řetězec ve zdrojovém kódu.

z klonu repozitáře
bash test/run.sh 200_generic_mcp_episode

Kde se toto tvrzení používá

pokryté odpovědnosti

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