From 3e74d185577fbf000243a5fccaec41861e257b55 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Thu, 3 Sep 2026 08:59:48 -0700 Subject: [PATCH 01/20] [bfops/small-runner]: Change runners --- .github/workflows/attach-artifacts.yml | 4 +- .github/workflows/check-merge-labels.yml | 3 +- .github/workflows/check-pr-base.yml | 6 ++- .github/workflows/ci.yml | 42 +++++++++++++------- .github/workflows/cla-gate.yml | 3 +- .github/workflows/discord-posts.yml | 15 ++++--- .github/workflows/docs-publish.yaml | 3 +- .github/workflows/docs-update-llms.yaml | 3 +- .github/workflows/internal-tests.yml | 3 +- .github/workflows/llm-benchmark-periodic.yml | 3 +- .github/workflows/pr_approval_check.yml | 3 +- .github/workflows/release.yml | 24 +++++++---- .github/workflows/retry-cla-assistant.yml | 3 +- .github/workflows/tag-release.yml | 6 ++- 14 files changed, 80 insertions(+), 41 deletions(-) diff --git a/.github/workflows/attach-artifacts.yml b/.github/workflows/attach-artifacts.yml index 90a331387fe..3a048395d56 100644 --- a/.github/workflows/attach-artifacts.yml +++ b/.github/workflows/attach-artifacts.yml @@ -9,7 +9,8 @@ on: jobs: upload-assets: - runs-on: spacetimedb-new-runner-2 + # This only downloads existing artifacts and attaches them to a GitHub release. + runs-on: spacetimedb-linux-small permissions: contents: write # needed to modify releases @@ -60,4 +61,3 @@ jobs: gh release upload "$RELEASE_TAG" ./* \ --repo "$GITHUB_REPOSITORY" \ --clobber - diff --git a/.github/workflows/check-merge-labels.yml b/.github/workflows/check-merge-labels.yml index 287a9bdb16c..4a6540ed1f3 100644 --- a/.github/workflows/check-merge-labels.yml +++ b/.github/workflows/check-merge-labels.yml @@ -10,7 +10,8 @@ permissions: read-all jobs: label_checks: name: Check merge labels - runs-on: spacetimedb-new-runner-2 + # This only inspects event labels and performs no checkout or build. + runs-on: spacetimedb-linux-small steps: - if: github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'do not merge') run: | diff --git a/.github/workflows/check-pr-base.yml b/.github/workflows/check-pr-base.yml index b648001bf5e..90801f72e02 100644 --- a/.github/workflows/check-pr-base.yml +++ b/.github/workflows/check-pr-base.yml @@ -13,7 +13,8 @@ concurrency: jobs: check_base_ref: name: Based on `master` - runs-on: spacetimedb-new-runner-2 + # This only evaluates the event base ref and performs no build. + runs-on: spacetimedb-linux-small steps: - id: not_based_on_master if: | @@ -26,7 +27,8 @@ jobs: release_dependencies: if: ${{ github.event_name == 'pull_request' }} name: Check release dependencies - runs-on: spacetimedb-new-runner-2 + # This builds a small CI helper and inspects release metadata and git history. + runs-on: spacetimedb-linux-small permissions: contents: read pull-requests: read diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 515fb45efc7..f9d68e7419f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,8 @@ permissions: jobs: merge_queue_noop: name: Merge queue no-op/reuse - runs-on: spacetimedb-new-runner-2 + # This compares git trees and builds only the small workflow-coordinator helper. + runs-on: spacetimedb-linux-small permissions: actions: write contents: read @@ -584,7 +585,8 @@ jobs: - name: Windows 2/4 - name: Windows 3/4 - name: Windows 4/4 - runs-on: spacetimedb-new-runner-2 + # These no-op jobs only preserve required smoketest check names after CI reuse. + runs-on: spacetimedb-linux-small steps: - name: Skip duplicate merge queue smoketest run: echo "Merge queue commit has the same tree as the PR head; smoketest already ran for the PR." @@ -814,7 +816,8 @@ jobs: codeowners_check: if: ${{ github.event_name == 'pull_request' }} name: CODEOWNERS check - runs-on: spacetimedb-new-runner-2 + # This builds a small CI helper and checks changed paths and GitHub reviews. + runs-on: spacetimedb-linux-small permissions: contents: read pull-requests: read @@ -849,7 +852,8 @@ jobs: needs: [merge_queue_noop, upload-build-artifacts-linux] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Build and test wasm bindings - runs-on: spacetimedb-new-runner-2 + # This reuses prebuilt core binaries and builds only the small module fixture. + runs-on: spacetimedb-linux-small env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full @@ -873,7 +877,8 @@ jobs: needs: [merge_queue_noop] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Check that packages are publishable - runs-on: spacetimedb-new-runner-2 + # This builds a small CI helper and validates package metadata without compiling the workspace. + runs-on: spacetimedb-linux-small permissions: read-all env: RUST_BACKTRACE: full @@ -901,7 +906,8 @@ jobs: strategy: matrix: include: - - { target: x86_64-unknown-linux-gnu, runner: spacetimedb-new-runner-2 } + # The Linux update-flow test uses released artifacts and builds only its small CI driver. + - { target: x86_64-unknown-linux-gnu, runner: spacetimedb-linux-small } - { target: aarch64-apple-darwin, runner: macos-latest } - { target: x86_64-pc-windows-msvc, runner: windows-latest } runs-on: ${{ matrix.runner }} @@ -950,7 +956,8 @@ jobs: - { target: x86_64-unknown-linux-gnu } - { target: aarch64-apple-darwin } - { target: x86_64-pc-windows-msvc } - runs-on: spacetimedb-new-runner-2 + # These no-op jobs only preserve required update-flow check names after CI reuse. + runs-on: spacetimedb-linux-small steps: - name: Skip duplicate merge queue update test run: echo "Merge queue commit has the same tree as the PR head; update-flow already ran for the PR." @@ -1053,7 +1060,8 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Check CLI docs permissions: read-all - runs-on: spacetimedb-new-runner-2 + # This builds a small CI helper and regenerates documentation, not core server packages. + runs-on: spacetimedb-linux-small env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full @@ -1319,7 +1327,8 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} permissions: contents: read - runs-on: spacetimedb-new-runner-2 + # This reuses prebuilt server artifacts and only builds the lightweight Godot SDK fixture. + runs-on: spacetimedb-linux-small env: CARGO_TARGET_DIR: ${{ github.workspace }}/target ARTIFACT_SUFFIX: linux @@ -1426,7 +1435,8 @@ jobs: csharp-testsuite: needs: [merge_queue_noop, lints, upload-build-artifacts-linux] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} - runs-on: spacetimedb-new-runner-2 + # This reuses prebuilt server artifacts and only builds and tests the C# SDK fixtures. + runs-on: spacetimedb-linux-small timeout-minutes: 30 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target @@ -1549,7 +1559,8 @@ jobs: needs: [merge_queue_noop] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Verify global.json files are symlinks - runs-on: spacetimedb-new-runner-2 + # This builds a small CI helper and checks symlink policy without building SpacetimeDB. + runs-on: spacetimedb-linux-small permissions: contents: read env: @@ -1590,7 +1601,8 @@ jobs: needs: [merge_queue_noop] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Check smoketests/mod.rs is complete - runs-on: spacetimedb-new-runner-2 + # This builds a tiny source-scanning helper and does not compile or run smoketests. + runs-on: spacetimedb-linux-small permissions: contents: read env: @@ -1624,7 +1636,8 @@ jobs: needs: [merge_queue_noop] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Docs build - runs-on: spacetimedb-new-runner-2 + # This builds the documentation site and a small CI wrapper, not the core Rust workspace. + runs-on: spacetimedb-linux-small env: RUST_BACKTRACE: full steps: @@ -1659,7 +1672,8 @@ jobs: needs: [merge_queue_noop, upload-build-artifacts-linux] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: TypeScript - Tests - runs-on: spacetimedb-new-runner-2 + # This reuses prebuilt core binaries and builds only TypeScript SDK test fixtures. + runs-on: spacetimedb-linux-small env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full diff --git a/.github/workflows/cla-gate.yml b/.github/workflows/cla-gate.yml index 668edba28d3..40c2864f219 100644 --- a/.github/workflows/cla-gate.yml +++ b/.github/workflows/cla-gate.yml @@ -17,7 +17,8 @@ permissions: jobs: publish-cla-gate-status: name: CLA status - runs-on: spacetimedb-new-runner-2 + # This only evaluates GitHub status metadata and publishes a commit status. + runs-on: spacetimedb-linux-small if: github.event_name != 'status' || github.event.context == 'license/cla' steps: diff --git a/.github/workflows/discord-posts.yml b/.github/workflows/discord-posts.yml index 890f65abcee..42513554af3 100644 --- a/.github/workflows/discord-posts.yml +++ b/.github/workflows/discord-posts.yml @@ -11,7 +11,8 @@ permissions: jobs: resolvePush: - runs-on: spacetimedb-new-runner-2 + # This only resolves GitHub event metadata and performs no checkout or build. + runs-on: spacetimedb-linux-small outputs: is_pr_merge: ${{ steps.resolve.outputs.is_pr_merge }} is_external: ${{ steps.resolve.outputs.is_external }} @@ -80,7 +81,8 @@ jobs: discordNotification: needs: resolvePush - runs-on: spacetimedb-new-runner-2 + # This only queries pull-request checks and posts a Discord notification. + runs-on: spacetimedb-linux-small if: needs.resolvePush.outputs.is_pr_merge == 'true' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -157,7 +159,8 @@ jobs: needs: - resolvePush - discordNotification - runs-on: spacetimedb-new-runner-2 + # This failure path only posts a Discord notification. + runs-on: spacetimedb-linux-small if: ${{ always() && (needs.resolvePush.result == 'failure' || needs.discordNotification.result == 'failure') }} steps: - name: Send failure notification @@ -172,7 +175,8 @@ jobs: warnDirectPush: needs: resolvePush - runs-on: spacetimedb-new-runner-2 + # This only formats commit metadata and posts a Discord warning. + runs-on: spacetimedb-linux-small if: needs.resolvePush.outputs.is_pr_merge != 'true' steps: - name: Warn about non-PR push @@ -197,7 +201,8 @@ jobs: invokePrivate: needs: resolvePush - runs-on: spacetimedb-new-runner-2 + # This only dispatches the private workflow through the GitHub API. + runs-on: spacetimedb-linux-small if: needs.resolvePush.outputs.is_pr_merge == 'true' permissions: contents: read diff --git a/.github/workflows/docs-publish.yaml b/.github/workflows/docs-publish.yaml index ae8364b4cea..9eff7a1bfda 100644 --- a/.github/workflows/docs-publish.yaml +++ b/.github/workflows/docs-publish.yaml @@ -10,7 +10,8 @@ on: jobs: build: - runs-on: spacetimedb-new-runner-2 + # This builds and uploads the documentation site, not SpacetimeDB binaries. + runs-on: spacetimedb-linux-small steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.github/workflows/docs-update-llms.yaml b/.github/workflows/docs-update-llms.yaml index 20414ead5ef..b1f5525b368 100644 --- a/.github/workflows/docs-update-llms.yaml +++ b/.github/workflows/docs-update-llms.yaml @@ -14,7 +14,8 @@ on: jobs: update-llms: - runs-on: spacetimedb-new-runner-2 + # This builds documentation assets and updates one generated text file. + runs-on: spacetimedb-linux-small steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.github/workflows/internal-tests.yml b/.github/workflows/internal-tests.yml index c4b2299ae07..6a2d47509d7 100644 --- a/.github/workflows/internal-tests.yml +++ b/.github/workflows/internal-tests.yml @@ -27,7 +27,8 @@ jobs: # Skip if this is an external contribution. GitHub secrets will be empty, so the step would fail anyway. if: ${{ (github.event_name == 'pull_request' || (github.event_name == 'push' && github.ref == 'refs/heads/master')) && (github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork) }} - runs-on: spacetimedb-new-runner-2 + # This builds small workflow helpers, dispatches private CI, and waits for its result. + runs-on: spacetimedb-linux-small env: TARGET_OWNER: clockworklabs TARGET_REPO: SpacetimeDBPrivate diff --git a/.github/workflows/llm-benchmark-periodic.yml b/.github/workflows/llm-benchmark-periodic.yml index f140d510d6c..e608d779c45 100644 --- a/.github/workflows/llm-benchmark-periodic.yml +++ b/.github/workflows/llm-benchmark-periodic.yml @@ -50,7 +50,8 @@ concurrency: jobs: prepare_matrix: name: Prepare benchmark matrix - runs-on: spacetimedb-new-runner-2 + # This only parses workflow inputs into a JSON matrix and performs no benchmark work. + runs-on: spacetimedb-linux-small outputs: languages: ${{ steps.matrix.outputs.languages }} steps: diff --git a/.github/workflows/pr_approval_check.yml b/.github/workflows/pr_approval_check.yml index db0c2037602..1c68feb6fa1 100644 --- a/.github/workflows/pr_approval_check.yml +++ b/.github/workflows/pr_approval_check.yml @@ -29,7 +29,8 @@ concurrency: jobs: publish-approval-status: name: Set approval status - runs-on: spacetimedb-new-runner-2 + # This disabled metadata-only job performs no checkout or build when re-enabled. + runs-on: spacetimedb-linux-small # Disabled until we can spend some more focus on making this work consistently. # See https://github.com/clockworklabs/SpacetimeDB/pull/4673. if: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 425c94239ec..01fa4e08b7b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -60,7 +60,8 @@ concurrency: jobs: validate-release-invoker: name: Validate release invoker - runs-on: spacetimedb-new-runner-2 + # This only validates workflow inputs and the invoking actor. + runs-on: spacetimedb-linux-small steps: - name: Reject direct public release invocations env: @@ -80,7 +81,8 @@ jobs: # try to fail during this step to prevent partial releases. build-cargo-release: needs: validate-release-invoker - runs-on: spacetimedb-new-runner-2 + # This compiles only the small release automation binary for downstream jobs. + runs-on: spacetimedb-linux-small steps: - name: Checkout uses: actions/checkout@v4 @@ -109,7 +111,8 @@ jobs: release-crates: needs: build-cargo-release - runs-on: spacetimedb-new-runner-2 + # This packages and publishes crates with the prebuilt release helper; it does not build the workspace. + runs-on: spacetimedb-linux-small if: ${{ inputs.release_crates }} env: CARGO_TERM_COLOR: always @@ -151,7 +154,8 @@ jobs: release-csharp: needs: build-cargo-release - runs-on: spacetimedb-new-runner-2 + # This packages the C# SDK and generated DLLs rather than building the core server. + runs-on: spacetimedb-linux-small if: ${{ inputs.release_csharp }} env: CARGO_TERM_COLOR: always @@ -230,7 +234,8 @@ jobs: release-cpp: needs: build-cargo-release - runs-on: spacetimedb-new-runner-2 + # This updates and publishes the generated C++ SDK repository without a core build. + runs-on: spacetimedb-linux-small if: ${{ inputs.release_cpp }} env: CARGO_TERM_COLOR: always @@ -286,7 +291,8 @@ jobs: release-npm: needs: build-cargo-release - runs-on: spacetimedb-new-runner-2 + # This installs and publishes the TypeScript SDK with the prebuilt release helper. + runs-on: spacetimedb-linux-small if: ${{ inputs.release_npm }} env: CARGO_TERM_COLOR: always @@ -380,7 +386,8 @@ jobs: update-mirror-latest-version: needs: validate-release-invoker - runs-on: spacetimedb-new-runner-2 + # This only verifies S3 objects and updates the latest-version marker. + runs-on: spacetimedb-linux-small if: ${{ !inputs.dry_run && inputs.update_mirror_latest_version }} steps: @@ -422,7 +429,8 @@ jobs: - release-npm - release-docker - update-mirror-latest-version - runs-on: spacetimedb-new-runner-2 + # This only publishes existing artifacts and dispatches the release announcement. + runs-on: spacetimedb-linux-small if: >- ${{ always() diff --git a/.github/workflows/retry-cla-assistant.yml b/.github/workflows/retry-cla-assistant.yml index 6c08021af16..f84949efd03 100644 --- a/.github/workflows/retry-cla-assistant.yml +++ b/.github/workflows/retry-cla-assistant.yml @@ -31,7 +31,8 @@ permissions: jobs: retry-cla: name: Retry CLA Assistant if it is the only blocker - runs-on: spacetimedb-new-runner-2 + # This builds a small CI helper and only queries or retries CLA checks. + runs-on: spacetimedb-linux-small steps: - name: Check out trusted base code diff --git a/.github/workflows/tag-release.yml b/.github/workflows/tag-release.yml index 19a37189fd5..1bf6fc14d8f 100644 --- a/.github/workflows/tag-release.yml +++ b/.github/workflows/tag-release.yml @@ -30,7 +30,8 @@ jobs: # Internal/team announcement (simple) announce-release: name: Announce GitHub release (Internal) - runs-on: spacetimedb-new-runner-2 + # This only formats release metadata and posts a Discord notification. + runs-on: spacetimedb-linux-small if: >- ${{ github.event_name == 'release' @@ -52,7 +53,8 @@ jobs: # Public announcement with full release notes public-discord-notification: name: Announce GitHub release (Public) - runs-on: spacetimedb-new-runner-2 + # This only formats release notes and posts them to Discord. + runs-on: spacetimedb-linux-small steps: - name: Send Discord notification env: From c02d963c9d45df864781d850500a05e645d27a3d Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Thu, 3 Sep 2026 09:01:06 -0700 Subject: [PATCH 02/20] [bfops/small-runner]: staging runners --- .github/workflows/attach-artifacts.yml | 2 +- .github/workflows/check-merge-labels.yml | 2 +- .github/workflows/check-pr-base.yml | 4 +-- .github/workflows/ci.yml | 28 ++++++++++---------- .github/workflows/cla-gate.yml | 2 +- .github/workflows/discord-posts.yml | 10 +++---- .github/workflows/docs-publish.yaml | 2 +- .github/workflows/docs-update-llms.yaml | 2 +- .github/workflows/internal-tests.yml | 2 +- .github/workflows/llm-benchmark-periodic.yml | 2 +- .github/workflows/pr_approval_check.yml | 2 +- .github/workflows/release.yml | 16 +++++------ .github/workflows/retry-cla-assistant.yml | 2 +- .github/workflows/tag-release.yml | 4 +-- 14 files changed, 40 insertions(+), 40 deletions(-) diff --git a/.github/workflows/attach-artifacts.yml b/.github/workflows/attach-artifacts.yml index 3a048395d56..1dc406f0457 100644 --- a/.github/workflows/attach-artifacts.yml +++ b/.github/workflows/attach-artifacts.yml @@ -10,7 +10,7 @@ on: jobs: upload-assets: # This only downloads existing artifacts and attaches them to a GitHub release. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: contents: write # needed to modify releases diff --git a/.github/workflows/check-merge-labels.yml b/.github/workflows/check-merge-labels.yml index 4a6540ed1f3..edac17f0f21 100644 --- a/.github/workflows/check-merge-labels.yml +++ b/.github/workflows/check-merge-labels.yml @@ -11,7 +11,7 @@ jobs: label_checks: name: Check merge labels # This only inspects event labels and performs no checkout or build. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - if: github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'do not merge') run: | diff --git a/.github/workflows/check-pr-base.yml b/.github/workflows/check-pr-base.yml index 90801f72e02..166950ea09f 100644 --- a/.github/workflows/check-pr-base.yml +++ b/.github/workflows/check-pr-base.yml @@ -14,7 +14,7 @@ jobs: check_base_ref: name: Based on `master` # This only evaluates the event base ref and performs no build. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - id: not_based_on_master if: | @@ -28,7 +28,7 @@ jobs: if: ${{ github.event_name == 'pull_request' }} name: Check release dependencies # This builds a small CI helper and inspects release metadata and git history. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: contents: read pull-requests: read diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f9d68e7419f..ee4f3a88b69 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: merge_queue_noop: name: Merge queue no-op/reuse # This compares git trees and builds only the small workflow-coordinator helper. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: actions: write contents: read @@ -586,7 +586,7 @@ jobs: - name: Windows 3/4 - name: Windows 4/4 # These no-op jobs only preserve required smoketest check names after CI reuse. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Skip duplicate merge queue smoketest run: echo "Merge queue commit has the same tree as the PR head; smoketest already ran for the PR." @@ -817,7 +817,7 @@ jobs: if: ${{ github.event_name == 'pull_request' }} name: CODEOWNERS check # This builds a small CI helper and checks changed paths and GitHub reviews. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: contents: read pull-requests: read @@ -853,7 +853,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Build and test wasm bindings # This reuses prebuilt core binaries and builds only the small module fixture. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full @@ -878,7 +878,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Check that packages are publishable # This builds a small CI helper and validates package metadata without compiling the workspace. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: read-all env: RUST_BACKTRACE: full @@ -907,7 +907,7 @@ jobs: matrix: include: # The Linux update-flow test uses released artifacts and builds only its small CI driver. - - { target: x86_64-unknown-linux-gnu, runner: spacetimedb-linux-small } + - { target: x86_64-unknown-linux-gnu, runner: spacetimedb-linux-small-staging } - { target: aarch64-apple-darwin, runner: macos-latest } - { target: x86_64-pc-windows-msvc, runner: windows-latest } runs-on: ${{ matrix.runner }} @@ -957,7 +957,7 @@ jobs: - { target: aarch64-apple-darwin } - { target: x86_64-pc-windows-msvc } # These no-op jobs only preserve required update-flow check names after CI reuse. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Skip duplicate merge queue update test run: echo "Merge queue commit has the same tree as the PR head; update-flow already ran for the PR." @@ -1061,7 +1061,7 @@ jobs: name: Check CLI docs permissions: read-all # This builds a small CI helper and regenerates documentation, not core server packages. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full @@ -1328,7 +1328,7 @@ jobs: permissions: contents: read # This reuses prebuilt server artifacts and only builds the lightweight Godot SDK fixture. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging env: CARGO_TARGET_DIR: ${{ github.workspace }}/target ARTIFACT_SUFFIX: linux @@ -1436,7 +1436,7 @@ jobs: needs: [merge_queue_noop, lints, upload-build-artifacts-linux] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} # This reuses prebuilt server artifacts and only builds and tests the C# SDK fixtures. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging timeout-minutes: 30 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target @@ -1560,7 +1560,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Verify global.json files are symlinks # This builds a small CI helper and checks symlink policy without building SpacetimeDB. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: contents: read env: @@ -1602,7 +1602,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Check smoketests/mod.rs is complete # This builds a tiny source-scanning helper and does not compile or run smoketests. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: contents: read env: @@ -1637,7 +1637,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Docs build # This builds the documentation site and a small CI wrapper, not the core Rust workspace. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging env: RUST_BACKTRACE: full steps: @@ -1673,7 +1673,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: TypeScript - Tests # This reuses prebuilt core binaries and builds only TypeScript SDK test fixtures. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full diff --git a/.github/workflows/cla-gate.yml b/.github/workflows/cla-gate.yml index 40c2864f219..5ee071f123f 100644 --- a/.github/workflows/cla-gate.yml +++ b/.github/workflows/cla-gate.yml @@ -18,7 +18,7 @@ jobs: publish-cla-gate-status: name: CLA status # This only evaluates GitHub status metadata and publishes a commit status. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: github.event_name != 'status' || github.event.context == 'license/cla' steps: diff --git a/.github/workflows/discord-posts.yml b/.github/workflows/discord-posts.yml index 42513554af3..37c7d027d22 100644 --- a/.github/workflows/discord-posts.yml +++ b/.github/workflows/discord-posts.yml @@ -12,7 +12,7 @@ permissions: jobs: resolvePush: # This only resolves GitHub event metadata and performs no checkout or build. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging outputs: is_pr_merge: ${{ steps.resolve.outputs.is_pr_merge }} is_external: ${{ steps.resolve.outputs.is_external }} @@ -82,7 +82,7 @@ jobs: discordNotification: needs: resolvePush # This only queries pull-request checks and posts a Discord notification. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: needs.resolvePush.outputs.is_pr_merge == 'true' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -160,7 +160,7 @@ jobs: - resolvePush - discordNotification # This failure path only posts a Discord notification. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: ${{ always() && (needs.resolvePush.result == 'failure' || needs.discordNotification.result == 'failure') }} steps: - name: Send failure notification @@ -176,7 +176,7 @@ jobs: warnDirectPush: needs: resolvePush # This only formats commit metadata and posts a Discord warning. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: needs.resolvePush.outputs.is_pr_merge != 'true' steps: - name: Warn about non-PR push @@ -202,7 +202,7 @@ jobs: invokePrivate: needs: resolvePush # This only dispatches the private workflow through the GitHub API. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: needs.resolvePush.outputs.is_pr_merge == 'true' permissions: contents: read diff --git a/.github/workflows/docs-publish.yaml b/.github/workflows/docs-publish.yaml index 9eff7a1bfda..6e1ba77ff46 100644 --- a/.github/workflows/docs-publish.yaml +++ b/.github/workflows/docs-publish.yaml @@ -11,7 +11,7 @@ on: jobs: build: # This builds and uploads the documentation site, not SpacetimeDB binaries. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.github/workflows/docs-update-llms.yaml b/.github/workflows/docs-update-llms.yaml index b1f5525b368..7b297adc21f 100644 --- a/.github/workflows/docs-update-llms.yaml +++ b/.github/workflows/docs-update-llms.yaml @@ -15,7 +15,7 @@ on: jobs: update-llms: # This builds documentation assets and updates one generated text file. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.github/workflows/internal-tests.yml b/.github/workflows/internal-tests.yml index 6a2d47509d7..c6cd36791f0 100644 --- a/.github/workflows/internal-tests.yml +++ b/.github/workflows/internal-tests.yml @@ -28,7 +28,7 @@ jobs: if: ${{ (github.event_name == 'pull_request' || (github.event_name == 'push' && github.ref == 'refs/heads/master')) && (github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork) }} # This builds small workflow helpers, dispatches private CI, and waits for its result. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging env: TARGET_OWNER: clockworklabs TARGET_REPO: SpacetimeDBPrivate diff --git a/.github/workflows/llm-benchmark-periodic.yml b/.github/workflows/llm-benchmark-periodic.yml index e608d779c45..0a2a6b0ff8a 100644 --- a/.github/workflows/llm-benchmark-periodic.yml +++ b/.github/workflows/llm-benchmark-periodic.yml @@ -51,7 +51,7 @@ jobs: prepare_matrix: name: Prepare benchmark matrix # This only parses workflow inputs into a JSON matrix and performs no benchmark work. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging outputs: languages: ${{ steps.matrix.outputs.languages }} steps: diff --git a/.github/workflows/pr_approval_check.yml b/.github/workflows/pr_approval_check.yml index 1c68feb6fa1..8a69025b385 100644 --- a/.github/workflows/pr_approval_check.yml +++ b/.github/workflows/pr_approval_check.yml @@ -30,7 +30,7 @@ jobs: publish-approval-status: name: Set approval status # This disabled metadata-only job performs no checkout or build when re-enabled. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging # Disabled until we can spend some more focus on making this work consistently. # See https://github.com/clockworklabs/SpacetimeDB/pull/4673. if: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 01fa4e08b7b..60bbf7f6bef 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -61,7 +61,7 @@ jobs: validate-release-invoker: name: Validate release invoker # This only validates workflow inputs and the invoking actor. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Reject direct public release invocations env: @@ -82,7 +82,7 @@ jobs: build-cargo-release: needs: validate-release-invoker # This compiles only the small release automation binary for downstream jobs. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Checkout uses: actions/checkout@v4 @@ -112,7 +112,7 @@ jobs: release-crates: needs: build-cargo-release # This packages and publishes crates with the prebuilt release helper; it does not build the workspace. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: ${{ inputs.release_crates }} env: CARGO_TERM_COLOR: always @@ -155,7 +155,7 @@ jobs: release-csharp: needs: build-cargo-release # This packages the C# SDK and generated DLLs rather than building the core server. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: ${{ inputs.release_csharp }} env: CARGO_TERM_COLOR: always @@ -235,7 +235,7 @@ jobs: release-cpp: needs: build-cargo-release # This updates and publishes the generated C++ SDK repository without a core build. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: ${{ inputs.release_cpp }} env: CARGO_TERM_COLOR: always @@ -292,7 +292,7 @@ jobs: release-npm: needs: build-cargo-release # This installs and publishes the TypeScript SDK with the prebuilt release helper. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: ${{ inputs.release_npm }} env: CARGO_TERM_COLOR: always @@ -387,7 +387,7 @@ jobs: update-mirror-latest-version: needs: validate-release-invoker # This only verifies S3 objects and updates the latest-version marker. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: ${{ !inputs.dry_run && inputs.update_mirror_latest_version }} steps: @@ -430,7 +430,7 @@ jobs: - release-docker - update-mirror-latest-version # This only publishes existing artifacts and dispatches the release announcement. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: >- ${{ always() diff --git a/.github/workflows/retry-cla-assistant.yml b/.github/workflows/retry-cla-assistant.yml index f84949efd03..05a7f27960b 100644 --- a/.github/workflows/retry-cla-assistant.yml +++ b/.github/workflows/retry-cla-assistant.yml @@ -32,7 +32,7 @@ jobs: retry-cla: name: Retry CLA Assistant if it is the only blocker # This builds a small CI helper and only queries or retries CLA checks. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Check out trusted base code diff --git a/.github/workflows/tag-release.yml b/.github/workflows/tag-release.yml index 1bf6fc14d8f..ba53d1e5cd9 100644 --- a/.github/workflows/tag-release.yml +++ b/.github/workflows/tag-release.yml @@ -31,7 +31,7 @@ jobs: announce-release: name: Announce GitHub release (Internal) # This only formats release metadata and posts a Discord notification. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: >- ${{ github.event_name == 'release' @@ -54,7 +54,7 @@ jobs: public-discord-notification: name: Announce GitHub release (Public) # This only formats release notes and posts them to Discord. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Send Discord notification env: From 43947dc3b611a8edadf0e389dc82bb3a2d6f9b8c Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Thu, 3 Sep 2026 09:41:35 -0700 Subject: [PATCH 03/20] [bfops/small-runner]: revert --- .github/workflows/benchmarks.yml | 2 +- .github/workflows/ci.yml | 12 ++++++------ .github/workflows/llm-benchmark-periodic.yml | 2 +- .github/workflows/llm-benchmark-validate-goldens.yml | 2 +- .github/workflows/release.yml | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index c2f79d61980..2c69e0ef06e 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -181,7 +181,7 @@ jobs: # Fortunately, we can run on standard GitHub Actions infra because we don't care # about other stuff running on the machine! # runs-on: benchmarks-runner - runs-on: spacetimedb-new-runner-2 + runs-on: spacetimedb-linux timeout-minutes: 20 # on a successful run, runs in 8 minutes container: image: rust:1.93.0 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ee4f3a88b69..08e8d86db2c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -95,7 +95,7 @@ jobs: needs: [merge_queue_noop, lints] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Upload build artifacts (Linux) - runs-on: spacetimedb-new-runner-2 + runs-on: spacetimedb-linux timeout-minutes: 15 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target @@ -325,7 +325,7 @@ jobs: smoketest_build_linux: needs: [upload-build-artifacts-linux] name: Build smoketests (Linux) - runs-on: spacetimedb-new-runner-2 + runs-on: spacetimedb-linux timeout-minutes: 15 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target @@ -410,7 +410,7 @@ jobs: fail-fast: false matrix: partition: [1] - runs-on: spacetimedb-new-runner-2 + runs-on: spacetimedb-linux timeout-minutes: 30 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target @@ -595,7 +595,7 @@ jobs: needs: [merge_queue_noop, lints, upload-build-artifacts-linux] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Test Suite - runs-on: spacetimedb-new-runner-2 + runs-on: spacetimedb-linux env: CARGO_TARGET_DIR: ${{ github.workspace }}/target @@ -765,7 +765,7 @@ jobs: needs: [merge_queue_noop] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Lints - runs-on: spacetimedb-new-runner-2 + runs-on: spacetimedb-linux env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full @@ -966,7 +966,7 @@ jobs: name: Unreal Engine Tests # This can't go on e.g. ubuntu-latest because that runner runs out of disk space. ChatGPT suggested that the general solution tends to be to use # a custom runner. - runs-on: spacetimedb-new-runner-2 + runs-on: spacetimedb-linux # Disable the tests because they are very flaky at the moment. # TODO: Remove this line and re-enable the `if` line just below here. if: false diff --git a/.github/workflows/llm-benchmark-periodic.yml b/.github/workflows/llm-benchmark-periodic.yml index 0a2a6b0ff8a..099982ae75e 100644 --- a/.github/workflows/llm-benchmark-periodic.yml +++ b/.github/workflows/llm-benchmark-periodic.yml @@ -65,7 +65,7 @@ jobs: run-benchmarks: name: Run benchmarks (${{ matrix.lang }}) needs: prepare_matrix - runs-on: spacetimedb-new-runner-2 + runs-on: spacetimedb-linux env: CARGO_TARGET_DIR: ${{ github.workspace }}/target TARGET_TRIPLE: x86_64-unknown-linux-gnu diff --git a/.github/workflows/llm-benchmark-validate-goldens.yml b/.github/workflows/llm-benchmark-validate-goldens.yml index bfde4e16150..b2709a3a98c 100644 --- a/.github/workflows/llm-benchmark-validate-goldens.yml +++ b/.github/workflows/llm-benchmark-validate-goldens.yml @@ -26,7 +26,7 @@ concurrency: jobs: validate-goldens: - runs-on: spacetimedb-new-runner-2 + runs-on: spacetimedb-linux timeout-minutes: 60 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 60bbf7f6bef..d290b04f7bc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -345,7 +345,7 @@ jobs: release-docker: needs: build-cargo-release - runs-on: spacetimedb-new-runner-2 + runs-on: spacetimedb-linux env: CARGO_TERM_COLOR: always GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 1de652dc6a315f6eee64886debf4ac97bc9cc87a Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Thu, 3 Sep 2026 09:42:30 -0700 Subject: [PATCH 04/20] [bfops/small-runner]: revert --- crates/client-api/src/routes/database.rs | 76 ++++++++++++++++++++++++ crates/client-api/src/routes/mod.rs | 41 +++++++++++-- 2 files changed, 113 insertions(+), 4 deletions(-) diff --git a/crates/client-api/src/routes/database.rs b/crates/client-api/src/routes/database.rs index ba7ebcd8008..f170f9b290e 100644 --- a/crates/client-api/src/routes/database.rs +++ b/crates/client-api/src/routes/database.rs @@ -1679,6 +1679,7 @@ mod tests { use super::*; use crate::auth::JwtAuthProvider; use crate::routes::subscribe::{HasWebSocketOptions, WebSocketOptions}; + use crate::routes::{identity::IdentityRoutes, router_with_root_routes, RootRoutes}; use crate::{ Action, Authorization, ControlStateReadAccess, ControlStateWriteAccess, MaybeMisdirected, Unauthorized, }; @@ -2452,4 +2453,79 @@ mod tests { remove_http_response_size_metric(database_identity); } + + fn root_router(root_routes: RootRoutes) -> axum::Router { + let state = DummyState::new(); + router_with_root_routes( + &state, + DatabaseRoutes::default(), + IdentityRoutes::default(), + root_routes, + axum::Router::new(), + ) + .with_state(state) + } + + fn post_mcp_root(body: &'static str) -> Request { + Request::builder() + .method(http::Method::POST) + .uri("/v1/mcp") + .header(http::header::CONTENT_TYPE, "application/json") + .body(Body::from(body)) + .unwrap() + } + + #[tokio::test] + async fn default_root_routes_serve_the_real_handlers() { + let app = root_router(RootRoutes::default()); + + let response = app + .clone() + .oneshot(post_mcp_root( + r#"{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"ping"}}"#, + )) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK); + let body = response.into_body().collect().await.unwrap().to_bytes(); + assert!(std::str::from_utf8(&body).unwrap().contains("pong")); + + let response = app + .oneshot(Request::builder().uri("/v1/ping").body(Body::empty()).unwrap()) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK); + } + + #[tokio::test] + async fn a_substituted_root_mcp_route_replaces_the_default_handler() { + let app = root_router(RootRoutes { + mcp_post: axum::routing::post(|| async { "substituted" }), + ..Default::default() + }); + + let response = app.oneshot(post_mcp_root("")).await.unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + assert_eq!(response.into_body().collect().await.unwrap().to_bytes(), "substituted"); + } + + #[tokio::test] + async fn the_auth_middleware_runs_before_substituted_root_layers() { + let app = root_router(RootRoutes { + mcp_post: axum::routing::post(|| async { "substituted" }).layer(axum::middleware::from_fn( + |request: axum::extract::Request, next: axum::middleware::Next| async move { + if request.extensions().get::().is_none() { + return StatusCode::INTERNAL_SERVER_ERROR.into_response(); + } + next.run(request).await + }, + )), + ..Default::default() + }); + + let response = app.oneshot(post_mcp_root("")).await.unwrap(); + + assert_eq!(response.status(), StatusCode::OK); + } } diff --git a/crates/client-api/src/routes/mod.rs b/crates/client-api/src/routes/mod.rs index 19b92e19402..5c487aa5fd9 100644 --- a/crates/client-api/src/routes/mod.rs +++ b/crates/client-api/src/routes/mod.rs @@ -1,3 +1,4 @@ +use axum::routing::MethodRouter; use http::header; use tower_http::cors; @@ -20,7 +21,27 @@ use self::{database::DatabaseRoutes, identity::IdentityRoutes}; /// establish a connection to SpacetimeDB. This API call doesn't actually do anything. pub async fn ping(_auth: crate::auth::SpacetimeAuthHeader) {} -#[allow(clippy::let_and_return)] +/// Allows the edition to customize the routes directly under `/v1`, as [`DatabaseRoutes`] does for `/database`. +pub struct RootRoutes { + /// GET: /ping + pub ping_get: MethodRouter, + /// POST: /mcp + pub mcp_post: MethodRouter, +} + +impl Default for RootRoutes +where + S: NodeDelegate + ControlStateDelegate + Authorization + Clone + 'static, +{ + fn default() -> Self { + use axum::routing::{get, post}; + Self { + ping_get: get(ping), + mcp_post: post(mcp::mcp_root::), + } + } +} + pub fn router( ctx: &S, database_routes: DatabaseRoutes, @@ -30,7 +51,19 @@ pub fn router( where S: NodeDelegate + ControlStateDelegate + Authorization + Clone + 'static, { - use axum::routing::{get, post}; + router_with_root_routes(ctx, database_routes, identity_routes, RootRoutes::default(), extra) +} + +pub fn router_with_root_routes( + ctx: &S, + database_routes: DatabaseRoutes, + identity_routes: IdentityRoutes, + root_routes: RootRoutes, + extra: axum::Router, +) -> axum::Router +where + S: NodeDelegate + ControlStateDelegate + Authorization + Clone + 'static, +{ let router = axum::Router::new() .nest("/database", database_routes.into_router(ctx.clone())) .nest("/identity", identity_routes.into_router()) @@ -40,12 +73,12 @@ where // the database is named in the request body, so `mcp_root` counts its own egress .route( "/mcp", - post(mcp::mcp_root::).route_layer(axum::middleware::from_fn_with_state( + root_routes.mcp_post.route_layer(axum::middleware::from_fn_with_state( ctx.clone(), crate::auth::anon_auth_middleware::, )), ) - .route("/ping", get(ping)) + .route("/ping", root_routes.ping_get) .merge(extra); let cors = cors::CorsLayer::new() From 58c9f7ae17490b256fae74ce98425803a5d5d905 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Thu, 3 Sep 2026 12:03:12 -0700 Subject: [PATCH 05/20] [bfops/small-runner]: pointless change to force CI re-runs --- .github/workflows/ci.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 08e8d86db2c..72921a41d5d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,7 @@ on: name: CI + concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.event.inputs.pr_number || format('sha-{0}', github.sha) }} cancel-in-progress: true @@ -1327,8 +1328,8 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} permissions: contents: read - # This reuses prebuilt server artifacts and only builds the lightweight Godot SDK fixture. - runs-on: spacetimedb-linux-small-staging + # The .NET packaging, Godot project build, and integration test make this too heavy for a small runner. + runs-on: spacetimedb-linux env: CARGO_TARGET_DIR: ${{ github.workspace }}/target ARTIFACT_SUFFIX: linux @@ -1435,8 +1436,8 @@ jobs: csharp-testsuite: needs: [merge_queue_noop, lints, upload-build-artifacts-linux] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} - # This reuses prebuilt server artifacts and only builds and tests the C# SDK fixtures. - runs-on: spacetimedb-linux-small-staging + # The C# SDK build and tests saturated the small runner's CPU, so keep this on the main runner. + runs-on: spacetimedb-linux timeout-minutes: 30 env: CARGO_TARGET_DIR: ${{ github.workspace }}/target @@ -1636,8 +1637,8 @@ jobs: needs: [merge_queue_noop] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Docs build - # This builds the documentation site and a small CI wrapper, not the core Rust workspace. - runs-on: spacetimedb-linux-small-staging + # Building the documentation site nearly saturated a small runner and used substantial memory. + runs-on: spacetimedb-linux env: RUST_BACKTRACE: full steps: From dd8db36f36ef07a182b7bb9c5e8d4a09e84fd30e Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Thu, 3 Sep 2026 13:42:45 -0700 Subject: [PATCH 06/20] [bfops/small-runner]: move to prod runners --- .github/workflows/attach-artifacts.yml | 3 ++- .github/workflows/check-merge-labels.yml | 2 +- .github/workflows/check-pr-base.yml | 4 ++-- .github/workflows/ci.yml | 23 ++++++++++---------- .github/workflows/cla-gate.yml | 2 +- .github/workflows/discord-posts.yml | 10 ++++----- .github/workflows/docs-publish.yaml | 2 +- .github/workflows/docs-update-llms.yaml | 2 +- .github/workflows/internal-tests.yml | 2 +- .github/workflows/llm-benchmark-periodic.yml | 2 +- .github/workflows/pr_approval_check.yml | 2 +- .github/workflows/release.yml | 16 +++++++------- .github/workflows/retry-cla-assistant.yml | 2 +- .github/workflows/tag-release.yml | 4 ++-- 14 files changed, 38 insertions(+), 38 deletions(-) diff --git a/.github/workflows/attach-artifacts.yml b/.github/workflows/attach-artifacts.yml index 1dc406f0457..85edef31f00 100644 --- a/.github/workflows/attach-artifacts.yml +++ b/.github/workflows/attach-artifacts.yml @@ -10,7 +10,7 @@ on: jobs: upload-assets: # This only downloads existing artifacts and attaches them to a GitHub release. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small permissions: contents: write # needed to modify releases @@ -61,3 +61,4 @@ jobs: gh release upload "$RELEASE_TAG" ./* \ --repo "$GITHUB_REPOSITORY" \ --clobber + diff --git a/.github/workflows/check-merge-labels.yml b/.github/workflows/check-merge-labels.yml index edac17f0f21..4a6540ed1f3 100644 --- a/.github/workflows/check-merge-labels.yml +++ b/.github/workflows/check-merge-labels.yml @@ -11,7 +11,7 @@ jobs: label_checks: name: Check merge labels # This only inspects event labels and performs no checkout or build. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small steps: - if: github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'do not merge') run: | diff --git a/.github/workflows/check-pr-base.yml b/.github/workflows/check-pr-base.yml index 166950ea09f..90801f72e02 100644 --- a/.github/workflows/check-pr-base.yml +++ b/.github/workflows/check-pr-base.yml @@ -14,7 +14,7 @@ jobs: check_base_ref: name: Based on `master` # This only evaluates the event base ref and performs no build. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small steps: - id: not_based_on_master if: | @@ -28,7 +28,7 @@ jobs: if: ${{ github.event_name == 'pull_request' }} name: Check release dependencies # This builds a small CI helper and inspects release metadata and git history. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small permissions: contents: read pull-requests: read diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 72921a41d5d..82f8fc636b6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,6 @@ on: name: CI - concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.event.inputs.pr_number || format('sha-{0}', github.sha) }} cancel-in-progress: true @@ -26,7 +25,7 @@ jobs: merge_queue_noop: name: Merge queue no-op/reuse # This compares git trees and builds only the small workflow-coordinator helper. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small permissions: actions: write contents: read @@ -587,7 +586,7 @@ jobs: - name: Windows 3/4 - name: Windows 4/4 # These no-op jobs only preserve required smoketest check names after CI reuse. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small steps: - name: Skip duplicate merge queue smoketest run: echo "Merge queue commit has the same tree as the PR head; smoketest already ran for the PR." @@ -818,7 +817,7 @@ jobs: if: ${{ github.event_name == 'pull_request' }} name: CODEOWNERS check # This builds a small CI helper and checks changed paths and GitHub reviews. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small permissions: contents: read pull-requests: read @@ -854,7 +853,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Build and test wasm bindings # This reuses prebuilt core binaries and builds only the small module fixture. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full @@ -879,7 +878,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Check that packages are publishable # This builds a small CI helper and validates package metadata without compiling the workspace. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small permissions: read-all env: RUST_BACKTRACE: full @@ -908,7 +907,7 @@ jobs: matrix: include: # The Linux update-flow test uses released artifacts and builds only its small CI driver. - - { target: x86_64-unknown-linux-gnu, runner: spacetimedb-linux-small-staging } + - { target: x86_64-unknown-linux-gnu, runner: spacetimedb-linux-small } - { target: aarch64-apple-darwin, runner: macos-latest } - { target: x86_64-pc-windows-msvc, runner: windows-latest } runs-on: ${{ matrix.runner }} @@ -958,7 +957,7 @@ jobs: - { target: aarch64-apple-darwin } - { target: x86_64-pc-windows-msvc } # These no-op jobs only preserve required update-flow check names after CI reuse. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small steps: - name: Skip duplicate merge queue update test run: echo "Merge queue commit has the same tree as the PR head; update-flow already ran for the PR." @@ -1062,7 +1061,7 @@ jobs: name: Check CLI docs permissions: read-all # This builds a small CI helper and regenerates documentation, not core server packages. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full @@ -1561,7 +1560,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Verify global.json files are symlinks # This builds a small CI helper and checks symlink policy without building SpacetimeDB. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small permissions: contents: read env: @@ -1603,7 +1602,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Check smoketests/mod.rs is complete # This builds a tiny source-scanning helper and does not compile or run smoketests. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small permissions: contents: read env: @@ -1674,7 +1673,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: TypeScript - Tests # This reuses prebuilt core binaries and builds only TypeScript SDK test fixtures. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full diff --git a/.github/workflows/cla-gate.yml b/.github/workflows/cla-gate.yml index 5ee071f123f..40c2864f219 100644 --- a/.github/workflows/cla-gate.yml +++ b/.github/workflows/cla-gate.yml @@ -18,7 +18,7 @@ jobs: publish-cla-gate-status: name: CLA status # This only evaluates GitHub status metadata and publishes a commit status. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small if: github.event_name != 'status' || github.event.context == 'license/cla' steps: diff --git a/.github/workflows/discord-posts.yml b/.github/workflows/discord-posts.yml index 37c7d027d22..42513554af3 100644 --- a/.github/workflows/discord-posts.yml +++ b/.github/workflows/discord-posts.yml @@ -12,7 +12,7 @@ permissions: jobs: resolvePush: # This only resolves GitHub event metadata and performs no checkout or build. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small outputs: is_pr_merge: ${{ steps.resolve.outputs.is_pr_merge }} is_external: ${{ steps.resolve.outputs.is_external }} @@ -82,7 +82,7 @@ jobs: discordNotification: needs: resolvePush # This only queries pull-request checks and posts a Discord notification. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small if: needs.resolvePush.outputs.is_pr_merge == 'true' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -160,7 +160,7 @@ jobs: - resolvePush - discordNotification # This failure path only posts a Discord notification. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small if: ${{ always() && (needs.resolvePush.result == 'failure' || needs.discordNotification.result == 'failure') }} steps: - name: Send failure notification @@ -176,7 +176,7 @@ jobs: warnDirectPush: needs: resolvePush # This only formats commit metadata and posts a Discord warning. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small if: needs.resolvePush.outputs.is_pr_merge != 'true' steps: - name: Warn about non-PR push @@ -202,7 +202,7 @@ jobs: invokePrivate: needs: resolvePush # This only dispatches the private workflow through the GitHub API. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small if: needs.resolvePush.outputs.is_pr_merge == 'true' permissions: contents: read diff --git a/.github/workflows/docs-publish.yaml b/.github/workflows/docs-publish.yaml index 6e1ba77ff46..9eff7a1bfda 100644 --- a/.github/workflows/docs-publish.yaml +++ b/.github/workflows/docs-publish.yaml @@ -11,7 +11,7 @@ on: jobs: build: # This builds and uploads the documentation site, not SpacetimeDB binaries. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.github/workflows/docs-update-llms.yaml b/.github/workflows/docs-update-llms.yaml index 7b297adc21f..b1f5525b368 100644 --- a/.github/workflows/docs-update-llms.yaml +++ b/.github/workflows/docs-update-llms.yaml @@ -15,7 +15,7 @@ on: jobs: update-llms: # This builds documentation assets and updates one generated text file. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.github/workflows/internal-tests.yml b/.github/workflows/internal-tests.yml index c6cd36791f0..6a2d47509d7 100644 --- a/.github/workflows/internal-tests.yml +++ b/.github/workflows/internal-tests.yml @@ -28,7 +28,7 @@ jobs: if: ${{ (github.event_name == 'pull_request' || (github.event_name == 'push' && github.ref == 'refs/heads/master')) && (github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork) }} # This builds small workflow helpers, dispatches private CI, and waits for its result. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small env: TARGET_OWNER: clockworklabs TARGET_REPO: SpacetimeDBPrivate diff --git a/.github/workflows/llm-benchmark-periodic.yml b/.github/workflows/llm-benchmark-periodic.yml index 099982ae75e..9230922b449 100644 --- a/.github/workflows/llm-benchmark-periodic.yml +++ b/.github/workflows/llm-benchmark-periodic.yml @@ -51,7 +51,7 @@ jobs: prepare_matrix: name: Prepare benchmark matrix # This only parses workflow inputs into a JSON matrix and performs no benchmark work. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small outputs: languages: ${{ steps.matrix.outputs.languages }} steps: diff --git a/.github/workflows/pr_approval_check.yml b/.github/workflows/pr_approval_check.yml index 8a69025b385..1c68feb6fa1 100644 --- a/.github/workflows/pr_approval_check.yml +++ b/.github/workflows/pr_approval_check.yml @@ -30,7 +30,7 @@ jobs: publish-approval-status: name: Set approval status # This disabled metadata-only job performs no checkout or build when re-enabled. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small # Disabled until we can spend some more focus on making this work consistently. # See https://github.com/clockworklabs/SpacetimeDB/pull/4673. if: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d290b04f7bc..bdd29e34bd4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -61,7 +61,7 @@ jobs: validate-release-invoker: name: Validate release invoker # This only validates workflow inputs and the invoking actor. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small steps: - name: Reject direct public release invocations env: @@ -82,7 +82,7 @@ jobs: build-cargo-release: needs: validate-release-invoker # This compiles only the small release automation binary for downstream jobs. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small steps: - name: Checkout uses: actions/checkout@v4 @@ -112,7 +112,7 @@ jobs: release-crates: needs: build-cargo-release # This packages and publishes crates with the prebuilt release helper; it does not build the workspace. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small if: ${{ inputs.release_crates }} env: CARGO_TERM_COLOR: always @@ -155,7 +155,7 @@ jobs: release-csharp: needs: build-cargo-release # This packages the C# SDK and generated DLLs rather than building the core server. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small if: ${{ inputs.release_csharp }} env: CARGO_TERM_COLOR: always @@ -235,7 +235,7 @@ jobs: release-cpp: needs: build-cargo-release # This updates and publishes the generated C++ SDK repository without a core build. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small if: ${{ inputs.release_cpp }} env: CARGO_TERM_COLOR: always @@ -292,7 +292,7 @@ jobs: release-npm: needs: build-cargo-release # This installs and publishes the TypeScript SDK with the prebuilt release helper. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small if: ${{ inputs.release_npm }} env: CARGO_TERM_COLOR: always @@ -387,7 +387,7 @@ jobs: update-mirror-latest-version: needs: validate-release-invoker # This only verifies S3 objects and updates the latest-version marker. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small if: ${{ !inputs.dry_run && inputs.update_mirror_latest_version }} steps: @@ -430,7 +430,7 @@ jobs: - release-docker - update-mirror-latest-version # This only publishes existing artifacts and dispatches the release announcement. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small if: >- ${{ always() diff --git a/.github/workflows/retry-cla-assistant.yml b/.github/workflows/retry-cla-assistant.yml index 05a7f27960b..f84949efd03 100644 --- a/.github/workflows/retry-cla-assistant.yml +++ b/.github/workflows/retry-cla-assistant.yml @@ -32,7 +32,7 @@ jobs: retry-cla: name: Retry CLA Assistant if it is the only blocker # This builds a small CI helper and only queries or retries CLA checks. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small steps: - name: Check out trusted base code diff --git a/.github/workflows/tag-release.yml b/.github/workflows/tag-release.yml index ba53d1e5cd9..1bf6fc14d8f 100644 --- a/.github/workflows/tag-release.yml +++ b/.github/workflows/tag-release.yml @@ -31,7 +31,7 @@ jobs: announce-release: name: Announce GitHub release (Internal) # This only formats release metadata and posts a Discord notification. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small if: >- ${{ github.event_name == 'release' @@ -54,7 +54,7 @@ jobs: public-discord-notification: name: Announce GitHub release (Public) # This only formats release notes and posts them to Discord. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux-small steps: - name: Send Discord notification env: From a18ea5c10fb4932e605265ac3f2ed571f7b60d3d Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 08:45:08 -0700 Subject: [PATCH 07/20] [bfops/small-runner]: CI: switch small jobs back to staging runners --- .github/workflows/attach-artifacts.yml | 3 +-- .github/workflows/check-merge-labels.yml | 2 +- .github/workflows/check-pr-base.yml | 4 ++-- .github/workflows/ci.yml | 22 ++++++++++---------- .github/workflows/cla-gate.yml | 2 +- .github/workflows/discord-posts.yml | 10 ++++----- .github/workflows/docs-publish.yaml | 2 +- .github/workflows/docs-update-llms.yaml | 2 +- .github/workflows/internal-tests.yml | 2 +- .github/workflows/llm-benchmark-periodic.yml | 2 +- .github/workflows/pr_approval_check.yml | 2 +- .github/workflows/release.yml | 16 +++++++------- .github/workflows/retry-cla-assistant.yml | 2 +- .github/workflows/tag-release.yml | 4 ++-- 14 files changed, 37 insertions(+), 38 deletions(-) diff --git a/.github/workflows/attach-artifacts.yml b/.github/workflows/attach-artifacts.yml index 85edef31f00..1dc406f0457 100644 --- a/.github/workflows/attach-artifacts.yml +++ b/.github/workflows/attach-artifacts.yml @@ -10,7 +10,7 @@ on: jobs: upload-assets: # This only downloads existing artifacts and attaches them to a GitHub release. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: contents: write # needed to modify releases @@ -61,4 +61,3 @@ jobs: gh release upload "$RELEASE_TAG" ./* \ --repo "$GITHUB_REPOSITORY" \ --clobber - diff --git a/.github/workflows/check-merge-labels.yml b/.github/workflows/check-merge-labels.yml index 4a6540ed1f3..edac17f0f21 100644 --- a/.github/workflows/check-merge-labels.yml +++ b/.github/workflows/check-merge-labels.yml @@ -11,7 +11,7 @@ jobs: label_checks: name: Check merge labels # This only inspects event labels and performs no checkout or build. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - if: github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'do not merge') run: | diff --git a/.github/workflows/check-pr-base.yml b/.github/workflows/check-pr-base.yml index 90801f72e02..166950ea09f 100644 --- a/.github/workflows/check-pr-base.yml +++ b/.github/workflows/check-pr-base.yml @@ -14,7 +14,7 @@ jobs: check_base_ref: name: Based on `master` # This only evaluates the event base ref and performs no build. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - id: not_based_on_master if: | @@ -28,7 +28,7 @@ jobs: if: ${{ github.event_name == 'pull_request' }} name: Check release dependencies # This builds a small CI helper and inspects release metadata and git history. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: contents: read pull-requests: read diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 82f8fc636b6..0547f92495c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,7 +25,7 @@ jobs: merge_queue_noop: name: Merge queue no-op/reuse # This compares git trees and builds only the small workflow-coordinator helper. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: actions: write contents: read @@ -586,7 +586,7 @@ jobs: - name: Windows 3/4 - name: Windows 4/4 # These no-op jobs only preserve required smoketest check names after CI reuse. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Skip duplicate merge queue smoketest run: echo "Merge queue commit has the same tree as the PR head; smoketest already ran for the PR." @@ -817,7 +817,7 @@ jobs: if: ${{ github.event_name == 'pull_request' }} name: CODEOWNERS check # This builds a small CI helper and checks changed paths and GitHub reviews. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: contents: read pull-requests: read @@ -853,7 +853,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Build and test wasm bindings # This reuses prebuilt core binaries and builds only the small module fixture. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full @@ -878,7 +878,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Check that packages are publishable # This builds a small CI helper and validates package metadata without compiling the workspace. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: read-all env: RUST_BACKTRACE: full @@ -907,7 +907,7 @@ jobs: matrix: include: # The Linux update-flow test uses released artifacts and builds only its small CI driver. - - { target: x86_64-unknown-linux-gnu, runner: spacetimedb-linux-small } + - { target: x86_64-unknown-linux-gnu, runner: spacetimedb-linux-small-staging } - { target: aarch64-apple-darwin, runner: macos-latest } - { target: x86_64-pc-windows-msvc, runner: windows-latest } runs-on: ${{ matrix.runner }} @@ -957,7 +957,7 @@ jobs: - { target: aarch64-apple-darwin } - { target: x86_64-pc-windows-msvc } # These no-op jobs only preserve required update-flow check names after CI reuse. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Skip duplicate merge queue update test run: echo "Merge queue commit has the same tree as the PR head; update-flow already ran for the PR." @@ -1061,7 +1061,7 @@ jobs: name: Check CLI docs permissions: read-all # This builds a small CI helper and regenerates documentation, not core server packages. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full @@ -1560,7 +1560,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Verify global.json files are symlinks # This builds a small CI helper and checks symlink policy without building SpacetimeDB. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: contents: read env: @@ -1602,7 +1602,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Check smoketests/mod.rs is complete # This builds a tiny source-scanning helper and does not compile or run smoketests. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging permissions: contents: read env: @@ -1673,7 +1673,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: TypeScript - Tests # This reuses prebuilt core binaries and builds only TypeScript SDK test fixtures. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full diff --git a/.github/workflows/cla-gate.yml b/.github/workflows/cla-gate.yml index 40c2864f219..5ee071f123f 100644 --- a/.github/workflows/cla-gate.yml +++ b/.github/workflows/cla-gate.yml @@ -18,7 +18,7 @@ jobs: publish-cla-gate-status: name: CLA status # This only evaluates GitHub status metadata and publishes a commit status. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: github.event_name != 'status' || github.event.context == 'license/cla' steps: diff --git a/.github/workflows/discord-posts.yml b/.github/workflows/discord-posts.yml index 42513554af3..37c7d027d22 100644 --- a/.github/workflows/discord-posts.yml +++ b/.github/workflows/discord-posts.yml @@ -12,7 +12,7 @@ permissions: jobs: resolvePush: # This only resolves GitHub event metadata and performs no checkout or build. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging outputs: is_pr_merge: ${{ steps.resolve.outputs.is_pr_merge }} is_external: ${{ steps.resolve.outputs.is_external }} @@ -82,7 +82,7 @@ jobs: discordNotification: needs: resolvePush # This only queries pull-request checks and posts a Discord notification. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: needs.resolvePush.outputs.is_pr_merge == 'true' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -160,7 +160,7 @@ jobs: - resolvePush - discordNotification # This failure path only posts a Discord notification. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: ${{ always() && (needs.resolvePush.result == 'failure' || needs.discordNotification.result == 'failure') }} steps: - name: Send failure notification @@ -176,7 +176,7 @@ jobs: warnDirectPush: needs: resolvePush # This only formats commit metadata and posts a Discord warning. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: needs.resolvePush.outputs.is_pr_merge != 'true' steps: - name: Warn about non-PR push @@ -202,7 +202,7 @@ jobs: invokePrivate: needs: resolvePush # This only dispatches the private workflow through the GitHub API. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: needs.resolvePush.outputs.is_pr_merge == 'true' permissions: contents: read diff --git a/.github/workflows/docs-publish.yaml b/.github/workflows/docs-publish.yaml index 9eff7a1bfda..6e1ba77ff46 100644 --- a/.github/workflows/docs-publish.yaml +++ b/.github/workflows/docs-publish.yaml @@ -11,7 +11,7 @@ on: jobs: build: # This builds and uploads the documentation site, not SpacetimeDB binaries. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.github/workflows/docs-update-llms.yaml b/.github/workflows/docs-update-llms.yaml index b1f5525b368..7b297adc21f 100644 --- a/.github/workflows/docs-update-llms.yaml +++ b/.github/workflows/docs-update-llms.yaml @@ -15,7 +15,7 @@ on: jobs: update-llms: # This builds documentation assets and updates one generated text file. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.github/workflows/internal-tests.yml b/.github/workflows/internal-tests.yml index 6a2d47509d7..c6cd36791f0 100644 --- a/.github/workflows/internal-tests.yml +++ b/.github/workflows/internal-tests.yml @@ -28,7 +28,7 @@ jobs: if: ${{ (github.event_name == 'pull_request' || (github.event_name == 'push' && github.ref == 'refs/heads/master')) && (github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork) }} # This builds small workflow helpers, dispatches private CI, and waits for its result. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging env: TARGET_OWNER: clockworklabs TARGET_REPO: SpacetimeDBPrivate diff --git a/.github/workflows/llm-benchmark-periodic.yml b/.github/workflows/llm-benchmark-periodic.yml index 9230922b449..099982ae75e 100644 --- a/.github/workflows/llm-benchmark-periodic.yml +++ b/.github/workflows/llm-benchmark-periodic.yml @@ -51,7 +51,7 @@ jobs: prepare_matrix: name: Prepare benchmark matrix # This only parses workflow inputs into a JSON matrix and performs no benchmark work. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging outputs: languages: ${{ steps.matrix.outputs.languages }} steps: diff --git a/.github/workflows/pr_approval_check.yml b/.github/workflows/pr_approval_check.yml index 1c68feb6fa1..8a69025b385 100644 --- a/.github/workflows/pr_approval_check.yml +++ b/.github/workflows/pr_approval_check.yml @@ -30,7 +30,7 @@ jobs: publish-approval-status: name: Set approval status # This disabled metadata-only job performs no checkout or build when re-enabled. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging # Disabled until we can spend some more focus on making this work consistently. # See https://github.com/clockworklabs/SpacetimeDB/pull/4673. if: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bdd29e34bd4..d290b04f7bc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -61,7 +61,7 @@ jobs: validate-release-invoker: name: Validate release invoker # This only validates workflow inputs and the invoking actor. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Reject direct public release invocations env: @@ -82,7 +82,7 @@ jobs: build-cargo-release: needs: validate-release-invoker # This compiles only the small release automation binary for downstream jobs. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Checkout uses: actions/checkout@v4 @@ -112,7 +112,7 @@ jobs: release-crates: needs: build-cargo-release # This packages and publishes crates with the prebuilt release helper; it does not build the workspace. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: ${{ inputs.release_crates }} env: CARGO_TERM_COLOR: always @@ -155,7 +155,7 @@ jobs: release-csharp: needs: build-cargo-release # This packages the C# SDK and generated DLLs rather than building the core server. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: ${{ inputs.release_csharp }} env: CARGO_TERM_COLOR: always @@ -235,7 +235,7 @@ jobs: release-cpp: needs: build-cargo-release # This updates and publishes the generated C++ SDK repository without a core build. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: ${{ inputs.release_cpp }} env: CARGO_TERM_COLOR: always @@ -292,7 +292,7 @@ jobs: release-npm: needs: build-cargo-release # This installs and publishes the TypeScript SDK with the prebuilt release helper. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: ${{ inputs.release_npm }} env: CARGO_TERM_COLOR: always @@ -387,7 +387,7 @@ jobs: update-mirror-latest-version: needs: validate-release-invoker # This only verifies S3 objects and updates the latest-version marker. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: ${{ !inputs.dry_run && inputs.update_mirror_latest_version }} steps: @@ -430,7 +430,7 @@ jobs: - release-docker - update-mirror-latest-version # This only publishes existing artifacts and dispatches the release announcement. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: >- ${{ always() diff --git a/.github/workflows/retry-cla-assistant.yml b/.github/workflows/retry-cla-assistant.yml index f84949efd03..05a7f27960b 100644 --- a/.github/workflows/retry-cla-assistant.yml +++ b/.github/workflows/retry-cla-assistant.yml @@ -32,7 +32,7 @@ jobs: retry-cla: name: Retry CLA Assistant if it is the only blocker # This builds a small CI helper and only queries or retries CLA checks. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Check out trusted base code diff --git a/.github/workflows/tag-release.yml b/.github/workflows/tag-release.yml index 1bf6fc14d8f..ba53d1e5cd9 100644 --- a/.github/workflows/tag-release.yml +++ b/.github/workflows/tag-release.yml @@ -31,7 +31,7 @@ jobs: announce-release: name: Announce GitHub release (Internal) # This only formats release metadata and posts a Discord notification. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging if: >- ${{ github.event_name == 'release' @@ -54,7 +54,7 @@ jobs: public-discord-notification: name: Announce GitHub release (Public) # This only formats release notes and posts them to Discord. - runs-on: spacetimedb-linux-small + runs-on: spacetimedb-linux-small-staging steps: - name: Send Discord notification env: From 8f37a026a0aa970bc7dd116b11eeea315c618263 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 08:56:19 -0700 Subject: [PATCH 08/20] [bfops/small-runner]: CI: move heavier small jobs back to Linux runners --- .github/workflows/ci.yml | 9 +++------ .github/workflows/release.yml | 9 +++------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0547f92495c..d955209cb26 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -852,8 +852,7 @@ jobs: needs: [merge_queue_noop, upload-build-artifacts-linux] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Build and test wasm bindings - # This reuses prebuilt core binaries and builds only the small module fixture. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full @@ -1060,8 +1059,7 @@ jobs: if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Check CLI docs permissions: read-all - # This builds a small CI helper and regenerates documentation, not core server packages. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full @@ -1672,8 +1670,7 @@ jobs: needs: [merge_queue_noop, upload-build-artifacts-linux] if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: TypeScript - Tests - # This reuses prebuilt core binaries and builds only TypeScript SDK test fixtures. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux env: CARGO_TARGET_DIR: ${{ github.workspace }}/target RUST_BACKTRACE: full diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d290b04f7bc..aed5af37636 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -81,8 +81,7 @@ jobs: # try to fail during this step to prevent partial releases. build-cargo-release: needs: validate-release-invoker - # This compiles only the small release automation binary for downstream jobs. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux steps: - name: Checkout uses: actions/checkout@v4 @@ -154,8 +153,7 @@ jobs: release-csharp: needs: build-cargo-release - # This packages the C# SDK and generated DLLs rather than building the core server. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux if: ${{ inputs.release_csharp }} env: CARGO_TERM_COLOR: always @@ -291,8 +289,7 @@ jobs: release-npm: needs: build-cargo-release - # This installs and publishes the TypeScript SDK with the prebuilt release helper. - runs-on: spacetimedb-linux-small-staging + runs-on: spacetimedb-linux if: ${{ inputs.release_npm }} env: CARGO_TERM_COLOR: always From 76ae167e9c62bc1fe2b0b6c2ba6a8b9973d85b43 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 08:57:06 -0700 Subject: [PATCH 09/20] [bfops/small-runner]: CI: keep npm release on small runners --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index aed5af37636..0d326da285c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -289,7 +289,8 @@ jobs: release-npm: needs: build-cargo-release - runs-on: spacetimedb-linux + # This installs and publishes the TypeScript SDK with the prebuilt release helper. + runs-on: spacetimedb-linux-small-staging if: ${{ inputs.release_npm }} env: CARGO_TERM_COLOR: always From 7d6b779611f078d0750d9a63771fc190ed98edc7 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 09:01:03 -0700 Subject: [PATCH 10/20] [bfops/small-runner]: CI: retrigger runner load test --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d955209cb26..3645802fb81 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1725,3 +1725,4 @@ jobs: # - name: Print rows in the user table # if: always() # run: spacetime sql quickstart-chat "SELECT * FROM user" + From 38361752ec364d8672cbdc2f6ff339d567d28397 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 09:07:24 -0700 Subject: [PATCH 11/20] [bfops/small-runner]: CI: remove load-test newline --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3645802fb81..d955209cb26 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1725,4 +1725,3 @@ jobs: # - name: Print rows in the user table # if: always() # run: spacetime sql quickstart-chat "SELECT * FROM user" - From e5212717b703f5f2d3743091fb278a4028fb8c78 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 12:51:23 -0700 Subject: [PATCH 12/20] [bfops/small-runner]: CI: prepare small-runner saturation test --- .github/workflows/check-pr-base.yml | 2 +- .github/workflows/ci.yml | 28 ++++++++++++++----------- .github/workflows/internal-tests.yml | 2 +- .github/workflows/pr_approval_check.yml | 2 +- .github/workflows/release.yml | 12 +++++------ 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/.github/workflows/check-pr-base.yml b/.github/workflows/check-pr-base.yml index 166950ea09f..61e1be399e1 100644 --- a/.github/workflows/check-pr-base.yml +++ b/.github/workflows/check-pr-base.yml @@ -8,7 +8,7 @@ permissions: read-all concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.event.inputs.pr_number || format('sha-{0}', github.sha) }} - cancel-in-progress: true + cancel-in-progress: false jobs: check_base_ref: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d955209cb26..7295a63ee1f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ name: CI concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.event.inputs.pr_number || format('sha-{0}', github.sha) }} - cancel-in-progress: true + cancel-in-progress: false permissions: contents: read @@ -93,7 +93,7 @@ jobs: upload-build-artifacts-linux: needs: [merge_queue_noop, lints] - if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} + if: false # Temporary small-runner saturation test. name: Upload build artifacts (Linux) runs-on: spacetimedb-linux timeout-minutes: 15 @@ -310,7 +310,7 @@ jobs: upload-build-artifacts-windows: needs: [merge_queue_noop, lints] - if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} + if: false # Temporary small-runner saturation test. name: Upload build artifacts (Windows) runs-on: spacetimedb-windows-runner timeout-minutes: 15 @@ -324,6 +324,7 @@ jobs: smoketest_build_linux: needs: [upload-build-artifacts-linux] + if: false # Temporary small-runner saturation test. name: Build smoketests (Linux) runs-on: spacetimedb-linux timeout-minutes: 15 @@ -391,6 +392,7 @@ jobs: smoketest_build_windows: needs: [upload-build-artifacts-windows] + if: false # Temporary small-runner saturation test. name: Build smoketests (Windows) runs-on: spacetimedb-windows-runner timeout-minutes: 15 @@ -405,6 +407,7 @@ jobs: smoketest_partitions_linux: needs: [smoketest_build_linux] + if: false # Temporary small-runner saturation test. name: Smoketests (Linux ${{ matrix.partition }}/1) strategy: fail-fast: false @@ -555,6 +558,7 @@ jobs: smoketest_partitions_windows: needs: [smoketest_build_windows] + if: false # Temporary small-runner saturation test. name: Smoketests (Windows ${{ matrix.partition }}/4) strategy: fail-fast: false @@ -593,7 +597,7 @@ jobs: test: needs: [merge_queue_noop, lints, upload-build-artifacts-linux] - if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} + if: false # Temporary small-runner saturation test. name: Test Suite runs-on: spacetimedb-linux @@ -763,7 +767,7 @@ jobs: lints: needs: [merge_queue_noop] - if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} + if: false # Temporary small-runner saturation test. name: Lints runs-on: spacetimedb-linux env: @@ -850,7 +854,7 @@ jobs: module_latest_deps: needs: [merge_queue_noop, upload-build-artifacts-linux] - if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} + if: false # Temporary small-runner saturation test. name: Build and test wasm bindings runs-on: spacetimedb-linux env: @@ -908,7 +912,7 @@ jobs: # The Linux update-flow test uses released artifacts and builds only its small CI driver. - { target: x86_64-unknown-linux-gnu, runner: spacetimedb-linux-small-staging } - { target: aarch64-apple-darwin, runner: macos-latest } - - { target: x86_64-pc-windows-msvc, runner: windows-latest } + # Windows disabled for the temporary small-runner saturation test. runs-on: ${{ matrix.runner }} env: RUST_BACKTRACE: full @@ -1056,7 +1060,7 @@ jobs: cli_docs: needs: [merge_queue_noop] - if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} + if: false # Temporary small-runner saturation test. name: Check CLI docs permissions: read-all runs-on: spacetimedb-linux @@ -1322,7 +1326,7 @@ jobs: godot-testsuite: needs: [merge_queue_noop, lints, upload-build-artifacts-linux] - if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} + if: false # Temporary small-runner saturation test. permissions: contents: read # The .NET packaging, Godot project build, and integration test make this too heavy for a small runner. @@ -1432,7 +1436,7 @@ jobs: csharp-testsuite: needs: [merge_queue_noop, lints, upload-build-artifacts-linux] - if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} + if: false # Temporary small-runner saturation test. # The C# SDK build and tests saturated the small runner's CPU, so keep this on the main runner. runs-on: spacetimedb-linux timeout-minutes: 30 @@ -1632,7 +1636,7 @@ jobs: docs-build: needs: [merge_queue_noop] - if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} + if: false # Temporary small-runner saturation test. name: Docs build # Building the documentation site nearly saturated a small runner and used substantial memory. runs-on: spacetimedb-linux @@ -1668,7 +1672,7 @@ jobs: typescript-test: needs: [merge_queue_noop, upload-build-artifacts-linux] - if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} + if: false # Temporary small-runner saturation test. name: TypeScript - Tests runs-on: spacetimedb-linux env: diff --git a/.github/workflows/internal-tests.yml b/.github/workflows/internal-tests.yml index c6cd36791f0..058b3e2246e 100644 --- a/.github/workflows/internal-tests.yml +++ b/.github/workflows/internal-tests.yml @@ -14,7 +14,7 @@ run-name: Internal Tests [ref=${{ github.ref }}] concurrency: group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true + cancel-in-progress: false permissions: contents: read diff --git a/.github/workflows/pr_approval_check.yml b/.github/workflows/pr_approval_check.yml index 8a69025b385..1d48b703ea5 100644 --- a/.github/workflows/pr_approval_check.yml +++ b/.github/workflows/pr_approval_check.yml @@ -24,7 +24,7 @@ permissions: concurrency: group: pr-approval-check-${{ github.event.pull_request.number || github.sha }} - cancel-in-progress: true + cancel-in-progress: false jobs: publish-approval-status: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0d326da285c..18f5dc4b935 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -55,7 +55,7 @@ permissions: concurrency: group: manual-release-${{ inputs.release_tag }}${{ inputs.dry_run && format('-dry-run-{0}', github.run_id) || '' }} - cancel-in-progress: true + cancel-in-progress: false jobs: validate-release-invoker: @@ -81,6 +81,7 @@ jobs: # try to fail during this step to prevent partial releases. build-cargo-release: needs: validate-release-invoker + if: false # Temporary small-runner saturation test. runs-on: spacetimedb-linux steps: - name: Checkout @@ -154,7 +155,7 @@ jobs: release-csharp: needs: build-cargo-release runs-on: spacetimedb-linux - if: ${{ inputs.release_csharp }} + if: false # Temporary small-runner saturation test. env: CARGO_TERM_COLOR: always GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -289,9 +290,8 @@ jobs: release-npm: needs: build-cargo-release - # This installs and publishes the TypeScript SDK with the prebuilt release helper. - runs-on: spacetimedb-linux-small-staging - if: ${{ inputs.release_npm }} + runs-on: spacetimedb-linux + if: false # Temporary small-runner saturation test. env: CARGO_TERM_COLOR: always GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -344,10 +344,10 @@ jobs: release-docker: needs: build-cargo-release runs-on: spacetimedb-linux + if: false # Temporary small-runner saturation test. env: CARGO_TERM_COLOR: always GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - if: ${{ inputs.release_docker }} steps: - name: Checkout release source From 7310a77062e9cab308685ca696c2d2473e16f1ea Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 12:51:40 -0700 Subject: [PATCH 13/20] [bfops/small-runner]: CI: saturation trigger 1/3 --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7295a63ee1f..83cc82999b6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1729,3 +1729,4 @@ jobs: # - name: Print rows in the user table # if: always() # run: spacetime sql quickstart-chat "SELECT * FROM user" + From beeb971d60ceef738da22cd0929d8ddac68358b2 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 12:51:47 -0700 Subject: [PATCH 14/20] [bfops/small-runner]: CI: saturation trigger 2/3 --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 83cc82999b6..655114c7037 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1730,3 +1730,4 @@ jobs: # if: always() # run: spacetime sql quickstart-chat "SELECT * FROM user" + From ff10c65a7ba902568e4a8ed70747c61ad4c031ad Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 12:51:53 -0700 Subject: [PATCH 15/20] [bfops/small-runner]: CI: saturation trigger 3/3 --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 655114c7037..470fb1da105 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1731,3 +1731,4 @@ jobs: # run: spacetime sql quickstart-chat "SELECT * FROM user" + From b4cc38689cc461722faa82014d12920f57f804fc Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 12:53:32 -0700 Subject: [PATCH 16/20] [bfops/small-runner]: CI: give saturation runs unique concurrency groups --- .github/workflows/check-pr-base.yml | 2 +- .github/workflows/ci.yml | 3 +-- .github/workflows/internal-tests.yml | 2 +- .github/workflows/pr_approval_check.yml | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/check-pr-base.yml b/.github/workflows/check-pr-base.yml index 61e1be399e1..3325f42b7de 100644 --- a/.github/workflows/check-pr-base.yml +++ b/.github/workflows/check-pr-base.yml @@ -7,7 +7,7 @@ on: permissions: read-all concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.event.inputs.pr_number || format('sha-{0}', github.sha) }} + group: ${{ github.workflow }}-${{ github.run_id }} # Temporary small-runner saturation test. cancel-in-progress: false jobs: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 470fb1da105..5b16e915b3b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ on: name: CI concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.event.inputs.pr_number || format('sha-{0}', github.sha) }} + group: ${{ github.workflow }}-${{ github.run_id }} # Temporary small-runner saturation test. cancel-in-progress: false permissions: @@ -1731,4 +1731,3 @@ jobs: # run: spacetime sql quickstart-chat "SELECT * FROM user" - diff --git a/.github/workflows/internal-tests.yml b/.github/workflows/internal-tests.yml index 058b3e2246e..11ad0784009 100644 --- a/.github/workflows/internal-tests.yml +++ b/.github/workflows/internal-tests.yml @@ -13,7 +13,7 @@ on: run-name: Internal Tests [ref=${{ github.ref }}] concurrency: - group: ${{ github.workflow }}-${{ github.ref }} + group: ${{ github.workflow }}-${{ github.run_id }} # Temporary small-runner saturation test. cancel-in-progress: false permissions: diff --git a/.github/workflows/pr_approval_check.yml b/.github/workflows/pr_approval_check.yml index 1d48b703ea5..18ce790fbfd 100644 --- a/.github/workflows/pr_approval_check.yml +++ b/.github/workflows/pr_approval_check.yml @@ -23,7 +23,7 @@ permissions: statuses: write concurrency: - group: pr-approval-check-${{ github.event.pull_request.number || github.sha }} + group: pr-approval-check-${{ github.run_id }} # Temporary small-runner saturation test. cancel-in-progress: false jobs: From c72eafe762d8a956ca0d50dc23951e024917fb3c Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 12:55:27 -0700 Subject: [PATCH 17/20] [bfops/small-runner]: CI: saturation trigger 4/6 --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5b16e915b3b..eab04cd0bab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1731,3 +1731,4 @@ jobs: # run: spacetime sql quickstart-chat "SELECT * FROM user" + From b234204bb1f7dad7b5cecd4ca0a047ca33b56329 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 12:55:33 -0700 Subject: [PATCH 18/20] [bfops/small-runner]: CI: saturation trigger 5/6 --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eab04cd0bab..34e5f61f302 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1732,3 +1732,4 @@ jobs: + From 9663f49725a17b55a41372863d6206568a141e3c Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 12:55:42 -0700 Subject: [PATCH 19/20] [bfops/small-runner]: CI: saturation trigger 6/6 --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 34e5f61f302..203cb35567b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1733,3 +1733,4 @@ jobs: + From b4c82edbaa0e62a97219030489a78caea05e8259 Mon Sep 17 00:00:00 2001 From: Zeke Foppa Date: Fri, 4 Sep 2026 14:25:15 -0700 Subject: [PATCH 20/20] [bfops/small-runner]: CI: restore workflows after saturation test [skip ci] --- .github/workflows/check-pr-base.yml | 4 +-- .github/workflows/ci.yml | 35 +++++++++---------------- .github/workflows/internal-tests.yml | 4 +-- .github/workflows/pr_approval_check.yml | 4 +-- .github/workflows/release.yml | 9 +++---- 5 files changed, 23 insertions(+), 33 deletions(-) diff --git a/.github/workflows/check-pr-base.yml b/.github/workflows/check-pr-base.yml index 3325f42b7de..166950ea09f 100644 --- a/.github/workflows/check-pr-base.yml +++ b/.github/workflows/check-pr-base.yml @@ -7,8 +7,8 @@ on: permissions: read-all concurrency: - group: ${{ github.workflow }}-${{ github.run_id }} # Temporary small-runner saturation test. - cancel-in-progress: false + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.event.inputs.pr_number || format('sha-{0}', github.sha) }} + cancel-in-progress: true jobs: check_base_ref: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 203cb35567b..d955209cb26 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,8 +14,8 @@ on: name: CI concurrency: - group: ${{ github.workflow }}-${{ github.run_id }} # Temporary small-runner saturation test. - cancel-in-progress: false + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.event.inputs.pr_number || format('sha-{0}', github.sha) }} + cancel-in-progress: true permissions: contents: read @@ -93,7 +93,7 @@ jobs: upload-build-artifacts-linux: needs: [merge_queue_noop, lints] - if: false # Temporary small-runner saturation test. + if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Upload build artifacts (Linux) runs-on: spacetimedb-linux timeout-minutes: 15 @@ -310,7 +310,7 @@ jobs: upload-build-artifacts-windows: needs: [merge_queue_noop, lints] - if: false # Temporary small-runner saturation test. + if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Upload build artifacts (Windows) runs-on: spacetimedb-windows-runner timeout-minutes: 15 @@ -324,7 +324,6 @@ jobs: smoketest_build_linux: needs: [upload-build-artifacts-linux] - if: false # Temporary small-runner saturation test. name: Build smoketests (Linux) runs-on: spacetimedb-linux timeout-minutes: 15 @@ -392,7 +391,6 @@ jobs: smoketest_build_windows: needs: [upload-build-artifacts-windows] - if: false # Temporary small-runner saturation test. name: Build smoketests (Windows) runs-on: spacetimedb-windows-runner timeout-minutes: 15 @@ -407,7 +405,6 @@ jobs: smoketest_partitions_linux: needs: [smoketest_build_linux] - if: false # Temporary small-runner saturation test. name: Smoketests (Linux ${{ matrix.partition }}/1) strategy: fail-fast: false @@ -558,7 +555,6 @@ jobs: smoketest_partitions_windows: needs: [smoketest_build_windows] - if: false # Temporary small-runner saturation test. name: Smoketests (Windows ${{ matrix.partition }}/4) strategy: fail-fast: false @@ -597,7 +593,7 @@ jobs: test: needs: [merge_queue_noop, lints, upload-build-artifacts-linux] - if: false # Temporary small-runner saturation test. + if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Test Suite runs-on: spacetimedb-linux @@ -767,7 +763,7 @@ jobs: lints: needs: [merge_queue_noop] - if: false # Temporary small-runner saturation test. + if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Lints runs-on: spacetimedb-linux env: @@ -854,7 +850,7 @@ jobs: module_latest_deps: needs: [merge_queue_noop, upload-build-artifacts-linux] - if: false # Temporary small-runner saturation test. + if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Build and test wasm bindings runs-on: spacetimedb-linux env: @@ -912,7 +908,7 @@ jobs: # The Linux update-flow test uses released artifacts and builds only its small CI driver. - { target: x86_64-unknown-linux-gnu, runner: spacetimedb-linux-small-staging } - { target: aarch64-apple-darwin, runner: macos-latest } - # Windows disabled for the temporary small-runner saturation test. + - { target: x86_64-pc-windows-msvc, runner: windows-latest } runs-on: ${{ matrix.runner }} env: RUST_BACKTRACE: full @@ -1060,7 +1056,7 @@ jobs: cli_docs: needs: [merge_queue_noop] - if: false # Temporary small-runner saturation test. + if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Check CLI docs permissions: read-all runs-on: spacetimedb-linux @@ -1326,7 +1322,7 @@ jobs: godot-testsuite: needs: [merge_queue_noop, lints, upload-build-artifacts-linux] - if: false # Temporary small-runner saturation test. + if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} permissions: contents: read # The .NET packaging, Godot project build, and integration test make this too heavy for a small runner. @@ -1436,7 +1432,7 @@ jobs: csharp-testsuite: needs: [merge_queue_noop, lints, upload-build-artifacts-linux] - if: false # Temporary small-runner saturation test. + if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} # The C# SDK build and tests saturated the small runner's CPU, so keep this on the main runner. runs-on: spacetimedb-linux timeout-minutes: 30 @@ -1636,7 +1632,7 @@ jobs: docs-build: needs: [merge_queue_noop] - if: false # Temporary small-runner saturation test. + if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: Docs build # Building the documentation site nearly saturated a small runner and used substantial memory. runs-on: spacetimedb-linux @@ -1672,7 +1668,7 @@ jobs: typescript-test: needs: [merge_queue_noop, upload-build-artifacts-linux] - if: false # Temporary small-runner saturation test. + if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }} name: TypeScript - Tests runs-on: spacetimedb-linux env: @@ -1729,8 +1725,3 @@ jobs: # - name: Print rows in the user table # if: always() # run: spacetime sql quickstart-chat "SELECT * FROM user" - - - - - diff --git a/.github/workflows/internal-tests.yml b/.github/workflows/internal-tests.yml index 11ad0784009..c6cd36791f0 100644 --- a/.github/workflows/internal-tests.yml +++ b/.github/workflows/internal-tests.yml @@ -13,8 +13,8 @@ on: run-name: Internal Tests [ref=${{ github.ref }}] concurrency: - group: ${{ github.workflow }}-${{ github.run_id }} # Temporary small-runner saturation test. - cancel-in-progress: false + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true permissions: contents: read diff --git a/.github/workflows/pr_approval_check.yml b/.github/workflows/pr_approval_check.yml index 18ce790fbfd..8a69025b385 100644 --- a/.github/workflows/pr_approval_check.yml +++ b/.github/workflows/pr_approval_check.yml @@ -23,8 +23,8 @@ permissions: statuses: write concurrency: - group: pr-approval-check-${{ github.run_id }} # Temporary small-runner saturation test. - cancel-in-progress: false + group: pr-approval-check-${{ github.event.pull_request.number || github.sha }} + cancel-in-progress: true jobs: publish-approval-status: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 18f5dc4b935..aed5af37636 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -55,7 +55,7 @@ permissions: concurrency: group: manual-release-${{ inputs.release_tag }}${{ inputs.dry_run && format('-dry-run-{0}', github.run_id) || '' }} - cancel-in-progress: false + cancel-in-progress: true jobs: validate-release-invoker: @@ -81,7 +81,6 @@ jobs: # try to fail during this step to prevent partial releases. build-cargo-release: needs: validate-release-invoker - if: false # Temporary small-runner saturation test. runs-on: spacetimedb-linux steps: - name: Checkout @@ -155,7 +154,7 @@ jobs: release-csharp: needs: build-cargo-release runs-on: spacetimedb-linux - if: false # Temporary small-runner saturation test. + if: ${{ inputs.release_csharp }} env: CARGO_TERM_COLOR: always GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -291,7 +290,7 @@ jobs: release-npm: needs: build-cargo-release runs-on: spacetimedb-linux - if: false # Temporary small-runner saturation test. + if: ${{ inputs.release_npm }} env: CARGO_TERM_COLOR: always GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -344,10 +343,10 @@ jobs: release-docker: needs: build-cargo-release runs-on: spacetimedb-linux - if: false # Temporary small-runner saturation test. env: CARGO_TERM_COLOR: always GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + if: ${{ inputs.release_docker }} steps: - name: Checkout release source