Skip to content

ci: make Do Not Merge tag actually block merging - #164

Merged
rapids-bot[bot] merged 3 commits into
NVIDIA:mainfrom
zhongxuanwang-nv:feat/do-not-merge-label-gate
Jul 31, 2026
Merged

ci: make Do Not Merge tag actually block merging#164
rapids-bot[bot] merged 3 commits into
NVIDIA:mainfrom
zhongxuanwang-nv:feat/do-not-merge-label-gate

Conversation

@zhongxuanwang-nv

@zhongxuanwang-nv zhongxuanwang-nv commented Jul 30, 2026

Copy link
Copy Markdown
Member

Overview

Add a minimal required-check surface that blocks a pull request while it has the DO NOT MERGE label. The job is skipped before runner allocation when the label is absent and runs only long enough to report a failure when the label is present.

  • 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.

Details

  • Run the label gate when a pull request is opened, reopened, synchronized, labeled, or unlabeled.
  • Use a job-level condition so ordinary pull requests do not allocate a runner for this check.
  • Grant the job no GitHub token permissions.

After this workflow lands, configure DO NOT MERGE label as a required status check for the protected main branch so its failure blocks merging.

Validation

  • just --fmt --check
  • Copyright header pre-commit hook for .github/workflows/do-not-merge.yml
  • actionlint pre-commit hook for GitHub Actions workflows
  • git diff --check upstream/main...HEAD

Rust and Python tests were not run because this change only adds a GitHub Actions workflow.

Where should the reviewer start?

Start with .github/workflows/do-not-merge.yml, especially the job-level label condition that avoids runner allocation when merging is allowed.

Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)

  • Relates to: none

Summary by CodeRabbit

  • Chores
    • Added an automated GitHub Actions check that fails pull requests marked with the “DO NOT MERGE” label.
    • The check runs on common pull request events (opened, reopened, synchronized) and when labels change, ensuring only one active run per pull request.
    • Updated project versioning to 0.2.0 across the core package, adapters, and examples.
    • Refreshed installation/documentation instructions to reference 0.2.0 and aligned integration tests to validate the updated README/pip command strings.

@coderabbitai

coderabbitai Bot commented Jul 30, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

Updates the project and adapter release metadata, dependencies, documentation, and integration tests from 0.1.0 to 0.2.0. Also adds a GitHub Actions workflow that fails checks for pull requests carrying the DO NOT MERGE label.

Changes

0.2.0 release alignment

Layer / File(s) Summary
Package versions and dependency pins
Cargo.toml, pyproject.toml, adapters/*/pyproject.toml
Workspace, runtime, and adapter versions and dependency constraints are aligned to 0.2.0.
Release installation documentation
README.md, docs/integrations/harness/deepagents.mdx, examples/harbor/*
Installation examples and Harbor bundle instructions reference 0.2.0; Deep Agents documentation adds combined Fabric and Relay installation instructions.
Version-aware integration tests
tests/integrations/test_harbor_runner.py, tests/python/test_harbor_integration.py
Tests read the package version from pyproject.toml instead of hardcoding release values in README and installation assertions.

Do Not Merge check

Layer / File(s) Summary
Label-gated failing workflow
.github/workflows/do-not-merge.yml
Triggers on relevant pull request events, runs only when DO NOT MERGE is present, uses PR-scoped concurrency, and exits with status 1 after printing an error.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

  • NVIDIA/NeMo-Fabric#163: Updates related Harbor integration assertions for release-dependent nemo-fabric[...] strings.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% 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
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.
Title check ✅ Passed The title uses the allowed lowercase ci type, an imperative summary, no trailing period, and is under 72 characters.
Description check ✅ Passed The description includes the required overview, reviewer starting point, related-issues section, contribution attestations, and validation details.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@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 @.github/workflows/do-not-merge.yml:
- Around line 6-8: Add a pull-request-keyed concurrency configuration alongside
the workflow trigger, using a stable PR identifier for the group and setting
cancel-in-progress to true. Keep the existing pull_request event types unchanged
so newer label-state runs cancel older runs and determine the final check
status.
🪄 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: db4b53e4-ea66-4d23-81e4-7b9bd8935edb

📥 Commits

Reviewing files that changed from the base of the PR and between c310e9c and 7e9f639.

📒 Files selected for processing (1)
  • .github/workflows/do-not-merge.yml
📜 Review details
⏰ Context from checks skipped due to timeout. (4)
  • GitHub Check: Test (Python 3.14, linux-arm64)
  • GitHub Check: Test (Python 3.11, macos-arm64)
  • GitHub Check: Test (Python 3.14, macos-arm64)
  • GitHub Check: Test (arm64)
🧰 Additional context used
📓 Path-based instructions (3)
**/.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/do-not-merge.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/do-not-merge.yml
{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/do-not-merge.yml
🪛 zizmor (1.28.0)
.github/workflows/do-not-merge.yml

[warning] 6-8: insufficient job-level concurrency limits (concurrency-limits): workflow is missing concurrency setting

(concurrency-limits)

🔇 Additional comments (1)
.github/workflows/do-not-merge.yml (1)

1-5: LGTM!

Also applies to: 10-21

Comment thread .github/workflows/do-not-merge.yml
Signed-off-by: Zhongxuan Wang <daniewang@nvidia.com>
Signed-off-by: Zhongxuan Wang <daniewang@nvidia.com>
Signed-off-by: Zhongxuan Wang <daniewang@nvidia.com>
@zhongxuanwang-nv
zhongxuanwang-nv force-pushed the feat/do-not-merge-label-gate branch from 4245880 to 32c241a Compare July 30, 2026 21:14
@zhongxuanwang-nv
zhongxuanwang-nv changed the base branch from release/0.1 to main July 30, 2026 21:15

@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 `@tests/python/test_harbor_integration.py`:
- Around line 357-363: Move the pyproject.toml version lookup using
Path.resolve, Path.open, and tomllib.load out of
test_harbor_structured_package_install_is_shell_safe, loading package_version
once at module scope or before the async test begins. Reuse that value when
constructing fabric_package, keeping the existing package-version source and
dependency format unchanged.
🪄 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: 466d0190-acc4-4dc9-9e1b-4169e1094c4a

📥 Commits

Reviewing files that changed from the base of the PR and between 4245880 and 32c241a.

⛔ Files ignored due to path filters (7)
  • Cargo.lock is excluded by !**/*.lock
  • adapters/claude/uv.lock is excluded by !**/*.lock
  • adapters/codex/uv.lock is excluded by !**/*.lock
  • adapters/common/uv.lock is excluded by !**/*.lock
  • adapters/deepagents/uv.lock is excluded by !**/*.lock
  • adapters/hermes/uv.lock is excluded by !**/*.lock
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (14)
  • .github/workflows/do-not-merge.yml
  • Cargo.toml
  • README.md
  • adapters/claude/pyproject.toml
  • adapters/codex/pyproject.toml
  • adapters/common/pyproject.toml
  • adapters/deepagents/pyproject.toml
  • adapters/hermes/pyproject.toml
  • docs/integrations/harness/deepagents.mdx
  • examples/harbor/README.md
  • examples/harbor/swebench/README.md
  • pyproject.toml
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_harbor_integration.py
📜 Review details
🧰 Additional context used
📓 Path-based instructions (44)
**/*

📄 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/pyproject.toml
  • adapters/hermes/pyproject.toml
  • adapters/claude/pyproject.toml
  • Cargo.toml
  • docs/integrations/harness/deepagents.mdx
  • examples/harbor/README.md
  • README.md
  • examples/harbor/swebench/README.md
  • adapters/deepagents/pyproject.toml
  • tests/integrations/test_harbor_runner.py
  • adapters/codex/pyproject.toml
  • pyproject.toml
  • tests/python/test_harbor_integration.py
**/*.{rs,toml}

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

For any Rust change, run just test-rust and cargo fmt --all -- --check.

For Rust core, CLI, or shared runtime semantic changes, run Rust formatting and tests, and add Python tests when behavior is exposed through the SDK.

Files:

  • adapters/common/pyproject.toml
  • adapters/hermes/pyproject.toml
  • adapters/claude/pyproject.toml
  • Cargo.toml
  • adapters/deepagents/pyproject.toml
  • adapters/codex/pyproject.toml
  • pyproject.toml
**/{Cargo.toml,Cargo.lock,pyproject.toml,package.json}

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

For new or updated dependencies, document the functional need, alternatives considered, and why the selected dependency is the narrowest fit.

Files:

  • adapters/common/pyproject.toml
  • adapters/hermes/pyproject.toml
  • adapters/claude/pyproject.toml
  • Cargo.toml
  • adapters/deepagents/pyproject.toml
  • adapters/codex/pyproject.toml
  • pyproject.toml
**/*.{toml,lock}

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

If a manifest or lockfile changes, run the license-diff script against origin/main, review transitive license changes, and run the attributions-rust and attributions-python pre-commit hooks.

Files:

  • adapters/common/pyproject.toml
  • adapters/hermes/pyproject.toml
  • adapters/claude/pyproject.toml
  • Cargo.toml
  • adapters/deepagents/pyproject.toml
  • adapters/codex/pyproject.toml
  • pyproject.toml
**/*.{yml,yaml,toml,lock}

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

For CI or packaging changes, use maintain-ci or maintain-packaging, then run recipes and checks whose behavior changed.

Files:

  • adapters/common/pyproject.toml
  • adapters/hermes/pyproject.toml
  • adapters/claude/pyproject.toml
  • Cargo.toml
  • adapters/deepagents/pyproject.toml
  • adapters/codex/pyproject.toml
  • pyproject.toml
{pyproject.toml,adapters/**/pyproject.toml}

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

{pyproject.toml,adapters/**/pyproject.toml}: Update the literal project.version in the root setuptools project and every adapter pyproject.toml.
Keep internal exact-version requirements aligned: root nemo-fabric-* == <version> optional dependencies and each adapter's nemo-fabric-adapters-common == <version> dependency.

Files:

  • adapters/common/pyproject.toml
  • adapters/hermes/pyproject.toml
  • adapters/claude/pyproject.toml
  • adapters/deepagents/pyproject.toml
  • adapters/codex/pyproject.toml
  • pyproject.toml
**/*.{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/pyproject.toml
  • adapters/hermes/pyproject.toml
  • adapters/claude/pyproject.toml
  • Cargo.toml
  • adapters/deepagents/pyproject.toml
  • tests/integrations/test_harbor_runner.py
  • adapters/codex/pyproject.toml
  • pyproject.toml
  • tests/python/test_harbor_integration.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/pyproject.toml
  • adapters/hermes/pyproject.toml
  • adapters/claude/pyproject.toml
  • Cargo.toml
  • adapters/deepagents/pyproject.toml
  • tests/integrations/test_harbor_runner.py
  • adapters/codex/pyproject.toml
  • pyproject.toml
  • tests/python/test_harbor_integration.py
**/*.{rs,py,html,md,mdx,toml,yaml,yml,sh,bash}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

All source files must include the specified SPDX copyright and Apache-2.0 license headers using the comment syntax appropriate to the file type.

Files:

  • adapters/common/pyproject.toml
  • adapters/hermes/pyproject.toml
  • adapters/claude/pyproject.toml
  • Cargo.toml
  • docs/integrations/harness/deepagents.mdx
  • examples/harbor/README.md
  • README.md
  • examples/harbor/swebench/README.md
  • adapters/deepagents/pyproject.toml
  • tests/integrations/test_harbor_runner.py
  • adapters/codex/pyproject.toml
  • pyproject.toml
  • tests/python/test_harbor_integration.py
adapters/*/{README.md,LICENSE,fabric-adapter.json,pyproject.toml,uv.lock,package.json,package-lock.json,src/**,tests/**}

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

Place each adapter under adapters/<name> with LICENSE -> ../../LICENSE, README.md, fabric-adapter.json, language-native package and lock files, a source entry point, and focused tests; Python adapters use the specified pyproject.toml, uv.lock, source path, and test naming convention.

Files:

  • adapters/common/pyproject.toml
  • adapters/hermes/pyproject.toml
  • adapters/claude/pyproject.toml
  • adapters/deepagents/pyproject.toml
  • adapters/codex/pyproject.toml
adapters/*/pyproject.toml

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

Keep published Python runtime dependencies razor-thin and adapter-owned; directly imported SDK/client libraries must be declared, while external-process harness dependencies must not be installed or upgraded and test-only dependencies belong in [dependency-groups].

Files:

  • adapters/common/pyproject.toml
  • adapters/hermes/pyproject.toml
  • adapters/claude/pyproject.toml
  • adapters/deepagents/pyproject.toml
  • adapters/codex/pyproject.toml
{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/pyproject.toml
  • adapters/hermes/pyproject.toml
  • adapters/claude/pyproject.toml
  • examples/harbor/README.md
  • examples/harbor/swebench/README.md
  • adapters/deepagents/pyproject.toml
  • adapters/codex/pyproject.toml
**/.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/do-not-merge.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/do-not-merge.yml
{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/do-not-merge.yml
  • Cargo.toml
  • pyproject.toml
{Cargo.toml,python/pyproject.toml,pyproject.toml}

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

Keep Rust workspace/package metadata and Python/maturin package metadata internally consistent, including package names, versions, import paths, and module names.

Files:

  • Cargo.toml
  • pyproject.toml
{Cargo.toml,Cargo.lock,pyproject.toml,uv.lock,python/pyproject.toml}

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

{Cargo.toml,Cargo.lock,pyproject.toml,uv.lock,python/pyproject.toml}: Keep workspace, Python, and lockfile dependency versions aligned where required, and review both direct and transitive dependency changes from resolved lockfiles.
Inspect resolved transitive licenses, explicitly surface UNKNOWN, non-SPDX/custom, proprietary, source-available, copyleft, or network-copyleft terms, and route unresolved licensing questions to dependency approvers with distribution and linkage context.
Document the functional need, alternatives considered, rationale for the selected dependency, and any unresolved licensing question when introducing dependencies.

Files:

  • Cargo.toml
  • pyproject.toml
{Cargo.toml,pyproject.toml,python/pyproject.toml}

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

Before adding a dependency, prefer the standard library, an existing dependency, or a small local implementation when appropriate; otherwise select a maintained, narrow-fit dependency with clear SPDX metadata and a permissive license where possible.

Files:

  • Cargo.toml
  • pyproject.toml
{Cargo.toml,Cargo.lock,pyproject.toml,uv.lock}

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

After updating manifests or lockfiles, run uv run --no-project python scripts/licensing/license_diff.py --base-ref origin/main and review added packages and license changes.

Files:

  • Cargo.toml
  • pyproject.toml
Cargo.toml

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

Cargo.toml: Use Cargo.toml [workspace.package].version as the source of truth for Rust workspace and Python build versioning.
Keep Cargo.toml [workspace.dependencies].nemo-fabric-core.version aligned with the workspace version.
Use valid Cargo SemVer in Cargo metadata and equivalent PEP 440 syntax in explicit Python metadata for prerelease or build-metadata versions.

Files:

  • Cargo.toml
{README.md,docs/**/*.{md,mdx,yml},examples/**/*.{md,mdx,yml}}

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

Keep package names, repository references, and build commands current in documentation and examples.

Files:

  • docs/integrations/harness/deepagents.mdx
  • examples/harbor/README.md
  • README.md
  • examples/harbor/swebench/README.md
{docs/**/*.{md,mdx,yml},examples/**/*.{md,mdx,yml}}

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

Update relevant getting-started, reference, adapter, and example documentation when the corresponding examples or adapters change.

Files:

  • docs/integrations/harness/deepagents.mdx
  • examples/harbor/README.md
  • examples/harbor/swebench/README.md
**/*.mdx

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

In MDX files, use JSX comment delimiters ({/* and */}) for top-of-file comments, including SPDX headers; do not use HTML comments.

Files:

  • docs/integrations/harness/deepagents.mdx
docs/**/*.{md,mdx,yml}

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

Run just docs when the documentation site changes.

Update user-facing Fern documentation, including docs/index.yml, when public behavior, the package, examples, or supported bindings change.

Files:

  • docs/integrations/harness/deepagents.mdx
**/*.{md,mdx,rst}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

**/*.{md,mdx,rst}: For NeMo Fabric documentation, verify technical claims against the current repository, public API, or documented command before reviewing style.
Always spell NVIDIA in all caps; do not use Nvidia, nvidia, or NV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text; avoid raw URLs and weak anchors such as here or read more.
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative, parallel steps; split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English while preserving necessary technical precision.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once, and prefer refer to over see when directing readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical documentation.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values; use numerals for 10 or greater and commas in thousands.
Do not add trademark symbols to learning-oriented documentation unless the source, platform, or legal guidance explicitly requires them.
Do not replace precise technical terms with simpler words when doing so would lose precision.
Do not flag passive voice when the actor is unknown or the action is the important part.
Do not rewrite API names, package names, command flags, or code literals for style.

**/*.{md,mdx,rst}: Use consistent title case for technical-document headings and table headers; avoid quotation marks, ampersands, and exclamation marks in headings, while preserving official product, event, research, and whitepaper title ...

Files:

  • docs/integrations/harness/deepagents.mdx
  • examples/harbor/README.md
  • README.md
  • examples/harbor/swebench/README.md
**/*.{md,mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

When public behavior, adapters, examples, or workspace structure changes, update the corresponding documentation, including relevant README files and SDK or API references.

**/*.{md,mdx}: Use the full product name NVIDIA NeMo Fabric on first use, typically in the title and H1; use NeMo Fabric thereafter. Use fabric alone only for the CLI tool and surround it with backticks.
Treat incorrect or stale commands, package names, paths, APIs, support claims, procedures, examples, terminology, or public behavior documentation as blocking issues.
Capitalize NVIDIA correctly and format code, commands, paths, and filenames as inline code where needed.
Use title case for technical-documentation headings.
Introduce code blocks, tables, and lists with complete lead-in sentences; ensure examples match current APIs and build commands.
Use descriptive anchor text, avoid raw URLs and generic labels such as here, and use repository-relative .mdx paths for links within docs/.
Prefer active voice, present tense, short sentences, plain English, consistent terminology, and imperative, parallel, scannable procedures.
Use after instead of once when expressing temporal sequence, and use can rather than may when describing possibility rather than permission.
Avoid ambiguous numeric dates and ordinal dates in body text.
For learning-oriented documentation, do not force trademark symbols unless the source document explicitly requires them.
When reporting documentation-review findings, lead with Must fix, Should fix, and Nice to have categories; include file path, line reference, current problem, rationale, and a concrete rewrite or direction.

Files:

  • docs/integrations/harness/deepagents.mdx
  • examples/harbor/README.md
  • README.md
  • examples/harbor/swebench/README.md
docs/**/*.mdx

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

docs/**/*.mdx: Use source-relative links with the target .mdx extension for links between files under docs/; do not use Fern site-root paths.
Use {/* ... */} delimiters for top-of-file MDX SPDX comments, not HTML comment delimiters.

Files:

  • docs/integrations/harness/deepagents.mdx
**/*.{md,mdx,yml,py,rs,sh}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)

Keep documentation aligned with current NeMo Fabric behavior, repository layout, entry points, commands, package names, APIs, bindings, and support claims.

Files:

  • docs/integrations/harness/deepagents.mdx
  • examples/harbor/README.md
  • README.md
  • examples/harbor/swebench/README.md
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_harbor_integration.py
{docs/**,README.md,AGENTS.md}

⚙️ CodeRabbit configuration file

{docs/**,README.md,AGENTS.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency with generated schemas.
For links between files under docs/, require paths relative to the source file with the target file's .mdx extension so they work in both Fern builds and repository browsers. Flag Fern site-root links such as NeMo Fabric overview; use the repository-relative equivalent, such as NeMo Fabric overview.

Files:

  • docs/integrations/harness/deepagents.mdx
  • README.md
{*.md,**/*.md,**/*.mdx,**/*.ipynb}

⚙️ CodeRabbit configuration file

{*.md,**/*.md,**/*.mdx,**/*.ipynb}: Enforce the product name in user-facing prose: use "NVIDIA NeMo Fabric" on first use and "NeMo Fabric" thereafter. Flag standalone capitalized "Fabric" when it refers to the product. Do not flag the lowercase fabric CLI command, package/import/crate names, code identifiers, API symbols, configuration keys, file paths, or unrelated generic uses of the word.

Files:

  • docs/integrations/harness/deepagents.mdx
  • examples/harbor/README.md
  • README.md
  • examples/harbor/swebench/README.md
**/*.{md,rst}

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

Update documentation and examples in the same branch as the public API change.

Files:

  • examples/harbor/README.md
  • README.md
  • examples/harbor/swebench/README.md
**/*.{md,rst,txt,adoc}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-language-mechanics.md)

**/*.{md,rst,txt,adoc}: For technical documentation, use professional, active, conversational, engaging, precise, and plain-English prose. Prefer active voice, present tense, short sentences, and scannable paragraphs. Avoid casual or imprecise language, swearing, threats, insults, jokes, puns, culture-specific idioms, marketing exaggeration, and unsupported third-party comparisons.
Use can for possibility and reserve may for permission; use after for temporal order; use refer to for cross-references; prefer short direct sentences and specific verbs; avoid unnecessary please in technical documentation.
Prefer active voice when the actor matters. Passive voice is acceptable when the actor is unknown or irrelevant, when the action or result is the focus, or in programmer documentation.
Use natural contractions in conversational technical prose, but do not force them in formal legal copy, API references, or generated text.
Prefer simpler English over Latinisms: use for example or such as instead of e.g., and so on instead of etc., that is instead of i.e., compared to instead of vs., and by, through, or using instead of via. Use industry-standard terms such as in silico, in vitro, and in vivo when appropriate, and italicize them in running text.
Use that without commas for essential clauses, and which with commas for nonessential clauses.
Format dates and times clearly: spell out months in body text; use forms such as June 12, 2025; avoid numeric or ordinal dates; capitalize days; use 12-hour time when appropriate; include a space before a.m. or p.m.; use ET and PT for needed time zones; avoid 24/7; and prefer from 12:30 to 1:00 p.m. for prose ranges.
Format numbers consistently: spell out zero through nine in body text, use numerals for 10 or greater and for technical values, use commas in thousands, do not begin a sentence with a numeral, spell out ordinals, and use numerals consistently within a category wh...

Files:

  • examples/harbor/README.md
  • README.md
  • examples/harbor/swebench/README.md
examples/{README.md,**/*}

📄 CodeRabbit inference engine (AGENTS.md)

Update examples documentation and relevant examples when public behavior, the package, or supported bindings change.

Files:

  • examples/harbor/README.md
  • examples/harbor/swebench/README.md
{README.md,docs/index.yml}

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

Update README.md or docs/index.yml when documentation entry points or example reading paths change.

Files:

  • README.md
README.md

📄 CodeRabbit inference engine (AGENTS.md)

Update the root README.md when public behavior, the nemo-fabric package (imported as nemo_fabric), examples, or supported bindings change.

Files:

  • README.md
**/*.{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/integrations/test_harbor_runner.py
  • tests/python/test_harbor_integration.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}: Use snake_case for functions and variables; use PascalCase for Rust types and Python classes.
Run the relevant Rust and Python test suites for every affected language surface; changes to the Rust core or public schemas require both suites.

Files:

  • tests/integrations/test_harbor_runner.py
  • tests/python/test_harbor_integration.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/integrations/test_harbor_runner.py
  • tests/python/test_harbor_integration.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/integrations/test_harbor_runner.py
  • tests/python/test_harbor_integration.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/integrations/test_harbor_runner.py
  • tests/python/test_harbor_integration.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/integrations/test_harbor_runner.py
  • tests/python/test_harbor_integration.py
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use type annotations for public Python APIs and keep native binding declarations synchronized with their Rust implementations.

Files:

  • tests/integrations/test_harbor_runner.py
  • tests/python/test_harbor_integration.py
**/*.{rs,py,json}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

When adding functionality, include tests in the corresponding Rust crate or relevant tests/ area; public contract changes must keep checked-in JSON Schema snapshots and native Python binding declarations synchronized.

Files:

  • tests/integrations/test_harbor_runner.py
  • tests/python/test_harbor_integration.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/integrations/test_harbor_runner.py
  • tests/python/test_harbor_integration.py
🪛 Ruff (0.16.0)
tests/python/test_harbor_integration.py

[warning] 357-357: Async functions should not use pathlib.Path methods, use trio.Path or anyio.path

(ASYNC240)

🔇 Additional comments (14)
.github/workflows/do-not-merge.yml (1)

1-25: LGTM!

Cargo.toml (1)

17-23: LGTM!

pyproject.toml (1)

12-12: LGTM!

Also applies to: 28-28, 41-49, 58-58

adapters/claude/pyproject.toml (1)

12-12: LGTM!

Also applies to: 28-28

adapters/codex/pyproject.toml (1)

12-12: LGTM!

Also applies to: 28-28

docs/integrations/harness/deepagents.mdx (1)

34-40: LGTM!

examples/harbor/README.md (1)

68-77: LGTM!

examples/harbor/swebench/README.md (1)

25-30: LGTM!

adapters/common/pyproject.toml (1)

12-12: LGTM!

adapters/deepagents/pyproject.toml (1)

12-12: LGTM!

Also applies to: 28-28

adapters/hermes/pyproject.toml (1)

12-12: LGTM!

Also applies to: 29-29

README.md (1)

151-153: LGTM!

Also applies to: 170-170, 179-179

tests/integrations/test_harbor_runner.py (1)

300-302: LGTM!

Also applies to: 323-325, 334-334

tests/python/test_harbor_integration.py (1)

10-10: LGTM!

Also applies to: 377-377

@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.

Caution

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

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 `@tests/python/test_harbor_integration.py`:
- Around line 357-363: Move the pyproject.toml version lookup using
Path.resolve, Path.open, and tomllib.load out of
test_harbor_structured_package_install_is_shell_safe, loading package_version
once at module scope or before the async test begins. Reuse that value when
constructing fabric_package, keeping the existing package-version source and
dependency format unchanged.
🪄 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: 466d0190-acc4-4dc9-9e1b-4169e1094c4a

📥 Commits

Reviewing files that changed from the base of the PR and between 4245880 and 32c241a.

⛔ Files ignored due to path filters (7)
  • Cargo.lock is excluded by !**/*.lock
  • adapters/claude/uv.lock is excluded by !**/*.lock
  • adapters/codex/uv.lock is excluded by !**/*.lock
  • adapters/common/uv.lock is excluded by !**/*.lock
  • adapters/deepagents/uv.lock is excluded by !**/*.lock
  • adapters/hermes/uv.lock is excluded by !**/*.lock
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (14)
  • .github/workflows/do-not-merge.yml
  • Cargo.toml
  • README.md
  • adapters/claude/pyproject.toml
  • adapters/codex/pyproject.toml
  • adapters/common/pyproject.toml
  • adapters/deepagents/pyproject.toml
  • adapters/hermes/pyproject.toml
  • docs/integrations/harness/deepagents.mdx
  • examples/harbor/README.md
  • examples/harbor/swebench/README.md
  • pyproject.toml
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_harbor_integration.py
📜 Review details
🔇 Additional comments (14)
.github/workflows/do-not-merge.yml (1)

1-25: LGTM!

Cargo.toml (1)

17-23: LGTM!

pyproject.toml (1)

12-12: LGTM!

Also applies to: 28-28, 41-49, 58-58

adapters/claude/pyproject.toml (1)

12-12: LGTM!

Also applies to: 28-28

adapters/codex/pyproject.toml (1)

12-12: LGTM!

Also applies to: 28-28

docs/integrations/harness/deepagents.mdx (1)

34-40: LGTM!

examples/harbor/README.md (1)

68-77: LGTM!

examples/harbor/swebench/README.md (1)

25-30: LGTM!

adapters/common/pyproject.toml (1)

12-12: LGTM!

adapters/deepagents/pyproject.toml (1)

12-12: LGTM!

Also applies to: 28-28

adapters/hermes/pyproject.toml (1)

12-12: LGTM!

Also applies to: 29-29

README.md (1)

151-153: LGTM!

Also applies to: 170-170, 179-179

tests/integrations/test_harbor_runner.py (1)

300-302: LGTM!

Also applies to: 323-325, 334-334

tests/python/test_harbor_integration.py (1)

10-10: LGTM!

Also applies to: 377-377

🛑 Comments failed to post (1)
tests/python/test_harbor_integration.py (1)

357-363: 🚀 Performance & Scalability | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

python3 - <<'PY'
from pathlib import Path
p = Path('tests/python/test_harbor_integration.py')
for start, end in [(330, 390)]:
    print(p)
    with p.open() as f:
        for i, line in enumerate(f, 1):
            if start <= i <= end:
                print(f"{i}: {line.rstrip()}")
PY

Repository: NVIDIA/NeMo-Fabric

Length of output: 2707


🏁 Script executed:

rg -n "ASYNC240|Path\.resolve\(\)|\.open\(\"rb\"\)|aiofiles|async with .*open|await .*open\(" tests python -g '!**/__pycache__/**'

Repository: NVIDIA/NeMo-Fabric

Length of output: 797


Move the package-version lookup out of the async test

Path.resolve() and Path.open("rb") here do synchronous I/O inside test_harbor_structured_package_install_is_shell_safe, which can block the async runner and triggers ASYNC240. Load pyproject.toml once at module scope or before entering the async test.

🧰 Tools
🪛 Ruff (0.16.0)

[warning] 357-357: Async functions should not use pathlib.Path methods, use trio.Path or anyio.path

(ASYNC240)

🤖 Prompt for 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.

In `@tests/python/test_harbor_integration.py` around lines 357 - 363, Move the
pyproject.toml version lookup using Path.resolve, Path.open, and tomllib.load
out of test_harbor_structured_package_install_is_shell_safe, loading
package_version once at module scope or before the async test begins. Reuse that
value when constructing fabric_package, keeping the existing package-version
source and dependency format unchanged.

Source: Linters/SAST tools

@zhongxuanwang-nv
zhongxuanwang-nv marked this pull request as ready for review July 30, 2026 21:23
@zhongxuanwang-nv
zhongxuanwang-nv requested a review from a team as a code owner July 30, 2026 21:23
@zhongxuanwang-nv zhongxuanwang-nv self-assigned this Jul 30, 2026
@zhongxuanwang-nv zhongxuanwang-nv added this to the 0.2 milestone Jul 30, 2026
@zhongxuanwang-nv zhongxuanwang-nv changed the title ci: block merging labeled pull requests ci: make Do Not Merge tag actually block merging Jul 30, 2026

@AnuradhaKaruppiah AnuradhaKaruppiah left a comment

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.

Thank you for this much needed change!

@zhongxuanwang-nv

Copy link
Copy Markdown
Member Author

/merge

@rapids-bot
rapids-bot Bot merged commit cfb87c7 into NVIDIA:main Jul 31, 2026
32 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