Skip to content

fix(relay): harden artifact collection - #133

Merged
rapids-bot[bot] merged 14 commits into
NVIDIA:release/0.1from
bbednarski9:fix/relay-artifact-collection-hardening
Jul 28, 2026
Merged

fix(relay): harden artifact collection#133
rapids-bot[bot] merged 14 commits into
NVIDIA:release/0.1from
bbednarski9:fix/relay-artifact-collection-hardening

Conversation

@bbednarski9

@bbednarski9 bbednarski9 commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Overview

Fix Relay artifact discovery so it follows configured sink filenames and templates instead of reporting every matching file in an output directory.

  • 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

  • Honor a valid configured ATOF file-sink filename.
  • Restrict ATIF discovery using its configured filename_template, treating non-placeholder characters literally.
  • Reject absolute or traversing artifact names and resolved artifacts outside their configured directory.
  • Ignore malformed, missing, and non-file paths.
  • Preserve the existing glob fallback when an ATOF filename is absent or is not a string.
  • Canonicalize reported artifact paths so equivalent filesystem paths are represented consistently.
  • Keep release-branch package versions at 0.1.0.
  • Compare generated scaffold dependency paths by filesystem identity so valid Windows extended paths do not fail CI.

Fabric-managed configurations already scope output directories by runtime. The primary correction is therefore for user-supplied output directories that are shared or pre-populated, where the previous broad globs could report unrelated JSONL or JSON files.

Canonicalization is an observable output change: when an output directory is a symlink, reported artifacts use their resolved paths rather than the configured symlink paths.

Legacy Relay observability configuration remains supported and is normalized to the component-based schema.

Validation:

  • Focused Relay artifact tests: 13 passed
  • Scaffold end-to-end tests: 3 passed
  • Complete Python suite: 484 passed, 43 skipped
  • cargo check -p fabric-python --locked: passed
  • Python build: passed
  • Full pre-commit suite: passed
  • GitHub Actions: 24/24 checks passed

Where should the reviewer start?

Start with collect_relay_artifacts() and its private path-validation helpers in adapters/common/src/nemo_fabric_adapters/common/utils.py. The corresponding cases in tests/adapters/test_adapaters_common_utils.py cover configured and missing filenames, literal ATIF templates, non-file entries, resolution failure scenarios, malformed/path-traversal inputs, glob fallback, and path containment.

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

  • None

dagardner-nv and others added 7 commits July 27, 2026 08:23
Signed-off-by: David Gardner <dagardner@nvidia.com>
Forward-merge release/0.1 into main
Forward-merge release/0.1 into main
Forward-merge release/0.1 into main
Forward-merge release/0.1 into main
Forward-merge release/0.1 into main
Forward-merge release/0.1 into main
@copy-pr-bot

copy-pr-bot Bot commented Jul 28, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Relay artifact collection now strictly resolves configured directories and files, confines candidates to those directories, supports configured ATOF filenames and ATIF templates, and validates these behaviors with focused tests.

Changes

Relay artifact validation

Layer / File(s) Summary
Strict artifact collection
adapters/common/src/nemo_fabric_adapters/common/utils.py
collect_relay_artifacts validates configured directories and candidate files, rejects paths outside those directories, supports explicit ATOF filenames, and derives ATIF glob patterns from validated templates.
Collection behavior coverage
tests/adapters/test_adapaters_common_utils.py, tests/adapters/test_claude_adapter.py
Tests cover explicit and non-string ATOF filename handling, invalid ATIF templates, missing or malformed paths, path traversal rejection, resolution failures, unrelated filesystem entries, and explicit ATIF template configuration.

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

🚥 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 Matches Conventional Commits and summarizes the artifact-collection hardening.
Description check ✅ Passed Mostly matches the template, but Related Issues is left as 'None' instead of a Closes/Fixes/Resolves/Relates to reference.
✨ 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: 3

🤖 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 `@adapters/common/src/nemo_fabric_adapters/common/utils.py`:
- Around line 275-289: Update artifact_directory and artifact_file to handle all
path-resolution failures, including TypeError from malformed values and
RuntimeError from symlink loops, while preserving the existing None return
behavior. Ensure invalid or unresolved artifact paths return None instead of
propagating exceptions.
- Around line 284-289: Update artifact_file and the ATOF/ATIF collection paths
to resolve the configured output directory and candidate path, then reject
candidates whose resolved path is not contained within that directory. This must
block absolute filenames, parent-directory traversal, and symlinks targeting
files outside the artifact root while preserving valid in-directory files.

In `@tests/adapters/test_adapaters_common_utils.py`:
- Around line 430-459: Extend
test_collect_relay_artifacts_honors_configured_atof_filename with parametrized
negative cases for a configured filename that does not exist and one that
resolves to a directory. Assert collect_relay_artifacts returns no artifact for
both invalid paths, while preserving the existing assertion for a valid file.
🪄 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: ad008855-bacc-48ce-80cf-fc75e2a8fac6

📥 Commits

Reviewing files that changed from the base of the PR and between d63d5b2 and db512ae.

📒 Files selected for processing (2)
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/adapters/test_adapaters_common_utils.py
📜 Review details
⏰ Context from checks skipped due to timeout. (17)
  • GitHub Check: Test (Python 3.11, windows-amd64)
  • GitHub Check: Test (Python 3.11, macos-arm64)
  • GitHub Check: Test (Python 3.13, windows-amd64)
  • GitHub Check: Test (Python 3.13, linux-arm64)
  • GitHub Check: Test (Python 3.13, macos-arm64)
  • GitHub Check: Test (Python 3.14, linux-arm64)
  • GitHub Check: Test (Python 3.12, linux-arm64)
  • GitHub Check: Test (Python 3.12, linux-amd64)
  • GitHub Check: Test (Python 3.12, windows-amd64)
  • GitHub Check: Pre-commit
  • GitHub Check: Test (Python 3.11, linux-arm64)
  • GitHub Check: Test (Python 3.11, linux-amd64)
  • GitHub Check: Test (Python 3.12, macos-arm64)
  • GitHub Check: Test (Python 3.14, macos-arm64)
  • GitHub Check: Test (Python 3.14, linux-amd64)
  • GitHub Check: Test (Python 3.14, windows-amd64)
  • GitHub Check: Test (Python 3.13, linux-amd64)
⚠️ CI failures not shown inline (6)

GitHub Actions: Rust / Test (arm64): fix(relay): harden artifact collection

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): fix(relay): harden artifact collection

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): fix(relay): harden artifact collection

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 / 0_Test (x86_64).txt: fix(relay): harden artifact collection

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): fix(relay): harden artifact collection

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: fix(relay): harden artifact collection

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 (15)
**/*.{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/adapters/test_adapaters_common_utils.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.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/adapters/test_adapaters_common_utils.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.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:

  • tests/adapters/test_adapaters_common_utils.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.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/adapters/test_adapaters_common_utils.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.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/adapters/test_adapaters_common_utils.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
tests/adapters/**/*.py

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

tests/adapters/**/*.py: If an adapter or integration changes, run its focused tests.
For adapter behavior changes, run focused adapter tests under tests/adapters, then run just test-python.

Files:

  • tests/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.py
  • 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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.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/adapters/test_adapaters_common_utils.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.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/adapters/test_adapaters_common_utils.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use type annotations for public Python APIs.

Files:

  • tests/adapters/test_adapaters_common_utils.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.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/adapters/test_adapaters_common_utils.py
  • adapters/common/src/nemo_fabric_adapters/common/utils.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/adapters/test_adapaters_common_utils.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
🪛 Ruff (0.15.21)
adapters/common/src/nemo_fabric_adapters/common/utils.py

[warning] 275-275: Dynamically typed expressions (typing.Any) are disallowed in value

(ANN401)

Comment thread adapters/common/src/nemo_fabric_adapters/common/utils.py Outdated
Comment thread adapters/common/src/nemo_fabric_adapters/common/utils.py Outdated
Comment thread tests/adapters/test_adapaters_common_utils.py Outdated
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
@bbednarski9
bbednarski9 force-pushed the fix/relay-artifact-collection-hardening branch from db512ae to 6a50596 Compare July 28, 2026 03:14

@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: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
adapters/common/src/nemo_fabric_adapters/common/utils.py (1)

310-352: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider extracting per-kind collection to reduce branch count.

Ruff flags this function for exceeding the branch-count threshold (14 > 12). Splitting the ATOF and ATIF blocks into dedicated helpers (e.g. _collect_atof_artifacts, _collect_atif_artifacts) would reduce cyclomatic complexity and make each kind independently testable.

🤖 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 `@adapters/common/src/nemo_fabric_adapters/common/utils.py` around lines 310 -
352, The function collect_relay_artifacts exceeds the branch-count threshold
because it handles both ATOF and ATIF collection inline. Extract the respective
logic into dedicated helpers such as _collect_atof_artifacts and
_collect_atif_artifacts, then have collect_relay_artifacts delegate to them
while preserving the existing filtering, path validation, and artifact output
behavior.

Source: Linters/SAST tools

🤖 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 `@adapters/common/src/nemo_fabric_adapters/common/utils.py`:
- Around line 274-291: Confirm the package’s minimum supported Python version
via its requires-python configuration. If it supports versions before 3.13,
update both _artifact_directory and _artifact_file to catch RuntimeError from
Path.resolve(strict=True), preserving the existing None return behavior for
invalid paths; otherwise leave the exception handling unchanged.
- Line 274: Update the parameter annotations of both helpers, including
_artifact_directory and the helper at the referenced second location, to avoid
Ruff ANN401 while preserving support for any JSON-compatible configuration
value. Prefer object with internal type narrowing or casting; use a targeted
ANN401 suppression only if the existing implementation requires Any.

In `@tests/adapters/test_adapaters_common_utils.py`:
- Around line 441-464: The reusable _atof_artifact_config test helper should
become a pytest factory fixture. Define it as a fixture that returns a callable
producing the same configuration, then update all four tests to request the
fixture through injection and invoke the returned factory instead of directly
calling or importing the helper.
- Around line 467-490: Add a negative test alongside
test_collect_relay_artifacts_honors_configured_atof_filename that configures an
explicit filename pointing to a directory, then assert collect_relay_artifacts
returns an empty list. Exercise the direct filename branch using
_atof_artifact_config and a directory created under the temporary ATOF
directory, preserving the existing behavior for valid files.

---

Outside diff comments:
In `@adapters/common/src/nemo_fabric_adapters/common/utils.py`:
- Around line 310-352: The function collect_relay_artifacts exceeds the
branch-count threshold because it handles both ATOF and ATIF collection inline.
Extract the respective logic into dedicated helpers such as
_collect_atof_artifacts and _collect_atif_artifacts, then have
collect_relay_artifacts delegate to them while preserving the existing
filtering, path validation, and artifact output behavior.
🪄 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: 5e380071-3d82-4d37-851b-35bf3995ff03

📥 Commits

Reviewing files that changed from the base of the PR and between db512ae and 6a50596.

📒 Files selected for processing (2)
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/adapters/test_adapaters_common_utils.py
📜 Review details
⏰ Context from checks skipped due to timeout. (17)
  • GitHub Check: Test (Python 3.12, linux-amd64)
  • GitHub Check: Test (Python 3.11, windows-amd64)
  • GitHub Check: Test (Python 3.14, macos-arm64)
  • GitHub Check: Test (Python 3.13, linux-amd64)
  • GitHub Check: Test (Python 3.12, linux-arm64)
  • GitHub Check: Test (Python 3.12, macos-arm64)
  • GitHub Check: Test (Python 3.11, linux-arm64)
  • GitHub Check: Pre-commit
  • GitHub Check: Test (Python 3.13, windows-amd64)
  • GitHub Check: Test (Python 3.13, macos-arm64)
  • GitHub Check: Test (Python 3.14, windows-amd64)
  • GitHub Check: Test (Python 3.14, linux-amd64)
  • GitHub Check: Test (Python 3.14, linux-arm64)
  • GitHub Check: Test (Python 3.12, windows-amd64)
  • GitHub Check: Test (Python 3.11, macos-arm64)
  • GitHub Check: Test (Python 3.13, linux-arm64)
  • GitHub Check: Test (Python 3.11, linux-amd64)
⚠️ CI failures not shown inline (6)

GitHub Actions: Rust / Test (x86_64): fix(relay): harden artifact collection

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): fix(relay): harden artifact collection

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): fix(relay): harden artifact collection

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: fix(relay): harden artifact collection

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: fix(relay): harden artifact collection

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): fix(relay): harden artifact collection

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 (15)
**/*.{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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/**/*.py

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

tests/adapters/**/*.py: If an adapter or integration changes, run its focused tests.
For adapter behavior changes, run focused adapter tests under tests/adapters, then run just test-python.

Files:

  • tests/adapters/test_adapaters_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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.py
🪛 Ruff (0.15.21)
adapters/common/src/nemo_fabric_adapters/common/utils.py

[warning] 274-274: Dynamically typed expressions (typing.Any) are disallowed in value

(ANN401)


[warning] 284-284: Dynamically typed expressions (typing.Any) are disallowed in value

(ANN401)


[warning] 310-310: Too many branches (14 > 12)

(PLR0912)

🔇 Additional comments (2)
adapters/common/src/nemo_fabric_adapters/common/utils.py (1)

294-307: LGTM!

tests/adapters/test_adapaters_common_utils.py (1)

11-11: LGTM!

Also applies to: 373-413, 400-404, 492-527

Comment thread adapters/common/src/nemo_fabric_adapters/common/utils.py
Comment thread adapters/common/src/nemo_fabric_adapters/common/utils.py
Comment thread tests/adapters/test_adapaters_common_utils.py
Comment thread tests/adapters/test_adapaters_common_utils.py
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
@bbednarski9
bbednarski9 marked this pull request as ready for review July 28, 2026 04:24
@bbednarski9
bbednarski9 requested a review from a team as a code owner July 28, 2026 04:24

@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: 2

🤖 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/adapters/test_adapaters_common_utils.py`:
- Around line 512-514: Update the resolve function’s loop branch to raise
RuntimeError without an inline message, preserving the existing exception type
and control flow.
- Around line 504-525: Extend
test_collect_relay_artifacts_ignores_path_resolution_runtime_errors to include
an ATIF configuration whose output directory or candidate path is named “loop”
and triggers the patched Path.resolve RuntimeError. Assert
common_utils.collect_relay_artifacts returns an empty list for this ATIF case,
while preserving the existing ATOF assertions.
🪄 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: 5586d627-7935-4916-9b47-f39fcecf1280

📥 Commits

Reviewing files that changed from the base of the PR and between 6a50596 and 4d966d3.

📒 Files selected for processing (2)
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/adapters/test_adapaters_common_utils.py
📜 Review details
⏰ Context from checks skipped due to timeout. (17)
  • GitHub Check: Test (Python 3.14, windows-amd64)
  • GitHub Check: Test (Python 3.13, windows-amd64)
  • GitHub Check: Test (Python 3.14, linux-amd64)
  • GitHub Check: Test (Python 3.11, windows-amd64)
  • GitHub Check: Test (Python 3.12, windows-amd64)
  • GitHub Check: Test (Python 3.11, macos-arm64)
  • GitHub Check: Test (Python 3.11, linux-arm64)
  • GitHub Check: Test (Python 3.12, linux-arm64)
  • GitHub Check: Test (Python 3.13, macos-arm64)
  • GitHub Check: Test (Python 3.13, linux-arm64)
  • GitHub Check: Test (Python 3.12, linux-amd64)
  • GitHub Check: Test (Python 3.14, macos-arm64)
  • GitHub Check: Test (Python 3.14, linux-arm64)
  • GitHub Check: Test (Python 3.12, macos-arm64)
  • GitHub Check: Test (Python 3.13, linux-amd64)
  • GitHub Check: Test (Python 3.11, linux-amd64)
  • GitHub Check: Pre-commit
⚠️ CI failures not shown inline (6)

GitHub Actions: Rust / Test (x86_64): fix(relay): harden artifact collection

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): fix(relay): harden artifact collection

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): fix(relay): harden artifact collection

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): fix(relay): harden artifact collection

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: fix(relay): harden artifact collection

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: fix(relay): harden artifact collection

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 (15)
**/*.{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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/**/*.py

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

tests/adapters/**/*.py: If an adapter or integration changes, run its focused tests.
For adapter behavior changes, run focused adapter tests under tests/adapters, then run just test-python.

Files:

  • tests/adapters/test_adapaters_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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.py
🪛 Ruff (0.15.21)
adapters/common/src/nemo_fabric_adapters/common/utils.py

[warning] 284-284: Dynamically typed expressions (typing.Any) are disallowed in value

(ANN401)

tests/adapters/test_adapaters_common_utils.py

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

(TRY003)

🔇 Additional comments (4)
adapters/common/src/nemo_fabric_adapters/common/utils.py (2)

284-284: Address the existing Ruff ANN401 finding.

_artifact_file(value: Any, ...) still triggers ANN401; use object with narrowing or a targeted suppression. This repeats the previous review finding.

Source: Linters/SAST tools


279-281: LGTM!

Also applies to: 285-291, 322-337, 338-351

tests/adapters/test_adapaters_common_utils.py (2)

441-464: Use a fixture factory for shared test setup.

_atof_artifact_config is reused across tests but remains a plain helper. Convert it to a pytest factory fixture and inject it into the affected tests.

Source: Coding guidelines


373-381: LGTM!

Also applies to: 400-404, 467-479, 492-502, 539-548, 550-563

Comment thread tests/adapters/test_adapaters_common_utils.py
Comment thread tests/adapters/test_adapaters_common_utils.py Outdated

@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 `@adapters/common/src/nemo_fabric_adapters/common/utils.py`:
- Around line 342-347: Update the ATIF collection logic around filename_template
so globbing occurs only when atif.get("filename_template") is a non-empty
string; when absent, empty, or non-string, skip ATIF collection instead of using
a "*.json" fallback. Add regression coverage for absent and non-string
templates.
🪄 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: acb4ab4c-5333-4711-8ccf-8d039c568057

📥 Commits

Reviewing files that changed from the base of the PR and between d63d5b2 and 4d966d3.

📒 Files selected for processing (2)
  • adapters/common/src/nemo_fabric_adapters/common/utils.py
  • tests/adapters/test_adapaters_common_utils.py
📜 Review details
⚠️ CI failures not shown inline (45)

GitHub Actions: Check / Pre-commit: fix(relay): harden artifact collection

Conclusion: failure

View job details

##[group]Run uv run --no-sync pre-commit run --all-files --show-diff-on-failure
 �[36;1muv run --no-sync pre-commit run --all-files --show-diff-on-failure�[0m
 shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
 env:
   UV_PYTHON_INSTALL_DIR: /home/runner/work/_temp/uv-python-dir
   UV_CACHE_DIR: /home/runner/work/_temp/setup-uv-cache
   GOTOOLCHAIN: local
   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
 ##[endgroup]
 [INFO] Initializing environment for https://github.com/astral-sh/ruff-pre-commit.
 [INFO] Initializing environment for https://github.com/rhysd/actionlint.
 [INFO] Installing environment for https://github.com/astral-sh/ruff-pre-commit.
 [INFO] Once installed this environment will be reused.
 [INFO] This may take a few minutes...
 [INFO] Installing environment for https://github.com/rhysd/actionlint.
 [INFO] Once installed this environment will be reused.
 [INFO] This may take a few minutes...
 copyright header.........................................................Passed
 ruff check...............................................................Passed
 Lint GitHub Actions workflow files.......................................Passed
 Cargo.lock is up to date.................................................Passed
 uv lockfiles are up to date..............................................Passed
 ATTRIBUTIONS-Rust.md (Cargo.lock)........................................Passed
 ATTRIBUTIONS-Python.md (uv.lock).........................................Passed
 Dependency license diff..................................................Failed
 - hook id: license-diff
 - exit code: 1
 [license-diff] selected languages: rust, python
 [license-diff] generating current inventory
 [license-diff] current: generating Rust inventory
 [license-diff] current: Rust inventory complete (35 packages)...

GitHub Actions: Check / Pre-commit: fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Check / 0_Pre-commit.txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Rust / 1_Test (arm64).txt: fix(relay): harden artifact collection

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): fix(relay): harden artifact collection

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 / 0_Test (x86_64).txt: fix(relay): harden artifact collection

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): fix(relay): harden artifact collection

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): fix(relay): harden artifact collection

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): fix(relay): harden artifact collection

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: Python / Test (Python 3.14, windows-amd64): fix(relay): harden artifact collection

Conclusion: failure

View job details

##[group]Run Set-StrictMode -Version Latest
 �[36;1mSet-StrictMode -Version Latest�[0m
 �[36;1m$remove_env = @('ENV','BASH_ENV','CDPATH','SHELLOPTS','BASHOPTS','BASH_FUNC_*')�[0m
 �[36;1mforeach ($name in $remove_env) {�[0m
 �[36;1m  if (Test-Path "Env:$name") { Remove-Item "Env:\$name" }�[0m
 �[36;1m}�[0m
 �[36;1mfor ($i=1; $i -le 10; $i++) {�[0m
 �[36;1m  $prev_err_action = $ErrorActionPreference�[0m
 �[36;1m  $ErrorActionPreference = "Continue"�[0m
 �[36;1m  & bash --noprofile --norc "$env:GITHUB_ACTION_PATH\main.sh"�[0m
 �[36;1m  $code = $LASTEXITCODE�[0m
 �[36;1m  $ErrorActionPreference = "$prev_err_action"�[0m
 �[36;1m  if (Test-Path "$env:USERPROFILE\.install-action\init") {�[0m
 �[36;1m    # If bash started successfully, main.sh creates init file.�[0m
 �[36;1m    Remove-Item "$env:USERPROFILE\.install-action\init" -Force�[0m
 �[36;1m    exit $code�[0m
 �[36;1m  }�[0m
 �[36;1m  if ($i -lt 10) {�[0m
 �[36;1m    Write-Output "::warning::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); retrying..."�[0m
 �[36;1m  }�[0m
 �[36;1m}�[0m
 �[36;1mWrite-Output "::error::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); this maybe resolved by re-running job"�[0m

GitHub Actions: Python / Test (Python 3.14, windows-amd64): fix(relay): harden artifact collection

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1mjust test-python�[0m
 shell: C:\Program Files\Git\bin\bash.EXE --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
   UV_TOOL_BIN_DIR: D:\a\_temp\uv-tool-bin-dir
   UV_TOOL_DIR: D:\a\_temp\uv-tool-dir
   UV_PYTHON_INSTALL_DIR: D:\a\_temp\uv-python-dir
   UV_CACHE_DIR: D:\a\_temp\setup-uv-cache
   CACHE_ON_FAILURE: false
 ##[endgroup]
 Resolved 191 packages in 4ms
 Checked 139 packages in 5ms
 ============================= test session starts =============================
 platform win32 -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0
 rootdir: D:\a\NeMo-Fabric\NeMo-Fabric
 configfile: pyproject.toml
 plugins: anyio-4.14.0, langsmith-0.10.1, asyncio-1.4.0, cov-7.1.0
 asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=session, asyncio_default_test_loop_scope=function
 collected 520 items / 2 skipped
 tests\adapters\test_adapaters_common_utils.py .......................... [  5%]
 .....................                                                    [  9%]
 tests\adapters\test_adapters_common_lifecycle.py .........               [ 10%]
 tests\adapters\test_adapters_common_relay_gateway.py ...............     [ 13%]
 tests\adapters\test_adapters_common_relay_hooks.py ....                  [ 14%]
 tests\adapters\test_claude_adapter.py .................................. [ 20%]
 ............                                                             [ 23%]
 tests\adapters\test_codex_adapter.py ................................... [ 30%]
 ...............                                                          [ 32%]
 tests\adapters\test_deepagents.py ...................................... [ 40%]
 ...                                                                      [ 40...

GitHub Actions: Python / Test (Python 3.14, linux-amd64): fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / Test (Python 3.13, windows-amd64): fix(relay): harden artifact collection

Conclusion: failure

View job details

##[group]Run Set-StrictMode -Version Latest
 �[36;1mSet-StrictMode -Version Latest�[0m
 �[36;1m$remove_env = @('ENV','BASH_ENV','CDPATH','SHELLOPTS','BASHOPTS','BASH_FUNC_*')�[0m
 �[36;1mforeach ($name in $remove_env) {�[0m
 �[36;1m  if (Test-Path "Env:$name") { Remove-Item "Env:\$name" }�[0m
 �[36;1m}�[0m
 �[36;1mfor ($i=1; $i -le 10; $i++) {�[0m
 �[36;1m  $prev_err_action = $ErrorActionPreference�[0m
 �[36;1m  $ErrorActionPreference = "Continue"�[0m
 �[36;1m  & bash --noprofile --norc "$env:GITHUB_ACTION_PATH\main.sh"�[0m
 �[36;1m  $code = $LASTEXITCODE�[0m
 �[36;1m  $ErrorActionPreference = "$prev_err_action"�[0m
 �[36;1m  if (Test-Path "$env:USERPROFILE\.install-action\init") {�[0m
 �[36;1m    # If bash started successfully, main.sh creates init file.�[0m
 �[36;1m    Remove-Item "$env:USERPROFILE\.install-action\init" -Force�[0m
 �[36;1m    exit $code�[0m
 �[36;1m  }�[0m
 �[36;1m  if ($i -lt 10) {�[0m
 �[36;1m    Write-Output "::warning::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); retrying..."�[0m
 �[36;1m  }�[0m
 �[36;1m}�[0m
 �[36;1mWrite-Output "::error::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); this maybe resolved by re-running job"�[0m

GitHub Actions: Python / Test (Python 3.12, windows-amd64): fix(relay): harden artifact collection

Conclusion: failure

View job details

##[group]Run Set-StrictMode -Version Latest
 �[36;1mSet-StrictMode -Version Latest�[0m
 �[36;1m$remove_env = @('ENV','BASH_ENV','CDPATH','SHELLOPTS','BASHOPTS','BASH_FUNC_*')�[0m
 �[36;1mforeach ($name in $remove_env) {�[0m
 �[36;1m  if (Test-Path "Env:$name") { Remove-Item "Env:\$name" }�[0m
 �[36;1m}�[0m
 �[36;1mfor ($i=1; $i -le 10; $i++) {�[0m
 �[36;1m  $prev_err_action = $ErrorActionPreference�[0m
 �[36;1m  $ErrorActionPreference = "Continue"�[0m
 �[36;1m  & bash --noprofile --norc "$env:GITHUB_ACTION_PATH\main.sh"�[0m
 �[36;1m  $code = $LASTEXITCODE�[0m
 �[36;1m  $ErrorActionPreference = "$prev_err_action"�[0m
 �[36;1m  if (Test-Path "$env:USERPROFILE\.install-action\init") {�[0m
 �[36;1m    # If bash started successfully, main.sh creates init file.�[0m
 �[36;1m    Remove-Item "$env:USERPROFILE\.install-action\init" -Force�[0m
 �[36;1m    exit $code�[0m
 �[36;1m  }�[0m
 �[36;1m  if ($i -lt 10) {�[0m
 �[36;1m    Write-Output "::warning::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); retrying..."�[0m
 �[36;1m  }�[0m
 �[36;1m}�[0m
 �[36;1mWrite-Output "::error::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); this maybe resolved by re-running job"�[0m

GitHub Actions: Python / Test (Python 3.12, windows-amd64): fix(relay): harden artifact collection

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1mjust test-python�[0m
 shell: C:\Program Files\Git\bin\bash.EXE --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
   UV_TOOL_BIN_DIR: D:\a\_temp\uv-tool-bin-dir
   UV_TOOL_DIR: D:\a\_temp\uv-tool-dir
   UV_PYTHON_INSTALL_DIR: D:\a\_temp\uv-python-dir
   UV_CACHE_DIR: D:\a\_temp\setup-uv-cache
   CACHE_ON_FAILURE: false
 ##[endgroup]
 Resolved 191 packages in 3ms
 Uninstalled 21 packages in 146ms
  - concurrent-log-handler==0.9.29
  - croniter==6.0.0
  - fire==0.7.1
  - hermes-agent==0.17.0
  - httptools==0.8.0
  - markdown==3.10.2
  - pillow==12.2.0
  - portalocker==3.2.0
  - prompt-toolkit==3.0.52
  - psutil==7.2.2
  - python-dateutil==2.9.0.post0
  - pytz==2026.2
  - pywinpty==2.0.15
  - ruamel-yaml==0.18.17
  - ruamel-yaml-clib==0.2.15
  - six==1.17.0
  - socksio==1.0.0
  - termcolor==3.3.0
  - tzdata==2025.3
  - watchfiles==1.2.0
  - wcwidth==0.8.1
 ============================= test session starts =============================
 platform win32 -- Python 3.12.10, pytest-9.1.1, pluggy-1.6.0
 rootdir: D:\a\NeMo-Fabric\NeMo-Fabric
 configfile: pyproject.toml
 plugins: anyio-4.14.0, langsmith-0.10.1, asyncio-1.4.0, cov-7.1.0
 asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=session, asyncio_default_test_loop_scope=function
 collected 523 items
 tests\adapters\test_adapaters_common_utils.py .......................... [  4%]
 .....................                                                    [  8%]
 tests\adapters\test_adapters_common_lifecycle.py .........               [ 10%]
 tests\adapters\test_adapters_common_relay_gateway.py ...............     [ 13%]
 tests\adapters\test_adapters_common_relay_hooks.py ....                  [ 14%]
 tests\adapters\test_cl...

GitHub Actions: Python / Test (Python 3.13, windows-amd64): fix(relay): harden artifact collection

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1mjust test-python�[0m
 shell: C:\Program Files\Git\bin\bash.EXE --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
   UV_TOOL_BIN_DIR: D:\a\_temp\uv-tool-bin-dir
   UV_TOOL_DIR: D:\a\_temp\uv-tool-dir
   UV_PYTHON_INSTALL_DIR: D:\a\_temp\uv-python-dir
   UV_CACHE_DIR: D:\a\_temp\setup-uv-cache
   CACHE_ON_FAILURE: false
 ##[endgroup]
 Resolved 191 packages in 3ms
 Uninstalled 21 packages in 115ms
  - concurrent-log-handler==0.9.29
  - croniter==6.0.0
  - fire==0.7.1
  - hermes-agent==0.17.0
  - httptools==0.8.0
  - markdown==3.10.2
  - pillow==12.2.0
  - portalocker==3.2.0
  - prompt-toolkit==3.0.52
  - psutil==7.2.2
  - python-dateutil==2.9.0.post0
  - pytz==2026.2
  - pywinpty==2.0.15
  - ruamel-yaml==0.18.17
  - ruamel-yaml-clib==0.2.15
  - six==1.17.0
  - socksio==1.0.0
  - termcolor==3.3.0
  - tzdata==2025.3
  - watchfiles==1.2.0
  - wcwidth==0.8.1
 ============================= test session starts =============================
 platform win32 -- Python 3.13.14, pytest-9.1.1, pluggy-1.6.0
 rootdir: D:\a\NeMo-Fabric\NeMo-Fabric
 configfile: pyproject.toml
 plugins: anyio-4.14.0, langsmith-0.10.1, asyncio-1.4.0, cov-7.1.0
 asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=session, asyncio_default_test_loop_scope=function
 collected 523 items
 tests\adapters\test_adapaters_common_utils.py .......................... [  4%]
 .....................                                                    [  8%]
 tests\adapters\test_adapters_common_lifecycle.py .........               [ 10%]
 tests\adapters\test_adapters_common_relay_gateway.py ...............     [ 13%]
 tests\adapters\test_adapters_common_relay_hooks.py ....                  [ 14%]
 tests\adapters\test_cl...

GitHub Actions: Python / Test (Python 3.14, macos-arm64): fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / Test (Python 3.13, macos-arm64): fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / Test (Python 3.11, macos-arm64): fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / Test (Python 3.11, windows-amd64): fix(relay): harden artifact collection

Conclusion: failure

View job details

##[group]Run Set-StrictMode -Version Latest
 �[36;1mSet-StrictMode -Version Latest�[0m
 �[36;1m$remove_env = @('ENV','BASH_ENV','CDPATH','SHELLOPTS','BASHOPTS','BASH_FUNC_*')�[0m
 �[36;1mforeach ($name in $remove_env) {�[0m
 �[36;1m  if (Test-Path "Env:$name") { Remove-Item "Env:\$name" }�[0m
 �[36;1m}�[0m
 �[36;1mfor ($i=1; $i -le 10; $i++) {�[0m
 �[36;1m  $prev_err_action = $ErrorActionPreference�[0m
 �[36;1m  $ErrorActionPreference = "Continue"�[0m
 �[36;1m  & bash --noprofile --norc "$env:GITHUB_ACTION_PATH\main.sh"�[0m
 �[36;1m  $code = $LASTEXITCODE�[0m
 �[36;1m  $ErrorActionPreference = "$prev_err_action"�[0m
 �[36;1m  if (Test-Path "$env:USERPROFILE\.install-action\init") {�[0m
 �[36;1m    # If bash started successfully, main.sh creates init file.�[0m
 �[36;1m    Remove-Item "$env:USERPROFILE\.install-action\init" -Force�[0m
 �[36;1m    exit $code�[0m
 �[36;1m  }�[0m
 �[36;1m  if ($i -lt 10) {�[0m
 �[36;1m    Write-Output "::warning::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); retrying..."�[0m
 �[36;1m  }�[0m
 �[36;1m}�[0m
 �[36;1mWrite-Output "::error::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); this maybe resolved by re-running job"�[0m

GitHub Actions: Python / Test (Python 3.12, macos-arm64): fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / Test (Python 3.11, windows-amd64): fix(relay): harden artifact collection

Conclusion: failure

View job details

##[group]Run set -euo pipefail
 �[36;1mset -euo pipefail�[0m
 �[36;1mjust test-python�[0m
 shell: C:\Program Files\Git\bin\bash.EXE --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
   UV_TOOL_BIN_DIR: D:\a\_temp\uv-tool-bin-dir
   UV_TOOL_DIR: D:\a\_temp\uv-tool-dir
   UV_PYTHON_INSTALL_DIR: D:\a\_temp\uv-python-dir
   UV_CACHE_DIR: D:\a\_temp\setup-uv-cache
   CACHE_ON_FAILURE: false
 ##[endgroup]
 Resolved 191 packages in 5ms
 Uninstalled 27 packages in 166ms
  - concurrent-log-handler==0.9.29
  - croniter==6.0.0
  - fire==0.7.1
  - hermes-agent==0.17.0
  - httptools==0.8.0
  - jinja2==3.1.6
  - markdown==3.10.2
  - markdown-it-py==4.2.0
  - markupsafe==3.0.3
  - mdurl==0.1.2
  - pathspec==1.1.1
  - pillow==12.2.0
  - portalocker==3.2.0
  - prompt-toolkit==3.0.52
  - psutil==7.2.2
  - python-dateutil==2.9.0.post0
  - pytz==2026.2
  - pywinpty==2.0.15
  - rich==14.3.3
  - ruamel-yaml==0.18.17
  - ruamel-yaml-clib==0.2.15
  - six==1.17.0
  - socksio==1.0.0
  - termcolor==3.3.0
  - tzdata==2025.3
  - watchfiles==1.2.0
  - wcwidth==0.8.1
 ============================= test session starts =============================
 platform win32 -- Python 3.11.9, pytest-9.1.1, pluggy-1.6.0
 rootdir: D:\a\NeMo-Fabric\NeMo-Fabric
 configfile: pyproject.toml
 plugins: anyio-4.14.0, langsmith-0.10.1, asyncio-1.4.0, cov-7.1.0
 asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=session, asyncio_default_test_loop_scope=function
 collected 523 items
 tests\adapters\test_adapaters_common_utils.py .......................... [  4%]
 .....................                                                    [  8%]
 tests\adapters\test_adapters_common_lifecycle.py .........               [ 10%]
 tests\adapters\test_adapters_common_relay_gateway.py ...............

GitHub Actions: Python / Test (Python 3.12, linux-amd64): fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / Test (Python 3.14, linux-arm64): fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / Test (Python 3.11, linux-arm64): fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / Test (Python 3.12, linux-arm64): fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / Test (Python 3.13, linux-arm64): fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / Test (Python 3.11, linux-amd64): fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / Test (Python 3.13, linux-amd64): fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / 3_Test (Python 3.13, windows-amd64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

##[group]Run Set-StrictMode -Version Latest
 �[36;1mSet-StrictMode -Version Latest�[0m
 �[36;1m$remove_env = @('ENV','BASH_ENV','CDPATH','SHELLOPTS','BASHOPTS','BASH_FUNC_*')�[0m
 �[36;1mforeach ($name in $remove_env) {�[0m
 �[36;1m  if (Test-Path "Env:$name") { Remove-Item "Env:\$name" }�[0m
 �[36;1m}�[0m
 �[36;1mfor ($i=1; $i -le 10; $i++) {�[0m
 �[36;1m  $prev_err_action = $ErrorActionPreference�[0m
 �[36;1m  $ErrorActionPreference = "Continue"�[0m
 �[36;1m  & bash --noprofile --norc "$env:GITHUB_ACTION_PATH\main.sh"�[0m
 �[36;1m  $code = $LASTEXITCODE�[0m
 �[36;1m  $ErrorActionPreference = "$prev_err_action"�[0m
 �[36;1m  if (Test-Path "$env:USERPROFILE\.install-action\init") {�[0m
 �[36;1m    # If bash started successfully, main.sh creates init file.�[0m
 �[36;1m    Remove-Item "$env:USERPROFILE\.install-action\init" -Force�[0m
 �[36;1m    exit $code�[0m
 �[36;1m  }�[0m
 �[36;1m  if ($i -lt 10) {�[0m
 �[36;1m    Write-Output "::warning::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); retrying..."�[0m
 �[36;1m  }�[0m
 �[36;1m}�[0m
 �[36;1mWrite-Output "::error::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); this maybe resolved by re-running job"�[0m

GitHub Actions: Python / 2_Test (Python 3.14, linux-amd64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / 1_Test (Python 3.14, windows-amd64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

##[group]Run Set-StrictMode -Version Latest
 �[36;1mSet-StrictMode -Version Latest�[0m
 �[36;1m$remove_env = @('ENV','BASH_ENV','CDPATH','SHELLOPTS','BASHOPTS','BASH_FUNC_*')�[0m
 �[36;1mforeach ($name in $remove_env) {�[0m
 �[36;1m  if (Test-Path "Env:$name") { Remove-Item "Env:\$name" }�[0m
 �[36;1m}�[0m
 �[36;1mfor ($i=1; $i -le 10; $i++) {�[0m
 �[36;1m  $prev_err_action = $ErrorActionPreference�[0m
 �[36;1m  $ErrorActionPreference = "Continue"�[0m
 �[36;1m  & bash --noprofile --norc "$env:GITHUB_ACTION_PATH\main.sh"�[0m
 �[36;1m  $code = $LASTEXITCODE�[0m
 �[36;1m  $ErrorActionPreference = "$prev_err_action"�[0m
 �[36;1m  if (Test-Path "$env:USERPROFILE\.install-action\init") {�[0m
 �[36;1m    # If bash started successfully, main.sh creates init file.�[0m
 �[36;1m    Remove-Item "$env:USERPROFILE\.install-action\init" -Force�[0m
 �[36;1m    exit $code�[0m
 �[36;1m  }�[0m
 �[36;1m  if ($i -lt 10) {�[0m
 �[36;1m    Write-Output "::warning::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); retrying..."�[0m
 �[36;1m  }�[0m
 �[36;1m}�[0m
 �[36;1mWrite-Output "::error::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); this maybe resolved by re-running job"�[0m

GitHub Actions: Python / 5_Test (Python 3.13, macos-arm64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / 6_Test (Python 3.14, macos-arm64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / 4_Test (Python 3.12, windows-amd64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

##[group]Run Set-StrictMode -Version Latest
 �[36;1mSet-StrictMode -Version Latest�[0m
 �[36;1m$remove_env = @('ENV','BASH_ENV','CDPATH','SHELLOPTS','BASHOPTS','BASH_FUNC_*')�[0m
 �[36;1mforeach ($name in $remove_env) {�[0m
 �[36;1m  if (Test-Path "Env:$name") { Remove-Item "Env:\$name" }�[0m
 �[36;1m}�[0m
 �[36;1mfor ($i=1; $i -le 10; $i++) {�[0m
 �[36;1m  $prev_err_action = $ErrorActionPreference�[0m
 �[36;1m  $ErrorActionPreference = "Continue"�[0m
 �[36;1m  & bash --noprofile --norc "$env:GITHUB_ACTION_PATH\main.sh"�[0m
 �[36;1m  $code = $LASTEXITCODE�[0m
 �[36;1m  $ErrorActionPreference = "$prev_err_action"�[0m
 �[36;1m  if (Test-Path "$env:USERPROFILE\.install-action\init") {�[0m
 �[36;1m    # If bash started successfully, main.sh creates init file.�[0m
 �[36;1m    Remove-Item "$env:USERPROFILE\.install-action\init" -Force�[0m
 �[36;1m    exit $code�[0m
 �[36;1m  }�[0m
 �[36;1m  if ($i -lt 10) {�[0m
 �[36;1m    Write-Output "::warning::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); retrying..."�[0m
 �[36;1m  }�[0m
 �[36;1m}�[0m
 �[36;1mWrite-Output "::error::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); this maybe resolved by re-running job"�[0m

GitHub Actions: Python / 7_Test (Python 3.11, macos-arm64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / 9_Test (Python 3.12, macos-arm64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / 8_Test (Python 3.11, windows-amd64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

##[group]Run Set-StrictMode -Version Latest
 �[36;1mSet-StrictMode -Version Latest�[0m
 �[36;1m$remove_env = @('ENV','BASH_ENV','CDPATH','SHELLOPTS','BASHOPTS','BASH_FUNC_*')�[0m
 �[36;1mforeach ($name in $remove_env) {�[0m
 �[36;1m  if (Test-Path "Env:$name") { Remove-Item "Env:\$name" }�[0m
 �[36;1m}�[0m
 �[36;1mfor ($i=1; $i -le 10; $i++) {�[0m
 �[36;1m  $prev_err_action = $ErrorActionPreference�[0m
 �[36;1m  $ErrorActionPreference = "Continue"�[0m
 �[36;1m  & bash --noprofile --norc "$env:GITHUB_ACTION_PATH\main.sh"�[0m
 �[36;1m  $code = $LASTEXITCODE�[0m
 �[36;1m  $ErrorActionPreference = "$prev_err_action"�[0m
 �[36;1m  if (Test-Path "$env:USERPROFILE\.install-action\init") {�[0m
 �[36;1m    # If bash started successfully, main.sh creates init file.�[0m
 �[36;1m    Remove-Item "$env:USERPROFILE\.install-action\init" -Force�[0m
 �[36;1m    exit $code�[0m
 �[36;1m  }�[0m
 �[36;1m  if ($i -lt 10) {�[0m
 �[36;1m    Write-Output "::warning::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); retrying..."�[0m
 �[36;1m  }�[0m
 �[36;1m}�[0m
 �[36;1mWrite-Output "::error::install-action: installation failed due to bash startup failure (<https://github.com/actions/partner-runner-images/issues/169>); this maybe resolved by re-running job"�[0m

GitHub Actions: Python / 11_Test (Python 3.14, linux-arm64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / 12_Test (Python 3.11, linux-arm64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / 10_Test (Python 3.12, linux-amd64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / 16_Test (Python 3.11, linux-amd64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / 13_Test (Python 3.12, linux-arm64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / 15_Test (Python 3.13, linux-arm64).txt: fix(relay): harden artifact collection

Conclusion: failure

View job details

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

GitHub Actions: Python / 14_Test (Python 3.13, linux-amd64).txt: fix(relay): harden artifact collection

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 (15)
**/*.{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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.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/adapters/**/*.py

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

tests/adapters/**/*.py: If an adapter or integration changes, run its focused tests.
For adapter behavior changes, run focused adapter tests under tests/adapters, then run just test-python.

Files:

  • tests/adapters/test_adapaters_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/adapters/test_adapaters_common_utils.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/adapters/test_adapaters_common_utils.py
🪛 Ruff (0.15.21)
adapters/common/src/nemo_fabric_adapters/common/utils.py

[warning] 274-274: Dynamically typed expressions (typing.Any) are disallowed in value

(ANN401)


[warning] 284-284: Dynamically typed expressions (typing.Any) are disallowed in value

(ANN401)


[warning] 310-310: Too many branches (14 > 12)

(PLR0912)

tests/adapters/test_adapaters_common_utils.py

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

(TRY003)

🔇 Additional comments (1)
tests/adapters/test_adapaters_common_utils.py (1)

441-464: Use a pytest factory fixture for _atof_artifact_config.

This reusable setup helper remains a direct function instead of a fixture factory. As per coding guidelines, “Prefer pytest fixtures over helper methods.”

Source: Coding guidelines

Comment thread adapters/common/src/nemo_fabric_adapters/common/utils.py Outdated
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
Signed-off-by: Bryan Bednarski <bbednarski@nvidia.com>
@bbednarski9
bbednarski9 force-pushed the fix/relay-artifact-collection-hardening branch from af584f0 to 47c838b Compare July 28, 2026 14:51
@AnuradhaKaruppiah
AnuradhaKaruppiah changed the base branch from main to release/0.1 July 28, 2026 15:18
Signed-off-by: Anuradha Karuppiah <26330987+AnuradhaKaruppiah@users.noreply.github.com>
Signed-off-by: Anuradha Karuppiah <26330987+AnuradhaKaruppiah@users.noreply.github.com>
Signed-off-by: Anuradha Karuppiah <26330987+AnuradhaKaruppiah@users.noreply.github.com>
@AnuradhaKaruppiah

Copy link
Copy Markdown
Collaborator

/merge

@rapids-bot
rapids-bot Bot merged commit 16e4f30 into NVIDIA:release/0.1 Jul 28, 2026
26 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.

4 participants