From 09b0d591bc68cb4409e98d47e0a79ba0763007bd Mon Sep 17 00:00:00 2001 From: Will Date: Wed, 11 Nov 2026 09:04:42 -0800 Subject: [PATCH 1/2] Deploy docs on version tags and by hand only The docs workflow now runs on a v* tag push and on workflow_dispatch, and not on every push or pull request commit. A tag or a manual run on main deploys; a manual run on any other branch builds without deploying, which is how a pull request's docs are checked once it is ready to merge. Co-Authored-By: Claude Fable 5.2 --- .github/workflows/docs.yaml | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 654cb58..a8c6b89 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -1,15 +1,23 @@ name: docs on: - # Rebuild after every benchmark run so the charts carry the newest point; - # workflow_run fires on the default branch only. - workflow_run: - workflows: [benchmark] - types: [completed] + # Deploy on a version tag, so the site describes the released version. + # Run by hand (workflow_dispatch) on a pull request's branch to check the + # build before merging: that builds without deploying. A manual run on main + # redeploys. Not run on every push or pull request commit. + # Release order: push the version bump to main as the last commit, wait for + # tests and benchmark to finish on it, then tag. The tag's deploy then + # includes a benchmark point measured on the released commit. + push: + tags: ["v*"] workflow_dispatch: permissions: contents: read pages: write id-token: write +# One run at a time per ref; a running deploy is never cancelled. +concurrency: + group: pages-${{ github.ref }} + cancel-in-progress: false jobs: build: runs-on: ubuntu-latest @@ -24,11 +32,13 @@ jobs: if git fetch --depth=1 origin gh-pages 2>/dev/null && git checkout origin/gh-pages -- dev/bench 2>/dev/null; then mkdir -p docs/build/html/dev && mv dev/bench docs/build/html/dev/ fi - - uses: actions/upload-pages-artifact@v3 + # Only a tag or main deploys; a manual run on another branch is a build check. + - if: github.ref_type == 'tag' || github.ref == 'refs/heads/main' + uses: actions/upload-pages-artifact@v3 with: path: docs/build/html deploy: - if: github.ref == 'refs/heads/main' + if: github.ref_type == 'tag' || github.ref == 'refs/heads/main' needs: build environment: name: github-pages From ce41485fe10ccf83a20d1b0b0eda98b003d87092 Mon Sep 17 00:00:00 2001 From: Will Date: Wed, 11 Nov 2026 09:58:27 -0800 Subject: [PATCH 2/2] Run the lowest-direct test leg against the declared floors The resolution mode was passed to `uv sync` only. The next step, a plain `uv run pytest`, saw a lockfile written in another mode, re-resolved to the newest versions and replaced the environment, so the leg named lowest-direct tested unlocked newest versions instead. The mode is now set once as UV_RESOLUTION for the whole job. Co-Authored-By: Claude Fable 5.2 --- .github/workflows/tests.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 438c33f..5e8d562 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -32,12 +32,16 @@ jobs: --health-retries 5 env: PGUSER: postgres + # Every uv command in the job resolves the same way. With the mode given to + # `uv sync` alone, the later `uv run` re-resolved to the newest versions and + # the lowest-direct leg never tested the declared floors. + UV_RESOLUTION: ${{ matrix.resolution }} steps: - uses: actions/checkout@v4 - uses: astral-sh/setup-uv@v6 with: python-version: ${{ matrix.python-version }} - - run: uv sync --resolution ${{ matrix.resolution }} + - run: uv sync - name: tests run: | start=$(date +%s%N)