Skip to content

ci: Update CI pipelines to accommodate RC tags - #123

Merged
rapids-bot[bot] merged 4 commits into
NVIDIA:release/0.1from
dagardner-nv:david-build-on-tags
Jul 27, 2026
Merged

ci: Update CI pipelines to accommodate RC tags#123
rapids-bot[bot] merged 4 commits into
NVIDIA:release/0.1from
dagardner-nv:david-build-on-tags

Conversation

@dagardner-nv

@dagardner-nv dagardner-nv commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Overview

  • Python and Rust have different ideas on how RC tags in version numbers should work

Where should the reviewer start?

  • scripts/ci/normalize_release_tag.py
  • justfile
  • I confirm this contribution is my own work, or I have the right to submit it under this project's license.
  • I searched existing issues and open pull requests, and this does not duplicate existing work.

Summary by CodeRabbit

  • Release Management
    • Release tags are now consistently normalized across documentation snapshots and package publishing.
    • Supports stable, beta, and release-candidate formats, including optional v prefixes and compact -rcN forms.
    • Improved validation provides clearer errors for unsupported tag formats.
    • Publish/version setting is streamlined to use the normalized package version.
  • Documentation
    • Updated manual release documentation for the release tag input.
  • Bug Fixes
    • Ensures published package metadata matches the intended release version.
  • Tests
    • Updated Hermes end-to-end assertions to match expected relay artifact steps.

Signed-off-by: David Gardner <dagardner@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 6f3a8a00-d12f-4026-9f9f-bb29edfb418f

📥 Commits

Reviewing files that changed from the base of the PR and between 79f2c52 and 09d64d0.

📒 Files selected for processing (2)
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/e2e/test_hermes_e2e.py
📜 Recent review details
⏰ Context from checks skipped due to timeout. (18)
  • GitHub Check: Preview docs
  • GitHub Check: Test (Python 3.12, linux-arm64)
  • GitHub Check: Test (Python 3.13, windows-amd64)
  • GitHub Check: Test (Python 3.12, windows-amd64)
  • GitHub Check: Test (Python 3.11, linux-amd64)
  • GitHub Check: Test (Python 3.14, linux-arm64)
  • GitHub Check: Test (Python 3.14, windows-amd64)
  • GitHub Check: Test (Python 3.12, linux-amd64)
  • GitHub Check: Test (Python 3.11, windows-amd64)
  • GitHub Check: Test (Python 3.13, linux-amd64)
  • GitHub Check: Test (Python 3.14, macos-arm64)
  • GitHub Check: Test (Python 3.11, linux-arm64)
  • GitHub Check: Test (Python 3.13, macos-arm64)
  • GitHub Check: Test (Python 3.11, macos-arm64)
  • GitHub Check: Test (Python 3.13, linux-arm64)
  • GitHub Check: Test (Python 3.12, macos-arm64)
  • GitHub Check: Test (Python 3.14, linux-amd64)
  • GitHub Check: Pre-commit
🧰 Additional context used
📓 Path-based instructions (14)
**/*.{rs,py,pyi,json,yaml,yml}

📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)

Determine and update every affected public surface, including the CLI, PyO3 bindings, Python SDK, type stubs, schemas, and adapter contract, so they remain in parity.

Files:

  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/e2e/test_hermes_e2e.py
**/*

📄 CodeRabbit inference engine (.agents/skills/karpathy-guidelines/SKILL.md)

**/*: Before implementing, explicitly state assumptions, surface ambiguity and tradeoffs, present multiple interpretations when relevant, and ask for clarification rather than silently deciding or proceeding when requirements are unclear.
Prefer the minimum code needed to solve the requested problem: avoid speculative features, unnecessary abstractions, unrequested flexibility, and handling of impossible scenarios; simplify overcomplicated solutions.
When editing existing code, make surgical changes only: do not modify unrelated code, comments, formatting, or pre-existing dead code; match the existing style, and remove only unused imports, variables, or functions introduced by your changes.
Define verifiable success criteria for each task, such as writing regression tests for bugs and invalid-input tests for validation, then verify the implementation against those criteria. For multi-step work, state a brief plan with a verification check for each step.

**/*: Always spell NVIDIA in all caps; do not use Nvidia, nvidia, nVidia, nVIDIA, or NV.
Use an NVIDIA before a noun, because the name begins with an “en” sound.
Do not add a registered trademark symbol after NVIDIA when referring to the company; use trademark symbols with product names only when required by the document type or legal guidance.
Verify official capitalization, spacing, hyphenation, and spelling for NVIDIA and third-party product names; do not rewrite official product names for grammar or title-case rules.
Precede NVIDIA product names with NVIDIA on first mention when natural and accurate, and link the first mention when the destination helps the reader.
On first use, include the company name and full model qualifier when it helps identify the model; preserve official capitalization and punctuation, and use shorter family names only after establishing the full name.
For learning-oriented and developer content, do not force trademark symbols unless explicitly required; for press, ...

Files:

  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/e2e/test_hermes_e2e.py
**/*.{rs,py}

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

For native binding changes, run cargo check -p fabric-python --locked.

**/*.{rs,py}: When changing the Rust core or public schemas, run both the Rust and Python test suites.
When adding functionality, include tests in the corresponding Rust crate or the relevant area under tests/.

Files:

  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/e2e/test_hermes_e2e.py
**/*.{py,pyi}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If Python code or a Python-facing adapter changes, run just test-python.

Files:

  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/e2e/test_hermes_e2e.py
**/*.{rs,py,pyi}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

**/*.{rs,py,pyi}: If public configuration types change, confirm schema snapshot tests in just test-rust pass and review generated schema diffs.
For schema or public contract changes, run both language suites and review changes under schemas/ and generated API references.

Files:

  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/e2e/test_hermes_e2e.py
**/*.{py,pyi,rs}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

For Python SDK or PyO3 binding changes, use python-tests, run focused pytest tests first, then just test-python; rebuild with just build-python when native code or packaging changes.

Files:

  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/e2e/test_hermes_e2e.py
**/*.{rs,py,toml}

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

When editing version helpers, verify every nemo-fabric-* workspace package through Cargo metadata and reject a static version in python/pyproject.toml.

Files:

  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/e2e/test_hermes_e2e.py
**/*.{toml,rs,py}

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

Avoid blind repository-wide replacement of version-like strings; distinguish package-version references from examples and unrelated dependency versions.

Files:

  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/e2e/test_hermes_e2e.py
**/*.{rs,py,html,md,mdx,toml,yml,yaml,sh,bash}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

All Rust, Python, HTML, Markdown, MDX, TOML, YAML, and shell source files must include the project SPDX copyright and Apache-2.0 license headers using the comment syntax appropriate to each file type.

Files:

  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/e2e/test_hermes_e2e.py
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use type annotations for public Python APIs.

Files:

  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/e2e/test_hermes_e2e.py
**/*.{py,rs}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.{py,rs}: Keep native Python binding declarations synchronized with their Rust implementations.
Use snake_case for functions and variables; use PascalCase for Rust types and Python classes.

Files:

  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/e2e/test_hermes_e2e.py
{adapters/**,examples/**}

⚙️ CodeRabbit configuration file

{adapters/**,examples/**}: Review adapter and example changes for command correctness, config/schema consistency, artifact handling, and compatibility with the public NeMo Fabric contracts.

Files:

  • adapters/common/src/nemo_fabric_adapters/common/utils.py
tests/**/*.py

📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)

tests/**/*.py: Use Pytest to run Python tests.
Do not add @pytest.mark.asyncio to tests; async tests are automatically detected and run by the async runner.
Do not add -> None return type annotations to test functions.
When mocking a class, use unittest.mock.MagicMock or unittest.mock.AsyncMock, using the spec argument when necessary, rather than defining a new class.
Prefix mocked class names with mock, not fake.
Prefer pytest fixtures over helper methods.
Do not repeat fixtures; place fixtures needed by multiple test files in conftest.py.
Define fixtures using @pytest.fixture(name="<fixture_name>"[, scope="<scope>"]) and a function named <fixture_name>_fixture; specify scope only when it is not function.
Prefer pytest.mark.parametrize over separate tests for different input types.
Use @pytest.mark.usefixtures when a fixture is needed but its return value is unused or it does not return a value.
Use the autouse restore_environ_fixture from tests/conftest.py to restore environment variables; modify variables with os.environ and do not use monkeypatch.setenv.
Avoid defensive programming in tests; access expected data directly so missing data raises a clear failure, such as using results["data"] instead of results.get("data").

Files:

  • tests/e2e/test_hermes_e2e.py
{tests/**,python/tests/**}

⚙️ CodeRabbit configuration file

{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.

Files:

  • tests/e2e/test_hermes_e2e.py
🔇 Additional comments (2)
adapters/common/src/nemo_fabric_adapters/common/utils.py (1)

186-188: 📐 Maintainability & Code Quality

Add focused coverage for without_none.

The implementation is correct, but the supplied changes do not show a focused test proving that only None values are removed while other falsey values remain unchanged. Confirm such coverage exists or add it, then run the required Python validation.

As per coding guidelines, when adding functionality, include tests in the relevant area under tests/, and run just test-python. As per path instructions, tests should cover the behavior promised by the changed API surface.

Sources: Coding guidelines, Path instructions

tests/e2e/test_hermes_e2e.py (1)

239-251: LGTM!


Walkthrough

Release tag handling is centralized in a new normalization script, integrated into version-setting, documentation snapshotting, and Rust publishing workflows. A dictionary filtering helper is added, and Hermes ATIF assertions now validate semantic user and agent steps.

Changes

Release tag normalization

Layer / File(s) Summary
Normalization helper and tests
scripts/ci/normalize_release_tag.py, tests/scripts/test_normalize_release_tag.py
Supported release tags are validated, compact RC tags are converted to dotted form, and valid and invalid inputs are tested.
Version-setting integration
justfile
A normalization recipe is added, and set-version normalizes its version or tag input before updating project metadata and locks.
Release workflow integration
.github/workflows/fern-docs.yml, .github/workflows/publish_rust.yml
Documentation releases preserve the source tag while using the normalized version; Rust publishing sets the version from the release tag and reads the resulting Cargo version.

Artifact and utility updates

Layer / File(s) Summary
Common filtering and Hermes ATIF validation
adapters/common/src/nemo_fabric_adapters/common/utils.py, tests/e2e/test_hermes_e2e.py
Adds without_none and updates Hermes artifact assertions to expect semantic user and agent steps with the relevant prompt, model, and response.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ReleaseWorkflow
  participant normalize_release_tag_py
  participant justfile
  participant CargoToml
  ReleaseWorkflow->>normalize_release_tag_py: normalize release tag
  normalize_release_tag_py-->>ReleaseWorkflow: return source tag and canonical version
  ReleaseWorkflow->>justfile: set-version with release tag
  justfile->>normalize_release_tag_py: normalize version input
  normalize_release_tag_py-->>justfile: return canonical version
  justfile->>CargoToml: update project version
  CargoToml-->>ReleaseWorkflow: provide parsed version for publishing
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title matches Conventional Commits and accurately summarizes the CI RC-tag work.
Description check ✅ Passed The description includes an overview, reviewer start points, and required confirmations, with only the related issue reference left incomplete.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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 unit tests (beta)
  • Create PR with unit tests

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

@github-actions

Copy link
Copy Markdown

@dagardner-nv
dagardner-nv marked this pull request as ready for review July 27, 2026 16:49
@dagardner-nv
dagardner-nv requested a review from a team as a code owner July 27, 2026 16:49

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@scripts/ci/normalize_release_tag.py`:
- Around line 11-13: Update the release-tag regex in normalize_release_tag to
use 0|[1-9]\d* for each major, minor, patch, and numeric RC identifier,
rejecting leading-zero forms such as v01.2.3, -rc.01, and compact -rc01. Apply
the same constraint to the documentation regex and add rejection tests for these
malformed tags.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 280bdaf2-8ba3-4120-9aba-c1951cd28f87

📥 Commits

Reviewing files that changed from the base of the PR and between 9e33716 and 79f2c52.

📒 Files selected for processing (5)
  • .github/workflows/fern-docs.yml
  • .github/workflows/publish_rust.yml
  • justfile
  • scripts/ci/normalize_release_tag.py
  • tests/scripts/test_normalize_release_tag.py
📜 Review details
⏰ Context from checks skipped due to timeout. (18)
  • GitHub Check: Preview docs
  • GitHub Check: Test (Python 3.13, linux-arm64)
  • GitHub Check: Test (Python 3.14, windows-amd64)
  • GitHub Check: Test (Python 3.12, linux-arm64)
  • GitHub Check: Test (Python 3.13, macos-arm64)
  • GitHub Check: Test (Python 3.12, linux-amd64)
  • GitHub Check: Test (Python 3.12, windows-amd64)
  • GitHub Check: Test (Python 3.13, linux-amd64)
  • GitHub Check: Test (Python 3.12, macos-arm64)
  • GitHub Check: Test (Python 3.11, linux-arm64)
  • GitHub Check: Test (Python 3.11, linux-amd64)
  • GitHub Check: Test (Python 3.14, macos-arm64)
  • GitHub Check: Test (Python 3.14, linux-arm64)
  • GitHub Check: Test (Python 3.11, macos-arm64)
  • GitHub Check: Test (Python 3.14, linux-amd64)
  • GitHub Check: Test (Python 3.11, windows-amd64)
  • GitHub Check: Test (Python 3.13, windows-amd64)
  • GitHub Check: Pre-commit
⚠️ CI failures not shown inline (6)

GitHub Actions: Rust / Test (x86_64): ci: Update CI pipelines to accommodate RC tags

Conclusion: failure

View job details

##[group]Run bail() {
 �[36;1mbail() {�[0m
 �[36;1m  printf '::error::install-action: %s\n' "$*"�[0m

GitHub Actions: Rust / Test (x86_64): ci: Update CI pipelines to accommodate RC tags

Conclusion: failure

View job details

##[group]Run cargo check -p fabric-python --locked
 �[36;1mcargo check -p fabric-python --locked�[0m
 shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
 env:
   CARGO_INCREMENTAL: 0
   CARGO_PROFILE_DEV_DEBUG: 0
   CARGO_TERM_COLOR: always
   RUST_BACKTRACE: short
   RUSTFLAGS: -D warnings
   CARGO_UNSTABLE_SPARSE_REGISTRY: true
   CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
   CACHE_ON_FAILURE: false
 ##[endgroup]
 �[1m�[92m    Updating�[0m crates.io index
 �[1m�[91merror�[0m: cannot update the lock file /home/runner/work/NeMo-Fabric/NeMo-Fabric/Cargo.lock because --locked was passed to prevent this
 help: to generate the lock file without accessing the network, remove the --locked flag and use --offline instead.
 ##[error]Process completed with exit code 101.

GitHub Actions: Rust / 1_Test (arm64).txt: ci: Update CI pipelines to accommodate RC tags

Conclusion: failure

View job details

##[group]Run bail() {
 �[36;1mbail() {�[0m
 �[36;1m  printf '::error::install-action: %s\n' "$*"�[0m

GitHub Actions: Rust / Test (arm64): ci: Update CI pipelines to accommodate RC tags

Conclusion: failure

View job details

##[group]Run cargo check -p fabric-python --locked
 �[36;1mcargo check -p fabric-python --locked�[0m
 shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
 env:
   CARGO_INCREMENTAL: 0
   CARGO_PROFILE_DEV_DEBUG: 0
   CARGO_TERM_COLOR: always
   RUST_BACKTRACE: short
   RUSTFLAGS: -D warnings
   CARGO_UNSTABLE_SPARSE_REGISTRY: true
   CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
   CACHE_ON_FAILURE: false
 ##[endgroup]
 �[1m�[92m    Updating�[0m crates.io index
 �[1m�[91merror�[0m: cannot update the lock file /home/runner/work/NeMo-Fabric/NeMo-Fabric/Cargo.lock because --locked was passed to prevent this
 help: to generate the lock file without accessing the network, remove the --locked flag and use --offline instead.
 ##[error]Process completed with exit code 101.

GitHub Actions: Rust / Test (arm64): ci: Update CI pipelines to accommodate RC tags

Conclusion: failure

View job details

##[group]Run bail() {
 �[36;1mbail() {�[0m
 �[36;1m  printf '::error::install-action: %s\n' "$*"�[0m

GitHub Actions: Rust / 0_Test (x86_64).txt: ci: Update CI pipelines to accommodate RC tags

Conclusion: failure

View job details

##[group]Run bail() {
 �[36;1mbail() {�[0m
 �[36;1m  printf '::error::install-action: %s\n' "$*"�[0m
🧰 Additional context used
📓 Path-based instructions (19)
**/.github/workflows/*.{yml,yaml}

📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)

**/.github/workflows/*.{yml,yaml}: Define permissions: per job that needs token access, using the minimum required scopes; avoid workflow-level permissions unless centralized inheritance is intentionally documented.
Pin every third-party GitHub Action to a full commit SHA and retain a readable version comment after the SHA.
Use action-native or ecosystem-native caching instead of generic actions/cache when available.
Tie cache invalidation to lockfiles, dependency manifests, or explicit tool versions; avoid caching generated outputs unless deliberate repository behavior requires it.
Use astral-sh/setup-uv cache support with cache-dependency-glob anchored to uv.lock.
Use Swatinem/rust-cache with explicit shared-key and workspaces instead of ad hoc target-directory caching.
Keep deploy and publish permissions isolated to only the jobs that require them; restrict pages: write and id-token: write to Pages deployment jobs and their reusable-workflow callers.
Use contents: read as the minimum permission for checkout-based build, test, documentation, and packaging jobs.
Grant pull-requests: read only to jobs that perform pull-request metadata lookups.
When using workflow_call, inspect both caller and callee, and ensure the caller grants every permission required by the called jobs because the callee cannot elevate permissions.
Keep local workflow commands aligned with equivalent justfile recipes, and keep Python, Rust, and documentation jobs aligned with their lockfiles.
Preserve intended concurrency settings, branch filters, and documentation publish guards when modifying workflows.
Before editing workflows, inspect workflow relationships and settings with searches covering uses:, permissions:, secrets:, concurrency:, cache, and just.

Files:

  • .github/workflows/publish_rust.yml
  • .github/workflows/fern-docs.yml
{docs/package.json,docs/package-lock.json,.github/workflows/*.yml,justfile}

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Keep documentation tooling, CI workflows, install commands, build/test/clean recipes, and examples consistent with current package names and commands.

Files:

  • .github/workflows/publish_rust.yml
  • .github/workflows/fern-docs.yml
  • justfile
{pyproject.toml,python/pyproject.toml,Cargo.toml,docs/package.json,.github/workflows/*.yml,justfile}

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Reflect public packaging changes in release-facing documentation and ensure CI references the same package names and commands used by local workflows.

Files:

  • .github/workflows/publish_rust.yml
  • .github/workflows/fern-docs.yml
  • justfile
.github/workflows/**/*.{yml,yaml}

📄 CodeRabbit inference engine (.agents/skills/README.md)

GitHub Actions workflows must use pinned actions and be validated locally when maintained.

Files:

  • .github/workflows/publish_rust.yml
  • .github/workflows/fern-docs.yml
**/*.{rs,py,pyi,json,yaml,yml}

📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)

Determine and update every affected public surface, including the CLI, PyO3 bindings, Python SDK, type stubs, schemas, and adapter contract, so they remain in parity.

Files:

  • tests/scripts/test_normalize_release_tag.py
  • scripts/ci/normalize_release_tag.py
**/*

📄 CodeRabbit inference engine (.agents/skills/karpathy-guidelines/SKILL.md)

**/*: Before implementing, explicitly state assumptions, surface ambiguity and tradeoffs, present multiple interpretations when relevant, and ask for clarification rather than silently deciding or proceeding when requirements are unclear.
Prefer the minimum code needed to solve the requested problem: avoid speculative features, unnecessary abstractions, unrequested flexibility, and handling of impossible scenarios; simplify overcomplicated solutions.
When editing existing code, make surgical changes only: do not modify unrelated code, comments, formatting, or pre-existing dead code; match the existing style, and remove only unused imports, variables, or functions introduced by your changes.
Define verifiable success criteria for each task, such as writing regression tests for bugs and invalid-input tests for validation, then verify the implementation against those criteria. For multi-step work, state a brief plan with a verification check for each step.

**/*: Always spell NVIDIA in all caps; do not use Nvidia, nvidia, nVidia, nVIDIA, or NV.
Use an NVIDIA before a noun, because the name begins with an “en” sound.
Do not add a registered trademark symbol after NVIDIA when referring to the company; use trademark symbols with product names only when required by the document type or legal guidance.
Verify official capitalization, spacing, hyphenation, and spelling for NVIDIA and third-party product names; do not rewrite official product names for grammar or title-case rules.
Precede NVIDIA product names with NVIDIA on first mention when natural and accurate, and link the first mention when the destination helps the reader.
On first use, include the company name and full model qualifier when it helps identify the model; preserve official capitalization and punctuation, and use shorter family names only after establishing the full name.
For learning-oriented and developer content, do not force trademark symbols unless explicitly required; for press, ...

Files:

  • tests/scripts/test_normalize_release_tag.py
  • scripts/ci/normalize_release_tag.py
  • justfile
**/*.{rs,py}

📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)

For native binding changes, run cargo check -p fabric-python --locked.

**/*.{rs,py}: When changing the Rust core or public schemas, run both the Rust and Python test suites.
When adding functionality, include tests in the corresponding Rust crate or the relevant area under tests/.

Files:

  • tests/scripts/test_normalize_release_tag.py
  • scripts/ci/normalize_release_tag.py
**/*.{py,pyi}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

If Python code or a Python-facing adapter changes, run just test-python.

Files:

  • tests/scripts/test_normalize_release_tag.py
  • scripts/ci/normalize_release_tag.py
**/*.{rs,py,pyi}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

**/*.{rs,py,pyi}: If public configuration types change, confirm schema snapshot tests in just test-rust pass and review generated schema diffs.
For schema or public contract changes, run both language suites and review changes under schemas/ and generated API references.

Files:

  • tests/scripts/test_normalize_release_tag.py
  • scripts/ci/normalize_release_tag.py
**/*.{py,pyi,rs}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

For Python SDK or PyO3 binding changes, use python-tests, run focused pytest tests first, then just test-python; rebuild with just build-python when native code or packaging changes.

Files:

  • tests/scripts/test_normalize_release_tag.py
  • scripts/ci/normalize_release_tag.py
tests/**/*.py

📄 CodeRabbit inference engine (.agents/skills/python-tests/SKILL.md)

tests/**/*.py: Use Pytest to run Python tests.
Do not add @pytest.mark.asyncio to tests; async tests are automatically detected and run by the async runner.
Do not add -> None return type annotations to test functions.
When mocking a class, use unittest.mock.MagicMock or unittest.mock.AsyncMock, using the spec argument when necessary, rather than defining a new class.
Prefix mocked class names with mock, not fake.
Prefer pytest fixtures over helper methods.
Do not repeat fixtures; place fixtures needed by multiple test files in conftest.py.
Define fixtures using @pytest.fixture(name="<fixture_name>"[, scope="<scope>"]) and a function named <fixture_name>_fixture; specify scope only when it is not function.
Prefer pytest.mark.parametrize over separate tests for different input types.
Use @pytest.mark.usefixtures when a fixture is needed but its return value is unused or it does not return a value.
Use the autouse restore_environ_fixture from tests/conftest.py to restore environment variables; modify variables with os.environ and do not use monkeypatch.setenv.
Avoid defensive programming in tests; access expected data directly so missing data raises a clear failure, such as using results["data"] instead of results.get("data").

Files:

  • tests/scripts/test_normalize_release_tag.py
**/*.{rs,py,toml}

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

When editing version helpers, verify every nemo-fabric-* workspace package through Cargo metadata and reject a static version in python/pyproject.toml.

Files:

  • tests/scripts/test_normalize_release_tag.py
  • scripts/ci/normalize_release_tag.py
**/*.{toml,rs,py}

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

Avoid blind repository-wide replacement of version-like strings; distinguish package-version references from examples and unrelated dependency versions.

Files:

  • tests/scripts/test_normalize_release_tag.py
  • scripts/ci/normalize_release_tag.py
**/*.{rs,py,html,md,mdx,toml,yml,yaml,sh,bash}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

All Rust, Python, HTML, Markdown, MDX, TOML, YAML, and shell source files must include the project SPDX copyright and Apache-2.0 license headers using the comment syntax appropriate to each file type.

Files:

  • tests/scripts/test_normalize_release_tag.py
  • scripts/ci/normalize_release_tag.py
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use type annotations for public Python APIs.

Files:

  • tests/scripts/test_normalize_release_tag.py
  • scripts/ci/normalize_release_tag.py
**/*.{py,rs}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.{py,rs}: Keep native Python binding declarations synchronized with their Rust implementations.
Use snake_case for functions and variables; use PascalCase for Rust types and Python classes.

Files:

  • tests/scripts/test_normalize_release_tag.py
  • scripts/ci/normalize_release_tag.py
{tests/**,python/tests/**}

⚙️ CodeRabbit configuration file

{tests/**,python/tests/**}: Tests should cover the behavior promised by the changed API surface, including error paths, lifecycle cleanup, and SDK/native parity where relevant.

Files:

  • tests/scripts/test_normalize_release_tag.py
**/.github/workflows/fern-docs.{yml,yaml}

📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)

Keep documentation publish and preview credentials isolated to the Fern documentation workflow and only to jobs that consume them.

Files:

  • .github/workflows/fern-docs.yml
justfile

📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)

justfile: The set-version recipe must run just lock-python after source metadata is updated.
set_project_version must invoke both Cargo and Python project version helpers.

Files:

  • justfile
🪛 Ruff (0.15.21)
scripts/ci/normalize_release_tag.py

[warning] 21-24: Avoid specifying long messages outside the exception class

(TRY003)


[warning] 36-36: Avoid specifying long messages outside the exception class

(TRY003)

🪛 zizmor (1.26.1)
.github/workflows/fern-docs.yml

[info] 414-414: code injection via template expansion (template-injection): may expand into attacker-controllable code

(template-injection)

🔇 Additional comments (1)
tests/scripts/test_normalize_release_tag.py (1)

17-34: 📐 Maintainability & Code Quality

Run the Python validation. Focused test first, then just test-python; record both results.

Comment thread scripts/ci/normalize_release_tag.py
…d-build-on-tags

Signed-off-by: David Gardner <dagardner@nvidia.com>
@dagardner-nv
dagardner-nv changed the base branch from main to release/0.1 July 27, 2026 17:38
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
@dagardner-nv

Copy link
Copy Markdown
Collaborator Author

/merge

@rapids-bot
rapids-bot Bot merged commit 8d16dce into NVIDIA:release/0.1 Jul 27, 2026
31 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants