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.

I2145 — Volání nástroje, které mohlo proběhnout, se nikdy neposílá podruhé

Zařídit, aby most stdio znovu odeslal zprávu, jen když server prokazatelně nepřijal nebo nespustil, a každé jiné selhání ohlásil jako chybu, kterou je, aby se žádné volání nástroje neprovedlo dvakrát.

HOTOVO vlna 0 · p0 · profil implementation · běží samostatně

Součást mcp-transports-are-reliable — Every MCP transport delivers each request at most once, bounds what it carries, and honours cancellation.

Cíl

Zařídit, aby most stdio znovu odeslal zprávu, jen když server prokazatelně nepřijal nebo nespustil, a každé jiné selhání ohlásil jako chybu, kterou je, aby se žádné volání nástroje neprovedlo dvakrát.

Proč

Most čeká na odpověď REQUEST_TIMEOUT, 60 s (apps/majordomus-cli/src/mcp/bridge.rs:25). Timeout je Unreachable, což způsobí, že Session::failover znovu volí (apps/majordomus-cli/src/commands/mcp.rs:229-311); když volba najde stejný server jako Peer, most se reinicializuje a znovu volá b.handle(&message) (apps/majordomus-cli/src/commands/mcp.rs:301 a :283 po převzetí), takže se stejné tools/call odešle dvakrát. Pomalý nástroj repository_mutation (je jich šest, plus executions.start, který spustí jakoukoli schopnost) tak může běžet dvakrát. Také jakékoli 4xx kromě 404, například 413, 403 nebo 400, spouští novou volbu (apps/majordomus-cli/src/mcp/bridge.rs:352): zpráva nad limit těla 1 MiB (apps/majordomus-cli/src/http/server.rs:20, 413 na :227-232) se stane 413, pak opětovné odeslání, pak -32603 'shared server unavailable', což jmenuje chybnou příčinu. Most je synchronní pod mutexem (apps/majordomus-cli/src/commands/mcp.rs:218). Gemini povoluje timeout volání 120 s proti 60 s mostu. Základní audit z 2026-10-09 na master 1fb8d6be44, mezera životního cyklu 2 (druhá po autorizaci) a řádek limitu payloadu.

Aktuální stav

Volání nástroje po timeoutu nebo odmítnutí se po nové volbě znovu odešle, ať je jeho efekt jakýkoli.

Cílový stav

failover znovu odešle jen při Sent::SessionLost, odmítnutém spojení nebo nástroji, jehož deklarované hinty provedení říkají idempotentní; jinak klient dostane -32603 s „outcome unknown“ a id požadavku. 4xx jiné než 404 nebo 409 se vrátí jako ta chyba, bez nové volby.

Rozsah

  • apps/majordomus-cli/src/commands/mcp.rs
  • apps/majordomus-cli/src/mcp/bridge.rs
  • apps/majordomus-cli/src/capability
  • apps/majordomus-cli/tests/mcp_shared.rs
  • apps/majordomus-cli/tests/shared_units.rs
  • docs/MCP.md

Závislosti

Žádné. Tento úkol je kořenem grafu.

Kritéria přijetí

  • Mutující volání nástroje, které přesáhne timeout mostu, se provede právě jednou, což dokládá testovací nástroj počítající svá vyvolání
  • Odpověď 413 pro příliš velkou zprávu dorazí ke klientovi jako payload too large a žádná volba nenásleduje
  • Volání nástroje jen pro čtení, které vypršelo, se zopakuje a vrátí svou odpověď
  • docs/MCP.md uvádí, kdy most odesílá znovu

Validace

  • bin/majordomus plan validate
  • cargo test --test mcp_shared --test shared_units

Požadované důkazy

  • timed_out_mutation_runs_once_test
  • rejected_request_is_not_reelected_test

Důkazy

pokrývátypcommandvýsledeku commitu
timed_out_mutation_runs_once_testtestcargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --test mcp_bridge_resendtest result: ok. 5 passed; 0 failed (run 2026-10-14 between 07:40Z and 07:58Z on master ce5959db59)ce5959d
rejected_request_is_not_reelected_testtestcargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --test mcp_bridge_resendtest result: ok. 5 passed; 0 failed (run 2026-10-14 between 07:40Z and 07:58Z on master ce5959db59)ce5959d

Časová osa

zahájeno
2026-10-14T08:01:47Z
ověřeno
—
dokončeno
2026-10-14T08:01:55Z

Tato tři pole, důkazy výše a stav závislostí jsou vše, z čeho se stav skládá. Neexistuje žádné pole stavu, které by s nimi mohlo být v rozporu.

Kanonický záznam: .ai/repo/project/issues/I2145.yaml. Načtěte jej zpět pomocí majordomus plan show I2145.

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