Skip to content

feat(ext-tasks): example pair + docs riders (slice C) #46

feat(ext-tasks): example pair + docs riders (slice C)

feat(ext-tasks): example pair + docs riders (slice C) #46

Workflow file for this run

name: CI
# Dual-spec feature matrix for the 2026-07-28 cutover branch:
# - default lane is MCP 2026-07-28 (stateless core)
# - 2025-11-25 is the opt-in legacy lane
# Gates derived from docs/plans/2026-07-28-final-readiness-audit.md §7.
# All jobs use standard ubuntu-latest runners (free on public repos).
# The same gates run locally via scripts/ci-gates.sh.
on:
push:
branches: ["**"]
pull_request:
env:
CARGO_TERM_COLOR: always
# Warnings are denied via the explicit `cargo clippy -- -D warnings` step and the
# test-build warning sweep, not a global RUSTFLAGS (which would also fail on any
# transient workspace-crate warning outside the audited gates).
jobs:
default-2026:
name: Default lane (2026-07-28)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# The full workspace debug build (all test binaries) overflows the
# default runner disk — three runs died on "No space left on device"
# with lld Bus errors. Drop the preinstalled SDKs we never use.
- name: Free runner disk space
run: |
sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL
df -h /
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- name: Build (default = protocol-2026-07-28)
run: cargo build
- name: Clippy (deny warnings)
run: cargo clippy --all-targets -- -D warnings
- name: Test
run: cargo test
- name: Warning sweep on the test build
run: |
n=$(cargo test --no-run 2>&1 | grep -c 'warning:' || true)
echo "test-build warnings: $n"
test "$n" = "0"
- name: 2026 stateless acceptance (real HTTP)
run: cargo test -p turul-mcp-server --no-default-features --features http,sse,protocol-2026-07-28 --test discover_stateless_2026
- name: 2026 HTTP surface (GET/DELETE 405, session-id ignored)
run: cargo test -p turul-mcp-server --no-default-features --features http,sse,protocol-2026-07-28 --test stateless_2026_http_surface
- name: 2026 subscriptions/listen (ack-first, filtered delivery)
run: cargo test -p turul-mcp-server --no-default-features --features http,sse,protocol-2026-07-28 --test subscriptions_listen_2026
- name: 2026 request-metadata headers (Mcp-Method/Mcp-Name, -32001/-32004)
run: cargo test -p turul-mcp-server --no-default-features --features http,sse,protocol-2026-07-28 --test mcp_headers_2026
- name: 2026 unknown-method mapping (404 + -32601)
run: cargo test -p turul-mcp-server --no-default-features --features http,sse,protocol-2026-07-28 --test error_mapping_2026
- name: 2026 MRTR (input_required round trip, -32003 capability gate)
run: cargo test -p turul-mcp-server --no-default-features --features http,sse,protocol-2026-07-28 --test mrtr_2026
- name: 2026 Mcp-Param-* mirroring (x-mcp-header validation)
run: cargo test -p turul-mcp-server --no-default-features --features http,sse,protocol-2026-07-28 --test mcp_param_2026
- name: 2026 per-request log gating (logLevel opt-in)
run: cargo test -p turul-mcp-server --no-default-features --features http,sse,protocol-2026-07-28 --test log_gating_2026
- name: 2026 schema fidelity (derive/builders pipeline to the wire)
run: cargo test -p turul-mcp-server --no-default-features --features http,sse,protocol-2026-07-28 --test schema_fidelity_2026
- name: protocol-2026 compliance + upstream wire fixtures
run: cargo test -p turul-mcp-protocol-2026-07-28 --features compliance
- name: Bilingual client (not in default-members)
run: cargo test -p turul-mcp-client
- name: 2026 client example (pairs with minimal-server)
run: cargo build -p streamable-http-client
- name: Client-using examples (not in default-members)
run: cargo build -p mrtr-elicitation-server -p bilingual-fleet-client -p ext-tasks-server --bins
- name: Tasks extension (SEP-2663, opt-in feature)
run: cargo test -p turul-mcp-server --no-default-features --features http,sse,ext-tasks --test ext_tasks_2026
- name: Extension crates standalone
run: cargo test -p turul-mcp-ext-tasks -p turul-mcp-ext-apps
- name: Tasks extension client e2e
run: cargo test -p turul-mcp-client --features ext-tasks --test ext_tasks_e2e_2026
opt-in-2025:
name: Opt-in lane (2025-11-25)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: clippy
- uses: Swatinem/rust-cache@v2
- name: Per-crate 2025-11-25 build matrix
run: |
set -euxo pipefail
cargo build -p turul-mcp-server --no-default-features --features http,sse,protocol-2025-11-25
cargo clippy -p turul-mcp-server --no-default-features --features http,sse,protocol-2025-11-25 -- -D warnings
cargo build -p turul-mcp-builders --no-default-features --features protocol-2025-11-25
cargo build -p turul-http-mcp-server --no-default-features --features sse,protocol-2025-11-25
cargo build -p turul-mcp-derive --no-default-features --features protocol-2025-11-25
cargo build -p turul-mcp-aws-lambda --no-default-features --features cors,sse,protocol-2025-11-25
cargo build -p turul-mcp-client --no-default-features --features http,sse,client-2025-11-25-only
cargo build -p turul-mcp-client --no-default-features --features http,sse,client-2026-07-28-only
cargo build -p client-initialise-server --no-default-features
- name: 2025-11-25 regression E2E (real servers)
run: |
set -euxo pipefail
cargo test -p mcp-tools-tests
cargo test -p mcp-resources-tests
cargo test -p mcp-prompts-tests
cargo test -p mcp-roots-tests
cargo test -p mcp-sampling-tests
cargo test -p mcp-elicitation-tests
cargo test -p turul-mcp-framework-integration-tests --test tasks_e2e_inmemory
cargo test -p turul-mcp-framework-integration-tests --test ping_auth_2025
spec-mutex:
name: Spec mutex (both features must not compile)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Enabling both protocol features must be a compile_error
run: |
if cargo build -p turul-mcp-protocol --features protocol-2025-11-25,protocol-2026-07-28 2>/dev/null; then
echo "ERROR: the spec mutex did not fire — both protocol features compiled together"
exit 1
fi
echo "OK: spec mutex fired as expected"
docs:
name: Rustdoc (deny warnings)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: cargo doc (deny rustdoc warnings)
env:
RUSTDOCFLAGS: "-D warnings"
run: cargo doc --no-deps