docs: Create separate pypi.md files for each Python package - #153
docs: Create separate pypi.md files for each Python package#153dagardner-nv wants to merge 13 commits into
pypi.md files for each Python package#153Conversation
#### Overview Slim the Python adapter dependency boundary for the `release/0.1` line without changing adapter behavior. - `nemo-fabric` remains a metadata-only package that unconditionally installs the exact matching `nemo-fabric-runtime`. - Root harness extras delegate to the matching adapter package's `harness` extra. - Bare adapter distributions contain only adapter-owned runtime dependencies. - Every adapter provides `harness` and `full`; only Deep Agents and Hermes provide the Python `relay` extra. Claude and Codex continue to use the separately installed `nemo-relay` CLI. - Wrapped harness packages required by repository tests remain in the non-published `adapter-tests` dependency group. #### Details The supported install modes are now explicit: - `nemo-fabric[<harness>]`: Runtime, adapter, and supported harness dependencies in one environment. - `nemo-fabric` plus a bare adapter package: Runtime and adapter with an existing host-managed harness. - `nemo-fabric-adapters-<adapter>[harness]`: Adapter and supported harness without Runtime, for a separate adapter interpreter. - Bare `nemo-fabric-adapters-<adapter>`: Adapter-owned dependencies only. - Adapter `full`: All package-installable dependencies; for Claude and Codex this equals `harness` because Relay is an external CLI. The README, package description, install guide, adapter guides, Harbor examples, CI, consumer skill, and maintainer packaging skills now describe the same matrix. Metadata tests guard the root-to-adapter delegation and the exact adapter dependency boundaries. #### Validation - Focused metadata, README, and Harbor checks: `55 passed` - Full Python suite: `529 passed, 15 skipped` - Latest upstream Hermes streaming coverage plus metadata checks: `21 passed` - Root and all adapter lockfiles: `uv lock --check` - `just build-python` - `cargo check -p fabric-python --locked` - `just docs` (all checks passed; unauthenticated redirect check skipped with the expected warning) - `just wheels`, followed by root and adapter wheel `METADATA` inspection - License diff against `upstream/release/0.1`: no Rust or Python additions, removals, or changes - Full `pre-commit run --all-files` - `just --fmt --check` - `git diff --check` #### Where should the reviewer start? Start with `pyproject.toml`, the four adapter `pyproject.toml` files, and `tests/adapters/test_adapter_package_metadata.py`. Then review `docs/getting-started/install.mdx`, `.github/workflows/ci_python.yml`, and `.agents/skills/contribute-adapter/SKILL.md`. The branch is rebased onto the latest `release/0.1`. It includes and preserves the adapter configuration changes from NVIDIA#117. #### Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to) - Closes [FABRIC-125](https://linear.app/nvidia/issue/FABRIC-125/slim-adapter-runtime-dependencies) - Relates to NVIDIA#117 - [x] I confirm this contribution is my own work, or I have the right to submit it under this project's license. - [x] I searched existing issues and open pull requests, and this does not duplicate existing work. ## Summary by CodeRabbit * **Documentation** * Clarified installation options for runtime, adapters, harnesses, and Relay integrations. * Added supported Python version guidance and separate-environment setup instructions. * Updated Hermes, Claude, Codex, and Deep Agents quick starts and deployment scenarios. * Improved Harbor setup and command examples, including version-alignment guidance. * **Bug Fixes** * Improved Hermes configuration writing when YAML support is unavailable. * Clarified Relay CLI requirements and adapter-specific integration behavior. * **Tests** * Added validation for package dependency boundaries, installation metadata, and adapter configuration behavior. Authors: - Zhongxuan (Daniel) Wang (https://github.com/zhongxuanwang-nv) Approvers: - Anuradha Karuppiah (https://github.com/AnuradhaKaruppiah) - David Gardner (https://github.com/dagardner-nv) URL: NVIDIA#105
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
Signed-off-by: David Gardner <dagardner@nvidia.com>
WalkthroughThis change establishes a thinner runtime/adapter packaging boundary, moves harness dependencies into adapter extras, adds metadata validation, updates CI and local installation workflows, and rewrites installation guidance and Harbor examples for the new runtime, harness, adapter, and Relay combinations. ChangesPackaging and Installation
Estimated code review effort: 3 (Moderate) | ~30 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
|
Fern docs preview: https://nvidia-preview-pull-request-153.docs.buildwithfern.com/nemo/fabric |
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 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/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py`:
- Around line 121-126: Update the documentation in preflight_check() to describe
the deepagents import and model-provider credential requirements as being
validated during adapter startup, matching its call from start(). Do not imply
that validation occurs before each invoke().
- Around line 128-133: Update the Deep Agents preflight around
importlib.util.find_spec to import and validate the create_deep_agent symbol
itself, rather than only checking package presence. Catch failures from that
import and raise the existing RuntimeError with the same adapter-environment
message, ensuring missing or broken exports fail during startup.
In `@CONTRIBUTING.md`:
- Around line 57-67: Add explicit local wheel-install commands for both split
Hermes distributions in the adapter installation section: one using the
[harness] extra and one installing the bare nemo-fabric-adapters-hermes package.
Keep the existing explanation about environments that already manage a
compatible Hermes Agent installation.
In `@python/pypi.md`:
- Around line 34-35: Update the NVIDIA NeMo Fabric repository link in the
surrounding installation and usage guidance to use the canonical URL casing,
changing the repository segment from NVIDIA/nemo-fabric to NVIDIA/NeMo-Fabric
while preserving the link destination and surrounding text.
In `@tests/adapters/test_hermes_config_builder.py`:
- Around line 50-53: Update import_without_yaml to raise ImportError without a
custom message when name is "yaml", preserving the existing fallback behavior
and real_import delegation for all other modules.
🪄 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: a447a2ba-ad9e-4fbf-be2e-1f3aa429edc9
⛔ Files ignored due to path filters (5)
adapters/claude/uv.lockis excluded by!**/*.lockadapters/codex/uv.lockis excluded by!**/*.lockadapters/deepagents/uv.lockis excluded by!**/*.lockadapters/hermes/uv.lockis excluded by!**/*.lockuv.lockis excluded by!**/*.lock
📒 Files selected for processing (45)
.agents/skills/contribute-adapter/SKILL.md.agents/skills/maintain-packaging/SKILL.md.agents/skills/python-tests/SKILL.md.github/workflows/ci_python.ymlCONTRIBUTING.mdREADME.mdadapters/claude/README.mdadapters/claude/pypi.mdadapters/claude/pyproject.tomladapters/claude/testing.mdadapters/codex/README.mdadapters/codex/pypi.mdadapters/codex/pyproject.tomladapters/codex/testing.mdadapters/common/pypi.mdadapters/common/pyproject.tomladapters/deepagents/README.mdadapters/deepagents/pypi.mdadapters/deepagents/pyproject.tomladapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pyadapters/hermes/README.mdadapters/hermes/pypi.mdadapters/hermes/pyproject.tomldocs/getting-started/install.mdxdocs/getting-started/quickstart.mdxdocs/integrations/harness/claude.mdxdocs/integrations/harness/codex.mdxdocs/integrations/harness/deepagents.mdxdocs/integrations/harness/hermes.mdxdocs/sdk/python.mdxexamples/harbor/README.mdexamples/harbor/calculator/README.mdexamples/harbor/calculator/task/environment/Dockerfileexamples/harbor/swebench/README.mdjustfilepypi.mdpyproject.tomlpython/pypi.mdpython/pyproject.tomlskills/integrations/consumer/nemo-fabric-integrate/SKILL.mdtests/adapters/test_adapter_package_metadata.pytests/adapters/test_hermes_config_builder.pytests/integrations/test_harbor_runner.pytests/python/test_harbor_integration.pytests/python/test_readme_examples.py
💤 Files with no reviewable changes (2)
- adapters/codex/testing.md
- adapters/claude/testing.md
📜 Review details
⏰ Context from checks skipped due to timeout. (8)
- GitHub Check: Test (Python 3.14, windows-amd64)
- GitHub Check: Test (Python 3.11, windows-amd64)
- GitHub Check: Test (Python 3.13, windows-amd64)
- GitHub Check: Pre-commit
- GitHub Check: Test (Python 3.14, macos-arm64)
- GitHub Check: Test (Python 3.13, macos-arm64)
- GitHub Check: Test (Python 3.11, linux-arm64)
- GitHub Check: Test (Python 3.12, windows-amd64)
🧰 Additional context used
📓 Path-based instructions (51)
**/*
📄 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 spellNVIDIAin all caps; do not useNvidia,nvidia,nVidia,nVIDIA, orNV.
Usean NVIDIAbefore a noun, because the name begins with an “en” sound.
Do not add a registered trademark symbol afterNVIDIAwhen 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 withNVIDIAon 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:
python/pyproject.tomldocs/getting-started/quickstart.mdxadapters/common/pypi.mdadapters/codex/pypi.mdadapters/hermes/pypi.mdadapters/deepagents/pypi.mdexamples/harbor/calculator/README.mdadapters/claude/pypi.mdCONTRIBUTING.mdtests/python/test_readme_examples.pypython/pypi.mddocs/sdk/python.mdxadapters/common/pyproject.tomldocs/integrations/harness/hermes.mdxexamples/harbor/README.mdexamples/harbor/calculator/task/environment/Dockerfileadapters/hermes/README.mdskills/integrations/consumer/nemo-fabric-integrate/SKILL.mdadapters/codex/pyproject.tomldocs/integrations/harness/deepagents.mdxdocs/integrations/harness/codex.mdxtests/adapters/test_hermes_config_builder.pyadapters/hermes/pyproject.tomladapters/claude/pyproject.tomltests/python/test_harbor_integration.pyadapters/deepagents/README.mdadapters/deepagents/pyproject.tomladapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pyadapters/codex/README.mdpyproject.tomldocs/integrations/harness/claude.mdxdocs/getting-started/install.mdxtests/adapters/test_adapter_package_metadata.pyREADME.mdexamples/harbor/swebench/README.mdpypi.mdjustfiletests/integrations/test_harbor_runner.pyadapters/claude/README.md
**/*.{rs,toml}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
For any Rust change, run
just test-rustandcargo fmt --all -- --check.For Rust core, CLI, or shared runtime semantic changes, run Rust formatting and tests, and add Python tests when behavior is exposed through the SDK.
Run
cargo fmt --alland verify formatting withcargo fmt --all -- --checkfor Rust changes.
Files:
python/pyproject.tomladapters/common/pyproject.tomladapters/codex/pyproject.tomladapters/hermes/pyproject.tomladapters/claude/pyproject.tomladapters/deepagents/pyproject.tomlpyproject.toml
**/{Cargo.toml,Cargo.lock,pyproject.toml,package.json}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
For new or updated dependencies, document the functional need, alternatives considered, and why the selected dependency is the narrowest fit.
Files:
python/pyproject.tomladapters/common/pyproject.tomladapters/codex/pyproject.tomladapters/hermes/pyproject.tomladapters/claude/pyproject.tomladapters/deepagents/pyproject.tomlpyproject.toml
**/*.{toml,lock}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
If a manifest or lockfile changes, run the license-diff script against
origin/main, review transitive license changes, and run theattributions-rustandattributions-pythonpre-commit hooks.Keep workspace, Python, and lockfile versions aligned where required, and review dependency changes using the resolved transitive graph rather than only direct dependencies.
Files:
python/pyproject.tomladapters/common/pyproject.tomladapters/codex/pyproject.tomladapters/hermes/pyproject.tomladapters/claude/pyproject.tomladapters/deepagents/pyproject.tomlpyproject.toml
**/*.{yml,yaml,toml,lock}
📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)
For CI or packaging changes, use
maintain-ciormaintain-packaging, then run recipes and checks whose behavior changed.
Files:
python/pyproject.tomladapters/common/pyproject.tomladapters/codex/pyproject.tomladapters/hermes/pyproject.tomladapters/claude/pyproject.tomladapters/deepagents/pyproject.tomlpyproject.toml
python/pyproject.toml
📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)
Keep
project.dynamic = ["version"]; do not add a literalproject.version, because Maturin derives the runtime version from Cargo metadata.Keep leaf adapters adapter-only by default. Every leaf must provide
harnessandfull; providerelayonly when the adapter imports the NeMo Relay Python package. For external Relay executables,fullmust equalharness.
Files:
python/pyproject.toml
**/*.{rs,py,toml}
📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)
When editing version helpers, verify every
nemo-fabric-*workspace package through Cargo metadata and reject a static version inpython/pyproject.toml.
Files:
python/pyproject.tomltests/python/test_readme_examples.pyadapters/common/pyproject.tomladapters/codex/pyproject.tomltests/adapters/test_hermes_config_builder.pyadapters/hermes/pyproject.tomladapters/claude/pyproject.tomltests/python/test_harbor_integration.pyadapters/deepagents/pyproject.tomladapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pypyproject.tomltests/adapters/test_adapter_package_metadata.pytests/integrations/test_harbor_runner.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:
python/pyproject.tomltests/python/test_readme_examples.pyadapters/common/pyproject.tomladapters/codex/pyproject.tomltests/adapters/test_hermes_config_builder.pyadapters/hermes/pyproject.tomladapters/claude/pyproject.tomltests/python/test_harbor_integration.pyadapters/deepagents/pyproject.tomladapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pypyproject.tomltests/adapters/test_adapter_package_metadata.pytests/integrations/test_harbor_runner.py
**/*.{toml,lock,json}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
When selecting dependencies, prefer maintained OSS options with clear SPDX metadata, smaller transitive graphs, and permissive licenses such as Apache-2.0, MIT, BSD, or ISC; explicitly review UNKNOWN, custom, proprietary, source-available, copyleft, and network-copyleft terms with dependency approvers.
Files:
python/pyproject.tomladapters/common/pyproject.tomladapters/codex/pyproject.tomladapters/hermes/pyproject.tomladapters/claude/pyproject.tomladapters/deepagents/pyproject.tomlpyproject.toml
**/*.{md,mdx,py,rs,toml,yml,yaml}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
Update corresponding documentation when public behavior, adapters, examples, or workspace structure changes.
Files:
python/pyproject.tomldocs/getting-started/quickstart.mdxadapters/common/pypi.mdadapters/codex/pypi.mdadapters/hermes/pypi.mdadapters/deepagents/pypi.mdexamples/harbor/calculator/README.mdadapters/claude/pypi.mdCONTRIBUTING.mdtests/python/test_readme_examples.pypython/pypi.mddocs/sdk/python.mdxadapters/common/pyproject.tomldocs/integrations/harness/hermes.mdxexamples/harbor/README.mdadapters/hermes/README.mdskills/integrations/consumer/nemo-fabric-integrate/SKILL.mdadapters/codex/pyproject.tomldocs/integrations/harness/deepagents.mdxdocs/integrations/harness/codex.mdxtests/adapters/test_hermes_config_builder.pyadapters/hermes/pyproject.tomladapters/claude/pyproject.tomltests/python/test_harbor_integration.pyadapters/deepagents/README.mdadapters/deepagents/pyproject.tomladapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pyadapters/codex/README.mdpyproject.tomldocs/integrations/harness/claude.mdxdocs/getting-started/install.mdxtests/adapters/test_adapter_package_metadata.pyREADME.mdexamples/harbor/swebench/README.mdpypi.mdtests/integrations/test_harbor_runner.pyadapters/claude/README.md
**/*.{rs,py,html,md,mdx,toml,yml,yaml,sh,bash}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
All source files must include the appropriate SPDX license header and comment syntax for their file type.
Files:
python/pyproject.tomldocs/getting-started/quickstart.mdxadapters/common/pypi.mdadapters/codex/pypi.mdadapters/hermes/pypi.mdadapters/deepagents/pypi.mdexamples/harbor/calculator/README.mdadapters/claude/pypi.mdCONTRIBUTING.mdtests/python/test_readme_examples.pypython/pypi.mddocs/sdk/python.mdxadapters/common/pyproject.tomldocs/integrations/harness/hermes.mdxexamples/harbor/README.mdadapters/hermes/README.mdskills/integrations/consumer/nemo-fabric-integrate/SKILL.mdadapters/codex/pyproject.tomldocs/integrations/harness/deepagents.mdxdocs/integrations/harness/codex.mdxtests/adapters/test_hermes_config_builder.pyadapters/hermes/pyproject.tomladapters/claude/pyproject.tomltests/python/test_harbor_integration.pyadapters/deepagents/README.mdadapters/deepagents/pyproject.tomladapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pyadapters/codex/README.mdpyproject.tomldocs/integrations/harness/claude.mdxdocs/getting-started/install.mdxtests/adapters/test_adapter_package_metadata.pyREADME.mdexamples/harbor/swebench/README.mdpypi.mdtests/integrations/test_harbor_runner.pyadapters/claude/README.md
{README.md,docs/**/*.{md,mdx,yml},examples/**/*.{md,mdx,yml}}
📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)
Keep package names, repository references, and build commands current in documentation and examples.
Files:
docs/getting-started/quickstart.mdxexamples/harbor/calculator/README.mddocs/sdk/python.mdxdocs/integrations/harness/hermes.mdxexamples/harbor/README.mddocs/integrations/harness/deepagents.mdxdocs/integrations/harness/codex.mdxdocs/integrations/harness/claude.mdxdocs/getting-started/install.mdxREADME.mdexamples/harbor/swebench/README.md
{docs/**/*.{md,mdx,yml},examples/**/*.{md,mdx,yml}}
📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)
Update relevant getting-started, reference, adapter, and example documentation when the corresponding examples or adapters change.
Files:
docs/getting-started/quickstart.mdxexamples/harbor/calculator/README.mddocs/sdk/python.mdxdocs/integrations/harness/hermes.mdxexamples/harbor/README.mddocs/integrations/harness/deepagents.mdxdocs/integrations/harness/codex.mdxdocs/integrations/harness/claude.mdxdocs/getting-started/install.mdxexamples/harbor/swebench/README.md
**/*.mdx
📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)
In MDX files, use JSX comment delimiters (
{/*and*/}) for top-of-file comments, including SPDX headers; do not use HTML comments.Use
{/* ... */}delimiters for top-of-file MDX SPDX comments, not HTML comment delimiters.
Files:
docs/getting-started/quickstart.mdxdocs/sdk/python.mdxdocs/integrations/harness/hermes.mdxdocs/integrations/harness/deepagents.mdxdocs/integrations/harness/codex.mdxdocs/integrations/harness/claude.mdxdocs/getting-started/install.mdx
docs/**/*.{md,mdx,yml}
📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)
Run
just docswhen the documentation site changes.
Files:
docs/getting-started/quickstart.mdxdocs/sdk/python.mdxdocs/integrations/harness/hermes.mdxdocs/integrations/harness/deepagents.mdxdocs/integrations/harness/codex.mdxdocs/integrations/harness/claude.mdxdocs/getting-started/install.mdx
**/*.{md,mdx,rst}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)
**/*.{md,mdx,rst}: For NeMo Fabric documentation, verify technical claims against the current repository, public API, or documented command before reviewing style.
Always spellNVIDIAin all caps; do not useNvidia,nvidia, orNV.
Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text; avoid raw URLs and weak anchors such ashereorread more.
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative, parallel steps; split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English while preserving necessary technical precision.
Usecanfor possibility and reservemayfor permission.
Useafterfor temporal relationships instead ofonce, and preferrefer tooverseewhen directing readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical documentation.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values; use numerals for 10 or greater and commas in thousands.
Do not add trademark symbols to learning-oriented documentation unless the source, platform, or legal guidance explicitly requires them.
Do not replace precise technical terms with simpler words when doing so would lose precision.
Do not flag passive voice when the actor is unknown or the action is the important part.
Do not rewrite API names, package names, command flags, or code literals for style.
**/*.{md,mdx,rst}: Use consistent title case for technical-document headings and table headers; avoid quotation marks, ampersands, and exclamation marks in headings, while preserving official product, event, research, and whitepaper title ...
Files:
docs/getting-started/quickstart.mdxadapters/common/pypi.mdadapters/codex/pypi.mdadapters/hermes/pypi.mdadapters/deepagents/pypi.mdexamples/harbor/calculator/README.mdadapters/claude/pypi.mdCONTRIBUTING.mdpython/pypi.mddocs/sdk/python.mdxdocs/integrations/harness/hermes.mdxexamples/harbor/README.mdadapters/hermes/README.mdskills/integrations/consumer/nemo-fabric-integrate/SKILL.mddocs/integrations/harness/deepagents.mdxdocs/integrations/harness/codex.mdxadapters/deepagents/README.mdadapters/codex/README.mddocs/integrations/harness/claude.mdxdocs/getting-started/install.mdxREADME.mdexamples/harbor/swebench/README.mdpypi.mdadapters/claude/README.md
docs/**/*
📄 CodeRabbit inference engine (AGENTS.md)
Update Fern documentation under
docs/when public behavior, thenemo-fabricpackage, examples, or supported bindings change.
Files:
docs/getting-started/quickstart.mdxdocs/sdk/python.mdxdocs/integrations/harness/hermes.mdxdocs/integrations/harness/deepagents.mdxdocs/integrations/harness/codex.mdxdocs/integrations/harness/claude.mdxdocs/getting-started/install.mdx
**/*.{md,mdx}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)
**/*.{md,mdx}: Use the full product nameNVIDIA NeMo Fabricon its first usage, typically in the title or H1; useNeMo Fabricthereafter.
Usefabricby itself only when referring to the CLI tool, and surround those references with backticks.
CapitalizeNVIDIAcorrectly in public documentation.
Format commands, code elements, expressions, file names, paths, and filenames as inline code where needed.
Use title case consistently for headings in technical documentation.
Introduce code blocks, tables, and lists with complete lead-in sentences.
Use descriptive anchor text instead of raw URLs or generic link text such ashere.
Prefer active voice, present tense, short sentences, and plain English.
Use consistent terminology for the same concept throughout a document.
Write procedures as imperative, parallel, easy-to-scan steps, and split long sequences into smaller tasks.
Useafterinstead ofoncewhen expressing temporal sequence.
Usecaninstead ofmaywhen the intended meaning is possibility rather than permission.
Avoid ambiguous numeric dates and ordinal dates in body text.
For learning-oriented documentation, do not force trademark symbols unless the source document explicitly requires them.
Introduce examples' code blocks with full sentences and ensure examples match current APIs and build commands.
Files:
docs/getting-started/quickstart.mdxadapters/common/pypi.mdadapters/codex/pypi.mdadapters/hermes/pypi.mdadapters/deepagents/pypi.mdexamples/harbor/calculator/README.mdadapters/claude/pypi.mdCONTRIBUTING.mdpython/pypi.mddocs/sdk/python.mdxdocs/integrations/harness/hermes.mdxexamples/harbor/README.mdadapters/hermes/README.mdskills/integrations/consumer/nemo-fabric-integrate/SKILL.mddocs/integrations/harness/deepagents.mdxdocs/integrations/harness/codex.mdxadapters/deepagents/README.mdadapters/codex/README.mddocs/integrations/harness/claude.mdxdocs/getting-started/install.mdxREADME.mdexamples/harbor/swebench/README.mdpypi.mdadapters/claude/README.md
{docs/**,README.md,AGENTS.md}
⚙️ CodeRabbit configuration file
{docs/**,README.md,AGENTS.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency with generated schemas.
For links between files under docs/, require paths relative to the source file with the target file's .mdx extension so they work in both Fern builds and repository browsers. Flag Fern site-root links such as NeMo Fabric overview; use the repository-relative equivalent, such as NeMo Fabric overview.
Files:
docs/getting-started/quickstart.mdxdocs/sdk/python.mdxdocs/integrations/harness/hermes.mdxdocs/integrations/harness/deepagents.mdxdocs/integrations/harness/codex.mdxdocs/integrations/harness/claude.mdxdocs/getting-started/install.mdxREADME.md
{*.md,**/*.md,**/*.mdx,**/*.ipynb}
⚙️ CodeRabbit configuration file
{*.md,**/*.md,**/*.mdx,**/*.ipynb}: Enforce the product name in user-facing prose: use "NVIDIA NeMo Fabric" on first use and "NeMo Fabric" thereafter. Flag standalone capitalized "Fabric" when it refers to the product. Do not flag the lowercasefabricCLI command, package/import/crate names, code identifiers, API symbols, configuration keys, file paths, or unrelated generic uses of the word.
Files:
docs/getting-started/quickstart.mdxadapters/common/pypi.mdadapters/codex/pypi.mdadapters/hermes/pypi.mdadapters/deepagents/pypi.mdexamples/harbor/calculator/README.mdadapters/claude/pypi.mdCONTRIBUTING.mdpython/pypi.mddocs/sdk/python.mdxdocs/integrations/harness/hermes.mdxexamples/harbor/README.mdadapters/hermes/README.mdskills/integrations/consumer/nemo-fabric-integrate/SKILL.mddocs/integrations/harness/deepagents.mdxdocs/integrations/harness/codex.mdxadapters/deepagents/README.mdadapters/codex/README.mddocs/integrations/harness/claude.mdxdocs/getting-started/install.mdxREADME.mdexamples/harbor/swebench/README.mdpypi.mdadapters/claude/README.md
**/*.{md,rst}
📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)
Update documentation and examples in the same branch as the public API change.
Files:
adapters/common/pypi.mdadapters/codex/pypi.mdadapters/hermes/pypi.mdadapters/deepagents/pypi.mdexamples/harbor/calculator/README.mdadapters/claude/pypi.mdCONTRIBUTING.mdpython/pypi.mdexamples/harbor/README.mdadapters/hermes/README.mdskills/integrations/consumer/nemo-fabric-integrate/SKILL.mdadapters/deepagents/README.mdadapters/codex/README.mdREADME.mdexamples/harbor/swebench/README.mdpypi.mdadapters/claude/README.md
**/*.{md,rst,txt,adoc}
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-language-mechanics.md)
**/*.{md,rst,txt,adoc}: For technical documentation, use professional, active, conversational, engaging, precise, and plain-English prose. Prefer active voice, present tense, short sentences, and scannable paragraphs. Avoid casual or imprecise language, swearing, threats, insults, jokes, puns, culture-specific idioms, marketing exaggeration, and unsupported third-party comparisons.
Usecanfor possibility and reservemayfor permission; useafterfor temporal order; userefer tofor cross-references; prefer short direct sentences and specific verbs; avoid unnecessarypleasein technical documentation.
Prefer active voice when the actor matters. Passive voice is acceptable when the actor is unknown or irrelevant, when the action or result is the focus, or in programmer documentation.
Use natural contractions in conversational technical prose, but do not force them in formal legal copy, API references, or generated text.
Prefer simpler English over Latinisms: usefor exampleorsuch asinstead ofe.g.,and so oninstead ofetc.,that isinstead ofi.e.,compared toinstead ofvs., andby,through, orusinginstead ofvia. Use industry-standard terms such as in silico, in vitro, and in vivo when appropriate, and italicize them in running text.
Usethatwithout commas for essential clauses, andwhichwith commas for nonessential clauses.
Format dates and times clearly: spell out months in body text; use forms such asJune 12, 2025; avoid numeric or ordinal dates; capitalize days; use 12-hour time when appropriate; include a space beforea.m.orp.m.; useETandPTfor needed time zones; avoid24/7; and preferfrom 12:30 to 1:00 p.m.for prose ranges.
Format numbers consistently: spell out zero through nine in body text, use numerals for 10 or greater and for technical values, use commas in thousands, do not begin a sentence with a numeral, spell out ordinals, and use numerals consistently within a category wh...
Files:
adapters/common/pypi.mdadapters/codex/pypi.mdadapters/hermes/pypi.mdadapters/deepagents/pypi.mdexamples/harbor/calculator/README.mdadapters/claude/pypi.mdCONTRIBUTING.mdpython/pypi.mdexamples/harbor/README.mdadapters/hermes/README.mdskills/integrations/consumer/nemo-fabric-integrate/SKILL.mdadapters/deepagents/README.mdadapters/codex/README.mdREADME.mdexamples/harbor/swebench/README.mdpypi.mdadapters/claude/README.md
**/*.md
📄 CodeRabbit inference engine (.agents/skills/README.md)
Documentation and examples must be updated consistently with changes to public behavior and reviewed for NVIDIA technical-writing style.
Files:
adapters/common/pypi.mdadapters/codex/pypi.mdadapters/hermes/pypi.mdadapters/deepagents/pypi.mdexamples/harbor/calculator/README.mdadapters/claude/pypi.mdCONTRIBUTING.mdpython/pypi.mdexamples/harbor/README.mdadapters/hermes/README.mdskills/integrations/consumer/nemo-fabric-integrate/SKILL.mdadapters/deepagents/README.mdadapters/codex/README.mdREADME.mdexamples/harbor/swebench/README.mdpypi.mdadapters/claude/README.md
**/*.{py,rs,md,rst}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
Keep package names, import paths, and module names internally consistent, and update documentation and examples to use current install, import, and build commands.
Files:
adapters/common/pypi.mdadapters/codex/pypi.mdadapters/hermes/pypi.mdadapters/deepagents/pypi.mdexamples/harbor/calculator/README.mdadapters/claude/pypi.mdCONTRIBUTING.mdtests/python/test_readme_examples.pypython/pypi.mdexamples/harbor/README.mdadapters/hermes/README.mdskills/integrations/consumer/nemo-fabric-integrate/SKILL.mdtests/adapters/test_hermes_config_builder.pytests/python/test_harbor_integration.pyadapters/deepagents/README.mdadapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pyadapters/codex/README.mdtests/adapters/test_adapter_package_metadata.pyREADME.mdexamples/harbor/swebench/README.mdpypi.mdtests/integrations/test_harbor_runner.pyadapters/claude/README.md
{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/pypi.mdadapters/codex/pypi.mdadapters/hermes/pypi.mdadapters/deepagents/pypi.mdexamples/harbor/calculator/README.mdadapters/claude/pypi.mdadapters/common/pyproject.tomlexamples/harbor/README.mdexamples/harbor/calculator/task/environment/Dockerfileadapters/hermes/README.mdadapters/codex/pyproject.tomladapters/hermes/pyproject.tomladapters/claude/pyproject.tomladapters/deepagents/README.mdadapters/deepagents/pyproject.tomladapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pyadapters/codex/README.mdexamples/harbor/swebench/README.mdadapters/claude/README.md
.agents/skills/**
📄 CodeRabbit inference engine (AGENTS.md)
Keep maintainer skills under
.agents/skills/focused on repository contribution work, including API, documentation, testing, CI, packaging, release, and PR preparation; do not add consumer integration guidance.Repository maintainer skills belong under
.agents/skills/and should use descriptive, task-based names such ascontribute-apiandvalidate-change.
Files:
.agents/skills/maintain-packaging/SKILL.md.agents/skills/python-tests/SKILL.md.agents/skills/contribute-adapter/SKILL.md
**/README.md
📄 CodeRabbit inference engine (.agents/skills/review-doc-style/SKILL.md)
Update relevant package, crate, adapter, and integration README files when public behavior or entry-point documentation changes.
Files:
examples/harbor/calculator/README.mdexamples/harbor/README.mdadapters/hermes/README.mdadapters/deepagents/README.mdadapters/codex/README.mdREADME.mdexamples/harbor/swebench/README.mdadapters/claude/README.md
**/.github/workflows/*.{yml,yaml}
📄 CodeRabbit inference engine (.agents/skills/maintain-ci/SKILL.md)
**/.github/workflows/*.{yml,yaml}: Definepermissions:per job that needs token access, using the minimum required scopes; avoid workflow-level permissions unless centralized inheritance is intentionally documented.
Pin every third-party GitHub Action to a full commit SHA and retain a readable version comment after the SHA.
Use action-native or ecosystem-native caching instead of genericactions/cachewhen available.
Tie cache invalidation to lockfiles, dependency manifests, or explicit tool versions; avoid caching generated outputs unless deliberate repository behavior requires it.
Useastral-sh/setup-uvcache support withcache-dependency-globanchored touv.lock.
UseSwatinem/rust-cachewith explicitshared-keyandworkspacesinstead of ad hoc target-directory caching.
Keep deploy and publish permissions isolated to only the jobs that require them; restrictpages: writeandid-token: writeto Pages deployment jobs and their reusable-workflow callers.
Usecontents: readas the minimum permission for checkout-based build, test, documentation, and packaging jobs.
Grantpull-requests: readonly to jobs that perform pull-request metadata lookups.
When usingworkflow_call, inspect both caller and callee, and ensure the caller grants every permission required by the called jobs because the callee cannot elevate permissions.
Keep local workflow commands aligned with equivalentjustfilerecipes, and keep Python, Rust, and documentation jobs aligned with their lockfiles.
Preserve intended concurrency settings, branch filters, and documentation publish guards when modifying workflows.
Before editing workflows, inspect workflow relationships and settings with searches coveringuses:,permissions:,secrets:,concurrency:,cache, andjust.
Files:
.github/workflows/ci_python.yml
.github/workflows/**/*.{yml,yaml}
📄 CodeRabbit inference engine (.agents/skills/README.md)
GitHub Actions workflows must use pinned actions and be validated locally when maintained.
Files:
.github/workflows/ci_python.yml
.github/workflows/*.{yml,yaml}
📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)
CI workflows must reference the same package names and installation commands used by local workflows.
Files:
.github/workflows/ci_python.yml
**/*.{rs,py,pyi,json,yaml,yml}
📄 CodeRabbit inference engine (.agents/skills/contribute-api/SKILL.md)
Determine and update every affected public surface, including the CLI, PyO3 bindings, Python SDK, type stubs, schemas, and adapter contract, so they remain in parity.
Files:
tests/python/test_readme_examples.pytests/adapters/test_hermes_config_builder.pytests/python/test_harbor_integration.pyadapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pytests/adapters/test_adapter_package_metadata.pytests/integrations/test_harbor_runner.py
**/*.{rs,py}
📄 CodeRabbit inference engine (.agents/skills/prepare-pr/SKILL.md)
For native binding changes, run
cargo check -p fabric-python --locked.
Files:
tests/python/test_readme_examples.pytests/adapters/test_hermes_config_builder.pytests/python/test_harbor_integration.pyadapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pytests/adapters/test_adapter_package_metadata.pytests/integrations/test_harbor_runner.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.Use type annotations for public Python APIs and keep native binding declarations synchronized with their Rust implementations.
Files:
tests/python/test_readme_examples.pytests/adapters/test_hermes_config_builder.pytests/python/test_harbor_integration.pyadapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pytests/adapters/test_adapter_package_metadata.pytests/integrations/test_harbor_runner.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 injust test-rustpass and review generated schema diffs.
For schema or public contract changes, run both language suites and review changes underschemas/and generated API references.
**/*.{rs,py,pyi}: Usesnake_casefor Rust and Python functions and variables; usePascalCasefor Rust types and Python classes.
Run tests for every affected language surface; changes touching the Rust core or public schemas must run both Rust and Python test suites.
Files:
tests/python/test_readme_examples.pytests/adapters/test_hermes_config_builder.pytests/python/test_harbor_integration.pyadapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pytests/adapters/test_adapter_package_metadata.pytests/integrations/test_harbor_runner.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, thenjust test-python; rebuild withjust build-pythonwhen native code or packaging changes.
Files:
tests/python/test_readme_examples.pytests/adapters/test_hermes_config_builder.pytests/python/test_harbor_integration.pyadapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pytests/adapters/test_adapter_package_metadata.pytests/integrations/test_harbor_runner.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.asyncioto tests; async tests are automatically detected by the async runner.
Do not add-> Nonereturn annotations to test functions.
When mocking a class, useunittest.mock.MagicMockorAsyncMock, withspecwhen necessary, rather than defining a new class.
Prefix mocked class names withmock, notfake.
Prefer pytest fixtures over helper methods.
If a fixture is needed in multiple test files, define it inconftest.pyinstead of repeating it.
Define fixtures using@pytest.fixture(name="<fixture_name>")and a function named<fixture_name>_fixture; specifyscopeonly when it is not"function".
Preferpytest.mark.parametrizeover separate tests for different input types.
Use@pytest.mark.usefixtureswhen a fixture is needed but its returned value is unused.
Useos.environto modify environment variables in tests; do not usemonkeypatch.setenv, becausetests/conftest.pyprovides an autouserestore_environ_fixturethat restores the original environment.
Avoid defensive programming in tests; access expected values directly so missing data raises a clear failure, such as usingresults["data"]instead ofresults.get("data").
Packaging metadata tests must assert that the root project unconditionally depends on the exact-versionnemo-fabric-runtimedistribution.
Packaging metadata tests must assert that each root harness extra delegates to the matching version of the leaf adapter'sharnessextra.
Packaging metadata tests must assert that bare leaf dependencies remain adapter-owned and that the rootadapter-testsdependency group installs each leaf through itsharnessextra.
Packaging metadata tests must assert that every leaf providesfull; only adapters importing NeMo Relay Python APIs providerelay; adapters using an external Relay executable must havefullequal toharness.
Files:
tests/python/test_readme_examples.pytests/adapters/test_hermes_config_builder.pytests/python/test_harbor_integration.pytests/adapters/test_adapter_package_metadata.pytests/integrations/test_harbor_runner.py
**/*.{rs,py,pyi,json}
📄 CodeRabbit inference engine (CONTRIBUTING.md)
When adding functionality, include tests in the corresponding Rust crate or relevant
tests/area; keep checked-in JSON Schema snapshots and native Python binding declarations synchronized for public contract changes.
Files:
tests/python/test_readme_examples.pytests/adapters/test_hermes_config_builder.pytests/python/test_harbor_integration.pyadapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pytests/adapters/test_adapter_package_metadata.pytests/integrations/test_harbor_runner.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/python/test_readme_examples.pytests/adapters/test_hermes_config_builder.pytests/python/test_harbor_integration.pytests/adapters/test_adapter_package_metadata.pytests/integrations/test_harbor_runner.py
docs/sdk/python.mdx
📄 CodeRabbit inference engine (AGENTS.md)
Keep
docs/sdk/python.mdxcurrent when the public Python API changes.
Files:
docs/sdk/python.mdx
{pyproject.toml,adapters/**/pyproject.toml}
📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)
{pyproject.toml,adapters/**/pyproject.toml}: Update the literalproject.versionin the root setuptools project and every adapterpyproject.toml.
Keep internal exact-version requirements aligned: rootnemo-fabric-* == <version>optional dependencies and each adapter'snemo-fabric-adapters-common == <version>dependency.
Files:
adapters/common/pyproject.tomladapters/codex/pyproject.tomladapters/hermes/pyproject.tomladapters/claude/pyproject.tomladapters/deepagents/pyproject.tomlpyproject.toml
adapters/*/pyproject.toml
📄 CodeRabbit inference engine (.agents/skills/contribute-adapter/SKILL.md)
adapters/*/pyproject.toml: Keep leaf adapter runtime dependencies razor-thin and adapter-owned; do not declare the wrapped harness/SDK or dependencies already declared by its supported package. Provide and test dependency-free fallbacks for optional libraries.
Give every leaf adapter aharnessextra for supported harness packages and afullextra for package-installable optional integrations; provide arelayextra when importing NeMo Relay Python APIs, but not when Relay is an external executable.
Files:
adapters/common/pyproject.tomladapters/codex/pyproject.tomladapters/hermes/pyproject.tomladapters/claude/pyproject.tomladapters/deepagents/pyproject.toml
adapters/*/{pyproject.toml,uv.lock,README.md,LICENSE,fabric-adapter.json}
📄 CodeRabbit inference engine (.agents/skills/contribute-adapter/SKILL.md)
A Python adapter should include
LICENSE -> ../../LICENSE,README.md,fabric-adapter.json,pyproject.toml,uv.lock, a source entry point, and focused adapter tests, while remaining independent and small.
Files:
adapters/common/pyproject.tomladapters/hermes/README.mdadapters/codex/pyproject.tomladapters/hermes/pyproject.tomladapters/claude/pyproject.tomladapters/deepagents/README.mdadapters/deepagents/pyproject.tomladapters/codex/README.mdadapters/claude/README.md
adapters/*/README.md
📄 CodeRabbit inference engine (AGENTS.md)
Update adapter README files when public behavior, examples, or supported bindings change.
Document installation, supported configuration, harness-only settings, credentials, lifecycle, telemetry, artifacts, limitations, focused tests, and canonical typed SDK or harness-native YAML examples where applicable.
Files:
adapters/hermes/README.mdadapters/deepagents/README.mdadapters/codex/README.mdadapters/claude/README.md
skills/**
📄 CodeRabbit inference engine (AGENTS.md)
skills/**: Keep consumer skills underskills/self-contained and dependent only on supported public Python SDK contracts and published documentation; do not add repository-internal contribution guidance.
Keep consumer skills in parity with the public SDK guide, model, and type details when the Python/Rust binding contract changes.
Files:
skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
**/SKILL.md
📄 CodeRabbit inference engine (.agents/skills/README.md)
**/SKILL.md: Maintainer skills must begin with YAML frontmatter containing at leastnameanddescription.
Maintainer skills may reference repository internals, build and test commands, and contribution workflows, but external usage guidance must remain in the top-levelskills/directory.
Files:
skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
⚙️ CodeRabbit configuration file
**/SKILL.md: Do not flag SKILL.md files for missing SPDX headers. Skill entrypoints intentionally start with YAML frontmatter instead.
Verify that every SKILL.md keeps valid YAML frontmatter with at least name and description fields before the Markdown body.
Files:
skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
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 undertests/adapters, then runjust test-python.
Files:
tests/adapters/test_hermes_config_builder.pytests/adapters/test_adapter_package_metadata.py
adapters/*/src/**/*.py
📄 CodeRabbit inference engine (.agents/skills/contribute-adapter/SKILL.md)
adapters/*/src/**/*.py: Use the existing Fabricpythonorprocessrunner and normalized request/result contracts; do not add a runner or one-adapter abstraction.
Consume the complete Fabric invocation and treatconfig,capability_plan,telemetry_plan, andruntime_contextas authoritative; reserveharness.settingsfor harness-specific behavior.
Apply configuration precedence in this order: normalized config, Fabric-resolved plans and runtime context, harness-specific settings, then descriptor and adapter defaults. Reject conflicting duplicate declarations or unsupported behavior with an actionable error; never silently drop configuration.
Validate fixed dependencies, selected versions, hooks, and credentials before invoking the harness, and never expose credential values in output, errors, events, logs, or fixtures.
Forward only required system variables, selected credential variables, telemetry variables, and documented harness-specific environment; never forward or log unrelated environment values.
Start one local adapter host per Fabric runtime and keep it alive for orderedstart→invoke*→stop; emit one JSON lifecycle response per request on stdout and diagnostics on stderr.
Return harness-level invoke failures as successful lifecycle responses withresponse: null,failed: true, and structurederrorcontainingcode,message,retryable, and optionalmetadata.
Do not emit NeMo Relay stream records on adapter stdout;Runtime.invoke_stream()uses the SDK-owned NDJSON endpoint while the adapter returns exactly one terminal lifecycle response.
Scope workspace, generated config, state, sessions, and artifacts to the resolved runtime context, and isolate stateful adapters by Fabric runtime ID.
Keep stdout stable by emittingresponseplus adapter-specific extensions such aserror, harness events, usage, and session IDs; Fabric supplies top-level identity, lifecycle IDs, status, artifacts, telemetry, and metadata.
Claim capabilit...
Files:
adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py
pyproject.toml
📄 CodeRabbit inference engine (.agents/skills/contribute-adapter/SKILL.md)
pyproject.toml: Keepnemo-fabric-runtimeas an exact-version unconditional dependency of the rootnemo-fabricmetapackage, and give every installable Python adapter one canonical root extra delegating to the matchingnemo-fabric-adapters-<adapter>[harness].
Install leaf adapters through theirharnessextras in the rootadapter-testsdependency group; keep other test-only packages in a non-published group.
pyproject.toml: Keep the rootnemo-fabricpackage as a metapackage that unconditionally installs the exact-versionnemo-fabric-runtimedistribution; root harness extras must delegate to version-matched leaf-adapterharnessextras, without root adapter-only aliases.
Prefer the standard library, an existing dependency, or a small local implementation before adding a Python dependency.Packaging metadata must preserve the documented adapter dependency composition: exact-version root runtime dependency, root harness delegation, adapter-owned bare leaf dependencies, root
adapter-testsharness installation, and the specifiedfull/relayextras.
Files:
pyproject.toml
{README.md,docs/index.yml}
📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)
Update
README.mdordocs/index.ymlwhen documentation entry points or example reading paths change.
Files:
README.md
README.md
📄 CodeRabbit inference engine (AGENTS.md)
Update the root
README.mdwhen public behavior, thenemo-fabricpackage, examples, or supported bindings change.Update the top-level
README.mdwhen changed behavior affects an entry point users would naturally consult.
Files:
README.md
justfile
📄 CodeRabbit inference engine (.agents/skills/update-project-version/SKILL.md)
justfile: Theset-versionrecipe must runjust lock-pythonafter source metadata is updated.
set_project_versionmust invoke both Cargo and Python project version helpers.Wire public Python adapter packages into
python_projectsand applicable installation, build, catalog, and CI surfaces; ship descriptors undershare/nemo-fabric/adapters/<name>.Keep build, test, clean, and documentation recipes aligned with current package names, build commands, and generated artifact locations.
Files:
justfile
🧠 Learnings (2)
📓 Common learnings
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-29T17:59:00.173Z
Learning: Read the authoritative reference surfaces before editing, and use the closest existing adapter only for harness-specific patterns rather than the core contract.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-29T17:59:00.173Z
Learning: Run the applicable validation matrix, including adapter tests, Python and Rust tests where relevant, lockfile and wheel generation for packaging changes, schema generation for schema changes, documentation generation for docs changes, pre-commit, and `git diff --check`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-29T17:59:00.173Z
Learning: Keep the change scoped and ensure package metadata, runtime and test dependencies, installation, resolution, documentation, examples, fixtures, generated artifacts, and CI catalogs agree without contract drift or unrelated changes.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-29T17:59:23.555Z
Learning: All contributors must sign off every commit with `git commit -s`; unsigned-off commits will not be accepted.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-29T17:59:23.555Z
Learning: Before submitting a pull request, run relevant tests, verify affected packages compile, update documentation, and rebase on the latest `main`.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-29T17:59:23.555Z
Learning: All pull requests require at least one approving review, and CI must pass before merging.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-29T17:59:23.555Z
Learning: Address review feedback by pushing additional commits; do not force-push during review.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-29T17:59:23.555Z
Learning: Use commit messages in the format `type: short description`, with an allowed type such as `feat`, `fix`, `docs`, `test`, `refactor`, `chore`, or `perf`; keep the first line under 72 characters.
Learnt from: CR
Repo: NVIDIA/NeMo-Fabric
Timestamp: 2026-07-29T17:59:23.555Z
Learning: Versioned release tags must use raw Rust-compatible SemVer without a leading `v`, such as `0.1.0` or `0.1.0-rc.1`.
📚 Learning: 2026-07-09T22:28:51.689Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 43
File: adapters/claude-sdk/src/nemo_fabric_adapters/claude_sdk/adapter.py:164-168
Timestamp: 2026-07-09T22:28:51.689Z
Learning: In the NeMo-Fabric adapters, treat path values used in Fabric adapter configuration (including logic like `_resolve_path` in adapter.py) as config-root-relative. Do not apply `Path.expanduser()` (or otherwise apply `~`/home or shell-style expansion), because it will make the resolved paths normalize inconsistently across adapters. Also, do not rely on or add any resolution behavior that uses `harness.settings.cwd` as an override point for these adapter paths—`harness.settings.cwd` is explicitly unsupported in this adapter context.
Applied to files:
adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py
🪛 Ruff (0.16.0)
tests/adapters/test_hermes_config_builder.py
[warning] 52-52: Avoid specifying long messages outside the exception class
(TRY003)
tests/integrations/test_harbor_runner.py
[warning] 325-325: Consider f-string instead of string join
Replace with f-string
(FLY002)
🪛 SkillSpector (2.4.4)
.agents/skills/contribute-adapter/SKILL.md
[error] 196: [RA1] Self-Modification: Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.
Remediation: Prevent the skill from modifying its own code, SKILL.md, or configuration files. Treat skill files as read-only at runtime.
(Rogue Agent (RA1))
[error] 196: [RA1] Self-Modification: Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.
Remediation: Prevent the skill from modifying its own code, SKILL.md, or configuration files. Treat skill files as read-only at runtime.
(Rogue Agent (RA1))
🪛 zizmor (1.28.0)
.github/workflows/ci_python.yml
[warning] 91-91: code injection via template expansion (template-injection): may expand into attacker-controllable code
(template-injection)
[warning] 92-92: code injection via template expansion (template-injection): may expand into attacker-controllable code
(template-injection)
[warning] 92-92: code injection via template expansion (template-injection): may expand into attacker-controllable code
(template-injection)
| These checks run during adapter startup. Core descriptor diagnostics do not | ||
| invoke adapter-specific preflight hooks, so they cannot verify these | ||
| prerequisites. At invocation time the ``deepagents`` package must be | ||
| importable and the configured model-provider credential must be present in | ||
| the environment. | ||
| """ |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Describe this as startup validation.
preflight_check() is called from start() at Line 480, not before every invoke(). Replace “At invocation time” with “During adapter startup,” unless validation is intentionally moved to each invocation.
🤖 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/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py` around
lines 121 - 126, Update the documentation in preflight_check() to describe the
deepagents import and model-provider credential requirements as being validated
during adapter startup, matching its call from start(). Do not imply that
validation occurs before each invoke().
| import importlib.util | ||
|
|
||
| if importlib.util.find_spec("deepagents") is None: | ||
| raise RuntimeError( | ||
| "the 'deepagents' package is required for the Deep Agents adapter; install " | ||
| "it with the 'deepagents' extra (pip install nemo-fabric-adapters-deepagents)." | ||
| "a compatible Deep Agents harness in the adapter environment." |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
file='adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py'
echo '--- around preflight ---'
sed -n '110,150p' "$file"
echo
echo '--- around later create_deep_agent import/use ---'
rg -n "create_deep_agent|find_spec|importlib.util" "$file"
sed -n '490,530p' "$file"Repository: NVIDIA/NeMo-Fabric
Length of output: 3783
🏁 Script executed:
#!/bin/bash
set -euo pipefail
file='adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py'
python3 - <<'PY'
from pathlib import Path
p = Path('adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py')
text = p.read_text()
for needle in ['find_spec("deepagents")', 'create_deep_agent', 'importlib.util']:
print(f'== {needle} ==')
for i, line in enumerate(text.splitlines(), 1):
if needle in line:
print(i, line)
PYRepository: NVIDIA/NeMo-Fabric
Length of output: 896
🏁 Script executed:
#!/bin/bash
set -euo pipefail
sed -n '120,140p' adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py
printf '\n'
sed -n '500,520p' adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pyRepository: NVIDIA/NeMo-Fabric
Length of output: 1801
🏁 Script executed:
#!/bin/bash
set -euo pipefail
rg -n "find_spec\\(\"deepagents\"\\)|create_deep_agent|importlib\\.util" adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.pyRepository: NVIDIA/NeMo-Fabric
Length of output: 762
🏁 Script executed:
#!/bin/bash
set -euo pipefail
file='adapters/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py'
printf '%s\n' '--- preflight ---'
sed -n '120,140p' "$file"
printf '\n%s\n' '--- later create_deep_agent usage ---'
sed -n '500,525p' "$file"
printf '\n%s\n' '--- symbol search ---'
rg -n 'find_spec\("deepagents"\)|create_deep_agent|importlib\.util' "$file"Repository: NVIDIA/NeMo-Fabric
Length of output: 2624
Import create_deep_agent in preflight. find_spec("deepagents") only proves the package is present; it can still pass when the package import is broken or create_deep_agent is missing, so the later import fails outside the clearer startup error. Catch the import itself and raise the same runtime error.
🤖 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/deepagents/src/nemo_fabric_adapters/deepagents/adapter.py` around
lines 128 - 133, Update the Deep Agents preflight around
importlib.util.find_spec to import and validate the create_deep_agent symbol
itself, rather than only checking package presence. Catch failures from that
import and raise the existing RuntimeError with the same adapter-environment
message, ensuring missing or broken exports fail during startup.
| Adapters are distributed as optional extras. For example, install the Hermes | ||
| Agent adapter with: | ||
| Agent adapter and harness with: | ||
|
|
||
| ```bash | ||
| uv pip install --find-links ./dist "nemo-fabric[hermes]" | ||
| uv pip install --find-links ./dist "nemo-fabric[hermes-agent]" | ||
| ``` | ||
|
|
||
| To install only the Hermes adapter and its supported harness, use | ||
| `nemo-fabric-adapters-hermes[harness]`. Install | ||
| `nemo-fabric-adapters-hermes` without an extra when the environment already | ||
| manages a compatible Hermes Agent installation. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Show the Local Split-Environment Commands
Lines 64-67 name the leaf distributions but do not provide the uv pip install --find-links ./dist commands required to install locally built wheels. Add explicit harness and bare-adapter commands so this local-installation section is actionable.
Proposed fix
-To install only the Hermes adapter and its supported harness, use
-`nemo-fabric-adapters-hermes[harness]`. Install
-`nemo-fabric-adapters-hermes` without an extra when the environment already
-manages a compatible Hermes Agent installation.
+To install only the Hermes adapter and its supported harness, run:
+
+```bash
+uv pip install --find-links ./dist "nemo-fabric-adapters-hermes[harness]"
+```
+
+Install `nemo-fabric-adapters-hermes` without an extra when the environment
+already manages a compatible Hermes Agent installation.🤖 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 `@CONTRIBUTING.md` around lines 57 - 67, Add explicit local wheel-install
commands for both split Hermes distributions in the adapter installation
section: one using the [harness] extra and one installing the bare
nemo-fabric-adapters-hermes package. Keep the existing explanation about
environments that already manage a compatible Hermes Agent installation.
| for installation and usage guidance. Source code is available in the | ||
| [NVIDIA NeMo Fabric repository](https://github.com/NVIDIA/nemo-fabric/). |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Use the Canonical Repository URL Casing.
Replace NVIDIA/nemo-fabric with NVIDIA/NeMo-Fabric to match the canonical repository URL used elsewhere. As per coding guidelines, preserve official capitalization; the PR objective also requires exact URL casing.
Proposed fix
-[NVIDIA NeMo Fabric repository](https://github.com/NVIDIA/nemo-fabric/).
+[NVIDIA NeMo Fabric repository](https://github.com/NVIDIA/NeMo-Fabric/).📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| for installation and usage guidance. Source code is available in the | |
| [NVIDIA NeMo Fabric repository](https://github.com/NVIDIA/nemo-fabric/). | |
| for installation and usage guidance. Source code is available in the | |
| [NVIDIA NeMo Fabric repository](https://github.com/NVIDIA/NeMo-Fabric/). |
🤖 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 `@python/pypi.md` around lines 34 - 35, Update the NVIDIA NeMo Fabric
repository link in the surrounding installation and usage guidance to use the
canonical URL casing, changing the repository segment from NVIDIA/nemo-fabric to
NVIDIA/NeMo-Fabric while preserving the link destination and surrounding text.
Source: Coding guidelines
| def import_without_yaml(name: str, *args: object, **kwargs: object) -> object: | ||
| if name == "yaml": | ||
| raise ImportError("No module named yaml") | ||
| return real_import(name, *args, **kwargs) |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
Remove the custom ImportError message.
The fallback test only needs the exception type; the message triggers Ruff TRY003.
Proposed fix
if name == "yaml":
- raise ImportError("No module named yaml")
+ raise ImportError from None📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| def import_without_yaml(name: str, *args: object, **kwargs: object) -> object: | |
| if name == "yaml": | |
| raise ImportError("No module named yaml") | |
| return real_import(name, *args, **kwargs) | |
| def import_without_yaml(name: str, *args: object, **kwargs: object) -> object: | |
| if name == "yaml": | |
| raise ImportError from None | |
| return real_import(name, *args, **kwargs) |
🧰 Tools
🪛 Ruff (0.16.0)
[warning] 52-52: Avoid specifying long messages outside the exception class
(TRY003)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@tests/adapters/test_hermes_config_builder.py` around lines 50 - 53, Update
import_without_yaml to raise ImportError without a custom message when name is
"yaml", preserving the existing fallback behavior and real_import delegation for
all other modules.
Source: Linters/SAST tools
Overview
README.mdfiles remain developer focusedpypi.mdprovides brief install instructions appropriate for presentation on pypi.orgtesting.mdfiles back into theREADME.mdfilesproject.urlsettings inpyproject.tomlfilesRelated Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)
Closes FABRIC-119
I confirm this contribution is my own work, or I have the right to submit it under this project's license.
I searched existing issues and open pull requests, and this does not duplicate existing work.
Summary by CodeRabbit
New Features
Documentation
Bug Fixes
Tests