I2840 — Zrušené volání MCP se zastaví a klient se dozví, že se zastavilo
Respektovat notifications/cancelled na každém přenosu MCP: volání, které pojmenovává, se zastaví v deklarované mezi, odpoví se na něj jako na zrušené místo pozdního výsledku a účinek zapisovače se hlásí jako úplný, žádný nebo neznámý.
PŘIPRAVENO vlna 0 · p1 · profil implementation · běží samostatně
Připraveno. Všechny závislosti jsou hotové, takže majordomus plan start I2840 bude přijato.
Cíl
Respektovat notifications/cancelled na každém přenosu MCP: volání, které pojmenovává, se zastaví v deklarované mezi, odpoví se na něj jako na zrušené místo pozdního výsledku a účinek zapisovače se hlásí jako úplný, žádný nebo neznámý.
Proč
Akceptační kritérium milníku „notifications/cancelled zastaví běžící volání v mezích“ je jediné bez implementace; jeho dva úkoly (I2145 odeslání nejvýše jednou, I2147 meze) jsou HOTOVO, takže milník se četl VERIFY s nedokázaným kritériem. Čteno na masteru 01227a0f74a dne 2026-10-17: Session::notification (apps/majordomus-cli/src/mcp/protocol.rs:245) zpracovává notifications/initialized a každou další notifikaci zahazuje na úrovni debug; žádný transport nesleduje požadavek, který zrušení jmenuje; most stdio předává jeden požadavek najednou pod mutexem (apps/majordomus-cli/src/commands/mcp.rs:82,217), takže zrušení dorazivší za běžícím voláním se přečte až po jeho konci. Testy posílají notifications/cancelled jen jako šum, který relace musí přežít (apps/majordomus-cli/tests/mcp_conformance.rs:463, mcp_shared.rs:810), nikdy proto, aby něco zastavily. Execution engine už má kooperativní příznak zrušení (apps/majordomus-cli/src/execution/engine.rs:340), kterého MCP nedosáhne.
Aktuální stav
notifications/cancelled se na stdio, na mostu i na endpointu Streamable HTTP přijme a ignoruje; zrušené volání doběhne a jeho výsledek je doručen.
Cílový stav
Každý transport drží id požadavků relace za běhu; notifications/cancelled jmenující jedno zvedne příznak zrušení onoho požadavku, který čte dispatcher schopností a engine provádění; stdio bridge čte klienta, zatímco volání probíhá, takže zrušení se přeposílá, ne řadí; zrušený požadavek se zodpoví bez výsledku (podle pravidla zrušení MCP) a zapisovatel s deklarovaným efektem, který mohl proběhnout, se zaloguje jako výsledek neznámý; zrušení jmenující neznámé nebo dokončené id se ignoruje. docs/MCP.md uvádí hranici a co zrušený zapisovatel zanechává.
Rozsah
- apps/majordomus-cli/src/mcp
- apps/majordomus-cli/src/commands/mcp.rs
- apps/majordomus-cli/src/http/mcp.rs
- apps/majordomus-cli/src/execution/engine.rs
- apps/majordomus-cli/tests/mcp_conformance.rs
- apps/majordomus-cli/tests/mcp_conformance_http.rs
- apps/majordomus-cli/tests/mcp_shared.rs
- docs/MCP.md
Závislosti
Žádné. Tento úkol je kořenem grafu.
Kritéria přijetí
- Dlouho běžící volání nástroje, které jmenuje notifications/cancelled, se zastaví v deklarovaném limitu na stdio, přes bridge i přes Streamable HTTP, vše doložené testem se skutečným procesem
- Zrušené volání nedoručí pozdní výsledek a relace odpoví na další požadavek
- Zrušený zapisovatel je hlášen jako dokončený, nezačatý nebo neznámý, nikdy mlčky
- Zrušení jmenující neznámé nebo už zodpovězené id nic nemění
Validace
- bin/majordomus plan validate
- cargo test --test mcp_conformance --test mcp_conformance_http --test mcp_shared
Požadované důkazy
- cancellation_test
Důkazy
Nic nezaznamenáno. Za každým tokenem výše musí stát příkaz nebo artefakt, než lze tento úkol dokončit; vyprávění se odmítá.
Časová osa
- zahájeno
- —
- ověřeno
- —
- dokončeno
- —
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/I2840.yaml. Přečtěte jej zpět pomocí majordomus plan show I2840.