Skip to content

Commit 0b5bfa3

Browse files
Andy-Jostclaude
andcommitted
Merge main into docs-pinned-mr-allocate-params to pick up #3188 (cuDSS 1.0 library names)
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2 parents 3626c66 + d5f37e0 commit 0b5bfa3

989 files changed

Lines changed: 308538 additions & 21933 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.coderabbit.yaml‎

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
language: en-US
5+
tone_instructions: |
6+
Be direct, technical, brief. No praise, emojis, headings, or collapsible menus.
7+
Start each comment with one prefix:
8+
- suggestion: optional improvement;
9+
- important: must-fix/high-impact risk;
10+
- critical: blocking correctness/security/data-loss.
11+
12+
reviews:
13+
profile: chill
14+
15+
high_level_summary: true
16+
high_level_summary_in_walkthrough: true
17+
poem: false
18+
in_progress_fortune: false
19+
sequence_diagrams: false
20+
estimate_code_review_effort: false
21+
collapse_walkthrough: true
22+
23+
# Reduce noisy status/details sections.
24+
request_changes_workflow: false
25+
review_status: false
26+
review_details: false
27+
enable_prompt_for_ai_agents: false
28+
29+
auto_review:
30+
enabled: true
31+
drafts: false
32+
base_branches:
33+
- "^main$"
34+
ignore_usernames:
35+
- "copy-pr-bot[bot]"
36+
- "dependabot[bot]"
37+
- "github-actions[bot]"
38+
39+
tools:
40+
gitleaks:
41+
enabled: false
42+
markdownlint:
43+
enabled: false
44+
shellcheck:
45+
enabled: false
46+
47+
# Keep Autofix available, but disable the other finishing touch actions.
48+
finishing_touches:
49+
docstrings:
50+
enabled: false
51+
unit_tests:
52+
enabled: false
53+
simplify:
54+
enabled: false
55+
56+
pre_merge_checks:
57+
docstrings:
58+
mode: "off"
59+
title:
60+
mode: "off"
61+
description:
62+
mode: "off"
63+
issue_assessment:
64+
mode: "off"
65+
custom_checks: []
66+
67+
path_instructions:
68+
- path: "cuda_bindings_13/**/*"
69+
instructions: |
70+
Focus on Cython binding correctness, API and ABI stability, error-code propagation,
71+
resource ownership and reference counting, GIL handling, cross-platform behavior.
72+
Avoid style-only comments already covered by pre-commit.
73+
74+
- path: "cuda_core/**/*"
75+
instructions: |
76+
Focus on Python API stability, stream ordering, CUDA resource lifetime and ownership, CUDA Array Interface
77+
compatibility, host/device memory semantics, error translation, and free-threading correctness. Check that
78+
public behavior changes have corresponding tests, documentation and release notes. Avoid style-only comments
79+
already covered by pre-commit.
80+
81+
- path: "cuda_pathfinder/**/*"
82+
instructions: |
83+
Focus on deterministic path resolution across Linux and Windows, wheel and conda layouts, dynamic-library
84+
loading and cache semantics, and explicit behavior when the CUDA Toolkit is missing or partially installed.
85+
Check that errors preserve the package's public exception contracts.
86+
87+
- path: "cuda_python/**/*"
88+
instructions: |
89+
Focus on metapackage correctness, dependency and version pins, wheel and sdist contents, and documentation
90+
aggregation. Keep runtime functionality in the component packages and verify that packaging changes preserve
91+
compatibility among cuda-python, cuda-bindings, cuda-core, and cuda-pathfinder.
92+
93+
- path: "benchmarks/**/*"
94+
instructions: |
95+
Check that benchmark changes measure meaningful workloads, keep comparison axes and benchmark identifiers
96+
comparable, avoid excessive runtime, and preserve useful comparison data.
97+
98+
- path: "ci/**/*"
99+
instructions: |
100+
For CI and build scripts, focus on matrix correctness, the GPU-versus-CPU job split, targeted build and test
101+
behavior, cache and artifact handling, environment setup, clear failure modes, and avoiding unnecessary
102+
expensive jobs.
103+
104+
- path: ".github/**/*"
105+
instructions: |
106+
For GitHub workflows and repository automation, focus on least-privilege permissions, event triggers, matrix
107+
generation, status and check behavior, security boundaries, and avoiding unnecessary CI fanout.
108+
109+
- path: "**/*.pyx"
110+
instructions: |
111+
Focus on typed-memoryview safety, GIL and nogil correctness, exception specifications, fused-type behavior,
112+
Python reference ownership, and consistency with related declarations and generated type stubs.
113+
114+
- path: "**/*.pxd"
115+
instructions: |
116+
Focus on declaration and implementation consistency, typed-memoryview safety, GIL and nogil correctness,
117+
exception specifications, fused-type behavior, and API or ABI impact on Cython consumers.
118+
119+
knowledge_base:
120+
opt_out: false
121+
code_guidelines:
122+
filePatterns:
123+
- "AGENTS.md"
124+
- "CONTRIBUTING.md"
125+
- "cuda_bindings_13/AGENTS.md"
126+
- "cuda_core/AGENTS.md"
127+
- "cuda_core/tests/AGENTS.md"
128+
- "cuda_pathfinder/AGENTS.md"
129+
- "cuda_python/AGENTS.md"
130+
- "benchmarks/cuda_bindings/AGENTS.md"
131+
- "benchmarks/cuda_core/AGENTS.md"
132+
- "cuda_bindings_13/README.md"
133+
- "cuda_core/README.md"
134+
- "cuda_pathfinder/DESCRIPTION.rst"
135+
- "cuda_python/DESCRIPTION.rst"
136+
- "cuda_bindings_13/docs/source/contribute.rst"
137+
- "cuda_core/docs/source/contribute.rst"
138+
- "cuda_core/docs/source/concurrency.rst"
139+
- "cuda_core/docs/source/error_handling.rst"
140+
- "cuda_pathfinder/docs/source/contribute.rst"
141+
- "cuda_bindings_13/docs/source/release.rst"
142+
- "cuda_core/docs/source/release.rst"
143+
- "cuda_pathfinder/docs/source/release.rst"
144+
- "cuda_python/docs/source/release.rst"

‎.gitattributes‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,11 @@ pixi.lock merge=binary linguist-language=YAML linguist-generated=true
1414
# `setuptools-scm` to correctly determine the version when building from a git
1515
# archive. See #1609.
1616
.git_archival.txt export-subst
17+
18+
# cuda.core compiles against the libcu++ headers of the vendored CCCL submodule
19+
# only; cuda_core/MANIFEST.in grafts those headers (and their licenses) into the
20+
# sdist explicitly. setuptools-scm 10 lists the files of an initialized
21+
# submodule, which would otherwise add the entire CCCL tree to the sdist and
22+
# make every egg_info walk it. "export-ignore" makes its file finder skip the
23+
# submodule. See #2940.
24+
cuda_core/third_party/cccl export-ignore

‎.github/RELEASE-core.md‎

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,32 @@
66
This document covers the `cuda.core` release process. For other packages:
77
`cuda-bindings` and `cuda-python` involve a private repository and are not
88
documented here; `cuda-pathfinder` is largely automated by the
9-
[release-cuda-pathfinder.yml](workflows/release-cuda-pathfinder.yml)
9+
[CI: Release](workflows/release.yml)
1010
workflow.
1111

12+
To release `cuda-pathfinder`, dispatch **CI: Release** with
13+
`component` set to `cuda-pathfinder`, `release-action` set
14+
to `full-release`, and `git-tag` set to the existing
15+
`cuda-pathfinder-v<VERSION>` tag. The workflow finds the successful
16+
tag-triggered CI run, checks release notes, creates or reuses a draft,
17+
builds and deploys versioned docs, and uploads the source archive, checksum,
18+
and wheels. It publishes to TestPyPI, verifies installation and the imported
19+
version, then publishes to PyPI and verifies again before publishing the
20+
GitHub Release without marking it as latest. A failed
21+
docs build prevents asset uploads, package publication, and finalization.
22+
23+
The release-note checker runs from `git-tag`, not the workflow revision.
24+
For Pathfinder, that tag must contain a version
25+
of `ci/tools/check_release_notes.py` that writes `version=<VERSION>` to
26+
`GITHUB_OUTPUT`. The release-notes job rejects an empty version before
27+
documentation, asset uploads, or package publication can start. Pathfinder
28+
package publication also requires successful draft metadata preparation.
29+
30+
The default `dry-run` action validates preparation, builds docs, and
31+
collects release artifacts without creating a GitHub Release or publishing
32+
packages. It can be dispatched from a development branch; use
33+
`dry-run-docs-branch` only when a preview deployment is needed.
34+
1235
Each section below provides detailed guidance for a step in the
1336
[Release Checklist](ISSUE_TEMPLATE/release_checklist.yml). To start a
1437
release, create a new issue from that template and work through it item by
@@ -62,9 +85,14 @@ platforms as appropriate for each release.
6285
## Check (or update if needed) the dependency requirements
6386

6487
Review `cuda_core/pyproject.toml` and verify that all dependency
65-
requirements are current.
66-
67-
Update the cuda_core dependency in `cuda_python/setup.py`.
88+
requirements are current. The `cu12`/`cu13` extras declare the
89+
`cuda-bindings` floors; see "Bumping the cuda-bindings floor" in
90+
`cuda_core/AGENTS.md`.
91+
92+
Update the `cuda-core` pin in `cuda_python/setup.py` to the new minor
93+
series (`cuda-core~=X.Y.0`), and plan a `cuda-python` release right after
94+
this one. Until that release, `pip install cuda-python` resolves to the
95+
previous `cuda-core`.
6896

6997
---
7098

‎.github/actionlint.yaml‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,23 @@ self-hosted-runner:
1212
# GitHub supports queued concurrency runs, but the latest actionlint release
1313
# does not yet recognize the concurrency.queue key.
1414
paths:
15+
".github/workflows/build-docs.yml":
16+
ignore:
17+
- 'unexpected key "queue" for "concurrency" section'
18+
".github/workflows/cleanup-pr-previews.yml":
19+
ignore:
20+
- 'unexpected key "queue" for "concurrency" section'
1521
".github/workflows/ci-workflow-health.yml":
1622
ignore:
1723
- 'unexpected key "queue" for "concurrency" section'
24+
# GitHub supports self-repository ($/) action references, but the latest
25+
# actionlint release does not yet recognize them (rhysd/actionlint#711).
26+
".github/workflows/release.yml":
27+
ignore:
28+
- 'specifying action "\$/[^"]+" in invalid format because ref is missing'
29+
".github/workflows/test-wheel-linux.yml":
30+
ignore:
31+
- 'specifying action "\$/[^"]+" in invalid format because ref is missing'
32+
".github/workflows/test-wheel-windows.yml":
33+
ignore:
34+
- 'specifying action "\$/[^"]+" in invalid format because ref is missing'
Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
1+
# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
22
#
33
# SPDX-License-Identifier: Apache-2.0
44

55
name: Docs in PRs
6-
description: Preview or clean up docs built from PRs
6+
description: Preview docs built from PRs
77

88
# A re-implementation based on the logic of https://github.com/rossjrw/pr-preview-action/blob/41a957c44a456a34718e9bcf825363194db5e6d5/README.md, due to limitations illustrated in NVIDIA/cuda-python#380.
99

@@ -18,20 +18,23 @@ inputs:
1818
runs:
1919
using: composite
2020
steps:
21-
# The steps below are executed only when testing in a PR.
22-
# Note: the PR previews will be removed once merged to main or release/* (see below)
2321
- name: Deploy doc preview
24-
if: ${{ github.ref_name != 'main' && !startsWith(github.ref_name, 'release/') }}
22+
if: ${{ startsWith(github.ref_name, 'pull-request/') }}
2523
uses: JamesIves/github-pages-deploy-action@d92aa235d04922e8f08b40ce78cc5442fcfbfa2f # v4.8.0
2624
with:
2725
git-config-name: cuda-python-bot
2826
git-config-email: [email protected]
2927
folder: ${{ inputs.source-folder }}
3028
target-folder: docs/pr-preview/pr-${{ inputs.pr-number }}/
3129
commit-message: "Deploy doc preview for PR ${{ inputs.pr-number }} (${{ github.sha }})"
30+
# Every PR preview, the main docs deploy, and the coverage deploy commit to
31+
# the shared gh-pages branch. Rebase onto a deployment that landed in the
32+
# meantime instead of force-pushing over it, which the branch ruleset
33+
# rejects (and which used to discard the other deployment).
34+
force: false
3235

3336
- name: Leave a comment after deployment
34-
if: ${{ github.ref_name != 'main' && !startsWith(github.ref_name, 'release/') }}
37+
if: ${{ startsWith(github.ref_name, 'pull-request/') }}
3538
uses: marocchino/sticky-pull-request-comment@d4d6b0936434b21bc8345ad45a440c5f7d2c40ff # v3.0.3
3639
with:
3740
header: pr-preview
@@ -45,27 +48,3 @@ runs:
4548
| <br> https://nvidia.github.io/cuda-python/pr-preview/pr-${{ inputs.pr-number }}/cuda-bindings/ <br>
4649
| <br> https://nvidia.github.io/cuda-python/pr-preview/pr-${{ inputs.pr-number }}/cuda-pathfinder/ <br><br>
4750
| <h6><br> Preview will be ready when the GitHub Pages deployment is complete. <br><br></h6>
48-
49-
# The steps below are executed only when building on main or release/*.
50-
- name: Remove doc preview
51-
if: ${{ github.ref_name == 'main' || startsWith(github.ref_name, 'release/') }}
52-
uses: JamesIves/github-pages-deploy-action@d92aa235d04922e8f08b40ce78cc5442fcfbfa2f # v4.8.0
53-
with:
54-
git-config-name: cuda-python-bot
55-
git-config-email: [email protected]
56-
folder: ${{ inputs.source-folder }}
57-
target-folder: docs/pr-preview/pr-${{ inputs.pr-number }}/
58-
commit-message: "Clean up doc preview for PR ${{ inputs.pr-number }} (${{ github.sha }})"
59-
60-
- name: Leave a comment after removal
61-
if: ${{ github.ref_name == 'main' || startsWith(github.ref_name, 'release/') }}
62-
uses: marocchino/sticky-pull-request-comment@d4d6b0936434b21bc8345ad45a440c5f7d2c40ff # v3.0.3
63-
with:
64-
header: pr-preview
65-
number: ${{ inputs.pr-number }}
66-
hide_and_recreate: true
67-
hide_classify: "OUTDATED"
68-
message: |
69-
Doc Preview CI
70-
:---:
71-
Preview removed because the pull request was closed or merged.
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
name: Download artifact (with retry)
6+
7+
description: >-
8+
Wrapper around actions/download-artifact that retries once after a short
9+
delay when the first attempt fails. Designed to absorb transient
10+
infrastructure flakes such as "other side closed" without failing the job.
11+
12+
inputs:
13+
name:
14+
description: "Name of the artifact to download"
15+
required: true
16+
path:
17+
description: "Destination path for the downloaded artifact"
18+
required: true
19+
run-id:
20+
description: >-
21+
The run ID of the workflow run that uploaded the artifact. Only used
22+
together with github-token; leave empty to download from the current run.
23+
required: false
24+
default: ""
25+
github-token:
26+
description: >-
27+
Token used to download from another run or repository. Leave empty (the
28+
default) to download from the current run, which uses
29+
actions/download-artifact's internal download path. That path is not the
30+
same as the one used when a token is given, so do not default this to
31+
github.token.
32+
required: false
33+
default: ""
34+
retry-delay-seconds:
35+
description: "Seconds to wait between the first failure and the retry"
36+
required: false
37+
default: "15"
38+
39+
runs:
40+
using: composite
41+
steps:
42+
- name: Download artifact (attempt 1)
43+
id: attempt1
44+
continue-on-error: true
45+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
46+
with:
47+
name: ${{ inputs.name }}
48+
path: ${{ inputs.path }}
49+
run-id: ${{ inputs.run-id }}
50+
github-token: ${{ inputs.github-token }}
51+
52+
- name: Wait before retry
53+
if: ${{ steps.attempt1.outcome == 'failure' }}
54+
shell: bash --noprofile --norc -euo pipefail {0}
55+
env:
56+
# Pass through env instead of interpolating the input into the shell
57+
# script, so a non-numeric value cannot inject commands.
58+
RETRY_DELAY_SECONDS: ${{ inputs.retry-delay-seconds }}
59+
run: |
60+
echo "::warning::Artifact download failed (attempt 1); retrying in ${RETRY_DELAY_SECONDS}s"
61+
sleep "$RETRY_DELAY_SECONDS"
62+
63+
- name: Download artifact (attempt 2)
64+
if: ${{ steps.attempt1.outcome == 'failure' }}
65+
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
66+
with:
67+
name: ${{ inputs.name }}
68+
path: ${{ inputs.path }}
69+
run-id: ${{ inputs.run-id }}
70+
github-token: ${{ inputs.github-token }}

0 commit comments

Comments
 (0)