Skip to content

Commit e431a29

Browse files
committed
docs(codex): explain two-layer external-MCP smoke resilience
Document why grep stays in TRANSIENT_EXTERNAL_MCP_SERVERS (in-probe graceful skip) AND is passed via --skip-server in CI: the MCP client's anyio cancel scope can raise during event-loop shutdown after _main_async returns, outside every per-server handler, so unreachable hosted/localhost MCPs are skipped in CI by policy while staying statically validated. Prevents a future regression that drops either layer and reintroduces the shutdown crash. No behavior change (comment only).
1 parent a47a32c commit e431a29

1 file changed

Lines changed: 11 additions & 0 deletions

File tree

scripts/smoke_mcp_capabilities.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,17 @@
3232

3333
AUTH_REQUIRED = {"figma"}
3434
STARTUP_ENV_REQUIRED = {"github"}
35+
# Hosted/external MCP resilience is two-layered, and both layers are deliberate:
36+
# 1. In-probe: _probe_with_retries downgrades transient failures (504s, timeouts,
37+
# anyio cancel-scope teardown) from servers in this set to a graceful "skip"
38+
# rather than failing the smoke (see tests/unit/test_smoke_mcp_capabilities.py).
39+
# 2. CI policy: the same external (grep) and localhost (figma) servers are also
40+
# passed via --skip-server in CI. GitHub-hosted runners cannot reach them
41+
# reliably, AND the MCP client's anyio cancel scope can still raise during
42+
# event-loop shutdown (after _main_async has already returned its exit code),
43+
# which is outside every per-server handler. Both servers stay statically
44+
# config-validated and work in real owner use. Do not drop the CI skips or
45+
# this transient set without re-proving both layers.
3546
TRANSIENT_EXTERNAL_MCP_SERVERS = {"grep"}
3647
TRANSIENT_EXTERNAL_FAILURE_MARKERS = (
3748
"504 Gateway Timeout",

0 commit comments

Comments
 (0)