Skip to content

ci: add release preparation and wheel verification#634

Merged
binaryaaron merged 9 commits into
mainfrom
binaryaaron/semver-release-helper
Jul 15, 2026
Merged

ci: add release preparation and wheel verification#634
binaryaaron merged 9 commits into
mainfrom
binaryaaron/semver-release-helper

Conversation

@binaryaaron

@binaryaaron binaryaaron commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • add a standard-library release:prepare task that previews the next release's initial rc0 tag without mutating Git
  • add a reusable no-config built-wheel verifier with a real CPU install and CUDA dependency resolution
  • run the verifier in PR CI for package/release-tooling changes and in the tag workflow before either PyPI upload
  • keep uv cache reuse while removing project, resolver, source, and index configuration from verification subprocesses

Stack

This PR is stacked on #633. Its own diff contains only the semver helper, release-tool documentation, wheel verification tooling/tests, and workflow integration. Retarget it to main after #633 merges; the PR workflow only runs automatically for pull requests whose base is main.

Validation

  • mise run validate: 1,648 tests and 3 subtests passed
  • 15 focused release-tool tests passed after the final council fixes
  • mise run release:prepare -- --ref origin/main --json produced v0.1.7rc0 without creating a tag or syncing the project
  • clean CPU wheel install resolved and installed 239 packages; dependency check, import, and CLI help passed
  • clean CUDA wheel resolution selected 252 packages with the intended public indexes and versions
  • mise run format-check, type checking, lock checking, and git diff --check passed
  • independent three-seat council review found no critical blocker

Summary by CodeRabbit

  • New Features
    • Added an end-user clean-container wheel verification step to CI and release workflows.
    • Introduced release planning for PEP 440 versions, including release candidates and post-releases.
    • Added a release preparation helper for generating the next release candidate/tag plan.
  • Documentation
    • Updated production release and contributor release-process guidance, including post-release procedures.
    • Expanded container test image documentation with wheel verification steps.
  • Bug Fixes
    • Improved CI change detection so dependency/CI-related changes trigger the right checks.
  • Chores
    • Adjusted Docker artifact inclusion rules and updated Docker image tagging to use PEP 440.

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: ad30937b-f432-4593-82e0-b457b4ad1749

📥 Commits

Reviewing files that changed from the base of the PR and between 4b1239a and c9ba540.

📒 Files selected for processing (2)
  • tests/tools/test_release_version.py
  • tools/release_version.py
🚧 Files skipped from review as they are similar to previous changes (2)
  • tests/tools/test_release_version.py
  • tools/release_version.py
📜 Recent review details
⏰ Context from checks skipped due to timeout. (7)
  • GitHub Check: Unit Tests (3.13)
  • GitHub Check: Unit Tests (3.12)
  • GitHub Check: Unit Tests (3.11)
  • GitHub Check: End-user Wheel Install
  • GitHub Check: Smoke Tests
  • GitHub Check: Greptile Review
  • GitHub Check: Analyze (python)

Walkthrough

Changes

Release and wheel validation

Layer / File(s) Summary
Release tag model and planning
tools/release_version.py
Adds PEP 440 tag parsing and release-plan generation for stable, candidate, post-release, and historical development tags.
Release planner tests
tests/tools/test_release_version.py
Tests release planning, CLI output, Git reference resolution, supported tag forms, and error cases.
Clean wheel installation path
.dockerignore, .mise/tasks/release/verify-wheel, containers/Dockerfile.test_ci, containers/README.md
Adds containerized wheel-install validation for CPU and cu129 environments and preserves wheel files in Docker build contexts.
CI and publishing integration
.github/actions/detect-changes/action.yml, .github/workflows/ci-checks.yml, .github/workflows/release.yml, .github/workflows/container-build.yml
Runs wheel verification for relevant changes, aggregates its result, verifies release wheels before publication, and generates PEP 440 container tags.
Release preparation and process documentation
.mise/tasks/release/prepare, CONTRIBUTING.md, .github/workflows/README.md
Adds the release preparation helper and documents post-releases, release checks, wheel verification, and final-release documentation publishing.

Estimated code review effort: 4 (Complex) | ~60 minutes

Suggested labels: feature, test

Suggested reviewers: zywind, kendrickb-nvidia

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 23.81% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main changes: adding release preparation and built-wheel verification to CI and release workflows.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch binaryaaron/semver-release-helper

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added area:dev-ex Affects build or dev experience area:ci area:tests labels Jul 10, 2026
@binaryaaron
binaryaaron force-pushed the binaryaaron/fix-wheel-flashinfer-metadata branch from 0485f51 to 3cc4ddf Compare July 10, 2026 03:47
@binaryaaron
binaryaaron force-pushed the binaryaaron/semver-release-helper branch from 532c7f3 to 704b01f Compare July 10, 2026 03:48
@binaryaaron
binaryaaron force-pushed the binaryaaron/fix-wheel-flashinfer-metadata branch from 3cc4ddf to c20669d Compare July 10, 2026 04:22
@binaryaaron
binaryaaron force-pushed the binaryaaron/semver-release-helper branch from 704b01f to dcc537a Compare July 10, 2026 04:23
Base automatically changed from binaryaaron/fix-wheel-flashinfer-metadata to main July 10, 2026 16:10
Comment thread tools/release_version.py Fixed
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
@binaryaaron
binaryaaron force-pushed the binaryaaron/semver-release-helper branch from a378b11 to 2567181 Compare July 13, 2026 22:21
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
@codecov

codecov Bot commented Jul 14, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 89.78979% with 34 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
tools/release_version.py 81.03% 33 Missing ⚠️
tests/tools/test_release_version.py 99.37% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

mckornfield
mckornfield previously approved these changes Jul 14, 2026
Comment thread .github/workflows/ci-checks.yml

COPY dist/*.whl /tmp/dist/

RUN --mount=type=cache,target=/root/.cache/uv \

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wish Dockerfiles in github had syntax highlighting for these

my nit would be to put this section into a script since it's a bit rough to read here

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in 25671818. The CI-facing orchestration now lives in mise run release:verify-wheel; the actual install and smoke checks remain in the wheel-install stage so the Docker build itself verifies the clean end-user environment.

Comment thread tests/tools/test_release_version.py Outdated
from pathlib import Path
from types import ModuleType

REPO_ROOT = Path(__file__).parents[2]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

my nit- would be to prefer a git rev-parse --show-toplevel or gitpy equivalent, but maybe not worth the git hit

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in d52cd440. The test now uses pytest's pytestconfig.rootpath fixture, so it follows pytest's discovered repository root without shelling out to Git.

Comment thread tools/release_version.py Outdated
Comment thread tools/release_version.py


def _list_local_tags(*, cwd: Path) -> list[str]:
output = _run_git(["tag", "--list"], cwd=cwd)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does this also fetch first or is that done somewhere else?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, intentionally. The helper only inspects local tags and has no network side effects. CONTRIBUTING.md now explicitly says to fetch the tags you want considered before running it.

Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Comment thread tests/tools/test_release_version.py Dismissed
Comment thread tools/release_version.py Dismissed
Comment thread tools/release_version.py Dismissed
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
@binaryaaron
binaryaaron marked this pull request as ready for review July 15, 2026 01:31
@binaryaaron
binaryaaron requested a review from a team as a code owner July 15, 2026 01:31
@binaryaaron
binaryaaron requested a review from a team as a code owner July 15, 2026 01:31
@binaryaaron
binaryaaron requested a review from mckornfield July 15, 2026 01:31
@coderabbitai coderabbitai Bot added docs Documentation-only change feature New feature or request test Test-only addition or change labels Jul 15, 2026
@greptile-apps

greptile-apps Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds release preparation and built-wheel verification. The main changes are:

  • A read-only release:prepare helper for rc and post-release tag planning.
  • A clean-container wheel verification task for CPU install and CUDA dependency resolution.
  • CI and release workflow steps that run the wheel verifier before publishing.
  • Release and container documentation updates for the new process.

Confidence Score: 5/5

This looks safe to merge.

  • No blocking issues found in the changed code.

Important Files Changed

Filename Overview
tools/release_version.py Adds the release tag planner and CLI for rc and post-release preparation.
.mise/tasks/release/verify-wheel Adds the task that checks for one built wheel and runs the container verifier.
containers/Dockerfile.test_ci Adds the clean wheel-install stage for package install and dependency checks.
.github/workflows/ci-checks.yml Adds wheel verification to PR CI for source, dependency, and CI changes.
.github/workflows/release.yml Runs wheel verification in the release workflow before artifact upload and publishing.

Reviews (2): Last reviewed commit: "fix(release): address review nits" | Re-trigger Greptile

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (3)
tests/tools/test_release_version.py (2)

48-52: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Fixture missing the fixture_ prefix.

release_tool should be named fixture_release_tool per project convention (and its usage as a parameter name at line 57 updated accordingly).

As per path instructions, "Prefix fixtures with fixture_, use function scope by default, and document each fixture with a one-line docstring."

Source: Path instructions


60-70: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Uses tempfile.TemporaryDirectory() instead of tmp_path.

Path instructions call for tmp_path for filesystem operations in tests. Since setup/teardown are xunit-style methods (not fixtures), tmp_path can't be injected directly here without restructuring to a fixture-based pattern.

As per path instructions, "Use tmp_path for filesystem writes and avoid shared mutable state."

Source: Path instructions

.github/workflows/README.md (1)

233-236: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Use em-dash for asides, per markdown style guideline.

"Build wheel - Builds the production wheel" and "Publish to PyPI - Uploads to PyPI" use a hyphen as an aside separator.

As per coding guidelines, "Use -- (em-dash) instead of - (hyphen) for asides in markdown."

🔧 Proposed fix
-1. Build wheel - Builds the production wheel
+1. Build wheel -- Builds the production wheel
 2. Verify the wheel installs in a clean end-user container
 3. Push to test PyPI
-4. Publish to PyPI - Uploads to PyPI
+4. Publish to PyPI -- Uploads to PyPI

Source: Coding guidelines


ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 435b4157-f034-4f33-829c-931bf75422c2

📥 Commits

Reviewing files that changed from the base of the PR and between 3203751 and 4b1239a.

📒 Files selected for processing (13)
  • .dockerignore
  • .github/actions/detect-changes/action.yml
  • .github/workflows/README.md
  • .github/workflows/ci-checks.yml
  • .github/workflows/container-build.yml
  • .github/workflows/release.yml
  • .mise/tasks/release/prepare
  • .mise/tasks/release/verify-wheel
  • CONTRIBUTING.md
  • containers/Dockerfile.test_ci
  • containers/README.md
  • tests/tools/test_release_version.py
  • tools/release_version.py
📜 Review details
⏰ Context from checks skipped due to timeout. (4)
  • GitHub Check: Greptile Review
  • GitHub Check: Unit Tests (3.11)
  • GitHub Check: Unit Tests (3.12)
  • GitHub Check: Unit Tests (3.13)
🧰 Additional context used
📓 Path-based instructions (14)
.github/workflows/*.yml

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Preserve CI workflow requirements, including the repository's quality checks and documented release and documentation deployment behavior.

Files:

  • .github/workflows/container-build.yml
  • .github/workflows/release.yml
  • .github/workflows/ci-checks.yml
.github/**

⚙️ CodeRabbit configuration file

Review GitHub configuration for branch protection expectations, CODEOWNERS alignment, least privilege permissions, pinned actions where practical, and consistency with CONTRIBUTING.md.

Files:

  • .github/workflows/container-build.yml
  • .github/actions/detect-changes/action.yml
  • .github/workflows/README.md
  • .github/workflows/release.yml
  • .github/workflows/ci-checks.yml
**/*.{md,markdown,py}

📄 CodeRabbit inference engine (.cursor/rules/agent-markdown-style.mdc)

**/*.{md,markdown,py}: Avoid decorative bold (**text**) in list items, body text, and docstrings; use structural cues (headers, list markers, colons, backticks) for emphasis instead
Use backticks for code identifiers, paths, and CLI commands in markdown and docstrings

Files:

  • containers/README.md
  • tests/tools/test_release_version.py
  • CONTRIBUTING.md
  • tools/release_version.py
**/*.{md,markdown}

📄 CodeRabbit inference engine (.cursor/rules/agent-markdown-style.mdc)

**/*.{md,markdown}: Bold is acceptable only in markdown tables where it's the conventional way to mark header-like cells in the body
Use ## headers to segment markdown sections instead of bold text
Use -- (em-dash) instead of - (hyphen) for asides in markdown

Files:

  • containers/README.md
  • CONTRIBUTING.md
**/*.md

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Do not use decorative bold in Markdown body text, list items, or docstrings; use single backticks for code identifiers, paths, and commands.

Use the repository's Markdown style and include SPDX copyright headers.

Files:

  • containers/README.md
  • CONTRIBUTING.md
**/*

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

**/*: Every source file requires the SPDX copyright and license header appropriate to its file format.
End files with a newline, remove trailing whitespace, use one space between sentences, and keep code, comments, and docstrings within 120 characters.

**/*: Before submitting a pull request, run mise run format, mise run check, and mise run test; use pinned mise tasks rather than invoking ruff or ty directly.
All commits merged to main must use Conventional Commits format: <type>(<scope>): <description> or <type>: <description>, with a lowercase valid type and a description of at most 100 characters.
All contributions must include a DCO Signed-off-by trailer, and commits must also have a verified cryptographic signature.
Never move a published release tag; if release code changes, create and validate the next release candidate instead.
Stable release tags must point to the exact tested commit SHA, and artifacts, containers, documentation, and installation must be verified before announcing a release.
Use mise run <task> for project tasks; the Makefile only bootstraps mise and provides deprecated compatibility messages.
When testing NSS changes in NMP, use the NMP Makefile's use-nss-local target for local wheels and always run use-nss-artifactory before committing.

Files:

  • containers/README.md
  • containers/Dockerfile.test_ci
  • tests/tools/test_release_version.py
  • CONTRIBUTING.md
  • tools/release_version.py

⚙️ CodeRabbit configuration file

**/*: Review as a senior maintainer for NeMo Safe Synthesizer. Prioritize issues that can change behavior, break user workflows, weaken privacy guarantees, hide failures, make tests unreliable, or create maintenance risk. Avoid generic style commentary unless it points to a concrete project convention that automated tools will not catch.
Comment only when the finding is actionable and tied to changed code. For each finding, state the impact, the condition that triggers it, and the smallest practical fix. Prefer one precise comment over broad advice. Do not ask for refactors outside the PR scope unless the changed code creates the problem.
Review type guidance: - Potential issue: use for correctness bugs, data loss, privacy leaks,
security risks, broken public APIs, invalid config behavior, missing
validation, hidden failures, nondeterministic tests, or CI breakage.

  • Refactor suggestion: use for local maintainability problems introduced
    by the diff when they have clear future cost, such as duplicated setup,
    unclear boundaries, over-mocking, avoidable complexity, or opaque test
    helpers.
  • Nitpick: avoid in chill mode. Do not emit formatting, import-order,
    wording, or style-only comments unless automated tools cannot catch the
    issue and it affects maintainability.

Severity guidance: - Critical: security/privacy leaks, data loss, training/test/holdout
contamination, or broken release/package/core pipeline execution.

  • Major: incorrect generation/training/evaluation behavior, broken
    CLI/SDK public API, invalid config defaults or validators, or GPU/vLLM
    cleanup and process-isolation bugs likely to fail CI or production
    runs.
  • Minor: localized bugs, missing focused tests for changed behavior, or
    bad test patterns that weaken regression coverage.
  • Trivial: small cleanup with no behavior impact. Usually suppress in
    chill mode.
  • Info: context only. Avoid unless it helps reviewers understand risk.
    Safe-Synthesizer-specific review focus: - Data ...

Files:

  • containers/README.md
  • containers/Dockerfile.test_ci
  • tests/tools/test_release_version.py
  • CONTRIBUTING.md
  • tools/release_version.py
**/*.{py,sh,yaml,yml,md}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Add SPDX copyright headers to all Python, shell, YAML, YML, and Markdown source files; honor exclusions in .copyrightignore.

Files:

  • containers/README.md
  • tests/tools/test_release_version.py
  • CONTRIBUTING.md
  • tools/release_version.py
containers/**

⚙️ CodeRabbit configuration file

Review container changes against STYLE_GUIDE.md and containers/README.md. Check cache mounts, uv usage, non-root runtime behavior, CUDA settings, and copy order.

Files:

  • containers/README.md
  • containers/Dockerfile.test_ci
containers/Dockerfile*

📄 CodeRabbit inference engine (STYLE_GUIDE.md)

Use multi-stage production builds, cache mounts, --no-install-recommends, non-root appuser, and proper PID 1 handling.

Files:

  • containers/Dockerfile.test_ci
**/*.py

📄 CodeRabbit inference engine (AGENTS.md)

**/*.py: Place durable implementation guidance in function and class docstrings for public contracts and source comments for local invariants
Target Python 3.11–3.13 with modern syntax (X | Y, list[str], Self). Python 3.14+ is not supported

**/*.py: Use American English spelling in Python code, documentation, and messages.
Use Field(description=...) for every Pydantic model field.
Use assignment-style Field() by default; use Annotated only for additional metadata such as validators, constrained aliases, or discriminated unions.
Use @dataclass(frozen=True) for immutable value objects and validators; use mutable dataclasses only for builders, accumulators, and pipeline state.
Use field(default_factory=list) instead of mutable list defaults.
Use StrEnum for string-valued configuration or serialization enums and plain Enum for internal constants.
Obtain loggers with observability.get_logger(__name__); do not call logging.getLogger() or structlog.get_logger() directly.
Use .runtime, .user, and .system category loggers appropriately.
Do not use print() for operational library output; use the approved logger, click.echo(), or sys.stdout.write() where appropriate.
Use extra={} for machine-queryable logging data and f-strings only for human-readable context.
Raise errors from the custom Safe Synthesizer error hierarchy, using the documented dual inheritance for user and internal errors.
Keep shared package code compatible with Python 3.11; do not use Python 3.12-only syntax such as PEP 695 type statements or bracketed generic parameters.
Prefer X | Y, built-in collection generics, and Self over Optional, Union, and legacy typing collections.
Use collection ABCs for function arguments and concrete collection types for return values.
Use Protocol for structural subtyping and avoid Any when object, generics, or protocols are suitable.
Use TYPE_CHECKING guards for heavy imports such as pandas, torch, and transformers.
...

Files:

  • tests/tools/test_release_version.py
  • tools/release_version.py
**/test_*.py

📄 CodeRabbit inference engine (AGENTS.md)

Use the unit marker instead of the deprecated unit_test marker for test identification

Files:

  • tests/tools/test_release_version.py
tests/**

📄 CodeRabbit inference engine (.cursor/rules/repo-navigation.mdc)

tests/**: Mirror src/ directory structure in tests/ directory for test organization
Auto-mark tests by directory: tests/e2e/e2e, tests/smoke/smoke, otherwise default to unit

Mirror source code directory structure in tests directory (e.g., tests/training/, tests/generation/ parallel to source structure)

Files:

  • tests/tools/test_release_version.py
tests/**/*.py

📄 CodeRabbit inference engine (tests/TESTING.md)

tests/**/*.py: Auto-mark tests based on file path: tests under /e2e/ get e2e marker, tests under /smoke/ get smoke marker, all others get unit marker (only if no category marker already present)
Every test should have exactly one category marker: unit, smoke, or e2e
Use pytest.mark.requires_gpu modifier on tests that need CUDA hardware
Use pytest.mark.vllm on tests using vLLM generation backend and ensure each vLLM test file runs in its own process for GPU memory isolation
Use pytest.mark.slow on long-running tests
Use pytest.mark.smollm2 for SmolLM2 Hub download tests to enable process isolation
Use pytest.mark.noautouse to skip autouse fixtures for specific tests
Use load_test_dataset(filename) helper to load test datasets from tests/stub_datasets/ as HuggingFace Dataset objects
Use load_test_dataframe(filename) helper to load test data files from tests/stub_datasets/ as pandas DataFrames
Convert pandas columns to nullable dtypes (pd.Int64Dtype(), pd.BooleanDtype()) before assigning np.nan values
Use fake.seed_instance(seed) and random.seed(seed) together for Faker-based test data reproducibility
When sharing methods across multiple test files, define them in conftest.py and import them using relative imports (e.g., from .conftest import train_with_sdk); note that importing from other test files like tests/cli/helpers.py does not work
Use fixture_mock_processor or fixture_mock_processor_without_valid_records for mocking ParsedResponse objects with valid_records, invalid_records, errors, and prompt_number fields
Use pytest.importorskip to gate tests on optional dependencies that require specific extras (e.g., sentence_transformers, vllm)
Run vLLM tests with separate pytest invocations (one per file) using -n 0 (single process) for GPU memory isolation, or use staged mise tasks for CI visibility
Print statements are allowed in tests (ruff T201 is suppressed for tests/ directory) and should...

Files:

  • tests/tools/test_release_version.py

⚙️ CodeRabbit configuration file

Review tests against tests/TESTING.md. Check marker usage, fixture naming, tmp_path usage, determinism, and GPU/vLLM process-isolation requirements. Flag slop tests that only check that code runs, assert result is not None when stronger invariants exist, over-mock internal implementation details, patch around the bug instead of reproducing it, or add broad snapshot/golden churn without a clear contract. Flag change detector tests that fail on harmless refactors, formatting, record ordering, incidental wording, or private implementation details without demonstrating a behavior regression. Prefer existing fixtures or focused new fixtures for repeated setup; keep tests DRY when reasonable without making the behavior under test opaque. print() is allowed in tests.

Files:

  • tests/tools/test_release_version.py
tools/**

⚙️ CodeRabbit configuration file

Review tools as developer and CI infrastructure. Check that scripts use uv or Makefile wrappers instead of ad hoc python/pip commands, preserve read-only behavior for check targets, fail with clear messages, avoid hidden network or filesystem side effects, and stay consistent with STYLE_GUIDE.md and CONTRIBUTING.md. Tooling may use print() when it is a standalone script or intentional CLI output.

Files:

  • tools/release_version.py
🧠 Learnings (1)
📚 Learning: 2026-05-27T22:20:37.354Z
Learnt from: kendrickb-nvidia
Repo: NVIDIA-NeMo/Safe-Synthesizer PR: 520
File: tests/generation/test_vllm_backend.py:556-587
Timestamp: 2026-05-27T22:20:37.354Z
Learning: In NVIDIA-NeMo/Safe-Synthesizer, `tests/conftest.py`’s `pytest_collection_modifyitems` hook applies pytest category markers automatically based on each test file’s path: tests under `/e2e/` get `pytest.mark.e2e`, tests under `/smoke/` get `pytest.mark.smoke`, and all other tests get `pytest.mark.unit`. Therefore, when reviewing pytest tests outside `tests/e2e/` and `tests/smoke/`, do not flag missing explicit `pytest.mark.unit` decorators on test classes/functions as an issue (the hook will add them during collection). If a new test directory/category is introduced, ensure the hook is updated so it’s categorized correctly.

Applied to files:

  • tests/tools/test_release_version.py
🪛 ast-grep (0.44.1)
tests/tools/test_release_version.py

[error] 71-71: Use of unsanitized data to create processes
Context: subprocess.run(args, cwd=self.repo, check=False, capture_output=True, text=True)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(os-system-unsanitized-data)


[error] 71-71: Command coming from incoming request
Context: subprocess.run(args, cwd=self.repo, check=False, capture_output=True, text=True)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)

tools/release_version.py

[info] 317-317: use jsonify instead of json.dumps for JSON output
Context: json.dumps({"error": str(error)}, sort_keys=True)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


[info] 323-323: use jsonify instead of json.dumps for JSON output
Context: json.dumps(asdict(plan), sort_keys=True)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


[error] 130-136: Command coming from incoming request
Context: subprocess.run(
["git", *args],
cwd=cwd,
check=False,
capture_output=True,
text=True,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)

🪛 LanguageTool
CONTRIBUTING.md

[uncategorized] ~688-~688: The official name of this software platform is spelled with a capital “H”.
Context: ...inal releases, including post-releases. container-build.yml publishe...

(GITHUB)


[style] ~839-~839: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...elease is not marked as a prerelease. - Confirm versioned documentation is available at...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)

🪛 Ruff (0.15.21)
tests/tools/test_release_version.py

[error] 72-72: subprocess call: check for execution of untrusted input

(S603)


[warning] 192-192: Pattern passed to match= contains metacharacters but is neither escaped nor raw

(RUF043)


[warning] 230-230: Pattern passed to match= contains metacharacters but is neither escaped nor raw

(RUF043)

tools/release_version.py

[error] 131-131: subprocess call: check for execution of untrusted input

(S603)


[error] 132-132: Starting a process with a partial executable path

(S607)

🔇 Additional comments (17)
.dockerignore (1)

27-28: LGTM!

.mise/tasks/release/verify-wheel (1)

6-9: LGTM!

containers/Dockerfile.test_ci (2)

49-59: 🩺 Stability & Availability | ⚡ Quick win

Commit-pinned vLLM wheel index is a fragile external dependency for CI.

The cu129 dependency-resolution check depends on https://wheels.vllm.ai/ee0da84ab9e04ac7610e28580af62c365e898389/cu129, a wheel index tied to one specific upstream commit. If that index is ever pruned or rotated upstream, this dependency-resolution step (and thus wheel verification / release / PR CI) will start failing for reasons unrelated to this repository's changes.

Confirm this pin is intentionally synced with pyproject.toml's vLLM/CUDA extras and that there's a process to bump it when the pinned commit rotates.


27-61: LGTM!

containers/README.md (1)

126-152: LGTM!

.github/actions/detect-changes/action.yml (1)

88-90: LGTM!

.github/workflows/ci-checks.yml (2)

258-266: LGTM!


54-59: 🗄️ Data Integrity & Integration

No issue: deps is already exposed by .github/actions/detect-changes/action.yml, so the wheel-install and smoke-test gates can use needs.changes.outputs.deps as intended.

			> Likely an incorrect or invalid review comment.
.github/workflows/release.yml (1)

71-73: LGTM!

.github/workflows/container-build.yml (1)

88-89: LGTM!

tools/release_version.py (2)

144-166: Solid, well-tested canonical-tag parser.

Cross-checked every documented valid/invalid tag example (rc/post dash variants, alpha prereleases, leading zeros, +devN locals) against this logic and the parametrized tests — all resolve as expected.


1-12: LGTM!

Also applies to: 24-141, 168-332

tests/tools/test_release_version.py (1)

18-46: LGTM! Thorough, precise assertions and good parametrized coverage of the planning/CLI contract.

Also applies to: 55-55, 71-231

.mise/tasks/release/prepare (2)

1-5: LGTM!

Also applies to: 11-13


6-10: 📐 Maintainability & Code Quality

No change needed for MISE_CONFIG_ROOT here. File tasks run under mise with MISE_CONFIG_ROOT set, and this task is meant to be invoked via mise run release:prepare; the same source pattern is used elsewhere under .mise/tasks/**.

			> Likely an incorrect or invalid review comment.
.github/workflows/README.md (1)

218-232: LGTM!

Also applies to: 237-238

CONTRIBUTING.md (1)

688-847: LGTM! Documentation accurately reflects tools/release_version.py's behavior (validity table, helper options, rejection conditions) and is internally consistent.

Comment thread tests/tools/test_release_version.py Outdated
Comment thread tools/release_version.py
mckornfield
mckornfield previously approved these changes Jul 15, 2026
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
@coderabbitai coderabbitai Bot removed the docs Documentation-only change label Jul 15, 2026
@binaryaaron
binaryaaron requested a review from mckornfield July 15, 2026 16:15
@binaryaaron
binaryaaron added this pull request to the merge queue Jul 15, 2026
Merged via the queue into main with commit b1bc437 Jul 15, 2026
24 checks passed
@binaryaaron
binaryaaron deleted the binaryaaron/semver-release-helper branch July 15, 2026 16:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:build-dist area:ci area:dev-ex Affects build or dev experience area:docs area:tests feature New feature or request test Test-only addition or change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants