From e54d16929a60f3cb7161b0686f45804c2a369a0e Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 12 May 2026 16:08:02 +0000 Subject: [PATCH 1/3] Add Cursor Cloud specific instructions to AGENTS.md Co-authored-by: Keith Kraus --- AGENTS.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index a4450fbc664..4f50a90fde5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -283,3 +283,47 @@ mechanical. Use judgment to decide how much structure adds value. * Do not provide range of lines * Examples: `src/app.ts`, src/app.ts:42, b/server/index.js#L10, C:\repo\project\main.rs:12:5 + +## Cursor Cloud specific instructions + +This section is for Cloud Agents running in VMs without CUDA hardware. + +### Environment overview + +- **pixi** is the primary environment manager. It is installed at + `~/.pixi/bin/pixi`; ensure `~/.pixi/bin` is on `PATH`. +- The VM update script installs pixi and runs `pixi install` for the root + workspace and `cuda_pathfinder`. No manual dependency installation needed. + +### What can run without a GPU + +- `cuda_pathfinder` is pure Python: build, test (`pixi run -e default test` + from `cuda_pathfinder/`), and import all work without CUDA hardware. +- Repo-wide **ruff lint/format** via `pixi run ruff check .` / `pixi run ruff + format --check .` from the repo root. +- **pre-commit** checks: `pre-commit run --all-files` (needs + `pip install pre-commit` if not already present). + +### What requires CUDA + +- `cuda_bindings` and `cuda_core` require CUDA Toolkit headers (`CUDA_HOME` or + `CUDA_PATH`) to build from source and a GPU to run tests. These cannot be + built or tested in a GPU-less Cloud Agent VM. +- `cuda_python` is a metapackage with no substantial runtime code. + +### Running tests + +- **cuda_pathfinder**: `cd cuda_pathfinder && pixi run -e default test` + (975+ tests, ~4 s). +- Tests for other packages are orchestrated the same way but require CUDA; see + each package's `AGENTS.md`. + +### Gotchas + +- pixi lockfiles use an older format (v6); the `WARN` about upgrading to v7 is + safe to ignore and should not be acted upon (running `pixi lock` would change + committed lockfiles). +- The root `pixi.toml` workspace tasks (`test`, `docs`) delegate to + sub-package pixi environments and are Linux-only. +- `pre-commit` hooks download their own tool versions on first run (~25 s); + subsequent runs are fast. From 554637c76c8cf4bc46b768d33368a9064443c4da Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 12 May 2026 16:13:57 +0000 Subject: [PATCH 2/3] Cherry-pick: fix invalid python_version target in cuda_core/pixi.toml Cherry-picked from PR #2029 (commit 18f5a027) to unblock pixi install. Pixi's [package.target.] only accepts platform identifiers; the 'python_version < "3.11"' selector caused parse failures. Co-authored-by: Keith Kraus --- cuda_core/pixi.lock | 32 ++++++++++++++++++++++++++++++++ cuda_core/pixi.toml | 6 ++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/cuda_core/pixi.lock b/cuda_core/pixi.lock index 4b7d2809cf1..757209b36bb 100644 --- a/cuda_core/pixi.lock +++ b/cuda_core/pixi.lock @@ -11,6 +11,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda @@ -225,6 +226,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aom-3.9.1-hcccb83c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda @@ -426,6 +428,7 @@ environments: win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aom-3.9.1-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/binutils_impl_win-64-2.45.1-default_ha84baeb_101.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda @@ -583,6 +586,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda @@ -793,6 +797,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aom-3.9.1-hcccb83c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda @@ -990,6 +995,7 @@ environments: win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aom-3.9.1-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/binutils_impl_win-64-2.45.1-default_ha84baeb_101.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda @@ -1141,6 +1147,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda @@ -1351,6 +1358,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aom-3.9.1-hcccb83c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda @@ -1548,6 +1556,7 @@ environments: win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aom-3.9.1-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/binutils_impl_win-64-2.45.1-default_ha84baeb_101.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda @@ -1707,6 +1716,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.15-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda @@ -1890,6 +1900,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.15-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py314h352cb57_1.conda @@ -2071,6 +2082,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.15-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda @@ -2243,6 +2255,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda @@ -2473,6 +2486,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aom-3.9.1-hcccb83c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/arm-variant-1.2.0-sbsa.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_101.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h4777abc_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-hbd8a1cb_0.conda @@ -2692,6 +2706,7 @@ environments: - conda: ../cuda_pathfinder win-64: - conda: https://conda.anaconda.org/conda-forge/win-64/aom-3.9.1-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.2.25-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h477c42c_1.conda @@ -3043,6 +3058,17 @@ packages: - pkg:pypi/babel?source=compressed-mapping size: 7684321 timestamp: 1772555330347 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.strenum-1.3.1-haf276df_2.conda + noarch: python + sha256: b3d3ae7769fd5a454417ce791b72cfeab77c85cb532e3d0c41d2bf70b07b5416 + md5: 1e58854a1a742a8d94d862b626cf4057 + depends: + - python >=3.12 + license: PSF-2.0 + license_family: PSF + purls: [] + size: 9849 + timestamp: 1736184616857 - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda noarch: generic sha256: c31ab719d256bc6f89926131e88ecd0f0c5d003fe8481852c6424f4ec6c7eb29 @@ -3670,6 +3696,7 @@ packages: - numpy - cuda-bindings - cuda-pathfinder + - backports.strenum - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 @@ -3693,6 +3720,7 @@ packages: - numpy - cuda-bindings - cuda-pathfinder + - backports.strenum - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 @@ -3715,6 +3743,7 @@ packages: - numpy - cuda-bindings - cuda-pathfinder + - backports.strenum - libgcc >=15 - libgcc >=15 - libstdcxx >=15 @@ -3737,6 +3766,7 @@ packages: - numpy - cuda-bindings - cuda-pathfinder + - backports.strenum - libgcc >=15 - libgcc >=15 - libstdcxx >=15 @@ -3759,6 +3789,7 @@ packages: - numpy - cuda-bindings - cuda-pathfinder + - backports.strenum - libgcc >=15 - libgcc >=15 - libstdcxx >=15 @@ -3781,6 +3812,7 @@ packages: - numpy - cuda-bindings - cuda-pathfinder + - backports.strenum - libgcc >=15 - libgcc >=15 - libstdcxx >=15 diff --git a/cuda_core/pixi.toml b/cuda_core/pixi.toml index df5111497fa..5e626557174 100644 --- a/cuda_core/pixi.toml +++ b/cuda_core/pixi.toml @@ -185,8 +185,10 @@ cuda-version = "*" numpy = "*" cuda-bindings = "*" cuda-pathfinder = "*" - -[package.target.'python_version < "3.11"'.run-dependencies] +# Conda-forge ships per-Python variants of backports.strenum (real impl on +# <3.11, no-op stub on >=3.12); pixi-build doesn't accept PEP 508-style +# `python_version` selectors in [package.target.], so list it +# unconditionally and let the solver pick the right variant. "backports.strenum" = "*" [target.linux.tasks.build-cython-tests] From 96deabac6fc53d12910c401cf6bd98e03c127502 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 12 May 2026 16:17:32 +0000 Subject: [PATCH 3/3] Update AGENTS.md: document full build capabilities for all packages Pixi pulls CUDA Toolkit headers from conda-forge, enabling builds of cuda_bindings and cuda_core without a local CUDA installation. Document the cu13 environment requirement and runtime vs build limitations. Co-authored-by: Keith Kraus --- AGENTS.md | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 4f50a90fde5..15280379ba8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -293,30 +293,43 @@ This section is for Cloud Agents running in VMs without CUDA hardware. - **pixi** is the primary environment manager. It is installed at `~/.pixi/bin/pixi`; ensure `~/.pixi/bin` is on `PATH`. - The VM update script installs pixi and runs `pixi install` for the root - workspace and `cuda_pathfinder`. No manual dependency installation needed. + workspace and all sub-package environments. No manual dependency installation + needed. +- Always use the **`cu13`** environment (not `default`) for `cuda_bindings` + and `cuda_core`. The `default` environment does not pin a CUDA version and + may fail to build due to header mismatches. + +### Building packages + +All three packages build from source using pixi, which pulls CUDA Toolkit +headers from conda-forge (no local CUDA installation needed): + +- `cuda_pathfinder`: `cd cuda_pathfinder && pixi install -e default` +- `cuda_bindings`: `cd cuda_bindings && pixi install -e cu13` (~35 s, Cython + compilation of 26 extension modules) +- `cuda_core`: `cd cuda_core && pixi install -e cu13` (~60 s, builds + cuda_bindings as a path dependency then 38 extension modules) ### What can run without a GPU -- `cuda_pathfinder` is pure Python: build, test (`pixi run -e default test` - from `cuda_pathfinder/`), and import all work without CUDA hardware. +- `cuda_pathfinder`: build, test (`pixi run -e default test`), and import all + work without CUDA hardware. +- `cuda_bindings`: builds and imports successfully (`pixi run -e cu13 python + -c "from cuda.bindings import driver, runtime, nvrtc"`). +- `cuda_core`: builds all Cython extensions but **import fails at runtime** + without GPU drivers (`cuMemGetMemPool` symbol missing from cydriver). This is + expected; the build itself verifies compilation correctness. - Repo-wide **ruff lint/format** via `pixi run ruff check .` / `pixi run ruff format --check .` from the repo root. - **pre-commit** checks: `pre-commit run --all-files` (needs `pip install pre-commit` if not already present). -### What requires CUDA - -- `cuda_bindings` and `cuda_core` require CUDA Toolkit headers (`CUDA_HOME` or - `CUDA_PATH`) to build from source and a GPU to run tests. These cannot be - built or tested in a GPU-less Cloud Agent VM. -- `cuda_python` is a metapackage with no substantial runtime code. - ### Running tests - **cuda_pathfinder**: `cd cuda_pathfinder && pixi run -e default test` (975+ tests, ~4 s). -- Tests for other packages are orchestrated the same way but require CUDA; see - each package's `AGENTS.md`. +- **cuda_bindings** / **cuda_core** tests require a GPU and CUDA drivers. + See each package's `AGENTS.md` for details. ### Gotchas @@ -327,3 +340,5 @@ This section is for Cloud Agents running in VMs without CUDA hardware. sub-package pixi environments and are Linux-only. - `pre-commit` hooks download their own tool versions on first run (~25 s); subsequent runs are fast. +- `cuda_bindings` `default` environment fails to build due to unpinned CUDA + version causing header/code mismatches. Always use `cu13` (or `cu12`).