Build cryptography without build isolation in the tests session

uv's isolated build environment lives in a temporary directory with a
fresh random name. For non-abi3 builds (the free-threaded jobs)
maturin passes that interpreter to pyo3-build-config as PYO3_PYTHON,
which registers rerun-if-env-changed on it, so every CI run on 3.14t
and 3.15t-dev recompiled pyo3-ffi and pyo3 despite a warm cache, on
all three platforms. Building with the session's own interpreter gives
a stable path. The cache key suffix is bumped so the recorded
fingerprint is refreshed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QZZQDQuPPD8T7jaAsCSHtM
diff --git a/.github/actions/cache/action.yml b/.github/actions/cache/action.yml
index b26c830..ed511b8 100644
--- a/.github/actions/cache/action.yml
+++ b/.github/actions/cache/action.yml
@@ -19,7 +19,7 @@
         KEY: "${{ inputs.key }}"
     - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6  # v2.9.2
       with:
-        key: ${{ steps.normalized-key.outputs.key }}-6
+        key: ${{ steps.normalized-key.outputs.key }}-7
     # maturin writes the pyo3 config file to target/maturin/, and pyo3-ffi's
     # build script registers cargo:rerun-if-changed on it. rust-cache's
     # cleanup deletes target/maturin/ before saving, so the file was
diff --git a/noxfile.py b/noxfile.py
index 9c833a3..9c06ad4 100644
--- a/noxfile.py
+++ b/noxfile.py
@@ -82,14 +82,24 @@
 
     install_spec = f".[{','.join(extras)}]"
     install(session, "-e", "./vectors")
+    # Build cryptography with this session's interpreter rather than in an
+    # isolated build environment. The build environment lives in a
+    # temporary directory with a fresh random name, and for non-abi3
+    # builds (free-threaded interpreters) maturin passes that interpreter
+    # to pyo3-build-config as PYO3_PYTHON, which registers
+    # rerun-if-env-changed on it: every CI run recompiled pyo3-ffi and
+    # pyo3 despite a warm cache. The session venv's path is stable.
+    pyproject_data = load_pyproject_toml()
+    install(session, *pyproject_data["build-system"]["requires"])
     if session.name == "tests-rust-debug":
         install(
             session,
+            "--no-build-isolation",
             "--config-settings-package=cryptography:build-args=--profile=dev",
             install_spec,
         )
     else:
-        install(session, install_spec)
+        install(session, "--no-build-isolation", install_spec)
 
     install(
         session,