name: Tests on: pull_request: branches: [master] push: branches: [master] jobs: test: runs-on: ubuntu-latest strategy: # Don't cancel the other shards/versions when one fails — we want the full # failure picture across the matrix in a single run. fail-fast: false matrix: python-version: ['3.11', '3.12', '3.13'] # Split the suite across 3 parallel shards per Python version. pytest-shard # partitions tests deterministically by test-id hash; the suite was made # shard-safe (no cross-test state leakage) so every shard passes # independently. See docs/agent-memory note on test-suite shard-safety. # NOTE: pytest-shard is 0-indexed — shard ids must be 0..num_shards-1. # Using 1-based ids would crash the out-of-range job AND silently skip # shard 0's tests. shard: [0, 1, 2] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} cache: 'pip' cache-dependency-path: | **/setup.cfg **/requirements*.txt **/pyproject.toml - name: Install dependencies run: | python -m pip install --upgrade pip pip install "pyyaml>=6.0" pytest pytest-timeout pytest-asyncio pytest-shard # Install the `mcp` package so tests/test_mcp_server.py runs in CI. # The package is an optional runtime dep of mcp_server.py — users # who run the MCP integration install it themselves; CI installs # it so test coverage exists. If mcp install fails (Python 3.13 # wheel not yet available, etc.), tests/test_mcp_server.py uses # importorskip and the matrix stays green. pip install mcp || echo "mcp install failed — test_mcp_server.py will importorskip" - name: Run tests (shard ${{ matrix.shard }} of 3) run: pytest tests/ -v --timeout=60 --shard-id=${{ matrix.shard }} --num-shards=3