diff --git a/.github/workflows/deploy-cudf-java-docs.yaml b/.github/workflows/deploy-cudf-java-docs.yaml
index 287fb0e5453..03ead9694be 100644
--- a/.github/workflows/deploy-cudf-java-docs.yaml
+++ b/.github/workflows/deploy-cudf-java-docs.yaml
@@ -2,10 +2,6 @@ name: Deploy cudf-java docs
on:
workflow_dispatch:
inputs:
- new_stable_value:
- description: "New stable value for cudf-java"
- required: true
- default: "1"
version:
description: "Version being released. Format: YY.MM or YY.MM.P e.g 24.08 or 24.08.1"
required: true
@@ -27,6 +23,17 @@ jobs:
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
+ - name: Update cudf-java source data and generated artifacts
+ env:
+ VERSION: ${{ inputs.version }}
+ run: |
+ python3 -m venv /tmp/docs-automation
+ /tmp/docs-automation/bin/python -m pip install pyyaml ruamel.yaml
+ /tmp/docs-automation/bin/python ci/update-docs-project.py \
+ --project cudf-java \
+ --channel stable \
+ --version "${VERSION}"
+ /tmp/docs-automation/bin/python ci/generate-projects-to-versions.py
- uses: aws-actions/configure-aws-credentials@61815dcd50bd041e203e49132bacad1fd04d2708 #v5.1.1
with:
role-to-assume: ${{ vars.AWS_ROLE_ARN }}
@@ -36,22 +43,6 @@ jobs:
env:
VERSION: ${{ inputs.version }}
run: ci/upload_cudf_java_docs.sh "${VERSION}"
- - name: Update stable value for cudf-java in docs.yml and projects-to-versions.json
- env:
- NEW_STABLE_VALUE: ${{ inputs.new_stable_value }}
- VERSION: ${{ inputs.version }}
- run: |
- if [ "$NEW_STABLE_VALUE" != "1" ]; then
- echo "Invalid value for new_stable_value: $NEW_STABLE_VALUE"
- exit 1
- fi
-
- sed -i '/cudf-java:/,/stable:/s/stable: .*/stable: '"$NEW_STABLE_VALUE"'/' _data/docs.yml
- echo "Updated stable value for cudf-java to $NEW_STABLE_VALUE in _data/docs.yml"
-
- jq --arg version "$VERSION" '."cudf-java".stable = $version' ci/customization/projects-to-versions.json > tmp.json \
- && mv tmp.json ci/customization/projects-to-versions.json
- echo "Updated cudf-java stable version to $VERSION in projects-to-versions.json"
- name: Create Pull Request
uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v8.1.1
with:
diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml
index 6cde6c075a7..8e633f3184e 100644
--- a/.github/workflows/pr.yaml
+++ b/.github/workflows/pr.yaml
@@ -20,3 +20,27 @@ jobs:
with:
persist-credentials: false
- uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # v3.0.1
+ build-site:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ persist-credentials: false
+ - name: Validate source data and generated artifacts
+ run: |
+ python3 -m venv /tmp/docs-validation
+ /tmp/docs-validation/bin/python -m pip install pyyaml
+ /tmp/docs-validation/bin/python ci/generate-release-data.py --check
+ /tmp/docs-validation/bin/python ci/generate-projects-to-versions.py --check
+ /tmp/docs-validation/bin/python ci/validate-platform-support.py
+ /tmp/docs-validation/bin/python ci/validate-install-packages.py
+ /tmp/docs-validation/bin/python ci/validate-notices.py
+ # This step uses the `.ruby-version` file.
+ - uses: ruby/setup-ruby@6aaa311d81eba98ae12eaffbcb63296ace0efcde # v1.307.0
+ - name: Build Jekyll site
+ run: |
+ bundle install
+ bundle exec jekyll build
+ - name: Test rendered install selector
+ run: node ci/test-selector.mjs
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 404742e42c5..8641c45c966 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,4 +1,4 @@
-# Copyright (c) 2024-2025, NVIDIA CORPORATION.
+# Copyright (c) 2024-2026, NVIDIA CORPORATION.
ci:
autofix_commit_msg: "[pre-commit.ci] auto code formatting"
@@ -37,6 +37,13 @@ repos:
- id: check-yaml
- repo: local
hooks:
+ - id: generate-release-data
+ name: generate-release-data
+ entry: ./ci/generate-release-data.py
+ language: python
+ pass_filenames: false
+ additional_dependencies:
+ - pyyaml
- id: generate-projects-to-versions
name: generate-projects-to-versions
entry: ./ci/generate-projects-to-versions.py
@@ -44,6 +51,30 @@ repos:
pass_filenames: false
additional_dependencies:
- pyyaml
+ - id: validate-platform-support
+ name: validate-platform-support
+ entry: ./ci/validate-platform-support.py
+ language: python
+ pass_filenames: false
+ files: ^(ci/(data_utils|validate-platform-support)\.py|_data/platform_support\.yml|_data/releases\.json|_includes/selector\.html)$
+ additional_dependencies:
+ - pyyaml
+ - id: validate-install-packages
+ name: validate-install-packages
+ entry: ./ci/validate-install-packages.py
+ language: python
+ pass_filenames: false
+ files: ^(ci/(data_utils|validate-install-packages)\.py|_data/(docs|install_packages|platform_support|releases)\.(json|yml)|_includes/selector\.html)$
+ additional_dependencies:
+ - pyyaml
+ - id: validate-notices
+ name: validate-notices
+ entry: ./ci/validate-notices.py
+ language: python
+ pass_filenames: false
+ files: ^(ci/(new-notice|validate-notices)\.py|_notices/.*\.md)$
+ additional_dependencies:
+ - pyyaml
- repo: https://github.com/sirosen/texthooks
rev: 0.7.1
hooks:
diff --git a/_config.yml b/_config.yml
index 19896d9c2fc..d8f457b4dd3 100644
--- a/_config.yml
+++ b/_config.yml
@@ -11,6 +11,7 @@ permalink: pretty
exclude:
- CONTRIBUTING.md
- README.md
+ - automation-proposal.md
- release_checklist.md
- ci/
- node_modules/
diff --git a/_data/docs.yml b/_data/docs.yml
index 939c48953e9..35c35b6ecfe 100644
--- a/_data/docs.yml
+++ b/_data/docs.yml
@@ -5,6 +5,7 @@ apis:
cudf:
name: cuDF
path: cudf
+ redirect: stable
desc: 'cuDF is a Python GPU DataFrame library (built on the [Apache Arrow](http://arrow.apache.org/) columnar memory format) for loading, joining, aggregating, filtering, and otherwise manipulating data.'
ghlink: https://github.com/rapidsai/cudf
cllink: https://github.com/rapidsai/cudf/blob/main/CHANGELOG.md
@@ -16,6 +17,7 @@ apis:
dask-cudf:
name: dask-cuDF
path: dask-cudf
+ redirect: stable
desc: 'Dask-cuDF extends Dask where necessary to allow its DataFrame partitions to be processed using cuDF GPU DataFrames instead of Pandas DataFrames. Dask-cuDF is used to leverage multiple gpus and multiple nodes for more performance at larger scales'
ghlink: https://github.com/rapidsai/cudf
cllink: https://github.com/rapidsai/cudf/blob/main/CHANGELOG.md
@@ -27,6 +29,7 @@ apis:
cuml:
name: cuML
path: cuml
+ redirect: stable
desc: 'cuML is a suite of libraries that implement machine learning algorithms and mathematical primitives functions that share compatible APIs with other RAPIDS projects.'
ghlink: https://github.com/rapidsai/cuml
cllink: https://github.com/rapidsai/cuml/blob/main/CHANGELOG.md
@@ -38,6 +41,7 @@ apis:
cugraph:
name: cuGraph
path: cugraph
+ redirect: stable
desc: 'cuGraph is a GPU accelerated graph analytics library, the core part of an ecosystem of libraries supporting graph-processing workloads like NetworkX integration (nx-cugraph), GNNs with PyG (cugraph-pyg), and more efficient memory management for large graphs (pylibwholegraph).'
ghlink: https://github.com/rapidsai/cugraph
cllink: https://github.com/rapidsai/cugraph/blob/main/CHANGELOG.md
@@ -49,6 +53,7 @@ apis:
cuxfilter:
name: cuxfilter
path: cuxfilter
+ redirect: stable
desc: 'cuxfilter acts as a connector library, which provides the connections between different visualization libraries and a GPU dataframe without much hassle. This also allows the user to use charts from different libraries in a single dashboard, while also providing the interaction.'
ghlink: https://github.com/rapidsai/cuxfilter
cllink: https://github.com/rapidsai/cuxfilter/blob/main/CHANGELOG.md
@@ -60,6 +65,7 @@ apis:
cudf-java:
name: 'Java + cuDF'
path: cudf-java
+ redirect: stable
desc: 'Java bindings for the cuDF library.'
ghlink: https://github.com/rapidsai/cudf/tree/main/java
cllink: https://github.com/rapidsai/cudf/blob/main/CHANGELOG.md
@@ -71,6 +77,7 @@ apis:
cucim:
name: cuCIM
path: cucim
+ redirect: stable
desc: 'The RAPIDS cuCIM is an extensible toolkit designed to provide GPU accelerated I/O, computer vision & image processing primitives for N-Dimensional images with a focus on biomedical imaging.'
ghlink: https://github.com/rapidsai/cucim
cllink: https://github.com/rapidsai/cucim/blob/main/CHANGELOG.md
@@ -82,6 +89,7 @@ apis:
cuvs:
name: cuVS
path: cuvs
+ redirect: stable
desc: 'cuVS is a library for GPU-accelerated vector search and clustering.'
ghlink: https://github.com/rapidsai/cuvs
cllink: https://github.com/rapidsai/cuvs/blob/main/CHANGELOG.md
@@ -93,6 +101,7 @@ apis:
kvikio:
name: KvikIO
path: kvikio
+ redirect: stable
desc: "KvikIO is a Python and C++ library for high performance file IO using GPUDirect Storage (GDS)."
ghlink: https://github.com/rapidsai/kvikio
cllink: https://github.com/rapidsai/kvikio/blob/main/CHANGELOG.md
@@ -104,6 +113,7 @@ apis:
raft:
name: RAFT
path: raft
+ redirect: stable
desc: "RAFT contains fundamental widely-used algorithms and primitives for vector search, machine learning, and information retrieval."
ghlink: https://github.com/rapidsai/raft
cllink: https://github.com/rapidsai/raft/blob/main/CHANGELOG.md
@@ -115,6 +125,7 @@ apis:
dask-cuda:
name: Dask-CUDA
path: dask-cuda
+ redirect: stable
desc: "Various utilities to improve deployment and management of Dask workers on CUDA-enabled systems."
ghlink: https://github.com/rapidsai/dask-cuda
cllink: https://github.com/rapidsai/dask-cuda/blob/main/CHANGELOG.md
@@ -126,6 +137,7 @@ apis:
rmm:
name: RMM
path: rmm
+ redirect: stable
desc: 'RAPIDS Memory Manager (RMM) is a central place for all device memory allocations in cuDF (C++ and Python) and other RAPIDS libraries. In addition, it is a replacement allocator for CUDA Device Memory (and CUDA Managed Memory) and a pool allocator to make CUDA device memory allocation / deallocation faster and asynchronous.'
ghlink: https://github.com/rapidsai/rmm
cllink: https://github.com/rapidsai/rmm/blob/main/CHANGELOG.md
@@ -137,6 +149,7 @@ apis:
rapidsmpf:
name: RapidsMPF
path: rapidsmpf
+ redirect: stable
desc: 'RAPIDS Multi-Process Foundation (rapidsmpf) is a collection of multi-GPU, distributed memory algorithms written in C++ and exposed to Python.'
ghlink: https://github.com/rapidsai/rapidsmpf
versions:
@@ -147,6 +160,8 @@ apis:
ucxx:
name: UCXX
path: ucxx
+ release_version_field: ucxx_version
+ redirect: stable
desc: 'UCXX is the Python interface for [UCX](https://github.com/openucx/ucx), a low-level high-performance networking library. UCX and UCXX support several transport methods including InfiniBand and NVLink while still using traditional networking protocols like TCP.'
ghlink: https://github.com/rapidsai/ucxx
cllink: https://github.com/rapidsai/ucxx/blob/main/CHANGELOG.md
@@ -159,6 +174,7 @@ apis:
nvforest:
name: nvForest
path: nvforest
+ redirect: stable
desc: 'nvForest is a highly-optimized and lightweight RAPIDS library that enables fast inference for decision tree models on NVIDIA GPUs and CPUs.'
ghlink: https://github.com/rapidsai/nvforest
cllink: https://github.com/rapidsai/nvforest/blob/main/CHANGELOG.md
@@ -174,6 +190,7 @@ libs:
librmm:
name: librmm
path: librmm
+ redirect: /api/rmm/stable/
desc: 'RAPIDS Memory Manager (RMM) is a central place for all device memory allocations in cuDF (C++ and Python) and other RAPIDS libraries. In addition, it is a replacement allocator for CUDA Device Memory (and CUDA Managed Memory) and a pool allocator to make CUDA device memory allocation / deallocation faster and asynchronous.'
ghlink: https://github.com/rapidsai/rmm
cllink: https://github.com/rapidsai/rmm/blob/main/CHANGELOG.md
@@ -186,6 +203,7 @@ libs:
libcudf:
name: libcudf
path: libcudf
+ redirect: stable
desc: 'libcudf is a C/C++ CUDA library for implementing standard dataframe operations.'
ghlink: https://github.com/rapidsai/cudf
cllink: https://github.com/rapidsai/cudf/blob/main/CHANGELOG.md
@@ -197,6 +215,7 @@ libs:
libcuml:
name: libcuml
path: libcuml
+ redirect: stable
desc: 'libcuml is a C/C++ CUDA library for cuML.'
ghlink: https://github.com/rapidsai/cuml
cllink: https://github.com/rapidsai/cuml/blob/main/CHANGELOG.md
@@ -208,6 +227,7 @@ libs:
libkvikio:
name: libkvikio
path: libkvikio
+ redirect: stable
desc: "libkvikio is a C++ header-only library providing bindings to cuFile, which enables GPUDirect Storage (GDS)."
ghlink: https://github.com/rapidsai/kvikio
cllink: https://github.com/rapidsai/kvikio/blob/main/CHANGELOG.md
@@ -219,6 +239,7 @@ libs:
librapidsmpf:
name: librapidsmpf
path: librapidsmpf
+ redirect: stable
desc: "librapidsmpf is a C++ collection of multi-GPU, distributed memory algorithms."
ghlink: https://github.com/rapidsai/rapidsmpf
versions:
@@ -229,6 +250,8 @@ libs:
libucxx:
name: libucxx
path: libucxx
+ release_version_field: ucxx_version
+ redirect: stable
desc: "libucxx is an object-oriented C++ interface for UCX, with native support for Python bindings."
ghlink: https://github.com/rapidsai/ucxx
versions:
@@ -239,6 +262,7 @@ libs:
rapids-cmake:
name: rapids-cmake
path: rapids-cmake
+ redirect: stable
desc: "This is a collection of CMake modules that are useful for all CUDA RAPIDS projects. By sharing the code in a single place it makes rolling out CMake fixes easier."
ghlink: https://github.com/rapidsai/rapids-cmake
cllink: https://github.com/rapidsai/rapids-cmake/blob/main/CHANGELOG.md
@@ -254,6 +278,7 @@ inactive-projects:
cuproj:
name: cuProj
path: cuProj
+ redirect: false # Historical docs have no lowercase root redirect.
desc: 'cuProj is a GPU-accelerated geographic and geodetic coordinate transformation library which supports projecting coordinates between coordinate reference systems (CRSes), compatible with PyProj.'
ghlink: https://github.com/rapidsai/cuspatial/tree/main/python/cuproj
cllink: https://github.com/rapidsai/cuspatial/blob/main/CHANGELOG.md # cuProj is housed within cuSpatial so updates remain in the cuSpatial changelog
@@ -281,6 +306,7 @@ inactive-projects:
cuspatial:
name: cuSpatial
path: cuspatial
+ redirect: stable
desc: 'cuSpatial is a GPU-accelerated vector GIS library including binary predicates (DE-9IM), point-in-polygon, spatial join, distances, and trajectory analysis.'
ghlink: https://github.com/rapidsai/cuspatial
cllink: https://github.com/rapidsai/cuspatial/blob/main/CHANGELOG.md
@@ -297,6 +323,7 @@ inactive-projects:
libcuproj:
name: libcuproj
path: libcuproj
+ redirect: false # Historical docs have no root redirect.
desc: 'libcuproj is a C++ header-only library for GPU-accelerated geographic and geodetic coordinate transformation library which supports projecting coordinates between coordinate reference systems (CRSes), similar to PROJ.'
ghlink: https://github.com/rapidsai/cuspatial/tree/main/cpp/cuproj
cllink: https://github.com/rapidsai/cuspatial/blob/main/CHANGELOG.md # Shares a changelog with cuSpatial
@@ -313,6 +340,7 @@ inactive-projects:
libcuspatial:
name: libcuspatial
path: libcuspatial
+ redirect: stable
desc: 'libcuspatial is a GPU-accelerated header-only C++ vector GIS library including binary predicates (DE-9IM), point-in-polygon, spatial join, distances, and trajectory analysis.'
ghlink: https://github.com/rapidsai/cuspatial
cllink: https://github.com/rapidsai/cuspatial/blob/main/CHANGELOG.md
diff --git a/_data/install_packages.yml b/_data/install_packages.yml
new file mode 100644
index 00000000000..237da32ad16
--- /dev/null
+++ b/_data/install_packages.yml
@@ -0,0 +1,128 @@
+# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES.
+# SPDX-License-Identifier: Apache-2.0
+#
+# Selector package policy. Release bounds are inclusive: added_in_release is the
+# first release shown, and removed_after_release is the last release shown.
+
+packages:
+ cudf:
+ display_name: cuDF
+ docs_project: cudf
+ standard_bundle: [conda, pip, docker]
+ conda:
+ packages: [cudf]
+ pip:
+ packages: [cudf]
+ pypi: true
+ nightly_dependencies: [dask-cuda]
+
+ dask-cudf:
+ display_name: dask-cuDF
+ docs_project: dask-cudf
+ standard_bundle: [pip]
+ pip:
+ packages: [dask-cudf]
+ pypi: true
+ nightly_dependencies: [dask-cuda]
+
+ cuml:
+ display_name: cuML
+ docs_project: cuml
+ standard_bundle: [conda, pip, docker]
+ conda:
+ packages: [cuml]
+ pip:
+ packages: [cuml]
+ pypi: true
+ nightly_dependencies: [dask-cuda]
+
+ cugraph:
+ display_name: cuGraph
+ docs_project: cugraph
+ standard_bundle: [conda, pip, docker]
+ bundle_display_names: [cuGraph, nx-cugraph]
+ conda:
+ packages: [cugraph]
+ pip:
+ display_name: cuGraph/nx-cugraph
+ packages: [cugraph, nx-cugraph]
+ nightly_dependencies: [dask-cuda]
+
+ cuxfilter:
+ display_name: cuxfilter
+ docs_project: cuxfilter
+ removed_after_release: "26.06"
+ standard_bundle: [conda, pip, docker]
+ conda:
+ packages: [cuxfilter]
+ pip:
+ packages: [cuxfilter]
+ nightly_dependencies: [dask-cuda]
+
+ cucim:
+ display_name: cuCIM
+ docs_project: cucim
+ standard_bundle: [conda, pip, docker]
+ conda:
+ packages: [cucim]
+ pip:
+ packages: [cucim]
+
+ raft:
+ display_name: RAFT
+ docs_project: raft
+ standard_bundle: [conda, pip, docker]
+ conda:
+ packages: [pylibraft, raft-dask]
+ pip:
+ packages: [pylibraft, raft-dask]
+ pypi: true
+ nightly_dependencies: [dask-cuda]
+
+ cuvs:
+ display_name: cuVS
+ docs_project: cuvs
+ standard_bundle: [conda, pip, docker]
+ conda:
+ packages: [cuvs]
+ pip:
+ packages: [cuvs]
+ nightly_packages: [cuvs, pylibraft]
+ nightly_dependencies: [dask-cuda]
+
+ nvforest:
+ display_name: nvForest
+ docs_project: nvforest
+ added_in_release: "26.04"
+ standard_bundle: []
+ conda:
+ packages: [nvforest]
+ pip:
+ packages: [nvforest]
+ pypi: true
+ nightly_dependencies: [dask-cuda]
+
+third_party_packages:
+ graphistry:
+ display_name: Graphistry
+ conda_packages: [graphistry]
+ jupyterlab:
+ display_name: JupyterLab
+ conda_packages: [jupyterlab]
+ networkx:
+ display_name: NetworkX + nx-cugraph
+ conda_packages: [networkx, "nx-cugraph={rapids_version}"]
+ plotly-dash:
+ display_name: Plotly Dash
+ conda_packages: [dash]
+ pytorch:
+ display_name: PyTorch
+ conda_packages: ["'pytorch=*=*cuda*'"]
+ cuda_majors: [12]
+ tensorflow:
+ display_name: TensorFlow
+ conda_packages: [tensorflow]
+ cuda_majors: [12]
+ xarray-spatial:
+ display_name: Xarray-Spatial
+ conda_packages: [xarray-spatial]
diff --git a/_data/previous_releases.json b/_data/previous_releases.json
index d21d15cf16a..87e35193dbb 100644
--- a/_data/previous_releases.json
+++ b/_data/previous_releases.json
@@ -2,1498 +2,2304 @@
{
"version": "26.06",
"ucxx_version": "0.50",
- "dev": {
- "start": "Mar 12 2026",
- "end": "May 13 2026",
- "days": "43"
- },
- "cudf_burndown": {
- "start": "May 14 2026",
- "end": "May 20 2026",
- "days": "5"
- },
- "other_burndown": {
- "start": "May 14 2026",
- "end": "May 27 2026",
- "days": "10"
- },
- "cudf_codefreeze": {
- "start": "May 21 2026",
- "end": "Jun 2 2026",
- "days": "8"
- },
- "other_codefreeze": {
- "start": "May 28 2026",
- "end": "Jun 2 2026",
- "days": "4"
- },
- "release": {
- "start": "Jun 3 2026",
- "end": "Jun 4 2026",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2026-03-12",
+ "end": "2026-05-13"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT/Dask-CUDA/KvikIO/UCXX/RapidsMPF",
+ "start": "2026-05-14",
+ "end": "2026-05-20",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2026-05-14",
+ "end": "2026-05-27",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT/Dask-CUDA/KvikIO/UCXX/RapidsMPF",
+ "start": "2026-05-21",
+ "end": "2026-06-02",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2026-05-28",
+ "end": "2026-06-02",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2026-06-03",
+ "end": "2026-06-04",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "26.04",
"ucxx_version": "0.49",
- "dev": {
- "start": "Jan 15 2026",
- "end": "Mar 11 2026",
- "days": "38"
- },
- "cudf_burndown": {
- "start": "Mar 12 2026",
- "end": "Mar 18 2026",
- "days": "5"
- },
- "other_burndown": {
- "start": "Mar 12 2026",
- "end": "Apr 1 2026",
- "days": "12"
- },
- "cudf_codefreeze": {
- "start": "Mar 19 2026",
- "end": "Apr 7 2026",
- "days": "12"
- },
- "other_codefreeze": {
- "start": "Apr 2 2026",
- "end": "Apr 7 2026",
- "days": "4"
- },
- "release": {
- "start": "Apr 8 2026",
- "end": "Apr 9 2026",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2026-01-15",
+ "end": "2026-03-11"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT/Dask-CUDA/KvikIO/UCXX/RapidsMPF",
+ "start": "2026-03-12",
+ "end": "2026-03-18",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2026-03-12",
+ "end": "2026-04-01",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT/Dask-CUDA/KvikIO/UCXX/RapidsMPF",
+ "start": "2026-03-19",
+ "end": "2026-04-07",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2026-04-02",
+ "end": "2026-04-07",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2026-04-08",
+ "end": "2026-04-09",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "26.02",
"ucxx_version": "0.48",
- "cudf_dev": {
- "start": "Nov 13 2025",
- "end": "Jan 14 2026",
- "days": "39"
- },
- "other_dev": {
- "start": "Nov 20 2025",
- "end": "Jan 21 2026",
- "days": "39"
- },
- "cudf_burndown": {
- "start": "Jan 15 2026",
- "end": "Jan 21 2026",
- "days": "5"
- },
- "other_burndown": {
- "start": "Jan 22 2026",
- "end": "Jan 28 2026",
- "days": "5"
- },
- "cudf_codefreeze": {
- "start": "Jan 22 2026",
- "end": "Feb 3 2026",
- "days": "9"
- },
- "other_codefreeze": {
- "start": "Jan 29 2026",
- "end": "Feb 3 2026",
- "days": "4"
- },
- "release": {
- "start": "Feb 4 2026",
- "end": "Feb 5 2026",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-11-13",
+ "end": "2026-01-14"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-11-20",
+ "end": "2026-01-21"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2026-01-15",
+ "end": "2026-01-21",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2026-01-22",
+ "end": "2026-01-28",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2026-01-22",
+ "end": "2026-02-03",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2026-01-29",
+ "end": "2026-02-03",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2026-02-04",
+ "end": "2026-02-05",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "25.12",
"ucxx_version": "0.47",
- "cudf_dev": {
- "start": "Sep 18 2025",
- "end": "Nov 12 2025",
- "days": "39"
- },
- "other_dev": {
- "start": "Sep 25 2025",
- "end": "Nov 19 2025",
- "days": "39"
- },
- "cudf_burndown": {
- "start": "Nov 13 2025",
- "end": "Nov 19 2025",
- "days": "5"
- },
- "other_burndown": {
- "start": "Nov 20 2025",
- "end": "Dec 3 2025",
- "days": "8"
- },
- "cudf_codefreeze": {
- "start": "Nov 20 2025",
- "end": "Dec 9 2025",
- "days": "12"
- },
- "other_codefreeze": {
- "start": "Dec 4 2025",
- "end": "Dec 9 2025",
- "days": "4"
- },
- "release": {
- "start": "Dec 10 2025",
- "end": "Dec 11 2025",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-09-18",
+ "end": "2025-11-12"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-09-25",
+ "end": "2025-11-19"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-11-13",
+ "end": "2025-11-19",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-11-20",
+ "end": "2025-12-03",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-11-20",
+ "end": "2025-12-09",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-12-04",
+ "end": "2025-12-09",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2025-12-10",
+ "end": "2025-12-11",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "25.10",
"ucxx_version": "0.46",
- "cudf_dev": {
- "start": "Jul 17 2025",
- "end": "Sep 17 2025",
- "days": "42"
- },
- "other_dev": {
- "start": "Jul 24 2025",
- "end": "Sep 24 2025",
- "days": "42"
- },
- "cudf_burndown": {
- "start": "Sep 18 2025",
- "end": "Sep 24 2025",
- "days": "5"
- },
- "other_burndown": {
- "start": "Sep 25 2025",
- "end": "Oct 1 2025",
- "days": "5"
- },
- "cudf_codefreeze": {
- "start": "Sep 25 2025",
- "end": "Oct 7 2025",
- "days": "9"
- },
- "other_codefreeze": {
- "start": "Oct 2 2025",
- "end": "Oct 7 2025",
- "days": "4"
- },
- "release": {
- "start": "Oct 8 2025",
- "end": "Oct 9 2025",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-07-17",
+ "end": "2025-09-17"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-07-24",
+ "end": "2025-09-24"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-09-18",
+ "end": "2025-09-24",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-09-25",
+ "end": "2025-10-01",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-09-25",
+ "end": "2025-10-07",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-10-02",
+ "end": "2025-10-07",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2025-10-08",
+ "end": "2025-10-09",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "25.08",
"ucxx_version": "0.45",
- "cudf_dev": {
- "start": "May 15 2025",
- "end": "Jul 16 2025",
- "days": "40"
- },
- "other_dev": {
- "start": "May 22 2025",
- "end": "Jul 23 2025",
- "days": "40"
- },
- "cudf_burndown": {
- "start": "Jul 17 2025",
- "end": "Jul 23 2025",
- "days": "5"
- },
- "other_burndown": {
- "start": "Jul 24 2025",
- "end": "Jul 30 2025",
- "days": "5"
- },
- "cudf_codefreeze": {
- "start": "Jul 24 2025",
- "end": "Aug 5 2025",
- "days": "9"
- },
- "other_codefreeze": {
- "start": "Jul 31 2025",
- "end": "Aug 5 2025",
- "days": "4"
- },
- "release": {
- "start": "Aug 6 2025",
- "end": "Aug 7 2025",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-05-15",
+ "end": "2025-07-16"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-05-22",
+ "end": "2025-07-23"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-07-17",
+ "end": "2025-07-23",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-07-24",
+ "end": "2025-07-30",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-07-24",
+ "end": "2025-08-05",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-07-31",
+ "end": "2025-08-05",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2025-08-06",
+ "end": "2025-08-07",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "25.06",
"ucxx_version": "0.44",
- "cudf_dev": {
- "start": "Mar 13 2025",
- "end": "May 14 2025",
- "days": "43"
- },
- "other_dev": {
- "start": "Mar 20 2025",
- "end": "May 21 2025",
- "days": "43"
- },
- "cudf_burndown": {
- "start": "May 15 2025",
- "end": "May 21 2025",
- "days": "5"
- },
- "other_burndown": {
- "start": "May 22 2025",
- "end": "May 28 2025",
- "days": "4"
- },
- "cudf_codefreeze": {
- "start": "May 22 2025",
- "end": "Jun 3 2025",
- "days": "8"
- },
- "other_codefreeze": {
- "start": "May 29 2025",
- "end": "Jun 3 2025",
- "days": "4"
- },
- "release": {
- "start": "Jun 4 2025",
- "end": "Jun 5 2025",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-03-13",
+ "end": "2025-05-14"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-03-20",
+ "end": "2025-05-21"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-05-15",
+ "end": "2025-05-21",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-05-22",
+ "end": "2025-05-28",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-05-22",
+ "end": "2025-06-03",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-05-29",
+ "end": "2025-06-03",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2025-06-04",
+ "end": "2025-06-05",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "25.04",
"ucxx_version": "0.43",
- "cudf_dev": {
- "start": "Jan 23 2025",
- "end": "Mar 12 2025",
- "days": "34"
- },
- "other_dev": {
- "start": "Jan 30 2025",
- "end": "Mar 19 2025",
- "days": "34"
- },
- "cudf_burndown": {
- "start": "Mar 13 2025",
- "end": "Mar 19 2025",
- "days": "5"
- },
- "other_burndown": {
- "start": "Mar 20 2025",
- "end": "Apr 2 2025",
- "days": "8"
- },
- "cudf_codefreeze": {
- "start": "Mar 20 2025",
- "end": "Apr 8 2025",
- "days": "12"
- },
- "other_codefreeze": {
- "start": "Apr 3 2025",
- "end": "Apr 8 2025",
- "days": "4"
- },
- "release": {
- "start": "Apr 9 2025",
- "end": "Apr 10 2025",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-01-23",
+ "end": "2025-03-12"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-01-30",
+ "end": "2025-03-19"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-03-13",
+ "end": "2025-03-19",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-03-20",
+ "end": "2025-04-02",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-03-20",
+ "end": "2025-04-08",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-04-03",
+ "end": "2025-04-08",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2025-04-09",
+ "end": "2025-04-10",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "25.02",
"ucxx_version": "0.42",
- "cudf_dev": {
- "start": "Nov 14 2024",
- "end": "Jan 22 2025",
- "days": "43"
- },
- "other_dev": {
- "start": "Nov 21 2024",
- "end": "Jan 29 2025",
- "days": "43"
- },
- "cudf_burndown": {
- "start": "Jan 23 2025",
- "end": "Jan 29 2025",
- "days": "5"
- },
- "other_burndown": {
- "start": "Jan 30 2025",
- "end": "Feb 5 2025",
- "days": "5"
- },
- "cudf_codefreeze": {
- "start": "Jan 30 2025",
- "end": "Feb 11 2025",
- "days": "9"
- },
- "other_codefreeze": {
- "start": "Feb 6 2025",
- "end": "Feb 11 2025",
- "days": "4"
- },
- "release": {
- "start": "Feb 12 2025",
- "end": "Feb 13 2025",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2024-11-14",
+ "end": "2025-01-22"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-11-21",
+ "end": "2025-01-29"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-01-23",
+ "end": "2025-01-29",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-01-30",
+ "end": "2025-02-05",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT",
+ "start": "2025-01-30",
+ "end": "2025-02-11",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2025-02-06",
+ "end": "2025-02-11",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2025-02-12",
+ "end": "2025-02-13",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "24.12",
"ucxx_version": "0.41",
- "cudf_dev": {
- "start": "Sep 19 2024",
- "end": "Nov 13 2024",
- "days": "39"
- },
- "other_dev": {
- "start": "Sep 26 2024",
- "end": "Nov 20 2024",
- "days": "39"
- },
- "cudf_burndown": {
- "start": "Nov 14 2024",
- "end": "Nov 20 2024",
- "days": "5"
- },
- "other_burndown": {
- "start": "Nov 21 2024",
- "end": "Dec 4 2024",
- "days": "8"
- },
- "cudf_codefreeze": {
- "start": "Nov 21 2024",
- "end": "Dec 10 2024",
- "days": "12"
- },
- "other_codefreeze": {
- "start": "Dec 5 2024",
- "end": "Dec 10 2024",
- "days": "4"
- },
- "release": {
- "start": "Dec 11 2024",
- "end": "Dec 12 2024",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-09-19",
+ "end": "2024-11-13"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-09-26",
+ "end": "2024-11-20"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-11-14",
+ "end": "2024-11-20",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-11-21",
+ "end": "2024-12-04",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-11-21",
+ "end": "2024-12-10",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-12-05",
+ "end": "2024-12-10",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2024-12-11",
+ "end": "2024-12-12",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "24.10",
"ucxx_version": "0.40",
- "cudf_dev": {
- "start": "Jul 18 2024",
- "end": "Sep 18 2024",
- "days": "42"
- },
- "other_dev": {
- "start": "Jul 25 2024",
- "end": "Sep 25 2024",
- "days": "42"
- },
- "cudf_burndown": {
- "start": "Sep 19 2024",
- "end": "Sep 25 2024",
- "days": "5"
- },
- "other_burndown": {
- "start": "Sep 26 2024",
- "end": "Oct 2 2024",
- "days": "5"
- },
- "cudf_codefreeze": {
- "start": "Sep 26 2024",
- "end": "Oct 8 2024",
- "days": "9"
- },
- "other_codefreeze": {
- "start": "Oct 3 2024",
- "end": "Oct 8 2024",
- "days": "4"
- },
- "release": {
- "start": "Oct 9 2024",
- "end": "Oct 10 2024",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-07-18",
+ "end": "2024-09-18"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-07-25",
+ "end": "2024-09-25"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-09-19",
+ "end": "2024-09-25",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-09-26",
+ "end": "2024-10-02",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-09-26",
+ "end": "2024-10-08",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-10-03",
+ "end": "2024-10-08",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2024-10-09",
+ "end": "2024-10-10",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "24.08",
"ucxx_version": "0.39",
- "cudf_dev": {
- "start": "May 16 2024",
- "end": "Jul 17 2024",
- "days": "40"
- },
- "other_dev": {
- "start": "May 23 2024",
- "end": "Jul 24 2024",
- "days": "40"
- },
- "cudf_burndown": {
- "start": "Jul 18 2024",
- "end": "Jul 24 2024",
- "days": "5"
- },
- "other_burndown": {
- "start": "Jul 25 2024",
- "end": "Jul 31 2024",
- "days": "5"
- },
- "cudf_codefreeze": {
- "start": "Jul 25 2024",
- "end": "Aug 6 2024",
- "days": "9"
- },
- "other_codefreeze": {
- "start": "Aug 1 2024",
- "end": "Aug 6 2024",
- "days": "4"
- },
- "release": {
- "start": "Aug 7 2024",
- "end": "Aug 8 2024",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-05-16",
+ "end": "2024-07-17"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-05-23",
+ "end": "2024-07-24"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-07-18",
+ "end": "2024-07-24",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-07-25",
+ "end": "2024-07-31",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-07-25",
+ "end": "2024-08-06",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-08-01",
+ "end": "2024-08-06",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2024-08-07",
+ "end": "2024-08-08",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "24.06",
"ucxx_version": "0.38",
- "cudf_dev": {
- "start": "Mar 14 2024",
- "end": "May 15 2024",
- "days": "43"
- },
- "other_dev": {
- "start": "Mar 21 2024",
- "end": "May 22 2024",
- "days": "43"
- },
- "cudf_burndown": {
- "start": "May 16 2024",
- "end": "May 22 2024",
- "days": "5"
- },
- "other_burndown": {
- "start": "May 23 2024",
- "end": "May 29 2024",
- "days": "4"
- },
- "cudf_codefreeze": {
- "start": "May 23 2024",
- "end": "Jun 4 2024",
- "days": "8"
- },
- "other_codefreeze": {
- "start": "May 30 2024",
- "end": "Jun 4 2024",
- "days": "4"
- },
- "release": {
- "start": "Jun 5 2024",
- "end": "Jun 6 2024",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-03-14",
+ "end": "2024-05-15"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-03-21",
+ "end": "2024-05-22"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-05-16",
+ "end": "2024-05-22",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-05-23",
+ "end": "2024-05-29",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-05-23",
+ "end": "2024-06-04",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-05-30",
+ "end": "2024-06-04",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2024-06-05",
+ "end": "2024-06-06",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "24.04",
"ucxx_version": "0.37",
- "cudf_dev": {
- "start": "Jan 18 2024",
- "end": "Mar 13 2024",
- "days": "39"
- },
- "other_dev": {
- "start": "Jan 25 2024",
- "end": "Mar 20 2024",
- "days": "39"
- },
- "cudf_burndown": {
- "start": "Mar 14 2024",
- "end": "Mar 20 2024",
- "days": "5"
- },
- "other_burndown": {
- "start": "Mar 21 2024",
- "end": "Apr 3 2024",
- "days": "8"
- },
- "cudf_codefreeze": {
- "start": "Mar 21 2024",
- "end": "Apr 9 2024",
- "days": "12"
- },
- "other_codefreeze": {
- "start": "Apr 4 2024",
- "end": "Apr 9 2024",
- "days": "4"
- },
- "release": {
- "start": "Apr 10 2024",
- "end": "Apr 11 2024",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-01-18",
+ "end": "2024-03-13"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-01-25",
+ "end": "2024-03-20"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-03-14",
+ "end": "2024-03-20",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-03-21",
+ "end": "2024-04-03",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-03-21",
+ "end": "2024-04-09",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-04-04",
+ "end": "2024-04-09",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2024-04-10",
+ "end": "2024-04-11",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "24.02",
- "cudf_dev": {
- "start": "Nov 9 2023",
- "end": "Jan 17 2024",
- "days": "42"
- },
- "other_dev": {
- "start": "Nov 16 2023",
- "end": "Jan 24 2024",
- "days": "43"
- },
- "cudf_burndown": {
- "start": "Jan 18 2024",
- "end": "Jan 24 2024",
- "days": "5"
- },
- "other_burndown": {
- "start": "Jan 25 2024",
- "end": "Jan 31 2024",
- "days": "5"
- },
- "cudf_codefreeze": {
- "start": "Jan 25 2024",
- "end": "Feb 6 2024",
- "days": "9"
- },
- "other_codefreeze": {
- "start": "Feb 1 2024",
- "end": "Feb 6 2024",
- "days": "4"
- },
- "release": {
- "start": "Feb 7 2024",
- "end": "Feb 8 2024",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2023-11-09",
+ "end": "2024-01-17"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-11-16",
+ "end": "2024-01-24"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-01-18",
+ "end": "2024-01-24",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-01-25",
+ "end": "2024-01-31",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2024-01-25",
+ "end": "2024-02-06",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2024-02-01",
+ "end": "2024-02-06",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2024-02-07",
+ "end": "2024-02-08",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "23.12",
- "cudf_dev": {
- "start": "Sep 21 2023",
- "end": "Wed Nov 8 2023",
- "days": "35"
- },
- "other_dev": {
- "start": "Sep 28 2023",
- "end": "Wed Nov 15 2023",
- "days": "34"
- },
- "cudf_burndown": {
- "start": "Nov 9 2023",
- "end": "Wed Nov 15 2023",
- "days": "4"
- },
- "other_burndown": {
- "start": "Nov 16 2023",
- "end": "Wed Nov 29 2023",
- "days": "8"
- },
- "cudf_codefreeze": {
- "start": "Nov 16 2023",
- "end": "Tue Dec 5 2023",
- "days": "12"
- },
- "other_codefreeze": {
- "start": "Nov 30 2023",
- "end": "Tue Dec 5 2023",
- "days": "4"
- },
- "release": {
- "start": "Dec 6 2023",
- "end": "Thu Dec 7 2023",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2023-09-21",
+ "end": "2023-11-08"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-09-28",
+ "end": "2023-11-15"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2023-11-09",
+ "end": "2023-11-15",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-11-16",
+ "end": "2023-11-29",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2023-11-16",
+ "end": "2023-12-05",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-11-30",
+ "end": "2023-12-05",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2023-12-06",
+ "end": "2023-12-07",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "23.10",
- "cudf_dev": {
- "start": "Jul 20 2023",
- "end": "Sep 20 2023",
- "days": 42
- },
- "other_dev": {
- "start": "Jul 27 2023",
- "end": "Sep 27 2023",
- "days": 42
- },
- "cudf_burndown": {
- "start": "Sep 21 2023",
- "end": "Sep 27 2023",
- "days": 5
- },
- "other_burndown": {
- "start": "Sep 28 2023",
- "end": "Oct 4 2023",
- "days": 5
- },
- "cudf_codefreeze": {
- "start": "Sep 28 2023",
- "end": "Oct 10 2023",
- "days": 9
- },
- "other_codefreeze": {
- "start": "Oct 5 2023",
- "end": "Oct 10 2023",
- "days": 4
- },
- "release": {
- "start": "Oct 11 2023",
- "end": "Oct 12 2023",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2023-07-20",
+ "end": "2023-09-20"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-07-27",
+ "end": "2023-09-27"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2023-09-21",
+ "end": "2023-09-27",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-09-28",
+ "end": "2023-10-04",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2023-09-28",
+ "end": "2023-10-10",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-10-05",
+ "end": "2023-10-10",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2023-10-11",
+ "end": "2023-10-12",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "23.08",
- "cudf_dev": {
- "start": "May 18 2023",
- "end": "Jul 19 2023",
- "days": 40
- },
- "other_dev": {
- "start": "May 25 2023",
- "end": "Jul 26 2023",
- "days": 40
- },
- "cudf_burndown": {
- "start": "Jul 20 2023",
- "end": "Jul 26 2023",
- "days": 5
- },
- "other_burndown": {
- "start": "Jul 27 2023",
- "end": "Aug 2 2023",
- "days": 5
- },
- "cudf_codefreeze": {
- "start": "Jul 27 2023",
- "end": "Aug 8 2023",
- "days": 9
- },
- "other_codefreeze": {
- "start": "Aug 3 2023",
- "end": "Aug 8 2023",
- "days": 4
- },
- "release": {
- "start": "Aug 9 2023",
- "end": "Aug 10 2023",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2023-05-18",
+ "end": "2023-07-19"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-05-25",
+ "end": "2023-07-26"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2023-07-20",
+ "end": "2023-07-26",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-07-27",
+ "end": "2023-08-02",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2023-07-27",
+ "end": "2023-08-08",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-08-03",
+ "end": "2023-08-08",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2023-08-09",
+ "end": "2023-08-10",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "23.06",
- "cudf_dev": {
- "start": "Mar 23 2023",
- "end": "May 17 2023",
- "days": 40
- },
- "other_dev": {
- "start": "Mar 30 2023",
- "end": "May 24 2023",
- "days": 40
- },
- "cudf_burndown": {
- "start": "May 18 2023",
- "end": "May 24 2023",
- "days": 5
- },
- "other_burndown": {
- "start": "May 25 2023",
- "end": "May 31 2023",
- "days": 4
- },
- "cudf_codefreeze": {
- "start": "May 25 2023",
- "end": "June 6 2023",
- "days": 9
- },
- "other_codefreeze": {
- "start": "Jun 1 2023",
- "end": "Jun 6 2023",
- "days": 4
- },
- "release": {
- "start": "Jun 7 2023",
- "end": "Jun 8 2023",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2023-03-23",
+ "end": "2023-05-17"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-03-30",
+ "end": "2023-05-24"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2023-05-18",
+ "end": "2023-05-24",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-05-25",
+ "end": "2023-05-31",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/cugraph-ops/RAFT",
+ "start": "2023-05-25",
+ "end": "2023-06-06",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-06-01",
+ "end": "2023-06-06",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2023-06-07",
+ "end": "2023-06-08",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "23.04",
- "cudf_dev": {
- "start": "Jan 19 2023",
- "end": "Mar 22 2023",
- "days": 42
- },
- "other_dev": {
- "start": "Jan 26 2023",
- "end": "Mar 29 2023",
- "days": 42
- },
- "cudf_burndown": {
- "start": "Mar 23 2023",
- "end": "Mar 29 2023",
- "days": 5
- },
- "other_burndown": {
- "start": "Mar 30 2023",
- "end": "Apr 5 2023",
- "days": 5
- },
- "cudf_codefreeze": {
- "start": "Mar 30 2023",
- "end": "Apr 4 2023",
- "days": 4
- },
- "other_codefreeze": {
- "start": "Apr 6 2023",
- "end": "Apr 11 2023",
- "days": 4
- },
- "release": {
- "start": "Apr 12 2023",
- "end": "Apr 13 2023",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2023-01-19",
+ "end": "2023-03-22"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-01-26",
+ "end": "2023-03-29"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2023-03-23",
+ "end": "2023-03-29",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-03-30",
+ "end": "2023-04-05",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2023-03-30",
+ "end": "2023-04-04",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-04-06",
+ "end": "2023-04-11",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2023-04-12",
+ "end": "2023-04-13",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "23.02",
- "cudf_dev": {
- "start": "Nov 10 2022",
- "end": "Jan 18 2023",
- "days": 42
- },
- "other_dev": {
- "start": "Nov 17 2022",
- "end": "Jan 25 2023",
- "days": 43
- },
- "cudf_burndown": {
- "start": "Jan 19 2023",
- "end": "Jan 25 2023",
- "days": 5
- },
- "other_burndown": {
- "start": "Jan 26 2023",
- "end": "Feb 1 2023",
- "days": 5
- },
- "cudf_codefreeze": {
- "start": "Jan 26 2023",
- "end": "Jan 31 2023",
- "days": 4
- },
- "other_codefreeze": {
- "start": "Feb 2 2023",
- "end": "Feb 7 2023",
- "days": 4
- },
- "release": {
- "start": "Feb 8 2023",
- "end": "Feb 9 2023",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-11-10",
+ "end": "2023-01-18"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-11-17",
+ "end": "2023-01-25"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2023-01-19",
+ "end": "2023-01-25",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-01-26",
+ "end": "2023-02-01",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2023-01-26",
+ "end": "2023-01-31",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2023-02-02",
+ "end": "2023-02-07",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2023-02-08",
+ "end": "2023-02-09",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "22.12",
- "cudf_dev": {
- "start": "Sep 22 2022",
- "end": "Nov 9 2022",
- "days": 35
- },
- "other_dev": {
- "start": "Sep 29 2022",
- "end": "Nov 16 2022",
- "days": 34
- },
- "cudf_burndown": {
- "start": "Nov 10 2022",
- "end": "Nov 16 2022",
- "days": 4
- },
- "other_burndown": {
- "start": "Nov 17 2022",
- "end": "Nov 30 2022",
- "days": 8
- },
- "cudf_codefreeze": {
- "start": "Nov 17 2022",
- "end": "Nov 30 2022",
- "days": 8
- },
- "other_codefreeze": {
- "start": "Dec 1 2022",
- "end": "Dec 6 2022",
- "days": 4
- },
- "release": {
- "start": "Dec 7 2022",
- "end": "Dec 8 2022",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-09-22",
+ "end": "2022-11-09"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-09-29",
+ "end": "2022-11-16"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-11-10",
+ "end": "2022-11-16",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-11-17",
+ "end": "2022-11-30",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-11-17",
+ "end": "2022-11-30",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-12-01",
+ "end": "2022-12-06",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2022-12-07",
+ "end": "2022-12-08",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "22.10",
- "cudf_dev": {
- "start": "Jul 21 2022",
- "end": "Sep 21 2022",
- "days": 42
- },
- "other_dev": {
- "start": "Jul 28 2022",
- "end": "Sep 28 2022",
- "days": 42
- },
- "cudf_burndown": {
- "start": "Sep 22 2022",
- "end": "Sep 28 2022",
- "days": 5
- },
- "other_burndown": {
- "start": "Sep 29 2022",
- "end": "Oct 5 2022",
- "days": 5
- },
- "cudf_codefreeze": {
- "start": "Sep 29 2022",
- "end": "Oct 5 2022",
- "days": 5
- },
- "other_codefreeze": {
- "start": "Oct 6 2022",
- "end": "Oct 11 2022",
- "days": 4
- },
- "release": {
- "start": "Oct 12 2022",
- "end": "Oct 13 2022",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-07-21",
+ "end": "2022-09-21"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-07-28",
+ "end": "2022-09-28"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-09-22",
+ "end": "2022-09-28",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-09-29",
+ "end": "2022-10-05",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-09-29",
+ "end": "2022-10-05",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-10-06",
+ "end": "2022-10-11",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2022-10-12",
+ "end": "2022-10-13",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "22.08",
- "cudf_dev": {
- "start": "May 18 2022",
- "end": "Jul 20 2022",
- "days": 41
- },
- "other_dev": {
- "start": "May 25 2022",
- "end": "Jul 27 2022",
- "days": 41
- },
- "cudf_burndown": {
- "start": "Jul 21 2022",
- "end": "Jul 27 2022",
- "days": 5
- },
- "other_burndown": {
- "start": "Jul 28 2022",
- "end": "Aug 3 2022",
- "days": 5
- },
- "cudf_codefreeze": {
- "start": "Jul 28 2022",
- "end": "Aug 3 2022",
- "days": 5
- },
- "other_codefreeze": {
- "start": "Aug 4 2022",
- "end": "Aug 10 2022",
- "days": 5
- },
- "release": {
- "start": "Aug 11 2022",
- "end": "Aug 17 2022",
- "days": 5
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-05-18",
+ "end": "2022-07-20"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-05-25",
+ "end": "2022-07-27"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-07-21",
+ "end": "2022-07-27",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-07-28",
+ "end": "2022-08-03",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-07-28",
+ "end": "2022-08-03",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-08-04",
+ "end": "2022-08-10",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2022-08-11",
+ "end": "2022-08-17",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "22.06",
- "cudf_dev": {
- "start": "Mar 17 2022",
- "end": "May 17 2022",
- "days": 44
- },
- "other_dev": {
- "start": "Mar 24 2022",
- "end": "May 24 2022",
- "days": 44
- },
- "cudf_burndown": {
- "start": "May 18 2022",
- "end": "May 24 2022",
- "days": 5
- },
- "other_burndown": {
- "start": "May 25 2022",
- "end": "Jun 1 2022",
- "days": 5
- },
- "cudf_codefreeze": {
- "start": "May 25 2022",
- "end": "May 31 2022",
- "days": 4
- },
- "other_codefreeze": {
- "start": "Jun 2 2022",
- "end": "Jun 6 2022",
- "days": 3
- },
- "release": {
- "start": "Jun 7 2022",
- "end": "Jun 8 2022",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-03-17",
+ "end": "2022-05-17"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-03-24",
+ "end": "2022-05-24"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-05-18",
+ "end": "2022-05-24",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-05-25",
+ "end": "2022-06-01",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-05-25",
+ "end": "2022-05-31",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-06-02",
+ "end": "2022-06-06",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2022-06-07",
+ "end": "2022-06-08",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "22.04",
- "cudf_dev": {
- "start": "Jan 12 2022",
- "end": "Mar 16 2022",
- "days": 44
- },
- "other_dev": {
- "start": "Jan 20 2022",
- "end": "Mar 23 2022",
- "days": 44
- },
- "cudf_burndown": {
- "start": "Mar 17 2022",
- "end": "Mar 23 2022",
- "days": 5
- },
- "other_burndown": {
- "start": "Mar 24 2022",
- "end": "Mar 30 2022",
- "days": 5
- },
- "cudf_codefreeze": {
- "start": "Mar 24 2022",
- "end": "Mar 30 2022",
- "days": 5
- },
- "other_codefreeze": {
- "start": "Mar 31 2022",
- "end": "Apr 5 2022",
- "days": 4
- },
- "release": {
- "start": "Apr 6 2022",
- "end": "Apr 7 2022",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-01-12",
+ "end": "2022-03-16"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-01-20",
+ "end": "2022-03-23"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-03-17",
+ "end": "2022-03-23",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-03-24",
+ "end": "2022-03-30",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-03-24",
+ "end": "2022-03-30",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-03-31",
+ "end": "2022-04-05",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2022-04-06",
+ "end": "2022-04-07",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "22.02",
- "cudf_dev": {
- "start": "Nov 4 2021",
- "end": "Jan 11 2022",
- "days": 43
- },
- "other_dev": {
- "start": "Nov 11 2021",
- "end": "Jan 19 2022",
- "days": 43
- },
- "cudf_burndown": {
- "start": "Jan 12 2022",
- "end": "Jan 19 2022",
- "days": 5
- },
- "other_burndown": {
- "start": "Jan 20 2022",
- "end": "Jan 26 2022",
- "days": 5
- },
- "cudf_codefreeze": {
- "start": "Jan 20 2022",
- "end": "Jan 26 2022",
- "days": 5
- },
- "other_codefreeze": {
- "start": "Jan 27 2022",
- "end": "Feb 1 2022",
- "days": 4
- },
- "release": {
- "start": "Feb 2 2022",
- "end": "Feb 3 2022",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-11-04",
+ "end": "2022-01-11"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-11-11",
+ "end": "2022-01-19"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-01-12",
+ "end": "2022-01-19",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-01-20",
+ "end": "2022-01-26",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2022-01-20",
+ "end": "2022-01-26",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2022-01-27",
+ "end": "2022-02-01",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2022-02-02",
+ "end": "2022-02-03",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "21.12",
- "cudf_dev": {
- "start": "Sep 16 2021",
- "end": "Nov 3 2021",
- "days": 35
- },
- "other_dev": {
- "start": "Sep 23 2021",
- "end": "Nov 10 2021",
- "days": 35
- },
- "cudf_burndown": {
- "start": "Nov 4 2021",
- "end": "Nov 10 2021",
- "days": 5
- },
- "other_burndown": {
- "start": "Nov 11 2021",
- "end": "Nov 17 2021",
- "days": 5
- },
- "cudf_codefreeze": {
- "start": "Nov 11 2021",
- "end": "Nov 17 2021",
- "days": 5
- },
- "other_codefreeze": {
- "start": "Nov 18 2021",
- "end": "Nov 30 2021",
- "days": 7
- },
- "release": {
- "start": "Dec 8 2021",
- "end": "Dec 9 2021",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-09-16",
+ "end": "2021-11-03"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-09-23",
+ "end": "2021-11-10"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-11-04",
+ "end": "2021-11-10",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-11-11",
+ "end": "2021-11-17",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-11-11",
+ "end": "2021-11-17",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-11-18",
+ "end": "2021-11-30",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2021-12-08",
+ "end": "2021-12-09",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "21.10",
- "cudf_dev": {
- "start": "Jul 14 2021",
- "end": "Sep 15 2021",
- "days": 45
- },
- "other_dev": {
- "start": "Jul 21 2021",
- "end": "Sep 22 2021",
- "days": 45
- },
- "cudf_burndown": {
- "start": "Sep 16 2021",
- "end": "Sep 22 2021",
- "days": 5
- },
- "other_burndown": {
- "start": "Sep 23 2021",
- "end": "Sep 28 2021",
- "days": 4
- },
- "cudf_codefreeze": {
- "start": "Sep 23 2021",
- "end": "Sep 28 2021",
- "days": 4
- },
- "other_codefreeze": {
- "start": "Sep 29 2021",
- "end": "Oct 5 2021",
- "days": 5
- },
- "release": {
- "start": "Oct 6 2021",
- "end": "Oct 7 2021",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-07-14",
+ "end": "2021-09-15"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-07-21",
+ "end": "2021-09-22"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-09-16",
+ "end": "2021-09-22",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-09-23",
+ "end": "2021-09-28",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-09-23",
+ "end": "2021-09-28",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-09-29",
+ "end": "2021-10-05",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2021-10-06",
+ "end": "2021-10-07",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "21.08",
- "cudf_dev": {
- "start": "May 19 2021",
- "end": "Jul 14 2021",
- "days": 39
- },
- "other_dev": {
- "start": "May 26 2021",
- "end": "Jul 21 2021",
- "days": 39
- },
- "cudf_burndown": {
- "start": "Jul 15 2021",
- "end": "Jul 21 2021",
- "days": 5
- },
- "other_burndown": {
- "start": "Jul 22 2021",
- "end": "Jul 28 2021",
- "days": 5
- },
- "cudf_codefreeze": {
- "start": "Jul 22 2021",
- "end": "Jul 28 2021",
- "days": 5
- },
- "other_codefreeze": {
- "start": "Jul 29 2021",
- "end": "Aug 3 2021",
- "days": 4
- },
- "release": {
- "start": "Aug 4 2021",
- "end": "Aug 5 2021",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-05-19",
+ "end": "2021-07-14"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-05-26",
+ "end": "2021-07-21"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-07-15",
+ "end": "2021-07-21",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-07-22",
+ "end": "2021-07-28",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-07-22",
+ "end": "2021-07-28",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-07-29",
+ "end": "2021-08-03",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2021-08-04",
+ "end": "2021-08-05",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "21.06",
- "cudf_dev": {
- "start": "Mar 25 2021",
- "end": "May 18 2021",
- "days": 39
- },
- "other_dev": {
- "start": "Apr 1 2021",
- "end": "May 25 2021",
- "days": 39
- },
- "cudf_burndown": {
- "start": "May 19 2021",
- "end": "May 25 2021",
- "days": 5
- },
- "other_burndown": {
- "start": "May 26 2021",
- "end": "Jun 2 2021",
- "days": 5
- },
- "cudf_codefreeze": {
- "start": "May 26 2021",
- "end": "Jun 2 2021",
- "days": 4
- },
- "other_codefreeze": {
- "start": "Jun 3 2021",
- "end": "Jun 8 2021",
- "days": 4
- },
- "release": {
- "start": "Jun 9 2021",
- "end": "Jun 10 2021",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-03-25",
+ "end": "2021-05-18"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-04-01",
+ "end": "2021-05-25"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-05-19",
+ "end": "2021-05-25",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-05-26",
+ "end": "2021-06-02",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-05-26",
+ "end": "2021-06-02",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-06-03",
+ "end": "2021-06-08",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2021-06-09",
+ "end": "2021-06-10",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "0.19",
- "cudf_dev": {
- "start": "Jan 27 2021",
- "end": "Mar 24 2021",
- "days": 40
- },
- "other_dev": {
- "start": "Feb 3 2021",
- "end": "Mar 31 2021",
- "days": 40
- },
- "cudf_burndown": {
- "start": "Mar 25 2021",
- "end": "Mar 31 2021",
- "days": 5
- },
- "other_burndown": {
- "start": "Apr 1 2021",
- "end": "Apr 7 2021",
- "days": 5
- },
- "cudf_codefreeze": {
- "start": "Apr 1 2021",
- "end": "Apr 7 2021",
- "days": 5
- },
- "other_codefreeze": {
- "start": "Apr 8 2021",
- "end": "Apr 20 2021",
- "days": 9
- },
- "release": {
- "start": "Apr 21 2021",
- "end": "Apr 22 2021",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-01-27",
+ "end": "2021-03-24"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-02-03",
+ "end": "2021-03-31"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-03-25",
+ "end": "2021-03-31",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-04-01",
+ "end": "2021-04-07",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-04-01",
+ "end": "2021-04-07",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-04-08",
+ "end": "2021-04-20",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2021-04-21",
+ "end": "2021-04-22",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "0.18",
- "cudf_dev": {
- "start": "Nov 24 2020",
- "end": "Jan 26 2021",
- "days": 34
- },
- "other_dev": {
- "start": "Nov 24 2020",
- "end": "Feb 2 2021",
- "days": 39
- },
- "cudf_burndown": {
- "start": "Jan 27 2021",
- "end": "Feb 16 2021",
- "days": 14
- },
- "other_burndown": {
- "start": "Feb 3 2021",
- "end": "Feb 16 2021",
- "days": 9
- },
- "cudf_codefreeze": {
- "start": "Feb 17 2021",
- "end": "Feb 23 2021",
- "days": 5
- },
- "other_codefreeze": {
- "start": "Feb 17 2021",
- "end": "Feb 23 2021",
- "days": 5
- },
- "release": {
- "start": "Feb 24 2021",
- "end": "Feb 25 2021",
- "days": 2
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2020-11-24",
+ "end": "2021-01-26"
+ },
+ {
+ "name": "Development",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2020-11-24",
+ "end": "2021-02-02"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-01-27",
+ "end": "2021-02-16",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-02-03",
+ "end": "2021-02-16",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM",
+ "start": "2021-02-17",
+ "end": "2021-02-23",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2021-02-17",
+ "end": "2021-02-23",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2021-02-24",
+ "end": "2021-02-25",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "0.17",
- "dev": {
- "start": "Oct 1 2020",
- "end": "Nov 23 2020",
- "days": 38
- },
- "burndown": {
- "start": "Nov 24 2020",
- "end": "Dec 3 2020",
- "days": 6
- },
- "codefreeze": {
- "start": "Dec 4 2020",
- "end": "Dec 9 2020",
- "days": 4
- },
- "release": {
- "start": "Dec 10 2020",
- "end": "Dec 10 2020",
- "days": 1
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-10-01",
+ "end": "2020-11-23"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-11-24",
+ "end": "2020-12-03",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-12-04",
+ "end": "2020-12-09",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-12-10",
+ "end": "2020-12-10",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "0.16",
- "dev": {
- "start": "Aug 6 2020",
- "end": "Sep 30 2020",
- "days": 39
- },
- "burndown": {
- "start": "Oct 1 2020",
- "end": "Oct 14 2020",
- "days": 10
- },
- "codefreeze": {
- "start": "Oct 15 2020",
- "end": "Oct 20 2020",
- "days": 4
- },
- "release": {
- "start": "Oct 21 2020",
- "end": "Oct 21 2020",
- "days": 1
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-08-06",
+ "end": "2020-09-30"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-10-01",
+ "end": "2020-10-14",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-10-15",
+ "end": "2020-10-20",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-10-21",
+ "end": "2020-10-21",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "0.15",
- "dev": {
- "start": "May 19 2020",
- "end": "Aug 5 2020",
- "days": 56
- },
- "burndown": {
- "start": "Aug 6 2020",
- "end": "Aug 19 2020",
- "days": 10
- },
- "codefreeze": {
- "start": "Aug 20 2020",
- "end": "Aug 25 2020",
- "days": 4
- },
- "release": {
- "start": "Aug 26 2020",
- "end": "Aug 26 2020",
- "days": 1
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-05-19",
+ "end": "2020-08-05"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-08-06",
+ "end": "2020-08-19",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-08-20",
+ "end": "2020-08-25",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-08-26",
+ "end": "2020-08-26",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "0.14",
- "dev": {
- "start": "Mar 9 2020",
- "end": "May 18 2020",
- "days": 51
- },
- "burndown": {
- "start": "May 19 2020",
- "end": "May 27 2020",
- "days": 6
- },
- "codefreeze": {
- "start": "May 28 2020",
- "end": "Jun 2 2020",
- "days": 4
- },
- "release": {
- "start": "Jun 3 2020",
- "end": "Jun 3 2020",
- "days": 1
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-03-09",
+ "end": "2020-05-18"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-05-19",
+ "end": "2020-05-27",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-05-28",
+ "end": "2020-06-02",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-06-03",
+ "end": "2020-06-03",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "0.13",
- "dev": {
- "start": "Jan 16 2020",
- "end": "Mar 6 2020",
- "days": 35
- },
- "burndown": {
- "start": "Mar 9 2020",
- "end": "Mar 26 2020",
- "days": 14
- },
- "codefreeze": {
- "start": "Mar 27 2020",
- "end": "Mar 30 2020",
- "days": 2
- },
- "release": {
- "start": "Mar 31 2020",
- "end": "Mar 31 2020",
- "days": 1
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-01-16",
+ "end": "2020-03-06"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-03-09",
+ "end": "2020-03-26",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-03-27",
+ "end": "2020-03-30",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-03-31",
+ "end": "2020-03-31",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "0.12",
- "dev": {
- "start": "Nov 21 2019",
- "end": "Jan 15 2020",
- "days": 36
- },
- "burndown": {
- "start": "Jan 16 2020",
- "end": "Jan 23 2020",
- "days": 5
- },
- "codefreeze": {
- "start": "Jan 24 2020",
- "end": "Feb 3 2020",
- "days": 9
- },
- "release": {
- "start": "Feb 4 2020",
- "end": "Feb 4 2020",
- "days": 1
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2019-11-21",
+ "end": "2020-01-15"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-01-16",
+ "end": "2020-01-23",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-01-24",
+ "end": "2020-02-03",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2020-02-04",
+ "end": "2020-02-04",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "0.11",
- "dev": {
- "start": "Sep 26 2019",
- "end": "Nov 20 2019",
- "days": 40
- },
- "burndown": {
- "start": "Nov 21 2019",
- "end": "Dec 4 2019",
- "days": 8
- },
- "codefreeze": {
- "start": "Dec 5 2019",
- "end": "Dec 10 2019",
- "days": 4
- },
- "release": {
- "start": "Dec 11 2019",
- "end": "Dec 11 2019",
- "days": 1
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2019-09-26",
+ "end": "2019-11-20"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2019-11-21",
+ "end": "2019-12-04",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2019-12-05",
+ "end": "2019-12-10",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2019-12-11",
+ "end": "2019-12-11",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "0.10",
- "dev": {
- "start": "Aug 14 2019",
- "end": "Sep 25 2019",
- "days": 30
- },
- "burndown": {
- "start": "Sep 26 2019",
- "end": "Oct 2 2019",
- "days": 5
- },
- "codefreeze": {
- "start": "Oct 10 2019",
- "end": "Oct 16 2019",
- "days": 5
- },
- "release": {
- "start": "Oct 17 2019",
- "end": "Oct 17 2019",
- "days": 1
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2019-08-14",
+ "end": "2019-09-25"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2019-09-26",
+ "end": "2019-10-02",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2019-10-10",
+ "end": "2019-10-16",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2019-10-17",
+ "end": "2019-10-17",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "0.9",
- "dev": {
- "start": "Jun 24 2019",
- "end": "Aug 6 2019",
- "days": 30
- },
- "burndown": {
- "start": "Aug 7 2019",
- "end": "Aug 13 2019",
- "days": 5
- },
- "codefreeze": {
- "start": "Aug 14 2019",
- "end": "Aug 20 2019",
- "days": 5
- },
- "release": {
- "start": "Aug 21 2019",
- "end": "Aug 21 2019",
- "days": 1
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2019-06-24",
+ "end": "2019-08-06"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2019-08-07",
+ "end": "2019-08-13",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2019-08-14",
+ "end": "2019-08-20",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2019-08-21",
+ "end": "2019-08-21",
+ "process_anchor": "releasing"
+ }
+ ]
},
{
"version": "0.8",
- "date": "Jun 27 2019"
+ "date": "2019-06-27"
},
{
"version": "0.7",
- "date": "May 10 2019"
+ "date": "2019-05-10"
},
{
"version": "0.6",
- "date": "Mar 22 2019"
+ "date": "2019-03-22"
},
{
"version": "0.5",
- "date": "Jan 31 2019"
+ "date": "2019-01-31"
},
{
"version": "0.4",
- "date": "Dec 10 2018"
+ "date": "2018-12-10"
},
{
"version": "0.3",
- "date": "Nov 29 2018"
+ "date": "2018-11-29"
},
{
"version": "0.2",
- "date": "Nov 14 2018"
+ "date": "2018-11-14"
},
{
"version": "0.1",
- "date": "Oct 28 2018"
+ "date": "2018-10-28"
}
]
diff --git a/_data/redirects.yml b/_data/redirects.yml
new file mode 100644
index 00000000000..12fcd6bd4f4
--- /dev/null
+++ b/_data/redirects.yml
@@ -0,0 +1,16 @@
+# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES.
+# SPDX-License-Identifier: Apache-2.0
+#
+# Redirects that cannot be derived from docs.yml. A source without a trailing
+# slash emits both forms. Generated project redirects are declared in docs.yml.
+
+redirects:
+ - source: /api/cusignal
+ target: /api/cusignal/stable/
+ reason: Preserve the retired project's historical entry point.
+ - source: /api/libcugraph
+ target: /api/libcugraph/stable/
+ reason: Preserve a published path that has no docs catalog entry.
+ - source: /deployment
+ target: /deployment/stable/
+ reason: Deployment docs are hosted outside the API project catalog.
diff --git a/_data/release_calendar.yml b/_data/release_calendar.yml
new file mode 100644
index 00000000000..ba6e5831b2b
--- /dev/null
+++ b/_data/release_calendar.yml
@@ -0,0 +1,1328 @@
+# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES.
+# SPDX-License-Identifier: Apache-2.0
+#
+# Canonical RAPIDS release channels and schedules. Generated projections live in
+# releases.json and previous_releases.json; edit this file instead of those files.
+
+channels:
+ legacy: '26.04'
+ stable: '26.06'
+ nightly: '26.08'
+ next_nightly: '26.10'
+project_labels:
+ cudf: cuDF
+ rmm: RMM
+ rapids-cmake: rapids-cmake
+ cugraph-ops: cugraph-ops
+ raft: RAFT
+ dask-cuda: Dask-CUDA
+ kvikio: KvikIO
+ ucxx: UCXX
+ rapidsmpf: RapidsMPF
+ nvforest: nvForest
+cohort_sets:
+ current:
+ early:
+ - cudf
+ - rmm
+ - rapids-cmake
+ - raft
+ - dask-cuda
+ - kvikio
+ - ucxx
+ - rapidsmpf
+ - nvforest
+ 26.04-26.06:
+ early:
+ - cudf
+ - rmm
+ - rapids-cmake
+ - raft
+ - dask-cuda
+ - kvikio
+ - ucxx
+ - rapidsmpf
+ 25.02-26.02:
+ early:
+ - cudf
+ - rmm
+ - rapids-cmake
+ - raft
+ 23.06-24.12:
+ early:
+ - cudf
+ - rmm
+ - rapids-cmake
+ - cugraph-ops
+ - raft
+ legacy-core:
+ early:
+ - cudf
+ - rmm
+releases:
+ '26.10':
+ ucxx_version: '0.52'
+ cohort_set: current
+ phases:
+ - phase: development
+ cohort: all
+ start: '2026-07-16'
+ end: '2026-09-09'
+ - phase: burn_down
+ cohort: early
+ start: '2026-09-10'
+ end: '2026-09-16'
+ - phase: burn_down
+ cohort: remaining
+ start: '2026-09-10'
+ end: '2026-09-30'
+ - phase: code_freeze
+ cohort: early
+ start: '2026-09-17'
+ end: '2026-10-06'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2026-10-01'
+ end: '2026-10-06'
+ - phase: release
+ cohort: all
+ start: '2026-10-07'
+ end: '2026-10-08'
+ '26.08':
+ ucxx_version: '0.51'
+ cohort_set: current
+ phases:
+ - phase: development
+ cohort: all
+ start: '2026-05-14'
+ end: '2026-07-15'
+ - phase: burn_down
+ cohort: early
+ start: '2026-07-16'
+ end: '2026-07-22'
+ - phase: burn_down
+ cohort: remaining
+ start: '2026-07-16'
+ end: '2026-07-29'
+ - phase: code_freeze
+ cohort: early
+ start: '2026-07-23'
+ end: '2026-08-04'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2026-07-30'
+ end: '2026-08-04'
+ - phase: release
+ cohort: all
+ start: '2026-08-05'
+ end: '2026-08-06'
+ '26.06':
+ ucxx_version: '0.50'
+ cohort_set: 26.04-26.06
+ phases:
+ - phase: development
+ cohort: all
+ start: '2026-03-12'
+ end: '2026-05-13'
+ - phase: burn_down
+ cohort: early
+ start: '2026-05-14'
+ end: '2026-05-20'
+ - phase: burn_down
+ cohort: remaining
+ start: '2026-05-14'
+ end: '2026-05-27'
+ - phase: code_freeze
+ cohort: early
+ start: '2026-05-21'
+ end: '2026-06-02'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2026-05-28'
+ end: '2026-06-02'
+ - phase: release
+ cohort: all
+ start: '2026-06-03'
+ end: '2026-06-04'
+ '26.04':
+ ucxx_version: '0.49'
+ cohort_set: 26.04-26.06
+ phases:
+ - phase: development
+ cohort: all
+ start: '2026-01-15'
+ end: '2026-03-11'
+ - phase: burn_down
+ cohort: early
+ start: '2026-03-12'
+ end: '2026-03-18'
+ - phase: burn_down
+ cohort: remaining
+ start: '2026-03-12'
+ end: '2026-04-01'
+ - phase: code_freeze
+ cohort: early
+ start: '2026-03-19'
+ end: '2026-04-07'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2026-04-02'
+ end: '2026-04-07'
+ - phase: release
+ cohort: all
+ start: '2026-04-08'
+ end: '2026-04-09'
+ '26.02':
+ ucxx_version: '0.48'
+ cohort_set: 25.02-26.02
+ phases:
+ - phase: development
+ cohort: early
+ start: '2025-11-13'
+ end: '2026-01-14'
+ - phase: development
+ cohort: remaining
+ start: '2025-11-20'
+ end: '2026-01-21'
+ - phase: burn_down
+ cohort: early
+ start: '2026-01-15'
+ end: '2026-01-21'
+ - phase: burn_down
+ cohort: remaining
+ start: '2026-01-22'
+ end: '2026-01-28'
+ - phase: code_freeze
+ cohort: early
+ start: '2026-01-22'
+ end: '2026-02-03'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2026-01-29'
+ end: '2026-02-03'
+ - phase: release
+ cohort: all
+ start: '2026-02-04'
+ end: '2026-02-05'
+ '25.12':
+ ucxx_version: '0.47'
+ cohort_set: 25.02-26.02
+ phases:
+ - phase: development
+ cohort: early
+ start: '2025-09-18'
+ end: '2025-11-12'
+ - phase: development
+ cohort: remaining
+ start: '2025-09-25'
+ end: '2025-11-19'
+ - phase: burn_down
+ cohort: early
+ start: '2025-11-13'
+ end: '2025-11-19'
+ - phase: burn_down
+ cohort: remaining
+ start: '2025-11-20'
+ end: '2025-12-03'
+ - phase: code_freeze
+ cohort: early
+ start: '2025-11-20'
+ end: '2025-12-09'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2025-12-04'
+ end: '2025-12-09'
+ - phase: release
+ cohort: all
+ start: '2025-12-10'
+ end: '2025-12-11'
+ '25.10':
+ ucxx_version: '0.46'
+ cohort_set: 25.02-26.02
+ phases:
+ - phase: development
+ cohort: early
+ start: '2025-07-17'
+ end: '2025-09-17'
+ - phase: development
+ cohort: remaining
+ start: '2025-07-24'
+ end: '2025-09-24'
+ - phase: burn_down
+ cohort: early
+ start: '2025-09-18'
+ end: '2025-09-24'
+ - phase: burn_down
+ cohort: remaining
+ start: '2025-09-25'
+ end: '2025-10-01'
+ - phase: code_freeze
+ cohort: early
+ start: '2025-09-25'
+ end: '2025-10-07'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2025-10-02'
+ end: '2025-10-07'
+ - phase: release
+ cohort: all
+ start: '2025-10-08'
+ end: '2025-10-09'
+ '25.08':
+ ucxx_version: '0.45'
+ cohort_set: 25.02-26.02
+ phases:
+ - phase: development
+ cohort: early
+ start: '2025-05-15'
+ end: '2025-07-16'
+ - phase: development
+ cohort: remaining
+ start: '2025-05-22'
+ end: '2025-07-23'
+ - phase: burn_down
+ cohort: early
+ start: '2025-07-17'
+ end: '2025-07-23'
+ - phase: burn_down
+ cohort: remaining
+ start: '2025-07-24'
+ end: '2025-07-30'
+ - phase: code_freeze
+ cohort: early
+ start: '2025-07-24'
+ end: '2025-08-05'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2025-07-31'
+ end: '2025-08-05'
+ - phase: release
+ cohort: all
+ start: '2025-08-06'
+ end: '2025-08-07'
+ '25.06':
+ ucxx_version: '0.44'
+ cohort_set: 25.02-26.02
+ phases:
+ - phase: development
+ cohort: early
+ start: '2025-03-13'
+ end: '2025-05-14'
+ - phase: development
+ cohort: remaining
+ start: '2025-03-20'
+ end: '2025-05-21'
+ - phase: burn_down
+ cohort: early
+ start: '2025-05-15'
+ end: '2025-05-21'
+ - phase: burn_down
+ cohort: remaining
+ start: '2025-05-22'
+ end: '2025-05-28'
+ - phase: code_freeze
+ cohort: early
+ start: '2025-05-22'
+ end: '2025-06-03'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2025-05-29'
+ end: '2025-06-03'
+ - phase: release
+ cohort: all
+ start: '2025-06-04'
+ end: '2025-06-05'
+ '25.04':
+ ucxx_version: '0.43'
+ cohort_set: 25.02-26.02
+ phases:
+ - phase: development
+ cohort: early
+ start: '2025-01-23'
+ end: '2025-03-12'
+ - phase: development
+ cohort: remaining
+ start: '2025-01-30'
+ end: '2025-03-19'
+ - phase: burn_down
+ cohort: early
+ start: '2025-03-13'
+ end: '2025-03-19'
+ - phase: burn_down
+ cohort: remaining
+ start: '2025-03-20'
+ end: '2025-04-02'
+ - phase: code_freeze
+ cohort: early
+ start: '2025-03-20'
+ end: '2025-04-08'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2025-04-03'
+ end: '2025-04-08'
+ - phase: release
+ cohort: all
+ start: '2025-04-09'
+ end: '2025-04-10'
+ '25.02':
+ ucxx_version: '0.42'
+ cohort_set: 25.02-26.02
+ phases:
+ - phase: development
+ cohort: early
+ start: '2024-11-14'
+ end: '2025-01-22'
+ - phase: development
+ cohort: remaining
+ start: '2024-11-21'
+ end: '2025-01-29'
+ - phase: burn_down
+ cohort: early
+ start: '2025-01-23'
+ end: '2025-01-29'
+ - phase: burn_down
+ cohort: remaining
+ start: '2025-01-30'
+ end: '2025-02-05'
+ - phase: code_freeze
+ cohort: early
+ start: '2025-01-30'
+ end: '2025-02-11'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2025-02-06'
+ end: '2025-02-11'
+ - phase: release
+ cohort: all
+ start: '2025-02-12'
+ end: '2025-02-13'
+ '24.12':
+ ucxx_version: '0.41'
+ cohort_set: 23.06-24.12
+ phases:
+ - phase: development
+ cohort: early
+ start: '2024-09-19'
+ end: '2024-11-13'
+ - phase: development
+ cohort: remaining
+ start: '2024-09-26'
+ end: '2024-11-20'
+ - phase: burn_down
+ cohort: early
+ start: '2024-11-14'
+ end: '2024-11-20'
+ - phase: burn_down
+ cohort: remaining
+ start: '2024-11-21'
+ end: '2024-12-04'
+ - phase: code_freeze
+ cohort: early
+ start: '2024-11-21'
+ end: '2024-12-10'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2024-12-05'
+ end: '2024-12-10'
+ - phase: release
+ cohort: all
+ start: '2024-12-11'
+ end: '2024-12-12'
+ '24.10':
+ ucxx_version: '0.40'
+ cohort_set: 23.06-24.12
+ phases:
+ - phase: development
+ cohort: early
+ start: '2024-07-18'
+ end: '2024-09-18'
+ - phase: development
+ cohort: remaining
+ start: '2024-07-25'
+ end: '2024-09-25'
+ - phase: burn_down
+ cohort: early
+ start: '2024-09-19'
+ end: '2024-09-25'
+ - phase: burn_down
+ cohort: remaining
+ start: '2024-09-26'
+ end: '2024-10-02'
+ - phase: code_freeze
+ cohort: early
+ start: '2024-09-26'
+ end: '2024-10-08'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2024-10-03'
+ end: '2024-10-08'
+ - phase: release
+ cohort: all
+ start: '2024-10-09'
+ end: '2024-10-10'
+ '24.08':
+ ucxx_version: '0.39'
+ cohort_set: 23.06-24.12
+ phases:
+ - phase: development
+ cohort: early
+ start: '2024-05-16'
+ end: '2024-07-17'
+ - phase: development
+ cohort: remaining
+ start: '2024-05-23'
+ end: '2024-07-24'
+ - phase: burn_down
+ cohort: early
+ start: '2024-07-18'
+ end: '2024-07-24'
+ - phase: burn_down
+ cohort: remaining
+ start: '2024-07-25'
+ end: '2024-07-31'
+ - phase: code_freeze
+ cohort: early
+ start: '2024-07-25'
+ end: '2024-08-06'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2024-08-01'
+ end: '2024-08-06'
+ - phase: release
+ cohort: all
+ start: '2024-08-07'
+ end: '2024-08-08'
+ '24.06':
+ ucxx_version: '0.38'
+ cohort_set: 23.06-24.12
+ phases:
+ - phase: development
+ cohort: early
+ start: '2024-03-14'
+ end: '2024-05-15'
+ - phase: development
+ cohort: remaining
+ start: '2024-03-21'
+ end: '2024-05-22'
+ - phase: burn_down
+ cohort: early
+ start: '2024-05-16'
+ end: '2024-05-22'
+ - phase: burn_down
+ cohort: remaining
+ start: '2024-05-23'
+ end: '2024-05-29'
+ - phase: code_freeze
+ cohort: early
+ start: '2024-05-23'
+ end: '2024-06-04'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2024-05-30'
+ end: '2024-06-04'
+ - phase: release
+ cohort: all
+ start: '2024-06-05'
+ end: '2024-06-06'
+ '24.04':
+ ucxx_version: '0.37'
+ cohort_set: 23.06-24.12
+ phases:
+ - phase: development
+ cohort: early
+ start: '2024-01-18'
+ end: '2024-03-13'
+ - phase: development
+ cohort: remaining
+ start: '2024-01-25'
+ end: '2024-03-20'
+ - phase: burn_down
+ cohort: early
+ start: '2024-03-14'
+ end: '2024-03-20'
+ - phase: burn_down
+ cohort: remaining
+ start: '2024-03-21'
+ end: '2024-04-03'
+ - phase: code_freeze
+ cohort: early
+ start: '2024-03-21'
+ end: '2024-04-09'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2024-04-04'
+ end: '2024-04-09'
+ - phase: release
+ cohort: all
+ start: '2024-04-10'
+ end: '2024-04-11'
+ '24.02':
+ cohort_set: 23.06-24.12
+ phases:
+ - phase: development
+ cohort: early
+ start: '2023-11-09'
+ end: '2024-01-17'
+ - phase: development
+ cohort: remaining
+ start: '2023-11-16'
+ end: '2024-01-24'
+ - phase: burn_down
+ cohort: early
+ start: '2024-01-18'
+ end: '2024-01-24'
+ - phase: burn_down
+ cohort: remaining
+ start: '2024-01-25'
+ end: '2024-01-31'
+ - phase: code_freeze
+ cohort: early
+ start: '2024-01-25'
+ end: '2024-02-06'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2024-02-01'
+ end: '2024-02-06'
+ - phase: release
+ cohort: all
+ start: '2024-02-07'
+ end: '2024-02-08'
+ '23.12':
+ cohort_set: 23.06-24.12
+ phases:
+ - phase: development
+ cohort: early
+ start: '2023-09-21'
+ end: '2023-11-08'
+ - phase: development
+ cohort: remaining
+ start: '2023-09-28'
+ end: '2023-11-15'
+ - phase: burn_down
+ cohort: early
+ start: '2023-11-09'
+ end: '2023-11-15'
+ - phase: burn_down
+ cohort: remaining
+ start: '2023-11-16'
+ end: '2023-11-29'
+ - phase: code_freeze
+ cohort: early
+ start: '2023-11-16'
+ end: '2023-12-05'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2023-11-30'
+ end: '2023-12-05'
+ - phase: release
+ cohort: all
+ start: '2023-12-06'
+ end: '2023-12-07'
+ '23.10':
+ cohort_set: 23.06-24.12
+ phases:
+ - phase: development
+ cohort: early
+ start: '2023-07-20'
+ end: '2023-09-20'
+ - phase: development
+ cohort: remaining
+ start: '2023-07-27'
+ end: '2023-09-27'
+ - phase: burn_down
+ cohort: early
+ start: '2023-09-21'
+ end: '2023-09-27'
+ - phase: burn_down
+ cohort: remaining
+ start: '2023-09-28'
+ end: '2023-10-04'
+ - phase: code_freeze
+ cohort: early
+ start: '2023-09-28'
+ end: '2023-10-10'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2023-10-05'
+ end: '2023-10-10'
+ - phase: release
+ cohort: all
+ start: '2023-10-11'
+ end: '2023-10-12'
+ '23.08':
+ cohort_set: 23.06-24.12
+ phases:
+ - phase: development
+ cohort: early
+ start: '2023-05-18'
+ end: '2023-07-19'
+ - phase: development
+ cohort: remaining
+ start: '2023-05-25'
+ end: '2023-07-26'
+ - phase: burn_down
+ cohort: early
+ start: '2023-07-20'
+ end: '2023-07-26'
+ - phase: burn_down
+ cohort: remaining
+ start: '2023-07-27'
+ end: '2023-08-02'
+ - phase: code_freeze
+ cohort: early
+ start: '2023-07-27'
+ end: '2023-08-08'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2023-08-03'
+ end: '2023-08-08'
+ - phase: release
+ cohort: all
+ start: '2023-08-09'
+ end: '2023-08-10'
+ '23.06':
+ cohort_set: 23.06-24.12
+ phases:
+ - phase: development
+ cohort: early
+ start: '2023-03-23'
+ end: '2023-05-17'
+ - phase: development
+ cohort: remaining
+ start: '2023-03-30'
+ end: '2023-05-24'
+ - phase: burn_down
+ cohort: early
+ start: '2023-05-18'
+ end: '2023-05-24'
+ - phase: burn_down
+ cohort: remaining
+ start: '2023-05-25'
+ end: '2023-05-31'
+ - phase: code_freeze
+ cohort: early
+ start: '2023-05-25'
+ end: '2023-06-06'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2023-06-01'
+ end: '2023-06-06'
+ - phase: release
+ cohort: all
+ start: '2023-06-07'
+ end: '2023-06-08'
+ '23.04':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2023-01-19'
+ end: '2023-03-22'
+ - phase: development
+ cohort: remaining
+ start: '2023-01-26'
+ end: '2023-03-29'
+ - phase: burn_down
+ cohort: early
+ start: '2023-03-23'
+ end: '2023-03-29'
+ - phase: burn_down
+ cohort: remaining
+ start: '2023-03-30'
+ end: '2023-04-05'
+ - phase: code_freeze
+ cohort: early
+ start: '2023-03-30'
+ end: '2023-04-04'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2023-04-06'
+ end: '2023-04-11'
+ - phase: release
+ cohort: all
+ start: '2023-04-12'
+ end: '2023-04-13'
+ '23.02':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2022-11-10'
+ end: '2023-01-18'
+ - phase: development
+ cohort: remaining
+ start: '2022-11-17'
+ end: '2023-01-25'
+ - phase: burn_down
+ cohort: early
+ start: '2023-01-19'
+ end: '2023-01-25'
+ - phase: burn_down
+ cohort: remaining
+ start: '2023-01-26'
+ end: '2023-02-01'
+ - phase: code_freeze
+ cohort: early
+ start: '2023-01-26'
+ end: '2023-01-31'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2023-02-02'
+ end: '2023-02-07'
+ - phase: release
+ cohort: all
+ start: '2023-02-08'
+ end: '2023-02-09'
+ '22.12':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2022-09-22'
+ end: '2022-11-09'
+ - phase: development
+ cohort: remaining
+ start: '2022-09-29'
+ end: '2022-11-16'
+ - phase: burn_down
+ cohort: early
+ start: '2022-11-10'
+ end: '2022-11-16'
+ - phase: burn_down
+ cohort: remaining
+ start: '2022-11-17'
+ end: '2022-11-30'
+ - phase: code_freeze
+ cohort: early
+ start: '2022-11-17'
+ end: '2022-11-30'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2022-12-01'
+ end: '2022-12-06'
+ - phase: release
+ cohort: all
+ start: '2022-12-07'
+ end: '2022-12-08'
+ '22.10':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2022-07-21'
+ end: '2022-09-21'
+ - phase: development
+ cohort: remaining
+ start: '2022-07-28'
+ end: '2022-09-28'
+ - phase: burn_down
+ cohort: early
+ start: '2022-09-22'
+ end: '2022-09-28'
+ - phase: burn_down
+ cohort: remaining
+ start: '2022-09-29'
+ end: '2022-10-05'
+ - phase: code_freeze
+ cohort: early
+ start: '2022-09-29'
+ end: '2022-10-05'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2022-10-06'
+ end: '2022-10-11'
+ - phase: release
+ cohort: all
+ start: '2022-10-12'
+ end: '2022-10-13'
+ '22.08':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2022-05-18'
+ end: '2022-07-20'
+ - phase: development
+ cohort: remaining
+ start: '2022-05-25'
+ end: '2022-07-27'
+ - phase: burn_down
+ cohort: early
+ start: '2022-07-21'
+ end: '2022-07-27'
+ - phase: burn_down
+ cohort: remaining
+ start: '2022-07-28'
+ end: '2022-08-03'
+ - phase: code_freeze
+ cohort: early
+ start: '2022-07-28'
+ end: '2022-08-03'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2022-08-04'
+ end: '2022-08-10'
+ - phase: release
+ cohort: all
+ start: '2022-08-11'
+ end: '2022-08-17'
+ '22.06':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2022-03-17'
+ end: '2022-05-17'
+ - phase: development
+ cohort: remaining
+ start: '2022-03-24'
+ end: '2022-05-24'
+ - phase: burn_down
+ cohort: early
+ start: '2022-05-18'
+ end: '2022-05-24'
+ - phase: burn_down
+ cohort: remaining
+ start: '2022-05-25'
+ end: '2022-06-01'
+ - phase: code_freeze
+ cohort: early
+ start: '2022-05-25'
+ end: '2022-05-31'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2022-06-02'
+ end: '2022-06-06'
+ - phase: release
+ cohort: all
+ start: '2022-06-07'
+ end: '2022-06-08'
+ '22.04':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2022-01-12'
+ end: '2022-03-16'
+ - phase: development
+ cohort: remaining
+ start: '2022-01-20'
+ end: '2022-03-23'
+ - phase: burn_down
+ cohort: early
+ start: '2022-03-17'
+ end: '2022-03-23'
+ - phase: burn_down
+ cohort: remaining
+ start: '2022-03-24'
+ end: '2022-03-30'
+ - phase: code_freeze
+ cohort: early
+ start: '2022-03-24'
+ end: '2022-03-30'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2022-03-31'
+ end: '2022-04-05'
+ - phase: release
+ cohort: all
+ start: '2022-04-06'
+ end: '2022-04-07'
+ '22.02':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2021-11-04'
+ end: '2022-01-11'
+ - phase: development
+ cohort: remaining
+ start: '2021-11-11'
+ end: '2022-01-19'
+ - phase: burn_down
+ cohort: early
+ start: '2022-01-12'
+ end: '2022-01-19'
+ - phase: burn_down
+ cohort: remaining
+ start: '2022-01-20'
+ end: '2022-01-26'
+ - phase: code_freeze
+ cohort: early
+ start: '2022-01-20'
+ end: '2022-01-26'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2022-01-27'
+ end: '2022-02-01'
+ - phase: release
+ cohort: all
+ start: '2022-02-02'
+ end: '2022-02-03'
+ '21.12':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2021-09-16'
+ end: '2021-11-03'
+ - phase: development
+ cohort: remaining
+ start: '2021-09-23'
+ end: '2021-11-10'
+ - phase: burn_down
+ cohort: early
+ start: '2021-11-04'
+ end: '2021-11-10'
+ - phase: burn_down
+ cohort: remaining
+ start: '2021-11-11'
+ end: '2021-11-17'
+ - phase: code_freeze
+ cohort: early
+ start: '2021-11-11'
+ end: '2021-11-17'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2021-11-18'
+ end: '2021-11-30'
+ - phase: release
+ cohort: all
+ start: '2021-12-08'
+ end: '2021-12-09'
+ schedule_exception: Preserves a gap in the historically published schedule.
+ '21.10':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2021-07-14'
+ end: '2021-09-15'
+ - phase: development
+ cohort: remaining
+ start: '2021-07-21'
+ end: '2021-09-22'
+ - phase: burn_down
+ cohort: early
+ start: '2021-09-16'
+ end: '2021-09-22'
+ - phase: burn_down
+ cohort: remaining
+ start: '2021-09-23'
+ end: '2021-09-28'
+ - phase: code_freeze
+ cohort: early
+ start: '2021-09-23'
+ end: '2021-09-28'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2021-09-29'
+ end: '2021-10-05'
+ - phase: release
+ cohort: all
+ start: '2021-10-06'
+ end: '2021-10-07'
+ '21.08':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2021-05-19'
+ end: '2021-07-14'
+ - phase: development
+ cohort: remaining
+ start: '2021-05-26'
+ end: '2021-07-21'
+ - phase: burn_down
+ cohort: early
+ start: '2021-07-15'
+ end: '2021-07-21'
+ - phase: burn_down
+ cohort: remaining
+ start: '2021-07-22'
+ end: '2021-07-28'
+ - phase: code_freeze
+ cohort: early
+ start: '2021-07-22'
+ end: '2021-07-28'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2021-07-29'
+ end: '2021-08-03'
+ - phase: release
+ cohort: all
+ start: '2021-08-04'
+ end: '2021-08-05'
+ '21.06':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2021-03-25'
+ end: '2021-05-18'
+ - phase: development
+ cohort: remaining
+ start: '2021-04-01'
+ end: '2021-05-25'
+ - phase: burn_down
+ cohort: early
+ start: '2021-05-19'
+ end: '2021-05-25'
+ - phase: burn_down
+ cohort: remaining
+ start: '2021-05-26'
+ end: '2021-06-02'
+ - phase: code_freeze
+ cohort: early
+ start: '2021-05-26'
+ end: '2021-06-02'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2021-06-03'
+ end: '2021-06-08'
+ - phase: release
+ cohort: all
+ start: '2021-06-09'
+ end: '2021-06-10'
+ '0.19':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2021-01-27'
+ end: '2021-03-24'
+ - phase: development
+ cohort: remaining
+ start: '2021-02-03'
+ end: '2021-03-31'
+ - phase: burn_down
+ cohort: early
+ start: '2021-03-25'
+ end: '2021-03-31'
+ - phase: burn_down
+ cohort: remaining
+ start: '2021-04-01'
+ end: '2021-04-07'
+ - phase: code_freeze
+ cohort: early
+ start: '2021-04-01'
+ end: '2021-04-07'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2021-04-08'
+ end: '2021-04-20'
+ - phase: release
+ cohort: all
+ start: '2021-04-21'
+ end: '2021-04-22'
+ '0.18':
+ cohort_set: legacy-core
+ phases:
+ - phase: development
+ cohort: early
+ start: '2020-11-24'
+ end: '2021-01-26'
+ - phase: development
+ cohort: remaining
+ start: '2020-11-24'
+ end: '2021-02-02'
+ - phase: burn_down
+ cohort: early
+ start: '2021-01-27'
+ end: '2021-02-16'
+ - phase: burn_down
+ cohort: remaining
+ start: '2021-02-03'
+ end: '2021-02-16'
+ - phase: code_freeze
+ cohort: early
+ start: '2021-02-17'
+ end: '2021-02-23'
+ - phase: code_freeze
+ cohort: remaining
+ start: '2021-02-17'
+ end: '2021-02-23'
+ - phase: release
+ cohort: all
+ start: '2021-02-24'
+ end: '2021-02-25'
+ '0.17':
+ phases:
+ - phase: development
+ cohort: all
+ start: '2020-10-01'
+ end: '2020-11-23'
+ - phase: burn_down
+ cohort: all
+ start: '2020-11-24'
+ end: '2020-12-03'
+ - phase: code_freeze
+ cohort: all
+ start: '2020-12-04'
+ end: '2020-12-09'
+ - phase: release
+ cohort: all
+ start: '2020-12-10'
+ end: '2020-12-10'
+ '0.16':
+ phases:
+ - phase: development
+ cohort: all
+ start: '2020-08-06'
+ end: '2020-09-30'
+ - phase: burn_down
+ cohort: all
+ start: '2020-10-01'
+ end: '2020-10-14'
+ - phase: code_freeze
+ cohort: all
+ start: '2020-10-15'
+ end: '2020-10-20'
+ - phase: release
+ cohort: all
+ start: '2020-10-21'
+ end: '2020-10-21'
+ '0.15':
+ phases:
+ - phase: development
+ cohort: all
+ start: '2020-05-19'
+ end: '2020-08-05'
+ - phase: burn_down
+ cohort: all
+ start: '2020-08-06'
+ end: '2020-08-19'
+ - phase: code_freeze
+ cohort: all
+ start: '2020-08-20'
+ end: '2020-08-25'
+ - phase: release
+ cohort: all
+ start: '2020-08-26'
+ end: '2020-08-26'
+ '0.14':
+ phases:
+ - phase: development
+ cohort: all
+ start: '2020-03-09'
+ end: '2020-05-18'
+ - phase: burn_down
+ cohort: all
+ start: '2020-05-19'
+ end: '2020-05-27'
+ - phase: code_freeze
+ cohort: all
+ start: '2020-05-28'
+ end: '2020-06-02'
+ - phase: release
+ cohort: all
+ start: '2020-06-03'
+ end: '2020-06-03'
+ '0.13':
+ phases:
+ - phase: development
+ cohort: all
+ start: '2020-01-16'
+ end: '2020-03-06'
+ - phase: burn_down
+ cohort: all
+ start: '2020-03-09'
+ end: '2020-03-26'
+ - phase: code_freeze
+ cohort: all
+ start: '2020-03-27'
+ end: '2020-03-30'
+ - phase: release
+ cohort: all
+ start: '2020-03-31'
+ end: '2020-03-31'
+ schedule_exception: Preserves a gap in the historically published schedule.
+ '0.12':
+ phases:
+ - phase: development
+ cohort: all
+ start: '2019-11-21'
+ end: '2020-01-15'
+ - phase: burn_down
+ cohort: all
+ start: '2020-01-16'
+ end: '2020-01-23'
+ - phase: code_freeze
+ cohort: all
+ start: '2020-01-24'
+ end: '2020-02-03'
+ - phase: release
+ cohort: all
+ start: '2020-02-04'
+ end: '2020-02-04'
+ '0.11':
+ phases:
+ - phase: development
+ cohort: all
+ start: '2019-09-26'
+ end: '2019-11-20'
+ - phase: burn_down
+ cohort: all
+ start: '2019-11-21'
+ end: '2019-12-04'
+ - phase: code_freeze
+ cohort: all
+ start: '2019-12-05'
+ end: '2019-12-10'
+ - phase: release
+ cohort: all
+ start: '2019-12-11'
+ end: '2019-12-11'
+ '0.10':
+ phases:
+ - phase: development
+ cohort: all
+ start: '2019-08-14'
+ end: '2019-09-25'
+ - phase: burn_down
+ cohort: all
+ start: '2019-09-26'
+ end: '2019-10-02'
+ - phase: code_freeze
+ cohort: all
+ start: '2019-10-10'
+ end: '2019-10-16'
+ - phase: release
+ cohort: all
+ start: '2019-10-17'
+ end: '2019-10-17'
+ schedule_exception: Preserves a gap in the historically published schedule.
+ '0.9':
+ phases:
+ - phase: development
+ cohort: all
+ start: '2019-06-24'
+ end: '2019-08-06'
+ - phase: burn_down
+ cohort: all
+ start: '2019-08-07'
+ end: '2019-08-13'
+ - phase: code_freeze
+ cohort: all
+ start: '2019-08-14'
+ end: '2019-08-20'
+ - phase: release
+ cohort: all
+ start: '2019-08-21'
+ end: '2019-08-21'
+ '0.8':
+ released_on: '2019-06-27'
+ '0.7':
+ released_on: '2019-05-10'
+ '0.6':
+ released_on: '2019-03-22'
+ '0.5':
+ released_on: '2019-01-31'
+ '0.4':
+ released_on: '2018-12-10'
+ '0.3':
+ released_on: '2018-11-29'
+ '0.2':
+ released_on: '2018-11-14'
+ '0.1':
+ released_on: '2018-10-28'
diff --git a/_data/releases.json b/_data/releases.json
index 860e7955e45..8eabd3c0b19 100644
--- a/_data/releases.json
+++ b/_data/releases.json
@@ -2,79 +2,117 @@
"legacy": {
"version": "26.04",
"ucxx_version": "0.49",
- "date": "Apr 9 2026"
+ "date": "2026-04-09"
},
"stable": {
"version": "26.06",
"ucxx_version": "0.50",
- "date": "Jun 4 2026"
+ "date": "2026-06-04"
},
"nightly": {
"version": "26.08",
"ucxx_version": "0.51",
- "dev": {
- "start": "May 14 2026",
- "end": "July 15 2026",
- "days": "40"
- },
- "cudf_burndown": {
- "start": "Jul 16 2026",
- "end": "Jul 22 2026",
- "days": "6"
- },
- "other_burndown": {
- "start": "Jul 16 2026",
- "end": "Jul 29 2026",
- "days": "10"
- },
- "cudf_codefreeze": {
- "start": "Jul 23 2026",
- "end": "Aug 4 2026",
- "days": "9"
- },
- "other_codefreeze": {
- "start": "Jul 30 2026",
- "end": "Aug 4 2026",
- "days": "4"
- },
- "release": {
- "start": "Aug 5 2026",
- "end": "Aug 6 2026",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2026-05-14",
+ "end": "2026-07-15"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT/Dask-CUDA/KvikIO/UCXX/RapidsMPF/nvForest",
+ "start": "2026-07-16",
+ "end": "2026-07-22",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2026-07-16",
+ "end": "2026-07-29",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT/Dask-CUDA/KvikIO/UCXX/RapidsMPF/nvForest",
+ "start": "2026-07-23",
+ "end": "2026-08-04",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2026-07-30",
+ "end": "2026-08-04",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2026-08-05",
+ "end": "2026-08-06",
+ "process_anchor": "releasing"
+ }
+ ]
},
"next_nightly": {
"version": "26.10",
"ucxx_version": "0.52",
- "dev": {
- "start": "Jul 16 2026",
- "end": "Sep 9 2026",
- "days": "39"
- },
- "cudf_burndown": {
- "start": "Sep 10 2026",
- "end": "Sep 16 2026",
- "days": "5"
- },
- "other_burndown": {
- "start": "Sep 10 2026",
- "end": "Sep 30 2026",
- "days": "15"
- },
- "cudf_codefreeze": {
- "start": "Sep 17 2026",
- "end": "Oct 6 2026",
- "days": "12"
- },
- "other_codefreeze": {
- "start": "Oct 1 2026",
- "end": "Oct 6 2026",
- "days": "5"
- },
- "release": {
- "start": "Oct 7 2026",
- "end": "Oct 8 2026",
- "days": "2"
- }
+ "phases": [
+ {
+ "name": "Development",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2026-07-16",
+ "end": "2026-09-09"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT/Dask-CUDA/KvikIO/UCXX/RapidsMPF/nvForest",
+ "start": "2026-09-10",
+ "end": "2026-09-16",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Burn Down",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2026-09-10",
+ "end": "2026-09-30",
+ "process_anchor": "burn-down"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "early",
+ "cohort_label": "cuDF/RMM/rapids-cmake/RAFT/Dask-CUDA/KvikIO/UCXX/RapidsMPF/nvForest",
+ "start": "2026-09-17",
+ "end": "2026-10-06",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Code Freeze/Testing",
+ "cohort": "remaining",
+ "cohort_label": "others",
+ "start": "2026-10-01",
+ "end": "2026-10-06",
+ "process_anchor": "code-freeze"
+ },
+ {
+ "name": "Release",
+ "cohort": "all",
+ "cohort_label": "",
+ "start": "2026-10-07",
+ "end": "2026-10-08",
+ "process_anchor": "releasing"
+ }
+ ]
}
}
diff --git a/_includes/api-docs.html b/_includes/api-docs.html
index bfa66cdae21..ef1854d9894 100644
--- a/_includes/api-docs.html
+++ b/_includes/api-docs.html
@@ -6,15 +6,14 @@
{% if api.hidden != true %}
{% comment %} HACK: below operation returns an array of stable/nightly/legacy values only if they're enabled in docs.yml. see issue #97 {% endcomment %}
{% assign versions = api.versions | sort | where_exp: "item", "item[1] == 1" | join: "" | split: "1" | reverse %}
+{% assign release_version_field = api.release_version_field | default: "version" %}
### {{ api.name }}
{{ api.desc }}
#### DOCS {% for version_name in versions -%}
{%- if api.version-overrides -%}
**[{{ version_name }} ({{ api.version-overrides[version_name] }})](/api/{{ api.path }}/{{ version_name }})**
- {%- elsif api.name == "libucxx" or api.name == "UCXX" -%}
- **[{{ version_name }} ({{ site.data.releases[version_name].ucxx_version }})](/api/{{ api.path }}/{{ version_name }})**
{%- else -%}
- **[{{ version_name }} ({{ site.data.releases[version_name].version }})](/api/{{ api.path }}/{{ version_name }})**
+ **[{{ version_name }} ({{ site.data.releases[version_name][release_version_field] }})](/api/{{ api.path }}/{{ version_name }})**
{%- endif -%}
{%- unless forloop.last %} | {% endunless -%}
{%- endfor %}
diff --git a/_includes/release-schedule.html b/_includes/release-schedule.html
new file mode 100644
index 00000000000..4d4b8ef6252
--- /dev/null
+++ b/_includes/release-schedule.html
@@ -0,0 +1,40 @@
+
+{% if include.release.phases %}
+
+
+
+ | Phase |
+ Start |
+ End |
+
+
+
+ {% for phase in include.release.phases %}
+
+ |
+ {% if phase.process_anchor %}{{ phase.name }}{% else %}{{ phase.name }}{% endif %}{% if phase.cohort_label != "" %} ({{ phase.cohort_label }}){% endif %}
+ |
+ {{ phase.start | date: "%a, %b %e, %Y" }} |
+ {{ phase.end | date: "%a, %b %e, %Y" }} |
+
+ {% endfor %}
+
+
+{% else %}
+
+
+
+ | Phase |
+ Date |
+
+
+
+
+ | Release |
+ {{ include.release.date | date: "%a, %b %e, %Y" }} |
+
+
+
+{% endif %}
diff --git a/_includes/selector.html b/_includes/selector.html
index 6bf2875a5ee..2ddb28fc20c 100644
--- a/_includes/selector.html
+++ b/_includes/selector.html
@@ -249,7 +249,7 @@
ENV. CUDA
-
+
@@ -257,7 +257,7 @@
System CUDA
-
+
@@ -265,7 +265,7 @@
Image CUDA
-
+
@@ -291,7 +291,7 @@
Additional Packages
-
+
@@ -318,7 +318,7 @@
-
+
@@ -370,10 +370,10 @@
document.addEventListener('alpine:init', () => {
Alpine.data('rapids_selector', () => ({
// default values
- active_python_ver: "3.14",
- active_conda_cuda_ver: "13",
- active_pip_cuda_ver: "13",
- active_docker_cuda_ver: "13",
+ active_python_ver: null,
+ active_conda_cuda_ver: null,
+ active_pip_cuda_ver: null,
+ active_docker_cuda_ver: null,
active_method: "Conda",
active_release: "Stable",
active_img_type: "Base",
@@ -381,30 +381,118 @@
active_packages: ["Standard"],
active_additional_packages: [],
- // all possible values
- python_vers_stable: ["3.11", "3.12", "3.13", "3.14"],
- python_vers_nightly: ["3.11", "3.12", "3.13", "3.14"],
- conda_cuda_vers_stable: ["12", "13"],
- conda_cuda_vers_nightly: ["12", "13"],
- pip_cuda_vers_stable: ["12", "13"],
- pip_cuda_vers_nightly: ["12", "13"],
- docker_cuda_vers_stable: ["12", "13"],
- docker_cuda_vers_nightly: ["12", "13"],
+ // Release aliases and platform values are rendered from Jekyll data files.
+ release_versions: {
+ "Stable": "{{ site.data.releases.stable.version }}",
+ "Nightly": "{{ site.data.releases.nightly.version }}"
+ },
+ platform_support_releases: {{ site.data.platform_support.releases | jsonify }},
+ install_package_catalog: {{ site.data.install_packages | jsonify }},
methods: ["Conda", "pip", "Docker"],
releases: ["Stable", "Nightly"],
img_loc: ["NGC", "Docker Hub"],
img_types: ["Base", "Notebooks"],
packages: ["Standard", "Choose Specific Packages"],
- additional_pip_packages: ["cuDF", "dask-cuDF", "cuML", "cuGraph/nx-cugraph", "cuxfilter", "cuCIM", "RAFT", "cuVS", "nvForest"],
- additional_rapids_packages: ["cuDF", "cuML", "cuGraph", "cuxfilter", "cuCIM", "RAFT", "cuVS", "nvForest"],
- additional_packages: ["Graphistry", "JupyterLab", "NetworkX + nx-cugraph", "Plotly Dash", "PyTorch", "TensorFlow", "Xarray-Spatial"],
note_prefix: "",
- rapids_meta_pkgs: ["cuDF", "cuML", "cuGraph", "nx-cugraph", "cuxfilter", "cuCIM", "RAFT", "cuVS"],
- getStableVersion() {
- return "{{ site.data.releases.stable.version }}";
- },
- getNightlyVersion() {
- return "{{ site.data.releases.nightly.version }}";
+ init() {
+ this.active_python_ver = this.getLatestSupportedVersion(this.getSupportedPythonVersions());
+ var latest_cuda_version = this.getLatestSupportedVersion(this.getSupportedCudaVersions());
+ this.active_conda_cuda_ver = latest_cuda_version;
+ this.active_pip_cuda_ver = latest_cuda_version;
+ this.active_docker_cuda_ver = latest_cuda_version;
+ },
+ compareRapidsVersions(left, right) {
+ var left_parts = left.split(".").map(Number);
+ var right_parts = right.split(".").map(Number);
+ var length = Math.max(left_parts.length, right_parts.length);
+ for (var index = 0; index < length; index++) {
+ var difference = (left_parts[index] || 0) - (right_parts[index] || 0);
+ if (difference !== 0) return difference;
+ }
+ return 0;
+ },
+ isPackageAvailable(package_policy) {
+ var release = this.getReleaseVersion();
+ var added = package_policy.added_in_release;
+ var removed = package_policy.removed_after_release;
+ return (!added || this.compareRapidsVersions(release, added) >= 0) &&
+ (!removed || this.compareRapidsVersions(release, removed) <= 0);
+ },
+ getAvailablePackageEntries(method) {
+ return Object.entries(this.install_package_catalog.packages)
+ .filter(([, policy]) => policy[method] && this.isPackageAvailable(policy));
+ },
+ getPackageLabel(policy, method) {
+ return policy[method].display_name || policy.display_name;
+ },
+ getSelectablePackageLabels(method) {
+ return this.getAvailablePackageEntries(method)
+ .map(([, policy]) => this.getPackageLabel(policy, method));
+ },
+ getPackagePolicy(label, method) {
+ var match = this.getAvailablePackageEntries(method)
+ .find(([, policy]) => this.getPackageLabel(policy, method) === label);
+ return match ? match[1] : null;
+ },
+ getPackageNames(label, method) {
+ var policy = this.getPackagePolicy(label, method);
+ if (!policy) return [];
+ var method_policy = policy[method];
+ if (this.active_release === "Nightly" && method_policy.nightly_packages) {
+ return method_policy.nightly_packages;
+ }
+ return method_policy.packages;
+ },
+ getStandardPackageEntries(method) {
+ if (method === "docker") {
+ return Object.entries(this.install_package_catalog.packages)
+ .filter(([, policy]) => this.isPackageAvailable(policy) && policy.standard_bundle.includes(method));
+ }
+ return this.getAvailablePackageEntries(method)
+ .filter(([, policy]) => policy.standard_bundle.includes(method));
+ },
+ getStandardPackageLabels(method) {
+ return this.getStandardPackageEntries(method)
+ .map(([, policy]) => this.getPackageLabel(policy, method));
+ },
+ getStandardBundleDisplayNames(method) {
+ return this.getStandardPackageEntries(method)
+ .flatMap(([, policy]) => policy.bundle_display_names || [policy.display_name]);
+ },
+ getThirdPartyPackageLabels() {
+ return Object.values(this.install_package_catalog.third_party_packages)
+ .map(policy => policy.display_name);
+ },
+ getThirdPartyPackagePolicy(label) {
+ return Object.values(this.install_package_catalog.third_party_packages)
+ .find(policy => policy.display_name === label);
+ },
+ getAdditionalPkgNames(label) {
+ var rapids_version = this.getReleaseVersion();
+ return this.getThirdPartyPackagePolicy(label).conda_packages
+ .map(package_name => package_name.replace("{rapids_version}", rapids_version));
+ },
+ reconcileActivePackages() {
+ if (this.active_packages.length === 1 && this.active_packages[0] === "Standard") return;
+ var method = this.active_method === "pip" ? "pip" : "conda";
+ var available = this.getSelectablePackageLabels(method);
+ this.active_packages = this.active_packages.filter(package_name =>
+ package_name === "Choose Specific Packages" || available.includes(package_name)
+ );
+ if (!this.active_packages.some(package_name => available.includes(package_name))) {
+ this.active_packages = ["Choose Specific Packages", available[0]];
+ }
+ },
+ getReleaseSupport(release = this.active_release) {
+ var version = this.release_versions[release];
+ var support = this.platform_support_releases.find(item => item.version === version);
+ if (!support) {
+ throw new Error(`No platform support data found for ${release} release ${version}.`);
+ }
+ return support;
+ },
+ getReleaseVersion(release = this.active_release) {
+ return this.getReleaseSupport(release).version;
},
getMethodHTML(method) {
var icon_class = "box-open fas";
@@ -420,8 +508,8 @@
return pkg;
},
getReleaseText(release) {
- var version = this.getStableVersion();
- if (release.includes("Nightly")) version = this.getNightlyVersion() + "a";
+ var version = this.getReleaseVersion(release);
+ if (release === "Nightly") version += "a";
return release + " " + "(" + version + ")";
},
highlightCmd(str) {
@@ -442,44 +530,27 @@
return pkg_components[0] + channel_pkg_separator + this.highlightPkgOrImg(pkg_components[1]);
},
getCondaVersionSupport(version) {
- var cuda_version_info = {
- "Stable": {
- "12": ["12.2", "12.9"],
- "13": ["13.0", "13.2"]
- },
- "Nightly": {
- "12": ["12.2", "12.9"],
- "13": ["13.0", "13.3"]
- }
- };
- var bounds = cuda_version_info[this.active_release][version];
- // if there is only one bound, we pin the version exactly
- if (bounds.length === 1) {
+ var cuda_support = this.getReleaseSupport().cuda.find(
+ item => item.major.toString() === version
+ );
+ if (!cuda_support) {
+ throw new Error(`No CUDA ${version} support data found for ${this.active_release}.`);
+ }
+ var lower_bound = cuda_support.toolkit_min;
+ var upper_bound = cuda_support.toolkit_max;
+ if (lower_bound === upper_bound) {
return {
- "label": bounds[0],
- "pinning": "=" + bounds[0]
+ "label": lower_bound,
+ "pinning": "=" + lower_bound
};
}
- // if there are two bounds, we pin the version between the two bounds, inclusive
- var lower_bound = bounds[0];
- var upper_bound = bounds[1];
return {
"label": lower_bound + " - " + upper_bound,
"pinning": ">=" + lower_bound + ",<=" + upper_bound
};
},
- getAdditionalPkgName(pkg) {
- // used to pin the version of nx-cugraph for conda install
- var rapids_version = this.active_release === "Stable" ? this.getStableVersion() : this.getNightlyVersion();
- var pkg_names = {
- "NetworkX + nx-cugraph": `networkx nx-cugraph=${rapids_version}`,
- "Plotly Dash": "dash",
- "PyTorch": "'pytorch=*=*cuda*'"
- }
- return (pkg_names[pkg] || pkg).toLowerCase();
- },
getCondaCmdHtml() {
- var rapids_version = this.active_release === "Stable" ? this.getStableVersion() : this.getNightlyVersion();
+ var rapids_version = this.getReleaseVersion();
var rapids_channel = this.active_release === "Stable" ? "rapidsai" : "rapidsai-nightly";
var python_version = this.active_python_ver;
var cuda_version_pinning = this.getCondaVersionSupport(this.active_conda_cuda_ver)["pinning"];
@@ -488,31 +559,21 @@
.map(ch => this.highlightFlag("-c") + " " + ch)
.join(" ");
var indentation = " ";
-
- // sort active_packages to appear in the same order as the additional_rapids_packages list
- this.active_packages.sort((a, b) => this.additional_rapids_packages.indexOf(a) - this.additional_rapids_packages.indexOf(b));
- var pkgs = this.active_packages;
+ var selectable_packages = this.getSelectablePackageLabels("conda");
+ var selected_packages = this.active_packages
+ .filter(package_name => !this.packages.includes(package_name))
+ .sort((a, b) => selectable_packages.indexOf(a) - selectable_packages.indexOf(b));
if (this.active_packages.length + this.active_additional_packages.length === 1 && this.active_packages[0] === "Choose Specific Packages") {
return "Select at least one package.";
}
+ var pkgs = selected_packages.flatMap(package_name => this.getPackageNames(package_name, "conda"));
if (this.active_packages.length === 1 && this.active_packages[0] === "Standard") {
pkgs = ["rapids"];
}
- if (pkgs.includes("RAFT")) {
- pkgs = pkgs.filter(pkg => pkg !== "RAFT");
- pkgs.push("pylibraft");
- pkgs.push("raft-dask");
- }
- if (pkgs.includes("cuVS")) {
- pkgs = pkgs.filter(pkg => pkg !== "cuVS");
- pkgs.push("cuvs");
- }
-
-
- var pkgs_vers = pkgs.filter(pkg => pkg !== "Choose Specific Packages").map(pkg => this.highlightPkgOrImg(pkg) + "=" + rapids_version + " ").join("").toLowerCase();
+ var pkgs_vers = pkgs.map(pkg => this.highlightPkgOrImg(pkg) + "=" + rapids_version + " ").join("").toLowerCase();
var all_pkgs = pkgs_vers + py_cuda_pkgs;
var conda_create_ln = this.highlightCmd('conda') + " create " + this.highlightFlag("-n") + " rapids-" + rapids_version + " " + conda_channels;
@@ -521,7 +582,8 @@
if (this.active_additional_packages.length) {
add_pkgs_ln = indentation + this.active_additional_packages
- .map(pkg => this.highlightCondaPkg(this.getAdditionalPkgName(pkg)))
+ .flatMap(pkg => this.getAdditionalPkgNames(pkg))
+ .map(pkg => this.highlightCondaPkg(pkg))
.join(" ");
}
@@ -542,79 +604,59 @@
return false;
}
var selected_packages = this.active_packages.filter(pkg => pkg !== "Choose Specific Packages" && pkg !== "Standard");
- var pypi_available_packages = ["cudf", "cuml", "dask-cudf", "raft", "nvforest"];
return selected_packages.length > 0 &&
- selected_packages.every(pkg => pypi_available_packages.includes(pkg.toLowerCase()));
+ selected_packages.every(pkg => this.getPackagePolicy(pkg, "pip").pip.pypi === true);
},
getpipCmdHtml() {
var pip_install = `${this.highlightCmd("pip")} install`;
var cuda_suffix = `-cu${this.active_pip_cuda_ver}`;
var indentation = " ";
+ var index_url;
// Change index depending on stable vs nightly for pip
// Also add versioning commands for nightly installs so that --pre is unnecessary
- // This has duplicate code, but makes for easier edits in the future
if (this.active_release === "Stable") {
index_url = `--${this.highlightFlag("extra-index-url")}=https://pypi.nvidia.com`;
- var version = this.removeLeadingZeros("{{ site.data.releases.stable.version }}");
+ var version = this.removeLeadingZeros(this.getReleaseVersion());
cuda_suffix = cuda_suffix + `==${version}.*`;
- var libraryToPkg = (pkg) => {
- pkg = pkg.toLowerCase();
- if (pkg === "raft") return ["pylibraft" + cuda_suffix, "raft-dask" + cuda_suffix];
- if (pkg === "cuvs") return ["cuvs" + cuda_suffix];
- if (pkg === "cugraph/nx-cugraph") return ["cugraph" + cuda_suffix, "nx-cugraph" + cuda_suffix];
- return [pkg + cuda_suffix];
- }
}
else {
index_url = `--${this.highlightFlag("extra-index-url")}=https://pypi.anaconda.org/rapidsai-wheels-nightly/simple`;
- var version = this.removeLeadingZeros("{{ site.data.releases.nightly.version }}")
+ var version = this.removeLeadingZeros(this.getReleaseVersion())
cuda_suffix = cuda_suffix + `>=${version}.0a0,<=${version}`;
- var libraryToPkg = (pkg) => {
- pkg = pkg.toLowerCase();
- if (pkg === "raft") return ["pylibraft" + cuda_suffix, "raft-dask" + cuda_suffix];
- if (pkg === "cuvs") return ["cuvs" + cuda_suffix, "pylibraft" + cuda_suffix];
- if (pkg === "cugraph/nx-cugraph") return ["cugraph" + cuda_suffix, "nx-cugraph" + cuda_suffix];
- return [pkg + cuda_suffix];
- }
}
if (this.active_packages.length === 1 && this.active_packages[0] === "Choose Specific Packages") {
return "Select at least one package.";
- } else if (this.active_packages[0] === 'Standard') {
- var pkgs_to_show = this.additional_pip_packages;
-
- var pkgs = pkgs_to_show.flatMap(libraryToPkg);
-
- var additional_pip_commands = libraryToPkg("nx-cugraph");
- pkgs = pkgs.concat(additional_pip_commands);
+ } else if (this.active_packages[0] === "Standard") {
+ var selected_labels = this.getStandardPackageLabels("pip");
} else {
- // sort active_packages to appear in the same order as the additional_pip_packages list
- this.active_packages.sort((a, b) => this.additional_pip_packages.indexOf(a) - this.additional_pip_packages.indexOf(b));
- var pkgs = this.active_packages
+ var selectable_packages = this.getSelectablePackageLabels("pip");
+ var selected_labels = this.active_packages
.filter(pkg => pkg !== "Choose Specific Packages")
- .flatMap(libraryToPkg);
+ .sort((a, b) => selectable_packages.indexOf(a) - selectable_packages.indexOf(b));
}
- // pkgs.length == 2 because it includes the "Choose Specific Packages" option
- if (this.active_release === "Nightly" && !(pkgs.length === 2 && pkgs[0] === "cucim")) {
- pkgs.push(["dask-cuda" + cuda_suffix.slice(5)])
+ var pkgs = selected_labels
+ .flatMap(label => this.getPackageNames(label, "pip"))
+ .map(package_name => package_name + cuda_suffix);
+ if (this.active_release === "Nightly") {
+ var nightly_dependencies = selected_labels
+ .flatMap(label => this.getPackagePolicy(label, "pip").pip.nightly_dependencies || [])
+ .map(package_name => package_name + cuda_suffix.slice(5));
+ pkgs = pkgs.concat(nightly_dependencies);
}
+ pkgs = Array.from(new Set(pkgs));
// Make sure all packages (and version selectors) are quoted
- pkgs = pkgs.flatMap(pkg => '"' + pkg + '"');
+ pkgs = pkgs.map(pkg => '"' + pkg + '"');
// Check if only PyPI-available packages are selected (exclude --extra-index-url for these)
var can_install_from_pypi = this.canInstallFromPyPi();
// For every n packages add a new line with a "\" character
// We need i += n + 1 since the splice adds a new element to the array
- if (this.active_release === "Stable") {
- packages_per_line = 3;
- }
- else {
- packages_per_line = 2;
- }
+ var packages_per_line = this.active_release === "Stable" ? 3 : 2;
for (var i = packages_per_line; i < pkgs.length; i += packages_per_line + 1) {
pkgs.splice(i, 0, "\\\n" + indentation.slice(0, -1));
}
@@ -639,7 +681,7 @@
].filter(Boolean).join("-");
var imgTag = [
- (isNightly ? this.getNightlyVersion() + "a" : this.getStableVersion()),
+ this.getReleaseVersion() + (isNightly ? "a" : ""),
"cuda" + this.active_docker_cuda_ver,
"py" + this.active_python_ver
].join("-");
@@ -660,7 +702,7 @@
},
getDockerNotes() {
var notes = [];
- var pkgs_to_show = this.rapids_meta_pkgs;
+ var pkgs_to_show = this.getStandardBundleDisplayNames("docker");
var pkgs_html = pkgs_to_show.map(pkg => "" + pkg + "").join(", ");
notes = [...notes, "The selected image contains the following packages:
" + pkgs_html];
@@ -668,7 +710,7 @@
},
getCondaNotes() {
var notes = [];
- var pkgs_to_show = this.rapids_meta_pkgs;
+ var pkgs_to_show = this.getStandardBundleDisplayNames("conda");
if (this.active_packages.length === 1 && this.active_packages[0] === "Standard") {
var pkgs_html = pkgs_to_show.map(pkg => "" + pkg + "").join(", ");
@@ -677,13 +719,12 @@
if (this.active_additional_packages.length) {
notes = [...notes, "Third-party packages are not tested."];
-
- if (this.active_additional_packages.includes("PyTorch")) {
- notes = [...notes, "PyTorch requires CUDA 12."];
- }
- if (this.active_additional_packages.includes("TensorFlow")) {
- notes = [...notes, "TensorFlow requires CUDA 12."];
- }
+ this.active_additional_packages
+ .map(package_name => this.getThirdPartyPackagePolicy(package_name))
+ .filter(policy => policy.cuda_majors)
+ .forEach(policy => {
+ notes = [...notes, `${policy.display_name} requires CUDA ${policy.cuda_majors.join(" or ")}.`];
+ });
}
return notes.map(note => this.note_prefix + " " + note);
@@ -731,28 +772,18 @@
return "Not implemented yet!";
},
getSupportedPythonVersions() {
- if (this.active_release === "Stable") {
- return this.python_vers_stable;
- }
- return this.python_vers_nightly;
+ return this.getReleaseSupport().python;
},
- getSupportedDockerCudaVersions() {
- if (this.active_release === "Stable") {
- return this.docker_cuda_vers_stable;
- }
- return this.docker_cuda_vers_nightly;
+ getSupportedCudaVersions() {
+ return this.getReleaseSupport().cuda.map(item => item.major.toString());
},
- getSupportedCondaCudaVersions() {
- if (this.active_release === "Stable") {
- return this.conda_cuda_vers_stable;
- }
- return this.conda_cuda_vers_nightly;
+ getLatestSupportedVersion(versions) {
+ return versions[versions.length - 1];
},
- getSupportedPipCudaVersions() {
- if (this.active_release === "Stable") {
- return this.pip_cuda_vers_stable;
+ ensureSupportedVersion(property, supported_versions) {
+ if (!supported_versions.includes(this[property])) {
+ this[property] = this.getLatestSupportedVersion(supported_versions);
}
- return this.pip_cuda_vers_nightly;
},
disableUnsupportedRelease(release) {
var isDisabled = false;
@@ -760,18 +791,16 @@
return isDisabled;
},
disableUnsupportedCuda(cuda_version) {
- var isDisabled = false;
- // PyTorch and TensorFlow do not support CUDA 13 yet
- if (this.active_additional_packages.includes("PyTorch") && (!cuda_version.startsWith("12"))) isDisabled = true;
- if (this.active_additional_packages.includes("TensorFlow") && (!cuda_version.startsWith("12"))) isDisabled = true;
- return isDisabled;
+ return this.active_additional_packages
+ .map(package_name => this.getThirdPartyPackagePolicy(package_name))
+ .some(policy => policy.cuda_majors && !policy.cuda_majors.includes(Number(cuda_version)));
},
disableUnsupportedPython(python_version) {
var isDisabled = !this.getSupportedPythonVersions().includes(python_version)
return isDisabled;
},
disableUnsupportedDockerCuda(cuda_version) {
- var isDisabled = !this.getSupportedDockerCudaVersions().includes(cuda_version)
+ var isDisabled = !this.getSupportedCudaVersions().includes(cuda_version)
return isDisabled;
},
disableUnsupportedImgType(type) {
@@ -797,48 +826,12 @@
releaseClickHandler(e, release) {
if (this.isDisabled(e.target)) return;
this.active_release = release;
-
- /*
- It's possible that the active Python version prior to someone changing releases
- isn't supported by whatever release was chosen in the selector.
-
- This handles that case, updating to the newest Python version supported by the chosen release.
- */
- var supported_python_versions = this.getSupportedPythonVersions();
- if (!supported_python_versions.includes(this.active_python_ver)) {
- this.active_python_ver = supported_python_versions[supported_python_versions.length - 1];
- }
-
- /*
- If the selected release doesn't support the selected Docker
- CUDA version, update Docker CUDA version to the newest
- supported by the selected release.
- */
- var supported_docker_cuda_versions = this.getSupportedDockerCudaVersions();
- if (!supported_docker_cuda_versions.includes(this.active_docker_cuda_ver)) {
- this.active_docker_cuda_ver = supported_docker_cuda_versions[supported_docker_cuda_versions.length - 1];
- }
-
- /*
- If the selected release doesn't support the selected Conda
- CUDA version, update Conda CUDA version to the newest
- supported by the selected release.
- */
- var supported_conda_cuda_versions = this.getSupportedCondaCudaVersions();
- if (!supported_conda_cuda_versions.includes(this.active_conda_cuda_ver)) {
- this.active_conda_cuda_ver = supported_conda_cuda_versions[supported_conda_cuda_versions.length - 1];
- }
-
- /*
- If the selected release doesn't support the selected pip
- CUDA version, update pip CUDA version to the newest
- supported by the selected release.
- */
- var supported_pip_cuda_versions = this.getSupportedPipCudaVersions();
- if (!supported_pip_cuda_versions.includes(this.active_pip_cuda_ver)) {
- this.active_pip_cuda_ver = supported_pip_cuda_versions[supported_pip_cuda_versions.length - 1];
- }
-
+ this.ensureSupportedVersion("active_python_ver", this.getSupportedPythonVersions());
+ var supported_cuda_versions = this.getSupportedCudaVersions();
+ this.ensureSupportedVersion("active_conda_cuda_ver", supported_cuda_versions);
+ this.ensureSupportedVersion("active_pip_cuda_ver", supported_cuda_versions);
+ this.ensureSupportedVersion("active_docker_cuda_ver", supported_cuda_versions);
+ this.reconcileActivePackages();
},
imgTypeClickHandler(e, type) {
if (this.isDisabled(e.target)) return;
@@ -868,18 +861,19 @@
if (method !== "Conda") {
this.active_additional_packages = [];
}
- if (method === 'Conda') {
- this.active_packages = ['Standard'];
+ if (method === "Conda") {
+ this.active_packages = ["Standard"];
}
if (method === "pip") {
- this.active_pip_cuda_ver = '13';
+ this.active_pip_cuda_ver = this.getLatestSupportedVersion(this.getSupportedCudaVersions());
}
if (method === "Docker") {
- if (this.active_release === 'Nightly') {
- this.active_img_loc = 'Docker Hub';
+ if (this.active_release === "Nightly") {
+ this.active_img_loc = "Docker Hub";
}
}
this.active_method = method;
+ this.reconcileActivePackages();
},
imgLocClickHandler(e, loc) {
if (this.isDisabled(e.target)) return;
@@ -901,7 +895,8 @@
if (package === "Choose Specific Packages") {
if (this.active_packages[0] === "Standard" && this.active_packages.length === 1) {
- this.active_packages = [package, "cuDF"];
+ var method = this.active_method === "pip" ? "pip" : "conda";
+ this.active_packages = [package, this.getSelectablePackageLabels(method)[0]];
return;
} else {
return;
@@ -924,8 +919,9 @@
return;
}
this.active_additional_packages = [...this.active_additional_packages, package];
- if (this.active_additional_packages.includes("PyTorch") && this.active_conda_cuda_ver !== "12") this.active_conda_cuda_ver = "12";
- if (this.active_additional_packages.includes("TensorFlow") && this.active_conda_cuda_ver !== "12") this.active_conda_cuda_ver = "12";
+ var supported_cuda_versions = this.getSupportedCudaVersions()
+ .filter(cuda_version => !this.disableUnsupportedCuda(cuda_version));
+ this.ensureSupportedVersion("active_conda_cuda_ver", supported_cuda_versions);
},
copyToClipboard() {
let range = document.createRange();
diff --git a/_redirects b/_redirects
index 4a1616b38b3..d10ec05cb81 100644
--- a/_redirects
+++ b/_redirects
@@ -1,3 +1,5 @@
+# Generated by ci/generate-projects-to-versions.py. Do not edit directly.
+# Sources: _data/docs.yml and _data/redirects.yml.
/api/cucim /api/cucim/stable/
/api/cucim/ /api/cucim/stable/
/api/cudf /api/cudf/stable/
@@ -12,6 +14,8 @@
/api/cusignal/ /api/cusignal/stable/
/api/cuspatial /api/cuspatial/stable/
/api/cuspatial/ /api/cuspatial/stable/
+/api/cuvs /api/cuvs/stable/
+/api/cuvs/ /api/cuvs/stable/
/api/cuxfilter /api/cuxfilter/stable/
/api/cuxfilter/ /api/cuxfilter/stable/
/api/dask-cuda /api/dask-cuda/stable/
@@ -20,8 +24,6 @@
/api/dask-cudf/ /api/dask-cudf/stable/
/api/kvikio /api/kvikio/stable/
/api/kvikio/ /api/kvikio/stable/
-/api/nvforest /api/nvforest/stable/
-/api/nvforest/ /api/nvforest/stable/
/api/libcudf /api/libcudf/stable/
/api/libcudf/ /api/libcudf/stable/
/api/libcugraph /api/libcugraph/stable/
@@ -38,6 +40,8 @@
/api/librmm/ /api/rmm/stable/
/api/libucxx /api/libucxx/stable/
/api/libucxx/ /api/libucxx/stable/
+/api/nvforest /api/nvforest/stable/
+/api/nvforest/ /api/nvforest/stable/
/api/raft /api/raft/stable/
/api/raft/ /api/raft/stable/
/api/rapids-cmake /api/rapids-cmake/stable/
@@ -50,9 +54,3 @@
/api/ucxx/ /api/ucxx/stable/
/deployment /deployment/stable/
/deployment/ /deployment/stable/
-# redirects for zero-code-change -> cuml-accel rename, can be removed after 25.10 release
-/api/cuml/stable/zero-code-change/ /api/cuml/stable/cuml-accel/
-/api/cuml/stable/zero-code-change-benchmarks/ /api/cuml/stable/cuml-accel/benchmarks/
-/api/cuml/stable/zero-code-change-limitations/ /api/cuml/stable/cuml-accel/limitations/
-/api/cuml/stable/zero-code-change-logging/ /api/cuml/stable/cuml-accel/logging-and-profiling/
-/api/cuml/stable/zero_code_change_examples/plot_kmeans_digits/ /api/cuml/stable/cuml-accel/examples/plot_kmeans_digits/
diff --git a/automation-proposal.md b/automation-proposal.md
new file mode 100644
index 00000000000..f2371e08332
--- /dev/null
+++ b/automation-proposal.md
@@ -0,0 +1,470 @@
+# Automation and Single-Source Proposal
+
+Date: 2026-06-30
+
+## Scope and method
+
+This analysis covers the 50 most recently created pull requests in
+`rapidsai/docs`, from [#749](https://github.com/rapidsai/docs/pull/749) through
+[#802](https://github.com/rapidsai/docs/pull/802), created between 2026-02-12
+and 2026-06-30. At the time of analysis, 46 were merged, 2 were open, and 2
+were closed.
+
+Every PR was inspected at the metadata and changed-file level. Recurring
+groups were then traced through their current source files, generators,
+workflows, Jekyll consumers, and representative diffs. The recommendations
+below distinguish canonical policy data from generated projections and from
+human-authored prose.
+
+## Executive summary
+
+There are four strong opportunities beyond the platform-support-to-selector
+work in #802:
+
+1. Make one release calendar authoritative and generate the active channel
+ map, historical schedule, durations, and release rollover diff from it.
+2. Render the installation page's current system requirements directly from
+ platform support data.
+3. Make the docs project catalog authoritative for the generated
+ project-to-version map and default API redirects, including cuDF-Java's
+ delayed publication workflow.
+4. Move installable package names, aliases, dependencies, channel
+ availability, and PyPI availability into a small install-package catalog.
+
+The first three address observed mistakes or drift. The fourth removes a
+substantial amount of release-specific branching from `selector.html` and
+makes future project onboarding less invasive.
+
+The desired end state is several focused sources of truth, not one oversized
+YAML file:
+
+```mermaid
+flowchart LR
+ calendar["release_calendar.yml"] --> releasegen["release data generator"]
+ releasegen --> active["releases.json"]
+ releasegen --> history["previous_releases.json"]
+ platform["platform_support.yml"] --> supportpage["platform support page"]
+ platform --> selector["install selector"]
+ platform --> requirements["install requirements"]
+ projects["docs.yml or projects.yml"] --> projectgen["docs artifact generator"]
+ projectgen --> versions["projects-to-versions.json"]
+ projectgen --> redirects["default API redirects"]
+ packages["install_packages.yml"] --> selector
+```
+
+Generated outputs should never be edited directly. Each generator should be
+deterministic, idempotent, and available in both `--check` mode and pre-commit.
+
+## Evidence from the PR sample
+
+The following hotspot counts overlap because a release rollover can touch
+multiple systems.
+
+| Hotspot | PRs out of 50 | Evidence |
+| --- | ---: | --- |
+| Install selector | 10 | #754, #757, #769, #771, #775, #779, #780, #790, #797, #802 |
+| Dependency lockfile | 9 | All nine were Dependabot updates and are already automated |
+| Release/platform data | 7 | #758, #768, #772, #780, #790, #798, #801 |
+| Docs catalog or generated version map | 6 | #753, #755, #768, #777, #790, #793 |
+| Notices | 4 | #762, #763, #773, #786 |
+
+Two release rollovers were especially expensive:
+
+- [#768](https://github.com/rapidsai/docs/pull/768) changed 5 files with
+ 187 additions and 101 deletions.
+- [#790](https://github.com/rapidsai/docs/pull/790) changed 6 files with
+ 190 additions and 106 deletions.
+
+The latter also accidentally restored an obsolete staggered-burndown rule.
+[#798](https://github.com/rapidsai/docs/pull/798) corrected that regression.
+This is a strong signal that rollover should be a data transformation rather
+than a copied and hand-edited block.
+
+## 1. Canonical release calendar and rollover automation
+
+Priority: P0
+
+### Current state
+
+Release identity and schedule data are split between:
+
+- `_data/releases.json`, an 80-line channel-oriented view;
+- `_data/previous_releases.json`, a 1,499-line history-oriented view;
+- hardcoded phase labels and project cohorts in `maintainers/index.md` and
+ `releases/schedule.md`;
+- the manual steps in `release_checklist.md`.
+
+At rollover, the nightly schedule is copied into history, four aliases are
+shifted, a new proposed schedule is added, platform support is added, project
+availability is reviewed, and generated docs mappings are refreshed. The same
+schedule record therefore exists in different shapes at different times.
+
+Durations are also stored independently from their start and end dates.
+[#772](https://github.com/rapidsai/docs/pull/772) fixed an off-by-one date and
+duration. The description of #798 explicitly calls the `days` values manual
+and inconsistent. A local weekday-only recomputation also disagrees with many
+current values. Some differences may intentionally account for holidays or
+NVIDIA free days, but those exclusions are not encoded, so the values are not
+auditable. For example:
+
+- 26.08 `cudf_burndown` is July 16-22, five weekdays, but declares six days.
+- 26.10 `other_codefreeze` is October 1-6, four weekdays, but declares five
+ days.
+
+Date formats are inconsistent as well (`Jul 15 2026` and `July 15 2026`).
+
+### Proposed source
+
+Add `_data/release_calendar.yml` with channel pointers and version-keyed
+records:
+
+```yaml
+channels:
+ legacy: "26.04"
+ stable: "26.06"
+ nightly: "26.08"
+ next_nightly: "26.10"
+
+cohorts:
+ early:
+ - cudf
+ - rmm
+ - rapids-cmake
+ - raft
+ - dask-cuda
+ - kvikio
+ - ucxx
+ - rapidsmpf
+ - nvforest
+
+releases:
+ "26.08":
+ ucxx_version: "0.51"
+ phases:
+ development:
+ start: 2026-05-14
+ end: 2026-07-15
+ early_burndown:
+ start: 2026-07-16
+ end: 2026-07-22
+ release:
+ start: 2026-08-05
+ end: 2026-08-06
+```
+
+Use ISO dates in the canonical file. Rename `cudf_*` phases to cohort-based
+names so adding a project such as nvForest does not require changing four
+rendered labels as it did in
+[#799](https://github.com/rapidsai/docs/pull/799).
+
+### Automation
+
+Create `ci/generate-release-data.py` to produce the existing
+`_data/releases.json` and `_data/previous_releases.json` shapes initially. This
+keeps current Liquid consumers stable while removing duplicate authoring.
+
+Create `ci/roll-release.py` to:
+
+1. validate that the new stable release has platform support data;
+2. rotate the four channel pointers;
+3. create the next release key and expected version number;
+4. regenerate release projections and docs mappings;
+5. print a concise list of policy decisions that still need human input.
+
+The script should not invent support policy or project availability. It should
+fail with a clear checklist when required source records are absent.
+
+For durations, choose one explicit policy:
+
+- remove the duration column and stop storing `days`; or
+- derive it from weekdays plus a checked-in exclusion calendar.
+
+Keeping hand-authored `days` alongside dates should not remain an option.
+
+### Validation
+
+The generator or a companion validator should enforce:
+
+- channel pointers reference existing, distinct releases in order;
+- phases are ordered, non-overlapping, and contiguous where required;
+- release versions and UCXX versions are unique and monotonic;
+- stable and nightly releases exist in `platform_support.yml`;
+- generated files exactly match canonical input;
+- cohort names referenced by schedules exist.
+
+## 2. Render current install requirements from platform support
+
+Priority: P0
+
+### Current state
+
+`install/index.md` says its system requirements are for the current release,
+but independently hardcodes:
+
+- glibc 2.28;
+- Volta / compute capability 7.0;
+- CUDA 12 and CUDA 13;
+- driver minima 525.60.13 (incorrect; it should be 535) and 580.65.06.
+
+Most of that data also exists in `_data/platform_support.yml`. This page can
+drift even after #802 makes the selector data-driven.
+
+The current stable platform record correctly uses `driver_min: "535"` for
+CUDA 12, while the install page incorrectly says `525.60.13`. This is existing
+drift: the install page should use the platform record's 535 minimum.
+
+### Proposal
+
+Have `install/index.md` select the stable release record and render:
+
+- glibc minimum;
+- each CUDA major and its `driver_min` value;
+- minimum compute capability per CUDA major;
+- a link to the full tested OS matrix.
+
+Keep the broad distro examples as prose because they are examples inferred
+from glibc compatibility, not the tested OS list.
+
+Also validate that `releases.json` stable/nightly pointers resolve to exactly
+one platform record. #802 already introduces most of that validation.
+
+## 3. Make the docs project catalog authoritative
+
+Priority: P1
+
+### Current state
+
+`_data/docs.yml` is already close to a canonical project catalog, and
+`ci/generate-projects-to-versions.py` generates
+`ci/customization/projects-to-versions.json`. However, the generated JSON is
+tracked and is still edited directly by
+`.github/workflows/deploy-cudf-java-docs.yaml` with `jq`.
+
+This caused the workflow fix in
+[#752](https://github.com/rapidsai/docs/pull/752), and cuDF-Java availability
+then changed again in #753, #777, and #793. The workflow currently edits the
+YAML with `sed` and the generated JSON separately instead of invoking the
+existing generator.
+
+Project onboarding is similarly distributed. Adding nvForest API docs in
+[#755](https://github.com/rapidsai/docs/pull/755) required changes to:
+
+- `_data/docs.yml`;
+- `_redirects`;
+- `ci/customization/projects-to-versions.json`.
+
+A catalog-to-redirect comparison found that cuVS is currently the only active,
+stable-enabled API entry without a root redirect. If that is intentional, the
+catalog should say so explicitly. The redirect file also contains temporary
+cuML redirects marked removable after 25.10 even though stable is now 26.06.
+
+Finally, UCXX version selection is special-cased twice:
+
+- Python checks whether `"ucxx"` appears in a project key;
+- Liquid checks whether the display name equals `libucxx` or `UCXX`.
+
+### Proposal
+
+Keep `_data/docs.yml` or rename it to `_data/projects.yml`, but make every
+exception declarative. Add fields such as:
+
+```yaml
+ucxx:
+ name: UCXX
+ release_version_field: ucxx_version
+ redirect:
+ mode: stable
+
+librmm:
+ redirect:
+ target: /api/rmm/stable/
+```
+
+Generate or validate all derived artifacts:
+
+- `projects-to-versions.json`;
+- the regular `/api/` and `/api//` redirects;
+- version labels in `api-docs.html` through `release_version_field`;
+- optional redirect expiry warnings.
+
+The cuDF-Java workflow should update only catalog source data with a YAML
+parser, then run the normal generator. Its `new_stable_value` input is
+currently required, defaults to `1`, and rejects every value except `1`; it can
+be removed. The supplied version should be checked against the current stable
+release or stored as an explicit catalog override if delayed publication needs
+that flexibility.
+
+Longer term, generate `projects-to-versions.json` during deploy and stop
+tracking it. A lower-risk first step is to keep tracking it but make CI fail if
+it was edited directly or is stale.
+
+## 4. Add a canonical install-package catalog
+
+Priority: P1
+
+### Current state
+
+Even after #802, `_includes/selector.html` owns several overlapping package
+declarations:
+
+- Conda-selectable RAPIDS packages;
+- pip-selectable packages;
+- packages included in the standard metapackage/image;
+- PyPI-available packages;
+- display-name-to-package-name mappings;
+- stable/nightly dependency differences;
+- third-party CUDA constraints.
+
+The nvForest lifecycle demonstrates the maintenance cost. #754 added 33 lines
+of selector branching to make it nightly-only. #769 removed most of that logic
+one release later and separately added PyPI availability.
+
+### Proposal
+
+Create `_data/install_packages.yml` as an install-specific source that can
+reference project IDs from the docs catalog without forcing both domains into
+one file:
+
+```yaml
+packages:
+ nvforest:
+ display_name: nvForest
+ docs_project: nvforest
+ added_in_release: "26.04"
+ standard_bundle: false
+ conda:
+ packages: [nvforest]
+ pip:
+ packages: [nvforest]
+ pypi: true
+
+ cuxfilter:
+ display_name: cuxfilter
+ docs_project: cuxfilter
+ removed_after_release: "26.06"
+ conda:
+ packages: [cuxfilter]
+ pip:
+ packages: [cuxfilter]
+
+ raft:
+ display_name: RAFT
+ conda:
+ packages: [pylibraft, raft-dask]
+ pip:
+ packages: [pylibraft, raft-dask]
+```
+
+The schema should support method-specific aliases, dependencies, release
+bounds, standard-bundle membership, and CUDA-major constraints. Treat
+`added_in_release` as the first included release and `removed_after_release` as
+the last included release. With `removed_after_release: "26.06"`, cuxfilter is
+automatically excluded from 26.08 and later. The validator should compare
+parsed RAPIDS versions and require
+`added_in_release <= removed_after_release` when both are present. Jekyll can
+serialize this data into Alpine just as #802 does for platform support.
+
+Do not try to infer package policy from the docs catalog. A project can have
+API docs without being a selector package, and one project can publish several
+packages. References between the catalogs are useful; conflating them is not.
+
+## 5. Add schema and rendered-output guardrails
+
+Priority: P1, low effort
+
+These checks do not replace the canonical-source work, but they prevent the
+same classes of mistakes during migration.
+
+### Release validation
+
+Add a pre-commit/CI validator for release schema, ISO dates, phase continuity,
+channel ordering, and generated-file freshness. This should land before the
+calendar migration so it can characterize existing exceptions.
+
+### Notice validation and scaffolding
+
+[#762](https://github.com/rapidsai/docs/pull/762) fixed a 2025/2026 front-matter
+typo that changed notice sort order. All 93 current notices pass a local check
+for filename/type/ID consistency, status-color pairs, and updated-date ordering.
+Preserve that state with `ci/validate-notices.py`.
+
+An optional `ci/new-notice.py --type rsn` can allocate the next ID and create
+valid front matter, while leaving all prose human-authored.
+
+### PR site build
+
+`.github/workflows/pr.yaml` currently runs pre-commit only. Add at least:
+
+- `bundle exec jekyll build`;
+- generated-data `--check` commands;
+- a small rendered selector test for release labels and generated commands.
+
+This catches valid YAML/Liquid/JavaScript combinations that static formatting
+hooks cannot. It also removes dependence on contributors having Ruby locally.
+
+### Redirect validation
+
+Require every stable-enabled project to declare a generated redirect, an
+explicit custom target, or an opt-out. Allow temporary redirects to carry an
+`expires_after` release and emit a warning or failure after that release.
+
+## Recommended implementation sequence
+
+1. Add non-mutating validators and a PR Jekyll build.
+2. Introduce the canonical release calendar and deterministic projections.
+3. Add the rollover command and optional workflow-dispatch PR creator.
+4. Extend platform support schema and render `install/index.md` requirements.
+5. Normalize docs catalog exceptions, redirects, and the cuDF-Java workflow.
+6. Move selector package policy into `install_packages.yml`.
+
+Each step should be a separate PR. In particular, do not combine the release
+calendar migration with package-catalog work; both touch release behavior but
+have different owners and failure modes.
+
+## What should remain human-authored
+
+- Platform support decisions such as adding an OS, CUDA toolkit, or GPU family.
+- Release dates and company-specific non-working days.
+- Whether a project belongs in the standard RAPIDS package or image.
+- Notice prose, migration guidance, and lifecycle decisions.
+
+Automation should validate and propagate those decisions, not discover policy
+by scraping repositories, package indexes, or S3. External availability can be
+used as a check, but should not silently change the published docs.
+
+## Existing automation to preserve
+
+- Dependabot produced 9 of the 50 PRs and is already handling lockfile churn.
+- pre-commit.ci produced the pre-commit autoupdate PR.
+- `generate-projects-to-versions.py` is the right pattern; the remaining work
+ is to make every caller use it and to stop direct edits to its output.
+- The cuDF-Java workflow already creates a PR after upload; it should be
+ simplified, not replaced.
+
+## PR inventory
+
+This partition accounts for all 50 reviewed PRs exactly once.
+
+| Primary category | Count | PRs |
+| --- | ---: | --- |
+| Existing dependency/tool update automation | 10 | #750, #759, #760, #764, #766, #774, #778, #794, #795, #796 |
+| Release, platform, or selector maintenance | 16 | #754, #757, #758, #768, #769, #771, #772, #775, #779, #780, #790, #797, #798, #799, #801, #802 |
+| API docs catalog or deployment | 5 | #752, #753, #755, #777, #793 |
+| Notices | 4 | #762, #763, #773, #786 |
+| CI or site infrastructure | 5 | #765, #767, #776, #788, #800 |
+| Documentation content or cleanup | 10 | #749, #756, #761, #770, #781, #782, #783, #784, #785, #791 |
+
+## Success criteria
+
+The automation program is successful when:
+
+- a release rollover starts from one canonical calendar edit and produces a
+ deterministic, reviewable diff;
+- no duration can disagree with its dates without an explicit calendar rule;
+- current install requirements, platform support, and selector options share
+ the same support record;
+- adding a docs project requires one catalog record plus intentional overrides;
+- generated JSON and regular redirects are never edited directly;
+- adding, graduating, or removing a selector package is primarily a data
+ change;
+- PR CI renders the site and rejects stale generated artifacts.
diff --git a/ci/README.md b/ci/README.md
index c497bf732d6..e6621cceb05 100644
--- a/ci/README.md
+++ b/ci/README.md
@@ -1,5 +1,26 @@
# ci
+## Data automation
+
+The release maintenance contract and command timing are documented in
+[`releases/maintenance.md`](../releases/maintenance.md). In short:
+
+- `_data/release_calendar.yml` generates `_data/releases.json` and
+ `_data/previous_releases.json` through `generate-release-data.py`.
+- `_data/docs.yml` and `_data/redirects.yml` generate
+ `customization/projects-to-versions.json` and `_redirects` through
+ `generate-projects-to-versions.py`.
+- `_data/platform_support.yml` and `_data/install_packages.yml` are direct policy
+ inputs consumed by the rendered installation pages.
+
+Generated files are tracked for review but must not be edited directly. Every
+generator supports `--check`, and pre-commit updates stale outputs.
+
+```shell
+./ci/generate-release-data.py --check
+./ci/generate-projects-to-versions.py --check
+```
+
## API docs
The site's `/api` page links to API documentation for many RAPIDS projects.
@@ -11,7 +32,9 @@ The steps are roughly as follows.
### Step 1: determine libraries and versions to build
-`generate-projects-to-versions.py` is responsible for holding all the logic relevant to the questions "What projects' API docs should be hosted? What versions?".
+`_data/docs.yml` answers which projects and channels should be hosted.
+`generate-projects-to-versions.py` validates that policy and creates the deploy map
+and regular API redirects.
Run it from the root of the repo to see for yourself.
diff --git a/ci/customization/README.md b/ci/customization/README.md
index 17afa7416e5..a7271c60a28 100644
--- a/ci/customization/README.md
+++ b/ci/customization/README.md
@@ -40,7 +40,9 @@ Building the API docs requires answering these questions:
* what version types? (stable? legacy? nightly?)
* what version numbers correspond to those version types?
-Logic for all of that is centralized in a script which is run by `pre-commit`.
+Policy for all of that is centralized in `_data/docs.yml`. The script run by
+`pre-commit` validates that source and generates
+`projects-to-versions.json`. Do not edit the generated JSON directly.
Invoke it to see what will be built.
diff --git a/ci/data_utils.py b/ci/data_utils.py
new file mode 100644
index 00000000000..d42b09e6217
--- /dev/null
+++ b/ci/data_utils.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES.
+# All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+
+import json
+from pathlib import Path
+
+import yaml
+
+
+class DataError(ValueError):
+ pass
+
+
+def load_yaml(path):
+ with path.open(encoding="utf-8") as file:
+ return yaml.safe_load(file)
+
+
+def version_tuple(value, field="version"):
+ if not isinstance(value, str):
+ raise DataError(f"{field} must be a quoted dotted version string")
+
+ try:
+ parsed = tuple(int(part) for part in value.split("."))
+ except ValueError as error:
+ raise DataError(
+ f"{field} must contain only dot-separated integers: {value!r}"
+ ) from error
+
+ if len(parsed) < 2:
+ raise DataError(f"{field} must contain at least two numeric components")
+ return parsed
+
+
+def json_text(value):
+ return json.dumps(value, indent=2) + "\n"
+
+
+def write_or_check(path, content, check):
+ path = Path(path)
+ if check:
+ current = path.read_text(encoding="utf-8") if path.exists() else None
+ if current != content:
+ raise DataError(f"{path} is stale; run its generator and commit the result")
+ return
+
+ path.write_text(content, encoding="utf-8")
diff --git a/ci/generate-projects-to-versions.py b/ci/generate-projects-to-versions.py
index cb2263c7b43..5a964ece584 100755
--- a/ci/generate-projects-to-versions.py
+++ b/ci/generate-projects-to-versions.py
@@ -2,80 +2,192 @@
# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES.
# All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# [description]
-#
-# Determines:
-#
-# * which RAPIDS libraries to host docs for
-# * what types of docs to host ('legacy', 'nightly', 'stable', etc.)
-# * what versions to map to those types
-#
-# The libraries that should be copied are read from "_data/docs.yml".
-#
-# The versions that should be copied are read from a mix of sources:
-#
-# - active projects: "_data/releases.json"
-# - inactive projects: 'version-overrides' field in entries in "_data/docs.yml"
-#
-# Produces a JSON mapping of the form:
-#
-# {
-# "{project}": {
-# "stable": {version_number},
-# "legacy": {version_number},
-# "nightly": {version_number}
-# },
-# }
-#
-# With keys omitted based on configuration in _data/docs.yml.
-#
-# e.g. if a project has 'stable: 0' in that file, it will not have a '{project}.stable'
-# key in the mapping produced by this script.
-#
+
+import argparse
import json
import sys
-from collections import OrderedDict
+from pathlib import Path
+
+from data_utils import DataError, json_text, load_yaml, version_tuple, write_or_check
+
+
+ROOT = Path(__file__).resolve().parents[1]
+DOCS_PATH = ROOT / "_data" / "docs.yml"
+RELEASES_PATH = ROOT / "_data" / "releases.json"
+CUSTOM_REDIRECTS_PATH = ROOT / "_data" / "redirects.yml"
+PROJECTS_OUTPUT_PATH = ROOT / "ci" / "customization" / "projects-to-versions.json"
+REDIRECTS_OUTPUT_PATH = ROOT / "_redirects"
+
+DOC_GROUPS = ("apis", "libs", "inactive-projects")
+CHANNELS = ("legacy", "stable", "nightly")
+
+
+def enabled(value):
+ return value is True or value == 1
-import yaml
-with open("_data/docs.yml") as f:
- DOCS_YML_DICT = yaml.safe_load(f)
+def add_redirect(redirects, source, target, owner):
+ if not isinstance(source, str) or not source.startswith("/"):
+ raise DataError(f"{owner} redirect source must start with '/'")
+ if not isinstance(target, str) or not target.startswith("/"):
+ raise DataError(f"{owner} redirect target must start with '/'")
-with open("_data/releases.json") as f:
- RELEASES_JSON_DICT = json.load(f)
+ sources = [source] if source.endswith("/") else [source, f"{source}/"]
+ for variant in sources:
+ previous = redirects.get(variant)
+ if previous is not None and previous != target:
+ raise DataError(
+ f"redirect {variant} has conflicting targets: {previous}, {target}"
+ )
+ redirects[variant] = target
-# using OrderedDict minimizes churn in the output as projects are added and removed
-PROJECTS_TO_VERSIONS_DICT = OrderedDict()
-for docs_key in ["apis", "libs", "inactive-projects"]:
- for project_name, project_details in DOCS_YML_DICT[docs_key].items():
- print(f"Processing: {project_name}", file=sys.stderr)
- # what entry from releases.json should be used to find version numbers?
- version_key = "version"
- if "ucxx" in project_name:
- version_key = "ucxx_version"
+def project_versions_and_redirects(docs, releases):
+ projects_to_versions = {}
+ redirects = {}
+ seen_paths = {}
- # what versions should be built for this project?
- versions_for_this_project = OrderedDict()
- for version_name, should_include in project_details["versions"].items():
- if should_include == 1:
- version_override = project_details.get("version-overrides", dict()).get(
- version_name, ""
+ for group in DOC_GROUPS:
+ projects = docs.get(group)
+ if not isinstance(projects, dict):
+ raise DataError(f"docs.yml {group} must be a mapping")
+
+ for project_name, details in projects.items():
+ field = f"docs.yml {group}.{project_name}"
+ if project_name in projects_to_versions:
+ raise DataError(f"duplicate docs project ID: {project_name}")
+ if not isinstance(details, dict):
+ raise DataError(f"{field} must be a mapping")
+ path = details.get("path")
+ if not isinstance(path, str) or not path:
+ raise DataError(f"{field}.path must be a non-empty string")
+ if path in seen_paths:
+ raise DataError(f"{field}.path duplicates {seen_paths[path]}: {path}")
+ seen_paths[path] = field
+ versions = details.get("versions")
+ if not isinstance(versions, dict):
+ raise DataError(f"{field}.versions must be a mapping")
+
+ version_field = details.get("release_version_field", "version")
+ if not isinstance(version_field, str):
+ raise DataError(f"{field}.release_version_field must be a string")
+ overrides = details.get("version-overrides", {})
+ if not isinstance(overrides, dict):
+ raise DataError(f"{field}.version-overrides must be a mapping")
+ unknown_overrides = set(overrides) - set(CHANNELS)
+ if unknown_overrides:
+ raise DataError(
+ f"{field}.version-overrides has unknown channels: "
+ f"{sorted(unknown_overrides)}"
+ )
+
+ selected_versions = {}
+ for channel in CHANNELS:
+ if channel not in versions:
+ raise DataError(f"{field}.versions is missing {channel}")
+ if not isinstance(versions[channel], (bool, int)) or versions[
+ channel
+ ] not in {0, 1}:
+ raise DataError(f"{field}.versions.{channel} must be 0 or 1")
+ if not enabled(versions[channel]):
+ continue
+ if channel in overrides:
+ if not isinstance(overrides[channel], str):
+ raise DataError(
+ f"{field}.version-overrides.{channel} must be quoted"
+ )
+ selected_versions[channel] = overrides[channel]
+ continue
+ release = releases.get(channel)
+ if not isinstance(release, dict) or version_field not in release:
+ raise DataError(f"{field} cannot resolve {channel}.{version_field}")
+ selected_versions[channel] = release[version_field]
+ projects_to_versions[project_name] = selected_versions
+
+ redirect = details.get("redirect")
+ if enabled(versions.get("stable")) and redirect is None:
+ raise DataError(
+ f"{field} must declare redirect: stable, a custom target, or false"
)
- if version_override:
- versions_for_this_project[version_name] = version_override
- else:
- versions_for_this_project[version_name] = RELEASES_JSON_DICT[
- version_name
- ][version_key]
+ if redirect is False or redirect is None:
+ continue
+ source = f"/api/{path}"
+ if redirect == "stable":
+ target = f"/api/{path}/stable/"
+ elif isinstance(redirect, str) and redirect.startswith("/"):
+ target = redirect
else:
- print(f"Skipping: {project_name} | {version_name}", file=sys.stderr)
+ raise DataError(
+ f"{field}.redirect must be stable, an absolute target, or false"
+ )
+ add_redirect(redirects, source, target, field)
+
+ return projects_to_versions, redirects
+
+
+def add_custom_redirects(redirects, custom_redirects, stable_version):
+ entries = custom_redirects.get("redirects")
+ if not isinstance(entries, list):
+ raise DataError("redirects.yml redirects must be a list")
+
+ for index, entry in enumerate(entries):
+ field = f"redirects.yml redirects[{index}]"
+ if not isinstance(entry, dict):
+ raise DataError(f"{field} must be a mapping")
+ if not entry.get("reason"):
+ raise DataError(f"{field}.reason is required")
+ expires_after = entry.get("expires_after")
+ if expires_after is not None:
+ if version_tuple(stable_version) > version_tuple(
+ expires_after, f"{field}.expires_after"
+ ):
+ raise DataError(
+ f"{field} expired after {expires_after}; remove or extend it"
+ )
+ add_redirect(redirects, entry.get("source"), entry.get("target"), field)
+
+
+def redirects_text(redirects):
+ lines = [
+ "# Generated by ci/generate-projects-to-versions.py. Do not edit directly.",
+ "# Sources: _data/docs.yml and _data/redirects.yml.",
+ ]
+ lines.extend(f"{source} {redirects[source]}" for source in sorted(redirects))
+ return "\n".join(lines) + "\n"
+
+
+def generate():
+ docs = load_yaml(DOCS_PATH)
+ with RELEASES_PATH.open(encoding="utf-8") as file:
+ releases = json.load(file)
+ custom_redirects = load_yaml(CUSTOM_REDIRECTS_PATH)
+
+ projects, redirects = project_versions_and_redirects(docs, releases)
+ add_custom_redirects(redirects, custom_redirects, releases["stable"]["version"])
+ return json_text(projects), redirects_text(redirects)
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Generate API project versions and root redirects."
+ )
+ parser.add_argument(
+ "--check", action="store_true", help="Fail instead of updating stale outputs."
+ )
+ args = parser.parse_args()
+
+ try:
+ projects_text, generated_redirects = generate()
+ write_or_check(PROJECTS_OUTPUT_PATH, projects_text, args.check)
+ write_or_check(REDIRECTS_OUTPUT_PATH, generated_redirects, args.check)
+ except (DataError, OSError, json.JSONDecodeError) as error:
+ print(error, file=sys.stderr)
+ return 1
- # update overall mapping
- PROJECTS_TO_VERSIONS_DICT[project_name] = versions_for_this_project
+ action = "validated" if args.check else "generated"
+ print(f"Docs artifacts {action} successfully.")
+ return 0
-with open("ci/customization/projects-to-versions.json", "w") as f:
- json.dump(PROJECTS_TO_VERSIONS_DICT, f, indent=2)
- f.write("\n")
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/ci/generate-release-data.py b/ci/generate-release-data.py
new file mode 100755
index 00000000000..b09ee0d5ef7
--- /dev/null
+++ b/ci/generate-release-data.py
@@ -0,0 +1,343 @@
+#!/usr/bin/env python3
+# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES.
+# All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+
+import argparse
+import sys
+from datetime import date, timedelta
+from pathlib import Path
+
+from data_utils import DataError, json_text, load_yaml, version_tuple, write_or_check
+
+
+ROOT = Path(__file__).resolve().parents[1]
+CALENDAR_PATH = ROOT / "_data" / "release_calendar.yml"
+PLATFORM_PATH = ROOT / "_data" / "platform_support.yml"
+RELEASES_PATH = ROOT / "_data" / "releases.json"
+HISTORY_PATH = ROOT / "_data" / "previous_releases.json"
+
+CHANNELS = ("legacy", "stable", "nightly", "next_nightly")
+PHASES = {
+ "development": ("Development", None),
+ "burn_down": ("Burn Down", "burn-down"),
+ "code_freeze": ("Code Freeze/Testing", "code-freeze"),
+ "release": ("Release", "releasing"),
+}
+COHORTS = {"all", "early", "remaining"}
+PHASE_ORDER = {name: index for index, name in enumerate(PHASES)}
+COHORT_ORDER = {"all": 0, "early": 1, "remaining": 2}
+
+
+def parse_iso_date(value, field, errors):
+ if not isinstance(value, str):
+ errors.append(f"{field} must be a quoted ISO date")
+ return None
+ try:
+ return date.fromisoformat(value)
+ except ValueError:
+ errors.append(f"{field} must use YYYY-MM-DD: {value!r}")
+ return None
+
+
+def validate_schedule(version, release, cohort_sets, errors):
+ phases = release.get("phases")
+ if phases is None:
+ return parse_iso_date(
+ release.get("released_on"), f"release {version}.released_on", errors
+ )
+ if "released_on" in release:
+ errors.append(
+ f"release {version}.released_on is derived from its release phase"
+ )
+ if not isinstance(phases, list) or not phases:
+ errors.append(f"release {version}.phases must be a non-empty list")
+ return None
+
+ parsed_phases = []
+ phase_keys = []
+ uses_split_cohorts = False
+ for index, phase in enumerate(phases):
+ field = f"release {version}.phases[{index}]"
+ if not isinstance(phase, dict):
+ errors.append(f"{field} must be a mapping")
+ continue
+ kind = phase.get("phase")
+ cohort = phase.get("cohort")
+ if kind not in PHASES:
+ errors.append(f"{field}.phase must be one of {sorted(PHASES)}")
+ if cohort not in COHORTS:
+ errors.append(f"{field}.cohort must be one of {sorted(COHORTS)}")
+ if kind in PHASES and cohort in COHORTS:
+ phase_keys.append((kind, cohort))
+ uses_split_cohorts |= cohort in {"early", "remaining"}
+ start = parse_iso_date(phase.get("start"), f"{field}.start", errors)
+ end = parse_iso_date(phase.get("end"), f"{field}.end", errors)
+ if start is not None and end is not None:
+ if start > end:
+ errors.append(f"{field}.start must not be after its end")
+ parsed_phases.append((kind, cohort, start, end))
+
+ expected_order = sorted(
+ phase_keys, key=lambda item: (PHASE_ORDER[item[0]], COHORT_ORDER[item[1]])
+ )
+ if phase_keys != expected_order:
+ errors.append(f"release {version}.phases must be ordered by phase and cohort")
+ if len(phase_keys) != len(set(phase_keys)):
+ errors.append(f"release {version}.phases contains a duplicate phase/cohort")
+
+ cohort_set = release.get("cohort_set")
+ if uses_split_cohorts:
+ if cohort_set not in cohort_sets:
+ errors.append(
+ f"release {version}.cohort_set must reference a defined cohort set"
+ )
+ elif cohort_set is not None:
+ errors.append(
+ f"release {version}.cohort_set is only valid for split-cohort schedules"
+ )
+
+ release_phases = [phase for phase in parsed_phases if phase[0] == "release"]
+ if len(release_phases) != 1 or release_phases[0][1] != "all":
+ errors.append(f"release {version} must have one all-cohort release phase")
+ return None
+
+ if release.get("schedule_exception"):
+ return release_phases[0][3]
+
+ non_release = [phase for phase in parsed_phases if phase[0] != "release"]
+ tracks = ("early", "remaining") if uses_split_cohorts else ("all",)
+ for track in tracks:
+ track_phases = sorted(
+ (phase for phase in non_release if phase[1] in {"all", track}),
+ key=lambda phase: phase[2],
+ )
+ if [phase[0] for phase in track_phases] != [
+ "development",
+ "burn_down",
+ "code_freeze",
+ ]:
+ errors.append(
+ f"release {version} {track} schedule must contain development, "
+ "burn_down, and code_freeze exactly once"
+ )
+ for previous, current in zip(track_phases, track_phases[1:]):
+ if current[2] != previous[3] + timedelta(days=1):
+ errors.append(
+ f"release {version} {track} schedule is not contiguous between "
+ f"{previous[0]} and {current[0]}"
+ )
+
+ if non_release:
+ latest_end = max(phase[3] for phase in non_release)
+ if release_phases[0][2] != latest_end + timedelta(days=1):
+ errors.append(
+ f"release {version} release phase must start after the prior phases"
+ )
+ return release_phases[0][3]
+
+
+def validate_calendar(calendar, platform_support):
+ errors = []
+ if not isinstance(calendar, dict):
+ raise DataError("release_calendar.yml must contain a mapping")
+
+ channels = calendar.get("channels")
+ releases = calendar.get("releases")
+ cohort_sets = calendar.get("cohort_sets")
+ labels = calendar.get("project_labels")
+ if not isinstance(channels, dict) or tuple(channels) != CHANNELS:
+ errors.append(f"channels must appear in this order: {', '.join(CHANNELS)}")
+ channels = {}
+ if not isinstance(releases, dict) or not releases:
+ errors.append("releases must be a non-empty mapping")
+ releases = {}
+ if not isinstance(cohort_sets, dict):
+ errors.append("cohort_sets must be a mapping")
+ cohort_sets = {}
+ if not isinstance(labels, dict):
+ errors.append("project_labels must be a mapping")
+ labels = {}
+
+ channel_versions = []
+ for channel in CHANNELS:
+ version = channels.get(channel)
+ try:
+ parsed = version_tuple(version, f"channels.{channel}")
+ channel_versions.append(parsed)
+ except DataError as error:
+ errors.append(str(error))
+ if version not in releases:
+ errors.append(f"channels.{channel} references missing release {version!r}")
+ if len(channel_versions) == len(CHANNELS):
+ if channel_versions != sorted(set(channel_versions)):
+ errors.append("channel releases must be distinct and oldest-to-newest")
+
+ for set_name, cohort_set in cohort_sets.items():
+ if not isinstance(cohort_set, dict) or not cohort_set.get("early"):
+ errors.append(f"cohort set {set_name} must define a non-empty early list")
+ continue
+ for project in cohort_set["early"]:
+ if project not in labels:
+ errors.append(
+ f"cohort set {set_name} references project without a label: {project}"
+ )
+
+ parsed_release_versions = []
+ release_dates = []
+ ucxx_versions = []
+ for version, release in releases.items():
+ try:
+ parsed_version = version_tuple(version, f"release {version}")
+ parsed_release_versions.append(parsed_version)
+ except DataError as error:
+ errors.append(str(error))
+ parsed_version = None
+ if not isinstance(release, dict):
+ errors.append(f"release {version} must be a mapping")
+ continue
+ released_on = validate_schedule(version, release, cohort_sets, errors)
+ if parsed_version is not None and released_on is not None:
+ release_dates.append((parsed_version, released_on))
+ if "ucxx_version" in release:
+ try:
+ ucxx_versions.append(
+ (version_tuple(version), version_tuple(release["ucxx_version"]))
+ )
+ except DataError as error:
+ errors.append(str(error))
+
+ if parsed_release_versions != sorted(parsed_release_versions, reverse=True):
+ errors.append("release records must be ordered newest-to-oldest")
+ ordered_dates = [released_on for _, released_on in sorted(release_dates)]
+ if ordered_dates != sorted(set(ordered_dates)):
+ errors.append("release dates must be unique and increase with release versions")
+ ordered_ucxx = [value for _, value in sorted(ucxx_versions)]
+ if len(ordered_ucxx) != len(set(ordered_ucxx)):
+ errors.append("UCXX release versions must be unique")
+ if ordered_ucxx != sorted(ordered_ucxx):
+ errors.append("UCXX release versions must increase with RAPIDS releases")
+
+ platform_releases = platform_support.get("releases", [])
+ platform_by_version = {
+ item.get("version"): item
+ for item in platform_releases
+ if isinstance(item, dict) and isinstance(item.get("version"), str)
+ }
+ for channel in ("stable", "nightly"):
+ version = channels.get(channel)
+ if version not in platform_by_version:
+ errors.append(
+ f"{channel} release {version} is missing from platform_support.yml"
+ )
+ nightly_version = channels.get("nightly")
+ marked_nightly = [
+ item.get("version")
+ for item in platform_releases
+ if isinstance(item, dict) and item.get("nightly") is True
+ ]
+ if marked_nightly != [nightly_version]:
+ errors.append(
+ "exactly the nightly channel must have nightly: true in "
+ f"platform_support.yml; expected {[nightly_version]}, found {marked_nightly}"
+ )
+
+ if errors:
+ raise DataError("Release data validation failed:\n- " + "\n- ".join(errors))
+ return channels, releases, cohort_sets, labels
+
+
+def projected_phases(release, cohort_sets, labels):
+ cohort_set = cohort_sets.get(release.get("cohort_set"), {})
+ early_label = "/".join(labels[project] for project in cohort_set.get("early", []))
+ projected = []
+ for phase in release.get("phases", []):
+ name, anchor = PHASES[phase["phase"]]
+ cohort = phase["cohort"]
+ cohort_label = ""
+ if cohort == "early":
+ cohort_label = early_label
+ elif cohort == "remaining":
+ cohort_label = "others"
+ item = {
+ "name": name,
+ "cohort": cohort,
+ "cohort_label": cohort_label,
+ "start": phase["start"],
+ "end": phase["end"],
+ }
+ if anchor:
+ item["process_anchor"] = anchor
+ projected.append(item)
+ return projected
+
+
+def canonical_release_date(release):
+ if release.get("phases"):
+ return next(
+ phase["end"] for phase in release["phases"] if phase["phase"] == "release"
+ )
+ return release["released_on"]
+
+
+def project_release(version, release, cohort_sets, labels):
+ result = {"version": version}
+ if "ucxx_version" in release:
+ result["ucxx_version"] = release["ucxx_version"]
+ if release.get("phases"):
+ result["phases"] = projected_phases(release, cohort_sets, labels)
+ else:
+ result["date"] = release["released_on"]
+ return result
+
+
+def generate(calendar, platform_support):
+ channels, releases, cohort_sets, labels = validate_calendar(
+ calendar, platform_support
+ )
+ active = {}
+ for channel in CHANNELS:
+ version = channels[channel]
+ release = releases[version]
+ if channel in {"legacy", "stable"}:
+ item = {"version": version}
+ if "ucxx_version" in release:
+ item["ucxx_version"] = release["ucxx_version"]
+ item["date"] = canonical_release_date(release)
+ else:
+ item = project_release(version, release, cohort_sets, labels)
+ active[channel] = item
+
+ stable_version = version_tuple(channels["stable"])
+ history = [
+ project_release(version, release, cohort_sets, labels)
+ for version, release in releases.items()
+ if version_tuple(version) <= stable_version
+ ]
+ return active, history
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Generate release channel and history projections."
+ )
+ parser.add_argument(
+ "--check", action="store_true", help="Fail instead of updating stale outputs."
+ )
+ args = parser.parse_args()
+
+ try:
+ active, history = generate(load_yaml(CALENDAR_PATH), load_yaml(PLATFORM_PATH))
+ write_or_check(RELEASES_PATH, json_text(active), args.check)
+ write_or_check(HISTORY_PATH, json_text(history), args.check)
+ except (DataError, OSError) as error:
+ print(error, file=sys.stderr)
+ return 1
+
+ action = "validated" if args.check else "generated"
+ print(f"Release data {action} successfully.")
+ return 0
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/ci/new-notice.py b/ci/new-notice.py
new file mode 100755
index 00000000000..cc7491445cf
--- /dev/null
+++ b/ci/new-notice.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python3
+# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES.
+# All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+
+import argparse
+import json
+import re
+import sys
+from datetime import date
+from pathlib import Path
+
+
+ROOT = Path(__file__).resolve().parents[1]
+NOTICES_DIR = ROOT / "_notices"
+PARENTS = {
+ "rdn": "RAPIDS Developer Notices",
+ "rgn": "RAPIDS General Notices",
+ "rsn": "RAPIDS Support Notices",
+}
+
+
+def next_id(notice_type):
+ pattern = re.compile(rf"^{notice_type}(\d{{4}})\.md$")
+ ids = [
+ int(match.group(1))
+ for path in NOTICES_DIR.glob(f"{notice_type}*.md")
+ if (match := pattern.fullmatch(path.name))
+ ]
+ return max(ids, default=0) + 1
+
+
+def main():
+ parser = argparse.ArgumentParser(description="Create valid notice front matter.")
+ parser.add_argument("--type", choices=sorted(PARENTS), required=True)
+ parser.add_argument("--title", required=True)
+ parser.add_argument("--topic", required=True)
+ parser.add_argument("--rapids-version", required=True)
+ parser.add_argument("--author", default="RAPIDS Ops")
+ args = parser.parse_args()
+
+ notice_id = next_id(args.type)
+ path = NOTICES_DIR / f"{args.type}{notice_id:04d}.md"
+ today = date.today().isoformat()
+ contents = f"""---
+layout: notice
+parent: {PARENTS[args.type]}
+grand_parent: RAPIDS Notices
+nav_exclude: true
+notice_type: {args.type}
+notice_id: {notice_id}
+notice_pin: false
+title: {json.dumps(args.title)}
+notice_author: {json.dumps(args.author)}
+notice_status: Proposal
+notice_status_color: blue
+notice_topic: {json.dumps(args.topic)}
+notice_rapids_version: {json.dumps(args.rapids_version)}
+notice_created: {today}
+notice_updated: {today}
+---
+
+## Overview
+
+TODO
+
+## Impact
+
+TODO
+"""
+ try:
+ path.write_text(contents, encoding="utf-8")
+ except OSError as error:
+ print(f"Could not create notice: {error}", file=sys.stderr)
+ return 1
+ print(path.relative_to(ROOT))
+ return 0
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/ci/roll-release.py b/ci/roll-release.py
new file mode 100755
index 00000000000..bbcc6f3fa93
--- /dev/null
+++ b/ci/roll-release.py
@@ -0,0 +1,200 @@
+#!/usr/bin/env python3
+# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES.
+# All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+
+import argparse
+import importlib.util
+import subprocess
+import sys
+from pathlib import Path
+
+import yaml
+
+from data_utils import DataError, json_text, load_yaml, version_tuple
+
+
+ROOT = Path(__file__).resolve().parents[1]
+CALENDAR_PATH = ROOT / "_data" / "release_calendar.yml"
+PLATFORM_PATH = ROOT / "_data" / "platform_support.yml"
+RELEASES_PATH = ROOT / "_data" / "releases.json"
+HISTORY_PATH = ROOT / "_data" / "previous_releases.json"
+PROJECT_GENERATOR = ROOT / "ci" / "generate-projects-to-versions.py"
+PROJECTS_OUTPUT_PATH = ROOT / "ci" / "customization" / "projects-to-versions.json"
+REDIRECTS_OUTPUT_PATH = ROOT / "_redirects"
+
+CALENDAR_HEADER = """# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES.
+# SPDX-License-Identifier: Apache-2.0
+#
+# Canonical RAPIDS release channels and schedules. Generated projections live in
+# releases.json and previous_releases.json; edit this file instead of those files.
+
+"""
+
+
+class IndentDumper(yaml.SafeDumper):
+ def increase_indent(self, flow=False, indentless=False):
+ return super().increase_indent(flow, False)
+
+
+def next_rapids_release(version):
+ parsed = version_tuple(version, "next_nightly release")
+ if len(parsed) != 2:
+ raise DataError("RAPIDS release versions must use YY.MM")
+ year, month = parsed
+ if month not in {2, 4, 6, 8, 10, 12}:
+ raise DataError(f"unsupported RAPIDS release month in {version}")
+ month += 2
+ if month == 14:
+ year += 1
+ month = 2
+ return f"{year:02d}.{month:02d}"
+
+
+def load_release_generator():
+ path = ROOT / "ci" / "generate-release-data.py"
+ spec = importlib.util.spec_from_file_location("generate_release_data", path)
+ module = importlib.util.module_from_spec(spec)
+ spec.loader.exec_module(module)
+ return module
+
+
+def dump_calendar(calendar):
+ body = yaml.dump(
+ calendar,
+ Dumper=IndentDumper,
+ sort_keys=False,
+ default_flow_style=False,
+ width=1000,
+ )
+ return CALENDAR_HEADER + body
+
+
+def target_channels(channels, new_next_nightly):
+ expected = next_rapids_release(channels["next_nightly"])
+ if new_next_nightly != expected:
+ raise DataError(
+ f"new next nightly must be {expected}, the release after "
+ f"{channels['next_nightly']}"
+ )
+ return {
+ "legacy": channels["stable"],
+ "stable": channels["nightly"],
+ "nightly": channels["next_nightly"],
+ "next_nightly": new_next_nightly,
+ }
+
+
+def validate_prerequisites(calendar, platform_support, new_next_nightly):
+ channels = calendar.get("channels", {})
+ releases = calendar.get("releases", {})
+ targets = target_channels(channels, new_next_nightly)
+ missing = [version for version in targets.values() if version not in releases]
+ if missing:
+ raise DataError(
+ "add complete release_calendar.yml records before rollover: "
+ + ", ".join(missing)
+ )
+
+ platform_releases = platform_support.get("releases", [])
+ platform_versions = {
+ release.get("version")
+ for release in platform_releases
+ if isinstance(release, dict)
+ }
+ required_platform = {targets["stable"], targets["nightly"]}
+ missing_platform = sorted(required_platform - platform_versions)
+ if missing_platform:
+ raise DataError(
+ "add platform support policy before rollover for: "
+ + ", ".join(missing_platform)
+ )
+
+ marked_nightly = [
+ release.get("version")
+ for release in platform_releases
+ if isinstance(release, dict) and release.get("nightly") is True
+ ]
+ if marked_nightly != [targets["nightly"]]:
+ raise DataError(
+ "move nightly: true in platform_support.yml before rollover; "
+ f"expected {[targets['nightly']]}, found {marked_nightly}"
+ )
+ return targets
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ description="Rotate release channels after source policy records are ready."
+ )
+ parser.add_argument(
+ "--new-next-nightly",
+ required=True,
+ help="The already-authored release to assign to next_nightly (YY.MM).",
+ )
+ parser.add_argument(
+ "--dry-run", action="store_true", help="Validate and print without writing."
+ )
+ args = parser.parse_args()
+
+ try:
+ calendar = load_yaml(CALENDAR_PATH)
+ platform_support = load_yaml(PLATFORM_PATH)
+ targets = validate_prerequisites(
+ calendar, platform_support, args.new_next_nightly
+ )
+ calendar["channels"] = targets
+ generator = load_release_generator()
+ active, history = generator.generate(calendar, platform_support)
+ except (DataError, OSError, KeyError, TypeError) as error:
+ print(f"Release rollover blocked: {error}", file=sys.stderr)
+ return 1
+
+ print("Channel rotation:")
+ for channel, version in targets.items():
+ print(f"- {channel}: {version}")
+ if args.dry_run:
+ print("Dry run complete; no files changed.")
+ return 0
+
+ managed_paths = (
+ CALENDAR_PATH,
+ RELEASES_PATH,
+ HISTORY_PATH,
+ PROJECTS_OUTPUT_PATH,
+ REDIRECTS_OUTPUT_PATH,
+ )
+ original_contents = {
+ path: path.read_text(encoding="utf-8") for path in managed_paths
+ }
+ try:
+ CALENDAR_PATH.write_text(dump_calendar(calendar), encoding="utf-8")
+ RELEASES_PATH.write_text(json_text(active), encoding="utf-8")
+ HISTORY_PATH.write_text(json_text(history), encoding="utf-8")
+ result = subprocess.run(
+ [sys.executable, PROJECT_GENERATOR], cwd=ROOT, check=False
+ )
+ except OSError as error:
+ for path, content in original_contents.items():
+ path.write_text(content, encoding="utf-8")
+ print(f"Release rollover failed and was restored: {error}", file=sys.stderr)
+ return 1
+ if result.returncode:
+ for path, content in original_contents.items():
+ path.write_text(content, encoding="utf-8")
+ print(
+ "Docs artifact generation failed; the rollover was restored.",
+ file=sys.stderr,
+ )
+ return result.returncode
+
+ print("Review these human policy decisions before opening the rollover PR:")
+ print("- docs.yml channel availability and delayed project publication")
+ print("- install_packages.yml lifecycle and standard-bundle membership")
+ print("- platform support details for the new nightly release")
+ print("- dates and cohort membership for the new next_nightly schedule")
+ return 0
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/ci/test-selector.mjs b/ci/test-selector.mjs
new file mode 100755
index 00000000000..531fa14456b
--- /dev/null
+++ b/ci/test-selector.mjs
@@ -0,0 +1,100 @@
+#!/usr/bin/env node
+// SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES.
+// SPDX-License-Identifier: Apache-2.0
+
+import assert from "node:assert/strict";
+import { readFileSync } from "node:fs";
+import vm from "node:vm";
+
+
+const renderedPath = process.argv[2] || "_site/install/index.html";
+const html = readFileSync(renderedPath, "utf8");
+const scripts = [...html.matchAll(/