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ě
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á | typ | command | výsledek | u commitu |
|---|---|---|---|---|
| timed_out_mutation_runs_once_test | test | cargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --test mcp_bridge_resend | test 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_test | test | cargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --test mcp_bridge_resend | test 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.