chore: test on bazel 9
diff --git a/.aspect/workflows/config.yaml b/.aspect/workflows/config.yaml
index b3fca42..e872ae0 100644
--- a/.aspect/workflows/config.yaml
+++ b/.aspect/workflows/config.yaml
@@ -1,5 +1,9 @@
+# Test the root workspace using "dev dependencies" on Linux only, and with the version in .bazelversion.
+# Look in /.github/workflows/ci.yaml for test matrix on other OS and Bazel version
 # See https://docs.aspect.build/workflows/configuration
 tasks:
   - test:
+  - format:
+  - buildozer:
 notifications:
   github: {}
diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml
index 9e49c0c..f856c42 100644
--- a/.bazelci/presubmit.yml
+++ b/.bazelci/presubmit.yml
@@ -1,105 +1,18 @@
----
-bazel: 7.1.1
-# Note, this will tell the user to do the wrong thing (manually run buildifer)
-# See https://github.com/bazelbuild/continuous-integration/issues/1161
-buildifier:
-  version: 6.4.0
-  # Keep this in sync with the list in .pre-commit-config.yaml
-  # https://github.com/bazelbuild/buildtools/issues/479 should fix this by giving us a config file
-tasks:
-  ubuntu1804:
-    name: ubuntu1804
-    platform: ubuntu1804
-    build_targets:
-      - "//..."
-    test_flags:
-      - "--test_tag_filters=-skip-on-bazelci-ubuntu"
-    test_targets:
-      - "//..."
-  ubuntu1804-headers:
-    name: ubuntu1804-headers
-    platform: ubuntu1804
-    working_directory: "e2e/headers"
-    build_targets:
-      - "//..."
-    test_flags:
-      - "--test_tag_filters=-skip-on-bazelci-ubuntu"
-    test_targets:
-      - "//..."
-  ubuntu1804-smoke:
-    name: ubuntu1804-smoke
-    platform: ubuntu1804
-    working_directory: "e2e/smoke"
-    build_targets:
-      - "//..."
-    test_flags:
-      - "--test_tag_filters=-skip-on-bazelci-ubuntu"
-    test_targets:
-      - "//..."
-  ubuntu1804-nodejs_host:
-    name: ubuntu1804-nodejs_host
-    platform: ubuntu1804
-    working_directory: "e2e/nodejs_host"
-    build_targets:
-      - "//..."
-    test_flags:
-      - "--test_tag_filters=-skip-on-bazelci-ubuntu"
-    test_targets:
-      - "//..."
-  macos:
-    name: macos
-    platform: macos
-    build_targets:
-      - "//..."
-    test_flags:
-      - "--test_tag_filters=-skip-on-bazelci-macos"
-    test_targets:
-      - "//..."
-  macos-headers:
-    name: macos-headers
-    platform: macos
-    working_directory: "e2e/headers"
-    build_targets:
-      - "//..."
-    test_flags:
-      - "--test_tag_filters=-skip-on-bazelci-macos"
-    test_targets:
-      - "//..."
-  macos-smoke:
-    name: macos-smoke
-    platform: macos
-    working_directory: "e2e/smoke"
-    build_targets:
-      - "//..."
-    test_flags:
-      - "--test_tag_filters=-skip-on-bazelci-macos"
-    test_targets:
-      - "//..."
-  windows-smoke:
-    name: windows-smoke
-    platform: windows
-    working_directory: "e2e/smoke"
-    build_targets:
-      - "//..."
-    test_flags:
-      - "--test_tag_filters=-skip-on-bazelci-windows"
-    test_targets:
-      - "//..."
-  windows-nodejs_host:
-    name: windows-nodejs_host
-    platform: windows
-    working_directory: "e2e/nodejs_host"
-    build_targets:
-      - "//..."
-    test_flags:
-      - "--test_tag_filters=-skip-on-bazelci-windows"
-    test_targets:
-      - "//..."
-  rbe_ubuntu1604-smoke:
-    name: rbe_ubuntu1604-smoke
-    platform: rbe_ubuntu1604
-    working_directory: "e2e/smoke"
-    build_targets:
-      - "//..."
-    test_targets:
-      - "//..."
+bcr_test_module:
+  module_path: e2e/smoke
+  matrix:
+    platform:
+      - ubuntu2204
+      - macos
+      - windows
+    bazel:
+      - 7.x
+      - 8.x
+      - 9.*
+  tasks:
+    run_test_module:
+      name: Run test module
+      platform: ${{ platform }}
+      bazel: ${{ bazel }}
+      test_targets:
+        - //...
diff --git a/.bcr/presubmit.yml b/.bcr/presubmit.yml
index b6f7777..2cc675a 100644
--- a/.bcr/presubmit.yml
+++ b/.bcr/presubmit.yml
@@ -1,7 +1,7 @@
 bcr_test_module:
   module_path: "e2e/smoke"
   matrix:
-    bazel: ["7.x", "8.x", "rolling"]
+    bazel: ["7.x", "8.x", "9.*"]
     platform: ["debian10", "macos", "ubuntu2004", "windows"]
   tasks:
     run_tests:
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
deleted file mode 100644
index 8e976f9..0000000
--- a/.github/workflows/ci.yaml
+++ /dev/null
@@ -1,32 +0,0 @@
-name: CI
-
-# Controls when the action will run.
-on:
-  push:
-    branches: [main]
-  pull_request:
-    branches: [main]
-  # Allows you to run this workflow manually from the Actions tab
-  workflow_dispatch:
-
-concurrency:
-  # Cancel previous actions from the same PR or branch except 'main' branch.
-  # See https://docs.github.com/en/actions/using-jobs/using-concurrency and https://docs.github.com/en/actions/learn-github-actions/contexts for more info.
-  group: concurrency-group::${{ github.workflow }}::${{ github.event.pull_request.number > 0 && format('pr-{0}', github.event.pull_request.number) || github.ref_name }}${{ github.ref_name == 'main' && format('::{0}', github.run_id) || ''}}
-  cancel-in-progress: ${{ github.ref_name != 'main' }}
-
-jobs:
-  test:
-    uses: bazel-contrib/.github/.github/workflows/bazel.yaml@v7.2.3
-    with:
-      folders: '[".", "e2e/headers", "e2e/smoke", "e2e/nodejs_host", "e2e/conflicting_toolchains"]'
-      # stardoc generated docs fail on diff_test with Bazel 6.4.0 so don't test against it in root repository
-      exclude: |
-        [
-          {"bazelversion": "7.3.1", "os": "ubuntu-latest", folder: "."},
-          {"bazelversion": "6.4.0", "os": "macos-latest"},
-          {"bazelversion": "6.4.0", "os": "windows-latest"},
-          {"bazelversion": "6.4.0", folder: "."},
-          {"bazelversion": "6.4.0", bzlmodEnabled: true},
-          {folder: "e2e/conflicting_toolchains", bzlmodEnabled: false}
-        ]
diff --git a/e2e/smoke/MODULE.bazel b/e2e/smoke/MODULE.bazel
index 7221a44..03ef282 100644
--- a/e2e/smoke/MODULE.bazel
+++ b/e2e/smoke/MODULE.bazel
@@ -4,8 +4,8 @@
     path = "../..",
 )
 
-bazel_dep(name = "bazel_lib", version = "3.0.0-beta.1", dev_dependency = True)
-bazel_dep(name = "bazel_skylib", version = "1.7.1", dev_dependency = True)
+bazel_dep(name = "bazel_lib", version = "3.0.0", dev_dependency = True)
+bazel_dep(name = "bazel_skylib", version = "1.8.1", dev_dependency = True)
 bazel_dep(name = "platforms", version = "0.0.10", dev_dependency = True)
 
 node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node", dev_dependency = True)