@@ -64,17 +64,20 @@ jobs:
6464 ./.github/actions/conformance/run-server.sh
6565 --suite active
6666 --expected-failures ./.github/actions/conformance/expected-failures.yml
67+ --output-dir conformance-results/server-active
6768 - name : Run server conformance (draft suite)
6869 run : >-
6970 ./.github/actions/conformance/run-server.sh
7071 --suite draft
7172 --expected-failures ./.github/actions/conformance/expected-failures.yml
73+ --output-dir conformance-results/server-draft
7274 - name : Run server conformance (2026-07-28 wire, all suite)
7375 run : >-
7476 ./.github/actions/conformance/run-server.sh
7577 --suite all
7678 --spec-version 2026-07-28
7779 --expected-failures ./.github/actions/conformance/expected-failures.2026-07-28.yml
80+ --output-dir conformance-results/server-2026-07-28
7881 - name : Run server conformance (all suite, extension scenarios)
7982 # A bare `--suite all` (no --spec-version) selects every scenario
8083 # shipped with the pinned harness — including the extension-tagged
9194 ./.github/actions/conformance/run-server.sh
9295 --suite all
9396 --expected-failures ./.github/actions/conformance/expected-failures.yml
97+ --output-dir conformance-results/server-all
98+ - name : Upload conformance results
99+ # The log has only summary counts; per-check data is in checks.json.
100+ if : failure()
101+ uses : actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
102+ with :
103+ name : server-conformance-results
104+ path : conformance-results/
105+ if-no-files-found : ignore
94106
95107 client-conformance :
96108 runs-on : ubuntu-latest
@@ -118,22 +130,39 @@ jobs:
118130 echo "CONFORMANCE_PKG=file:/tmp/conformance.tgz" >> "$GITHUB_ENV"
119131 ;;
120132 esac
121- - run : uv sync --frozen --all-extras --package mcp
133+ # --compile-bytecode: without it, ~40 concurrently spawned interpreters
134+ # race to byte-compile site-packages during the timing-sensitive window.
135+ - run : uv sync --frozen --all-extras --package mcp --compile-bytecode
136+ - name : Pre-compile bytecode (editable sources)
137+ run : uv run --frozen python -m compileall -q src .github/actions/conformance
122138 - name : Run client conformance (all suite)
123139 # The harness runs all scenarios via unbounded Promise.all; with 40
124140 # scenarios on a 2-core runner the slowest one (sse-retry, which has a
125141 # real-time SSE reconnect wait) needs more than the 30s default budget.
142+ # `.venv/bin/python` (not `uv run`) avoids lockfile re-checks in ~40
143+ # concurrent spawns; run-client.sh re-runs unexpected failures solo.
126144 run : >-
127- npx --yes "$CONFORMANCE_PKG" client
128- --command 'uv run --frozen python .github/actions/conformance/client.py'
145+ ./.github/actions/conformance/run- client.sh
146+ --command '.venv/bin/ python .github/actions/conformance/client.py'
129147 --suite all
130148 --timeout 60000
131149 --expected-failures ./.github/actions/conformance/expected-failures.yml
150+ --output-dir conformance-results/client-all
132151 - name : Run client conformance (2026-07-28 wire, all suite)
133152 run : >-
134- npx --yes "$CONFORMANCE_PKG" client
135- --command 'uv run --frozen python .github/actions/conformance/client.py'
153+ ./.github/actions/conformance/run- client.sh
154+ --command '.venv/bin/ python .github/actions/conformance/client.py'
136155 --suite all
137156 --timeout 60000
138157 --spec-version 2026-07-28
139158 --expected-failures ./.github/actions/conformance/expected-failures.2026-07-28.yml
159+ --output-dir conformance-results/client-2026-07-28
160+ - name : Upload conformance results
161+ # The log has only summary counts; per-check data is in checks.json.
162+ # Also on FLAKE_RESCUED: rescued-flake evidence is otherwise discarded.
163+ if : failure() || hashFiles('conformance-results/**/FLAKE_RESCUED') != ''
164+ uses : actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
165+ with :
166+ name : client-conformance-results
167+ path : conformance-results/
168+ if-no-files-found : ignore
0 commit comments