@@ -37,25 +37,39 @@ These run in `cargo nextest run` with no Docker dependencies.
3737## MCP Conformance CI
3838
3939` .github/workflows/mcp_conformance.yml ` runs the pinned official conformance
40- suite ` 0.2.0-alpha.11 ` with ` --requirements 2026-07-28` . Its small live path is
41- official runner → nginx → checked-out dataplane → fixture proxy → official
42- fixture , with the published ` latest ` control plane registering and publishing
40+ suite ` 0.2.0-alpha.11 ` for MCP ` 2026-07-28 ` in both directions. The server leg
41+ is official client → nginx → checked-out dataplane → fixture proxy → official
42+ server , with the published ` latest ` control plane registering and publishing
4343the fixture through Redis. The backend-only proxy rewrites ` Host ` to
4444` localhost:3000 ` , which the official fixture's DNS-rebinding protection
4545requires, while leaving dataplane header protections unchanged. The control
4646plane uses ephemeral SQLite, so PostgreSQL is unnecessary. The harness lives
4747in ` tests/conformance/ ` .
4848
49+ The scoped client leg then treats the dataplane as an MCP client: the official
50+ runner starts a scenario backend, the adapter publishes an isolated route to
51+ Redis, and a downstream ` tools/call ` makes the dataplane connect to that
52+ backend. It covers tool calls, per-request client metadata and protocol-version
53+ retry, standard MCP headers, and custom parameter headers. The control plane is
54+ stopped first so its periodic publisher cannot replace the scenario route or
55+ probe the observation backend. OAuth client scenarios remain a control-plane
56+ responsibility. Server and client results are written below ` server/ ` and
57+ ` client/ ` , with separate ` expected-failures.yml ` and
58+ ` client-expected-failures.yml ` baselines.
59+
60+ ` make conformance ` runs both legs locally, while ` make conformance-bless ` runs
61+ both and refreshes both expected-failure baselines from that run.
62+
4963Because this conformance CLI cannot set a bearer header, nginx adds an
5064ephemeral control-plane token when one is absent; there is no auth proxy or
5165repository-owned JavaScript. A route probe prevents control-plane fallback.
52- Counts and the official fixture log appear directly in the Actions log, and
53- ` expected-failures.yml ` guards the current baseline. The job does not retain a
54- separate conformance artifact. ` upstream-fixture-failures.yml ` records the
55- pinned fixture's seven scored failures and one warning; its other 47 failures
56- are extension or pending scenarios and are already unscored. CI prints the
57- exact actual-versus-baseline diff, adds annotations for unexpected and stale
58- entries, and writes the same comparison to the job summary.
66+ Counts and the official fixture log appear directly in the Actions log. The
67+ job does not retain a separate conformance artifact.
68+ ` upstream-fixture-failures.yml ` records the pinned fixture's seven scored
69+ failures and one warning; its other 47 failures are extension or pending
70+ scenarios and are already unscored. CI prints the exact server
71+ actual-versus-baseline diff, adds annotations for unexpected and stale entries,
72+ and writes the same comparison to the job summary.
5973
6074## Full-Stack Integration Harness
6175
0 commit comments