Skip to content

feat: validate adapter harness settings - #146

Closed
ZhongxuanWang wants to merge 1 commit into
NVIDIA:release/0.1from
ZhongxuanWang:feat/validate-harness-settings
Closed

feat: validate adapter harness settings#146
ZhongxuanWang wants to merge 1 commit into
NVIDIA:release/0.1from
ZhongxuanWang:feat/validate-harness-settings

Conversation

@ZhongxuanWang

@ZhongxuanWang ZhongxuanWang commented Jul 28, 2026

Copy link
Copy Markdown

Overview

Validate harness.settings during Fabric.plan() against JSON Schema owned by the exact resolved adapter descriptor.

  • Extend the adapter descriptor contract with an optional embedded settings_schema.
  • Resolve the winning descriptor first, then validate settings before any runtime starts.
  • Add a closed production schema only for Claude's residual settings: setting_sources, max_budget_usd, and permission_mode.
  • Reject non-empty settings for schema-less descriptors while keeping empty settings valid.
  • Preserve validated settings byte-for-byte in the RunPlan; JSON Schema defaults are never applied.

Per FABRIC-132's phased scope, Codex, Deep Agents, and Hermes do not receive production schemas in this change. Their non-empty harness.settings now fail closed until follow-up schemas are added. Legacy Python-selection keys and adapter-specific tool aliases are not retained: ADAPTER_PYTHON and normalized tool configuration are authoritative.

The Rust core uses released jsonschema 0.49.2 with default features disabled. schemars generates schemas but does not validate arbitrary instances; a hand-written subset would duplicate JSON Schema semantics; invoking Python would cross an interpreter boundary during core planning. A smaller Rust validator was also evaluated and rejected because its released version can report an incorrect array index after prefixItems; this change includes a regression asserting harness.settings.values.2. With jsonschema default features disabled, HTTP/file retrieval, TLS, and async resolution are absent, so descriptor schemas must be self-contained while local $defs references remain supported.

The apparent diff size is overwhelmingly generated dependency metadata. The exact diff is 46 files and 17,831 displayed changed lines:

  • 16,319 lines (91.52%) are generated Cargo.lock and ATTRIBUTIONS-Rust.md changes.
  • 52 lines (0.29%) are generated schema snapshots and Rust API references.
  • 1,460 lines (8.19%) are authored source, tests, documentation, descriptors, and examples.

The lockfile adds 87 Rust packages. The license audit reports Apache-2.0, MIT, MIT-0, BSD-2-Clause, Unicode-3.0, and Zlib expressions, with no Python dependency changes.

Details

  • Resolve repository, installed-environment, ADAPTER_PYTHON, and agent-local descriptors atomically with their settings schema.
  • Validate only from ResolvedAdapterDescriptor; there is no adapter-to-schema table, separate schema search, harness-name inference, or adapter Python import.
  • Preserve UnknownAdapter precedence over settings validation.
  • Reject malformed or externally referenced schemas while loading the descriptor.
  • Report adapter ID, descriptor source, exact descriptor path, and offending settings path.
  • Keep repository, embedded CLI, Harbor, and installed-wheel Claude descriptors aligned.
  • For Claude's dontAsk mode, pre-approve only tools that were explicitly enabled; blocked-tool filters remain authoritative.
  • Skip unavailable notebook harnesses before interpreter selection or planning.
  • Cover repository, current-interpreter, installed-wheel, split-interpreter, ADAPTER_PYTHON, and agent-local override discovery.
  • Update examples, public documentation, generated contracts, and the consumer integration skill for the fail-closed behavior.

Validation

  • cargo fmt --all -- --check
  • cargo check -p fabric-python --locked
  • just build-python
  • just test-rust: 22 CLI, 1 frontier, and 43 core tests passed; Rust doc tests passed
  • just test-python: 527 passed, 15 skipped
  • .venv/bin/pytest -q tests/e2e/test_claude.py: 1 passed, 5 skipped; fixture ordering verified with --setup-plan
  • just docs with Rust 1.93: all checks passed; only the expected unauthenticated Fern redirect check was skipped
  • uv run pre-commit run --all-files: all hooks passed
  • scripts/licensing/license_diff.py --base-ref upstream/release/0.1: 87 Rust additions with the license expressions above; no Python additions, removals, or changes
  • Verified the three production Claude schema copies are byte-identical and no non-Claude production descriptor declares a schema
  • Verified a one-commit, direct-parent relationship to the current release/0.1 head and clean diff/ancestry hygiene

Where should the reviewer start?

Start with validate_harness_settings and descriptor loading in crates/fabric-core/src/config.rs, then review adapters/claude/fabric-adapter.json and tests/python/test_harness_settings_validation.py. Installed, split-interpreter, ADAPTER_PYTHON, and override coverage is in tests/python/test_installed_adapter_discovery.py.

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

  • Closes FABRIC-132

  • 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
    • Added adapter-defined JSON schemas for validating adapter-owned harness settings during planning/diagnostics (including Claude).
  • Bug Fixes
    • Unknown/invalid harness settings now fail early with more detailed error information (including adapter and failing settings path).
    • Adapter discovery for harness execution now follows the ADAPTER_PYTHON environment variable.
  • Documentation
    • Updated harness configuration contracts for Claude, Codex, Deep Agents, and Hermes (including “settings must be empty” where no schema exists), plus improved runtime scoping guidance.
  • Tests
    • Added/expanded validation and notebook contract coverage for schema-based settings.

@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

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 8fe676ca-97ef-4236-a9e0-192b7fef467a

📥 Commits

Reviewing files that changed from the base of the PR and between 3cc4a0e and d202f6c.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (45)
  • ATTRIBUTIONS-Rust.md
  • Cargo.toml
  • README.md
  • adapters/README.md
  • adapters/claude/README.md
  • adapters/claude/fabric-adapter.json
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • adapters/codex/README.md
  • adapters/deepagents/README.md
  • adapters/hermes/README.md
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/Cargo.toml
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/schema.rs
  • crates/fabric-python/src/lib.rs
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/integrations/harness/hermes.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/sdk/python.mdx
  • examples/code_review_agent/config.py
  • examples/harbor/README.md
  • examples/harbor/calculator/README.md
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • examples/notebooks/01_quickstart.ipynb
  • examples/notebooks/02_variations.ipynb
  • python/src/nemo_fabric/integrations/harbor/fabric_agent.py
  • schemas/SCHEMA.md
  • schemas/adapter-descriptor.schema.json
  • schemas/run-plan.schema.json
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • tests/adapters/test_claude_adapter.py
  • tests/adapters/test_codex_adapter.py
  • tests/e2e/test_claude.py
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_harness_settings_validation.py
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.py

Walkthrough

The PR adds descriptor-owned JSON Schema validation for harness.settings, makes Python adapter discovery environment-driven through ADAPTER_PYTHON, narrows bundled adapter configuration, updates examples and documentation, expands validation tests, and regenerates Rust crate attributions.

Changes

Descriptor-owned settings contract

Layer / File(s) Summary
Descriptor schema and validation flow
crates/fabric-core/..., schemas/*, docs/reference/api/...
AdapterDescriptor.settings_schema is added, validated, applied during planning, and surfaced through structured InvalidHarnessSettings errors with descriptor and settings-path context.
Environment-driven adapter discovery
crates/fabric-python/src/lib.rs, crates/fabric-core/src/error.rs
Adapter interpreter and installed descriptor discovery now use ADAPTER_PYTHON rather than Python-related harness settings.
Adapter contracts and configuration migration
adapters/*, docs/integrations/..., docs/sdk/python.mdx, examples/*, crates/fabric-cli/..., python/src/...
Claude publishes a closed settings schema; Codex, Deep Agents, and Hermes reject non-empty settings without schemas. Related adapter behavior, presets, examples, and documentation are updated.
Validation and discovery coverage
crates/fabric-core/src/config.rs, tests/*
Tests cover schema errors, defaults, descriptor precedence, installed-wheel discovery, environment selection, runtime-start ordering, adapter behavior, and notebook/example configurations.
Rust attribution regeneration
ATTRIBUTIONS-Rust.md
Per-crate repository, license metadata, and embedded license texts are regenerated and expanded.

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

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 37.50% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title follows Conventional Commits and accurately summarizes the PR’s main change.
Description check ✅ Passed The description includes the required overview, reviewer start point, related issue, and confirmation checkboxes.
✨ 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 `@Cargo.toml`:
- Line 26: Add a concise comment immediately above the jsonschema dependency
declaration explaining that disabling default features excludes resolve-http and
resolve-file, preventing schema compilation from fetching remote or local $ref
targets. Keep the dependency configuration unchanged.

In `@crates/fabric-core/src/config.rs`:
- Around line 1494-1508: Cache the compiled settings_schema validator when
loading the descriptor, then store it alongside the resolved descriptor and
reuse it in validate_harness_settings during resolve_run_plan. Replace the
repeated jsonschema::validator_for compilation while preserving the existing
schema validation and invalid-descriptor error handling.

In `@tests/python/test_harness_settings_validation.py`:
- Around line 119-125: Remove the redundant `@pytest.mark.asyncio` decorator from
test_invalid_settings_fail_before_runtime_start, leaving the async test function
and its existing runtime_start setup unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: dff2f022-961c-4025-9ccd-91635657f645

📥 Commits

Reviewing files that changed from the base of the PR and between f5ef085 and c529942.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (46)
  • ATTRIBUTIONS-Rust.md
  • Cargo.toml
  • README.md
  • adapters/README.md
  • adapters/claude/README.md
  • adapters/claude/fabric-adapter.json
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • adapters/codex/README.md
  • adapters/deepagents/README.md
  • adapters/hermes/README.md
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/Cargo.toml
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/schema.rs
  • crates/fabric-python/src/lib.rs
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/integrations/harness/hermes.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/sdk/python.mdx
  • examples/code_review_agent/config.py
  • examples/harbor/README.md
  • examples/harbor/calculator/README.md
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • examples/notebooks/01_quickstart.ipynb
  • examples/notebooks/02_variations.ipynb
  • python/src/nemo_fabric/integrations/harbor/fabric_agent.py
  • schemas/SCHEMA.md
  • schemas/adapter-descriptor.schema.json
  • schemas/run-plan.schema.json
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • tests/adapters/test_claude_adapter.py
  • tests/adapters/test_codex_adapter.py
  • tests/e2e/test_claude.py
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_harness_settings_validation.py
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.py
  • tests/python/test_readme_examples.py
💤 Files with no reviewable changes (2)
  • examples/harbor/calculator/README.md
  • python/src/nemo_fabric/integrations/harbor/fabric_agent.py
📜 Review details
🧰 Additional context used
📓 Path-based instructions (57)
{README.md,docs/**/*.{md,mdx,yml},examples/**/*.{md,mdx,yml}}

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

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

Files:

  • docs/integrations/harness/hermes.mdx
  • README.md
  • examples/harbor/README.md
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/claude.mdx
  • docs/sdk/python.mdx
{docs/**/*.{md,mdx,yml},examples/**/*.{md,mdx,yml}}

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

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

Files:

  • docs/integrations/harness/hermes.mdx
  • examples/harbor/README.md
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/claude.mdx
  • docs/sdk/python.mdx
**/*.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/integrations/harness/hermes.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/claude.mdx
  • docs/sdk/python.mdx
docs/**/*.{md,mdx,yml}

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

Run just docs when the documentation site changes.

Files:

  • docs/integrations/harness/hermes.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/claude.mdx
  • docs/sdk/python.mdx
**/*

📄 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:

  • docs/integrations/harness/hermes.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • Cargo.toml
  • tests/python/test_readme_examples.py
  • README.md
  • examples/notebooks/01_quickstart.ipynb
  • adapters/claude/fabric-adapter.json
  • examples/harbor/README.md
  • schemas/run-plan.schema.json
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • crates/fabric-core/src/schema.rs
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/codex/README.md
  • crates/fabric-core/Cargo.toml
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • schemas/SCHEMA.md
  • docs/integrations/harness/codex.mdx
  • crates/fabric-core/src/runtime.rs
  • examples/code_review_agent/config.py
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • docs/integrations/harness/claude.mdx
  • crates/fabric-core/src/error.rs
  • schemas/adapter-descriptor.schema.json
  • adapters/claude/README.md
  • adapters/README.md
  • tests/python/test_harness_settings_validation.py
  • docs/sdk/python.mdx
  • tests/integrations/test_harbor_runner.py
  • examples/notebooks/02_variations.ipynb
  • tests/adapters/test_claude_adapter.py
  • adapters/hermes/README.md
  • tests/e2e/test_claude.py
  • crates/fabric-python/src/lib.rs
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/config.rs
  • adapters/deepagents/README.md
  • tests/python/test_installed_adapter_discovery.py
  • ATTRIBUTIONS-Rust.md
**/*.{md,mdx,rst}

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

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

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

Files:

  • docs/integrations/harness/hermes.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • README.md
  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/codex/README.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • schemas/SCHEMA.md
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/claude.mdx
  • adapters/claude/README.md
  • adapters/README.md
  • docs/sdk/python.mdx
  • adapters/hermes/README.md
  • adapters/deepagents/README.md
  • ATTRIBUTIONS-Rust.md
docs/**/*

📄 CodeRabbit inference engine (AGENTS.md)

Update Fern documentation under docs/ when public behavior, the nemo-fabric package, examples, or supported bindings change.

Files:

  • docs/integrations/harness/hermes.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/claude.mdx
  • docs/sdk/python.mdx
**/*.{md,mdx}

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

**/*.{md,mdx}: Use the full product name NVIDIA NeMo Fabric on its first usage, typically in the title or H1; use NeMo Fabric thereafter.
Use fabric by itself only when referring to the CLI tool, and surround those references with backticks.
Capitalize NVIDIA correctly 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 as here.
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.
Use after instead of once when expressing temporal sequence.
Use can instead of may when 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.

For docs site changes, run just docs to regenerate Python and Rust API references and validate the Fern configuration.

Files:

  • docs/integrations/harness/hermes.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • README.md
  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/codex/README.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • schemas/SCHEMA.md
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/claude.mdx
  • adapters/claude/README.md
  • adapters/README.md
  • docs/sdk/python.mdx
  • adapters/hermes/README.md
  • adapters/deepagents/README.md
  • ATTRIBUTIONS-Rust.md
**/*.{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:

  • docs/integrations/harness/hermes.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • Cargo.toml
  • tests/python/test_readme_examples.py
  • README.md
  • examples/harbor/README.md
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • crates/fabric-core/src/schema.rs
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/codex/README.md
  • crates/fabric-core/Cargo.toml
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • crates/fabric-cli/src/presets.rs
  • schemas/SCHEMA.md
  • docs/integrations/harness/codex.mdx
  • crates/fabric-core/src/runtime.rs
  • examples/code_review_agent/config.py
  • docs/integrations/harness/claude.mdx
  • crates/fabric-core/src/error.rs
  • adapters/claude/README.md
  • adapters/README.md
  • tests/python/test_harness_settings_validation.py
  • docs/sdk/python.mdx
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • adapters/hermes/README.md
  • tests/e2e/test_claude.py
  • crates/fabric-python/src/lib.rs
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/config.rs
  • adapters/deepagents/README.md
  • tests/python/test_installed_adapter_discovery.py
  • ATTRIBUTIONS-Rust.md
**/{README.md,*.md,*.mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update relevant documentation when changes affect public behavior, adapters, examples, or workspace structure.

Files:

  • docs/integrations/harness/hermes.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • README.md
  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/codex/README.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • schemas/SCHEMA.md
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/claude.mdx
  • adapters/claude/README.md
  • adapters/README.md
  • docs/sdk/python.mdx
  • adapters/hermes/README.md
  • adapters/deepagents/README.md
  • ATTRIBUTIONS-Rust.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/integrations/harness/hermes.mdx
  • README.md
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/claude.mdx
  • docs/sdk/python.mdx
{*.md,**/*.md,**/*.mdx,**/*.ipynb}

⚙️ CodeRabbit configuration file

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

Files:

  • docs/integrations/harness/hermes.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • README.md
  • examples/notebooks/01_quickstart.ipynb
  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/codex/README.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • schemas/SCHEMA.md
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/claude.mdx
  • adapters/claude/README.md
  • adapters/README.md
  • docs/sdk/python.mdx
  • examples/notebooks/02_variations.ipynb
  • adapters/hermes/README.md
  • adapters/deepagents/README.md
  • ATTRIBUTIONS-Rust.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:

  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • README.md
  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/codex/README.md
  • schemas/SCHEMA.md
  • adapters/claude/README.md
  • adapters/README.md
  • adapters/hermes/README.md
  • adapters/deepagents/README.md
  • ATTRIBUTIONS-Rust.md
**/*.{md,rst,txt,adoc}

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

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

Files:

  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • README.md
  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/codex/README.md
  • schemas/SCHEMA.md
  • adapters/claude/README.md
  • adapters/README.md
  • adapters/hermes/README.md
  • adapters/deepagents/README.md
  • ATTRIBUTIONS-Rust.md
skills/**

📄 CodeRabbit inference engine (AGENTS.md)

skills/**: Keep consumer skills under skills/ 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/references/config-mapping.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.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:

  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • README.md
  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/codex/README.md
  • schemas/SCHEMA.md
  • adapters/claude/README.md
  • adapters/README.md
  • adapters/hermes/README.md
  • adapters/deepagents/README.md
  • ATTRIBUTIONS-Rust.md
{Cargo.toml,python/pyproject.toml,pyproject.toml}

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

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

Files:

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

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

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

Files:

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

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

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

Files:

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

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

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

Files:

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

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

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

Files:

  • Cargo.toml
**/*.{rs,toml}

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

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

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

Files:

  • Cargo.toml
  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/Cargo.toml
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • crates/fabric-core/src/config.rs
**/{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:

  • Cargo.toml
  • crates/fabric-core/Cargo.toml
**/*.{toml,lock}

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

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

Files:

  • Cargo.toml
  • crates/fabric-core/Cargo.toml
**/*.{yml,yaml,toml,lock}

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

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

Files:

  • Cargo.toml
  • crates/fabric-core/Cargo.toml
Cargo.toml

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

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

Files:

  • Cargo.toml
**/*.{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:

  • Cargo.toml
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/Cargo.toml
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/runtime.rs
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/error.rs
  • tests/python/test_harness_settings_validation.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • tests/e2e/test_claude.py
  • crates/fabric-python/src/lib.rs
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.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:

  • Cargo.toml
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/Cargo.toml
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/runtime.rs
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/error.rs
  • tests/python/test_harness_settings_validation.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • tests/e2e/test_claude.py
  • crates/fabric-python/src/lib.rs
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.py
**/*.{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.py
  • adapters/claude/fabric-adapter.json
  • schemas/run-plan.schema.json
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-core/src/schema.rs
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • crates/fabric-core/src/runtime.rs
  • examples/code_review_agent/config.py
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • crates/fabric-core/src/error.rs
  • schemas/adapter-descriptor.schema.json
  • tests/python/test_harness_settings_validation.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • tests/e2e/test_claude.py
  • crates/fabric-python/src/lib.rs
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.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/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-core/src/schema.rs
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/runtime.rs
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/error.rs
  • tests/python/test_harness_settings_validation.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • tests/e2e/test_claude.py
  • crates/fabric-python/src/lib.rs
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.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/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • examples/code_review_agent/config.py
  • tests/python/test_harness_settings_validation.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • tests/e2e/test_claude.py
  • tests/python/test_notebook_examples.py
  • tests/python/test_installed_adapter_discovery.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/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-core/src/schema.rs
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/runtime.rs
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/error.rs
  • tests/python/test_harness_settings_validation.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • tests/e2e/test_claude.py
  • crates/fabric-python/src/lib.rs
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.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/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-core/src/schema.rs
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/runtime.rs
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/error.rs
  • tests/python/test_harness_settings_validation.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • tests/e2e/test_claude.py
  • crates/fabric-python/src/lib.rs
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.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/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • tests/python/test_harness_settings_validation.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • tests/e2e/test_claude.py
  • tests/python/test_notebook_examples.py
  • tests/python/test_installed_adapter_discovery.py
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use type annotations for public Python APIs.

Files:

  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • examples/code_review_agent/config.py
  • tests/python/test_harness_settings_validation.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • tests/e2e/test_claude.py
  • tests/python/test_notebook_examples.py
  • tests/python/test_installed_adapter_discovery.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/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-core/src/schema.rs
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/runtime.rs
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/error.rs
  • tests/python/test_harness_settings_validation.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • tests/e2e/test_claude.py
  • crates/fabric-python/src/lib.rs
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.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.py
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • tests/adapters/test_codex_adapter.py
  • tests/python/test_harness_settings_validation.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • tests/e2e/test_claude.py
  • tests/python/test_notebook_examples.py
  • tests/python/test_installed_adapter_discovery.py
{README.md,docs/index.yml}

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

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

Files:

  • README.md
README.md

📄 CodeRabbit inference engine (AGENTS.md)

Update the root README.md when public behavior, the nemo-fabric package, examples, or supported bindings change.

Update the top-level README.md when changed behavior affects an entry point users would naturally consult.

Files:

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

  • README.md
  • examples/harbor/README.md
  • adapters/codex/README.md
  • adapters/claude/README.md
  • adapters/README.md
  • adapters/hermes/README.md
  • adapters/deepagents/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:

  • examples/notebooks/01_quickstart.ipynb
  • adapters/claude/fabric-adapter.json
  • examples/harbor/README.md
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • adapters/codex/README.md
  • examples/code_review_agent/config.py
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • adapters/claude/README.md
  • adapters/README.md
  • examples/notebooks/02_variations.ipynb
  • adapters/hermes/README.md
  • adapters/deepagents/README.md
**/*.{json,jsonschema}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Public contract changes must keep checked-in JSON Schema snapshots synchronized.

Files:

  • adapters/claude/fabric-adapter.json
  • schemas/run-plan.schema.json
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • schemas/adapter-descriptor.schema.json
schemas/**/*

⚙️ CodeRabbit configuration file

schemas/**/*: Schemas are generated public contract snapshots. Check that schema diffs correspond to intentional Rust type changes and are covered by core tests.

Files:

  • schemas/run-plan.schema.json
  • schemas/SCHEMA.md
  • schemas/adapter-descriptor.schema.json
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_codex_adapter.py
  • tests/adapters/test_claude_adapter.py
**/SKILL.md

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

**/SKILL.md: Maintainer skills must begin with YAML frontmatter containing at least name and description.
Maintainer skills may reference repository internals, build and test commands, and contribution workflows, but external usage guidance must remain in the top-level skills/ 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
**/*.rs

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

Implement new runtime or binding behavior in the shared Rust core first.

**/*.rs: Format Rust code with cargo fmt --all; Rust formatting checks must pass with cargo fmt --all -- --check.
Rust workspace changes must pass cargo check --workspace --locked.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • crates/fabric-core/src/config.rs
crates/fabric-core/**/*.{rs,py}

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

Changes under crates/fabric-core must run both the Rust and Python test suites.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/config.rs
crates/fabric-core/**/*.rs

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

For Rust API reference changes, update Rust documentation comments under crates/fabric-core/ instead of editing generated reference output.

If crates/fabric-core changes in a way exposed through Python, run both the Rust and Python suites.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/config.rs
**/*.{rs,rmeta}

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

If Rust code changes, run cargo fmt --all -- --check and just test-rust.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • crates/fabric-core/src/config.rs
crates/fabric-core/src/**/*.rs

⚙️ CodeRabbit configuration file

crates/fabric-core/src/**/*.rs: Review the Rust core for runtime lifecycle correctness, handle validation, capability routing accuracy, schema stability, and error semantics.
Public API changes should match committed schemas, tests, and documentation.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/config.rs
docs/reference/api/**

📄 CodeRabbit inference engine (AGENTS.md)

Regenerate or update generated API references under docs/reference/api/ when the public API changes.

Treat all files under docs/reference/api/ as generated output and do not modify them directly.

Files:

  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
adapters/*/README.md

📄 CodeRabbit inference engine (AGENTS.md)

Update adapter README files when public behavior, examples, or supported bindings change.

Files:

  • adapters/codex/README.md
  • adapters/claude/README.md
  • adapters/hermes/README.md
  • adapters/deepagents/README.md
schemas/SCHEMA.md

📄 CodeRabbit inference engine (AGENTS.md)

Keep the JSON Schema notes in schemas/SCHEMA.md current when the public API or Python/Rust binding contract changes.

Files:

  • schemas/SCHEMA.md
docs/sdk/python.mdx

📄 CodeRabbit inference engine (AGENTS.md)

Keep docs/sdk/python.mdx current when the public Python API changes.

Files:

  • docs/sdk/python.mdx
crates/fabric-python/**/*.{rs,toml}

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

If the PyO3 bridge or package metadata changes, run just build-python and cargo check -p fabric-python --locked.

Files:

  • crates/fabric-python/src/lib.rs
crates/fabric-python/**/*

⚙️ CodeRabbit configuration file

crates/fabric-python/**/*: Treat native binding changes as public API changes. Check JSON/type conversion, error propagation, GIL/thread behavior, and parity with the Python SDK.

Files:

  • crates/fabric-python/src/lib.rs
**/ATTRIBUTIONS-*.md

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

Regenerate and include changed ATTRIBUTIONS-*.md files.

Files:

  • ATTRIBUTIONS-Rust.md
🧠 Learnings (3)
📚 Learning: 2026-06-29T22:34:52.407Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 27
File: adapters/codex-cli/fabric-adapter.json:13-15
Timestamp: 2026-06-29T22:34:52.407Z
Learning: In NeMo-Fabric adapter manifest files (e.g., `*/fabric-adapter.json`), keep `config.accepts` limited to the top-level Fabric capability sections that `resolve_capability_plan` consumes (such as `models`, `tools`, `mcp`, `skills`, `telemetry`). Do not add adapter-owned `harness.settings` keys to `config.accepts`; `harness.settings` should remain adapter-owned and be passed through unchanged.

Applied to files:

  • adapters/claude/fabric-adapter.json
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
📚 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/claude/src/nemo_fabric_adapters/claude/adapter.py
📚 Learning: 2026-07-24T16:07:22.255Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 118
File: docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx:5-5
Timestamp: 2026-07-24T16:07:22.255Z
Learning: In this repo, files generated under `docs/reference/api/**` are NVIDIA NeMo Fabric API reference output. When reviewing changes to these generated pages, do not treat sidebar `position`/ordering updates as direct manual edits—these can be regenerated by running `just docs` after adding public types. Only flag substantive content changes that are not explained by generation.

Applied to files:

  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
🪛 ast-grep (0.45.0)
tests/python/test_notebook_examples.py

[error] 41-41: The use of exec can be insecure
Context: exec(compile(source, str(QUICKSTART_NOTEBOOK), "exec"), namespace)
Note: [CWE-94] Improper Control of Generation of Code ('Code Injection').

(no-exec)


[warning] 41-41: The use of compile can be insecure
Context: compile(source, str(QUICKSTART_NOTEBOOK), "exec")
Note: [CWE-94] Improper Control of Generation of Code ('Code Injection').

(no-compile)

tests/python/test_installed_adapter_discovery.py

[info] 52-52: use jsonify instead of json.dumps for JSON output
Context: json.dumps(data)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


[error] 127-137: Command coming from incoming request
Context: subprocess.run(
[
"uv",
"build",
"--wheel",
"--out-dir",
str(wheelhouse),
str(ROOT / "adapters" / "claude"),
],
check=True,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)


[error] 142-145: Command coming from incoming request
Context: subprocess.run(
["uv", "pip", "install", "--python", str(python), "--no-deps", str(wheel)],
check=True,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)

🪛 Ruff (0.16.0)
examples/notebooks/02_variations.ipynb

[warning] 274-274: Abstract raise to an inner function

(TRY301)


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

(TRY003)


[warning] 279-279: Abstract raise to an inner function

(TRY301)


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

(TRY003)


[warning] 283-283: Abstract raise to an inner function

(TRY301)


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

(TRY003)


[warning] 297-297: Do not catch blind exception: Exception

(BLE001)

tests/e2e/test_claude.py

[warning] 36-36: Missing return type annotation for private function _use_current_python_for_adapter_discovery

(ANN202)

tests/python/test_installed_adapter_discovery.py

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

(S603)


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

(S607)


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

(S603)


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

(S607)

Comment thread Cargo.toml
Comment on lines +1494 to +1508
if let Some(schema) = &descriptor.settings_schema {
let schema = Value::Object(schema.clone());
jsonschema::meta::options()
.validate(&schema)
.map_err(|error| FabricError::InvalidAdapterDescriptor {
path: path.to_path_buf(),
message: format!("settings_schema is not valid JSON Schema: {error}"),
})?;
jsonschema::validator_for(&schema).map_err(|error| {
FabricError::InvalidAdapterDescriptor {
path: path.to_path_buf(),
message: format!("settings_schema could not be compiled: {error}"),
}
})?;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

Does the Rust jsonschema crate version 0.49 expose jsonschema::meta::options() with a chained .validate(&schema) method?

💡 Result:

No, the Rust jsonschema crate does not expose a method with that specific signature. While the crate provides both jsonschema::options [1] and meta-schema validation capabilities via the jsonschema::meta module [2], they do not form a single chained method call of the type jsonschema::meta::options.validate(&schema). The configuration for standard validation is accessed via the top-level jsonschema::options function [1], which returns a ValidationOptions builder [1]. This builder is used to configure validation before calling.build(&schema) [3][1] to create a reusable validator, or to use other methods on the validator instance. Meta-schema validation is handled through the jsonschema::meta module [2]. The function jsonschema::meta::options returns a MetaSchemaOptions struct [2], which provides its own dedicated.validate(&schema) method to check if a schema is valid according to its meta-schema [2]. The two APIs (general validation and meta-schema validation) are distinct and not chained in the manner described [2][1].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the relevant config functions and nearby types.
FILE="crates/fabric-core/src/config.rs"
sed -n '1450,1585p' "$FILE" | cat -n

# Look for any existing caching or precompiled validator storage.
rg -n "ResolvedAdapterDescriptor|validator_for|settings_schema|MetaSchemaOptions|compiled validator|Validator" crates/fabric-core/src/config.rs crates/fabric-core/src -g '!**/target/**'

Repository: NVIDIA/NeMo-Fabric

Length of output: 11094


🏁 Script executed:

#!/bin/bash
set -euo pipefail

sed -n '120,230p' crates/fabric-core/src/config.rs | cat -n
rg -n "derive\\(|Serialize|Deserialize|skip|validator" crates/fabric-core/src/config.rs crates/fabric-core/src/schema.rs

Repository: NVIDIA/NeMo-Fabric

Length of output: 23047


Cache the compiled settings_schema validator
validate_harness_settings recompiles the same schema on every resolve_run_plan call, even though descriptor loading already compiles it once. Store a compiled validator with the resolved descriptor to avoid repeating that work.

🤖 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 `@crates/fabric-core/src/config.rs` around lines 1494 - 1508, Cache the
compiled settings_schema validator when loading the descriptor, then store it
alongside the resolved descriptor and reuse it in validate_harness_settings
during resolve_run_plan. Replace the repeated jsonschema::validator_for
compilation while preserving the existing schema validation and
invalid-descriptor error handling.

Comment thread tests/python/test_harness_settings_validation.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: 4

🤖 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/claude/src/nemo_fabric_adapters/claude/adapter.py`:
- Line 554: Update the Claude adapter’s tool configuration around allowed_tools
so enabled Claude tools retain an explicit approval path and can execute with
permission_mode="dontAsk" in headless use. Restore the appropriate auto-approval
tool list, or add coverage that verifies enabled tools can be invoked under that
permission mode.

In `@examples/harbor/swebench/adapters/claude/fabric-adapter.json`:
- Around line 9-42: add a focused parity test alongside
test_installed_claude_wheel_supplies_metadata_and_settings_schema that loads the
example Claude fabric-adapter.json and the canonical
adapters/claude/fabric-adapter.json, then asserts their settings_schema objects
are identical. Ensure the check covers future schema changes without duplicating
or hardcoding schema fields.

In `@examples/notebooks/02_variations.ipynb`:
- Around line 273-310: Move the blocker(harness) evaluation and its NOT RUN
handling before fabric.plan(cfg, base_dir=BASE_DIR) in the harness loop. Only
build the plan and execute the run when blocker(harness) returns no reason,
while preserving the existing output and continuing to later variants when a
harness is unavailable.

In `@tests/python/test_harness_settings_validation.py`:
- Line 119: Remove the `@pytest.mark.asyncio` decorator from the affected async
test in test_harness_settings_validation.py, leaving the test function and its
automatic async-runner behavior unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: dff2f022-961c-4025-9ccd-91635657f645

📥 Commits

Reviewing files that changed from the base of the PR and between f5ef085 and c529942.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (46)
  • ATTRIBUTIONS-Rust.md
  • Cargo.toml
  • README.md
  • adapters/README.md
  • adapters/claude/README.md
  • adapters/claude/fabric-adapter.json
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • adapters/codex/README.md
  • adapters/deepagents/README.md
  • adapters/hermes/README.md
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/Cargo.toml
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/schema.rs
  • crates/fabric-python/src/lib.rs
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/integrations/harness/hermes.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/sdk/python.mdx
  • examples/code_review_agent/config.py
  • examples/harbor/README.md
  • examples/harbor/calculator/README.md
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • examples/notebooks/01_quickstart.ipynb
  • examples/notebooks/02_variations.ipynb
  • python/src/nemo_fabric/integrations/harbor/fabric_agent.py
  • schemas/SCHEMA.md
  • schemas/adapter-descriptor.schema.json
  • schemas/run-plan.schema.json
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • tests/adapters/test_claude_adapter.py
  • tests/adapters/test_codex_adapter.py
  • tests/e2e/test_claude.py
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_harness_settings_validation.py
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.py
  • tests/python/test_readme_examples.py
💤 Files with no reviewable changes (2)
  • python/src/nemo_fabric/integrations/harbor/fabric_agent.py
  • examples/harbor/calculator/README.md
📜 Review details
🧰 Additional context used
📓 Path-based instructions (57)
**/*.{md,rst}

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

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

Files:

  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • schemas/SCHEMA.md
  • README.md
  • adapters/hermes/README.md
  • adapters/claude/README.md
  • adapters/codex/README.md
  • adapters/deepagents/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/README.md
  • ATTRIBUTIONS-Rust.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:

  • examples/harbor/README.md
  • README.md
  • docs/integrations/harness/hermes.mdx
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/sdk/python.mdx
{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:

  • examples/harbor/README.md
  • docs/integrations/harness/hermes.mdx
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/sdk/python.mdx
**/*

📄 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:

  • examples/harbor/README.md
  • crates/fabric-core/src/schema.rs
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • Cargo.toml
  • examples/notebooks/01_quickstart.ipynb
  • examples/code_review_agent/config.py
  • schemas/SCHEMA.md
  • schemas/run-plan.schema.json
  • crates/fabric-core/src/runtime.rs
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • README.md
  • adapters/hermes/README.md
  • adapters/claude/fabric-adapter.json
  • docs/integrations/harness/hermes.mdx
  • adapters/claude/README.md
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • schemas/adapter-descriptor.schema.json
  • adapters/codex/README.md
  • docs/integrations/harness/claude.mdx
  • crates/fabric-core/Cargo.toml
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • crates/fabric-cli/src/presets.rs
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/deepagents/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/README.md
  • tests/adapters/test_claude_adapter.py
  • docs/sdk/python.mdx
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • ATTRIBUTIONS-Rust.md
  • examples/notebooks/02_variations.ipynb
  • tests/python/test_installed_adapter_discovery.py
  • crates/fabric-core/src/config.rs
**/*.{md,mdx,rst}

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

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

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

Files:

  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • schemas/SCHEMA.md
  • README.md
  • adapters/hermes/README.md
  • docs/integrations/harness/hermes.mdx
  • adapters/claude/README.md
  • adapters/codex/README.md
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/deepagents/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/README.md
  • docs/sdk/python.mdx
  • ATTRIBUTIONS-Rust.md
**/*.{md,rst,txt,adoc}

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

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

Files:

  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • schemas/SCHEMA.md
  • README.md
  • adapters/hermes/README.md
  • adapters/claude/README.md
  • adapters/codex/README.md
  • adapters/deepagents/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/README.md
  • ATTRIBUTIONS-Rust.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/README.md
  • README.md
  • adapters/hermes/README.md
  • adapters/claude/README.md
  • adapters/codex/README.md
  • adapters/deepagents/README.md
  • adapters/README.md
**/*.{md,mdx}

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

**/*.{md,mdx}: Use the full product name NVIDIA NeMo Fabric on its first usage, typically in the title or H1; use NeMo Fabric thereafter.
Use fabric by itself only when referring to the CLI tool, and surround those references with backticks.
Capitalize NVIDIA correctly 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 as here.
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.
Use after instead of once when expressing temporal sequence.
Use can instead of may when 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.

For docs site changes, run just docs to regenerate Python and Rust API references and validate the Fern configuration.

Files:

  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • schemas/SCHEMA.md
  • README.md
  • adapters/hermes/README.md
  • docs/integrations/harness/hermes.mdx
  • adapters/claude/README.md
  • adapters/codex/README.md
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/deepagents/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/README.md
  • docs/sdk/python.mdx
  • ATTRIBUTIONS-Rust.md
**/*.{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:

  • examples/harbor/README.md
  • crates/fabric-core/src/schema.rs
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • Cargo.toml
  • examples/code_review_agent/config.py
  • schemas/SCHEMA.md
  • crates/fabric-core/src/runtime.rs
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • README.md
  • adapters/hermes/README.md
  • docs/integrations/harness/hermes.mdx
  • adapters/claude/README.md
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • adapters/codex/README.md
  • docs/integrations/harness/claude.mdx
  • crates/fabric-core/Cargo.toml
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • crates/fabric-cli/src/presets.rs
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/deepagents/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/README.md
  • tests/adapters/test_claude_adapter.py
  • docs/sdk/python.mdx
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • ATTRIBUTIONS-Rust.md
  • tests/python/test_installed_adapter_discovery.py
  • crates/fabric-core/src/config.rs
**/{README.md,*.md,*.mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update relevant documentation when changes affect public behavior, adapters, examples, or workspace structure.

Files:

  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • schemas/SCHEMA.md
  • README.md
  • adapters/hermes/README.md
  • docs/integrations/harness/hermes.mdx
  • adapters/claude/README.md
  • adapters/codex/README.md
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/deepagents/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/README.md
  • docs/sdk/python.mdx
  • ATTRIBUTIONS-Rust.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:

  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • schemas/SCHEMA.md
  • README.md
  • adapters/hermes/README.md
  • adapters/claude/README.md
  • adapters/codex/README.md
  • adapters/deepagents/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/README.md
  • ATTRIBUTIONS-Rust.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:

  • examples/harbor/README.md
  • examples/notebooks/01_quickstart.ipynb
  • examples/code_review_agent/config.py
  • adapters/hermes/README.md
  • adapters/claude/fabric-adapter.json
  • adapters/claude/README.md
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • adapters/codex/README.md
  • adapters/deepagents/README.md
  • adapters/README.md
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • examples/notebooks/02_variations.ipynb
{*.md,**/*.md,**/*.mdx,**/*.ipynb}

⚙️ CodeRabbit configuration file

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

Files:

  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • examples/notebooks/01_quickstart.ipynb
  • schemas/SCHEMA.md
  • README.md
  • adapters/hermes/README.md
  • docs/integrations/harness/hermes.mdx
  • adapters/claude/README.md
  • adapters/codex/README.md
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/deepagents/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/README.md
  • docs/sdk/python.mdx
  • ATTRIBUTIONS-Rust.md
  • examples/notebooks/02_variations.ipynb
**/*.rs

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

Implement new runtime or binding behavior in the shared Rust core first.

**/*.rs: Format Rust code with cargo fmt --all; Rust formatting checks must pass with cargo fmt --all -- --check.
Rust workspace changes must pass cargo check --workspace --locked.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • crates/fabric-core/src/config.rs
**/*.{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:

  • crates/fabric-core/src/schema.rs
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • examples/code_review_agent/config.py
  • schemas/run-plan.schema.json
  • crates/fabric-core/src/runtime.rs
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/fabric-adapter.json
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • schemas/adapter-descriptor.schema.json
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • crates/fabric-cli/src/presets.rs
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_installed_adapter_discovery.py
  • crates/fabric-core/src/config.rs
**/*.{rs,toml}

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

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

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

Files:

  • crates/fabric-core/src/schema.rs
  • Cargo.toml
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/Cargo.toml
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • crates/fabric-core/src/config.rs
**/*.{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:

  • crates/fabric-core/src/schema.rs
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/runtime.rs
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-cli/src/presets.rs
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_installed_adapter_discovery.py
  • crates/fabric-core/src/config.rs
crates/fabric-core/**/*.{rs,py}

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

Changes under crates/fabric-core must run both the Rust and Python test suites.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/config.rs
crates/fabric-core/**/*.rs

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

For Rust API reference changes, update Rust documentation comments under crates/fabric-core/ instead of editing generated reference output.

If crates/fabric-core changes in a way exposed through Python, run both the Rust and Python suites.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/config.rs
**/*.{rs,rmeta}

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

If Rust code changes, run cargo fmt --all -- --check and just test-rust.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • crates/fabric-core/src/config.rs
**/*.{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:

  • crates/fabric-core/src/schema.rs
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/runtime.rs
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-cli/src/presets.rs
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_installed_adapter_discovery.py
  • crates/fabric-core/src/config.rs
**/*.{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:

  • crates/fabric-core/src/schema.rs
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/runtime.rs
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-cli/src/presets.rs
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_installed_adapter_discovery.py
  • crates/fabric-core/src/config.rs
**/*.{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:

  • crates/fabric-core/src/schema.rs
  • Cargo.toml
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/runtime.rs
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-core/Cargo.toml
  • crates/fabric-cli/src/presets.rs
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_installed_adapter_discovery.py
  • crates/fabric-core/src/config.rs
**/*.{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:

  • crates/fabric-core/src/schema.rs
  • Cargo.toml
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/runtime.rs
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-core/Cargo.toml
  • crates/fabric-cli/src/presets.rs
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_installed_adapter_discovery.py
  • crates/fabric-core/src/config.rs
**/*.{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:

  • crates/fabric-core/src/schema.rs
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/runtime.rs
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-cli/src/presets.rs
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_notebook_examples.py
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_installed_adapter_discovery.py
  • crates/fabric-core/src/config.rs
crates/fabric-core/src/**/*.rs

⚙️ CodeRabbit configuration file

crates/fabric-core/src/**/*.rs: Review the Rust core for runtime lifecycle correctness, handle validation, capability routing accuracy, schema stability, and error semantics.
Public API changes should match committed schemas, tests, and documentation.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/config.rs
skills/**

📄 CodeRabbit inference engine (AGENTS.md)

skills/**: Keep consumer skills under skills/ 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/references/config-mapping.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
**/*.{json,jsonschema}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Public contract changes must keep checked-in JSON Schema snapshots synchronized.

Files:

  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • schemas/run-plan.schema.json
  • adapters/claude/fabric-adapter.json
  • schemas/adapter-descriptor.schema.json
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
{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/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_notebook_examples.py
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_installed_adapter_discovery.py
{Cargo.toml,python/pyproject.toml,pyproject.toml}

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

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

Files:

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

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

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

Files:

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

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

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

Files:

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

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

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

Files:

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

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

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

Files:

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

  • Cargo.toml
  • crates/fabric-core/Cargo.toml
**/*.{toml,lock}

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

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

Files:

  • Cargo.toml
  • crates/fabric-core/Cargo.toml
**/*.{yml,yaml,toml,lock}

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

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

Files:

  • Cargo.toml
  • crates/fabric-core/Cargo.toml
Cargo.toml

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

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

Files:

  • Cargo.toml
**/*.{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:

  • examples/code_review_agent/config.py
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_notebook_examples.py
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_installed_adapter_discovery.py
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use type annotations for public Python APIs.

Files:

  • examples/code_review_agent/config.py
  • tests/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_notebook_examples.py
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_installed_adapter_discovery.py
schemas/SCHEMA.md

📄 CodeRabbit inference engine (AGENTS.md)

Keep the JSON Schema notes in schemas/SCHEMA.md current when the public API or Python/Rust binding contract changes.

Files:

  • schemas/SCHEMA.md
schemas/**/*

⚙️ CodeRabbit configuration file

schemas/**/*: Schemas are generated public contract snapshots. Check that schema diffs correspond to intentional Rust type changes and are covered by core tests.

Files:

  • schemas/SCHEMA.md
  • schemas/run-plan.schema.json
  • schemas/adapter-descriptor.schema.json
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/python/test_readme_examples.py
  • tests/adapters/test_codex_adapter.py
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_notebook_examples.py
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_installed_adapter_discovery.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_codex_adapter.py
  • tests/adapters/test_claude_adapter.py
{README.md,docs/index.yml}

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

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

Files:

  • README.md
README.md

📄 CodeRabbit inference engine (AGENTS.md)

Update the root README.md when public behavior, the nemo-fabric package, examples, or supported bindings change.

Update the top-level README.md when changed behavior affects an entry point users would naturally consult.

Files:

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

  • README.md
  • docs/integrations/harness/hermes.mdx
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/sdk/python.mdx
adapters/*/README.md

📄 CodeRabbit inference engine (AGENTS.md)

Update adapter README files when public behavior, examples, or supported bindings change.

Files:

  • adapters/hermes/README.md
  • adapters/claude/README.md
  • adapters/codex/README.md
  • adapters/deepagents/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/integrations/harness/hermes.mdx
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/sdk/python.mdx
docs/**/*.{md,mdx,yml}

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

Run just docs when the documentation site changes.

Files:

  • docs/integrations/harness/hermes.mdx
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/sdk/python.mdx
docs/**/*

📄 CodeRabbit inference engine (AGENTS.md)

Update Fern documentation under docs/ when public behavior, the nemo-fabric package, examples, or supported bindings change.

Files:

  • docs/integrations/harness/hermes.mdx
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/sdk/python.mdx
docs/reference/api/**

📄 CodeRabbit inference engine (AGENTS.md)

Regenerate or update generated API references under docs/reference/api/ when the public API changes.

Treat all files under docs/reference/api/ as generated output and do not modify them directly.

Files:

  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
**/SKILL.md

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

**/SKILL.md: Maintainer skills must begin with YAML frontmatter containing at least name and description.
Maintainer skills may reference repository internals, build and test commands, and contribution workflows, but external usage guidance must remain in the top-level skills/ 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
docs/sdk/python.mdx

📄 CodeRabbit inference engine (AGENTS.md)

Keep docs/sdk/python.mdx current when the public Python API changes.

Files:

  • docs/sdk/python.mdx
crates/fabric-python/**/*.{rs,toml}

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

If the PyO3 bridge or package metadata changes, run just build-python and cargo check -p fabric-python --locked.

Files:

  • crates/fabric-python/src/lib.rs
crates/fabric-python/**/*

⚙️ CodeRabbit configuration file

crates/fabric-python/**/*: Treat native binding changes as public API changes. Check JSON/type conversion, error propagation, GIL/thread behavior, and parity with the Python SDK.

Files:

  • crates/fabric-python/src/lib.rs
**/ATTRIBUTIONS-*.md

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

Regenerate and include changed ATTRIBUTIONS-*.md files.

Files:

  • ATTRIBUTIONS-Rust.md
🧠 Learnings (3)
📚 Learning: 2026-06-29T22:34:52.407Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 27
File: adapters/codex-cli/fabric-adapter.json:13-15
Timestamp: 2026-06-29T22:34:52.407Z
Learning: In NeMo-Fabric adapter manifest files (e.g., `*/fabric-adapter.json`), keep `config.accepts` limited to the top-level Fabric capability sections that `resolve_capability_plan` consumes (such as `models`, `tools`, `mcp`, `skills`, `telemetry`). Do not add adapter-owned `harness.settings` keys to `config.accepts`; `harness.settings` should remain adapter-owned and be passed through unchanged.

Applied to files:

  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • adapters/claude/fabric-adapter.json
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
📚 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/claude/src/nemo_fabric_adapters/claude/adapter.py
📚 Learning: 2026-07-24T16:07:22.255Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 118
File: docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx:5-5
Timestamp: 2026-07-24T16:07:22.255Z
Learning: In this repo, files generated under `docs/reference/api/**` are NVIDIA NeMo Fabric API reference output. When reviewing changes to these generated pages, do not treat sidebar `position`/ordering updates as direct manual edits—these can be regenerated by running `just docs` after adding public types. Only flag substantive content changes that are not explained by generation.

Applied to files:

  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
🪛 ast-grep (0.45.0)
tests/python/test_notebook_examples.py

[warning] 41-41: The use of compile can be insecure
Context: compile(source, str(QUICKSTART_NOTEBOOK), "exec")
Note: [CWE-94] Improper Control of Generation of Code ('Code Injection').

(no-compile)


[error] 41-41: The use of exec can be insecure
Context: exec(compile(source, str(QUICKSTART_NOTEBOOK), "exec"), namespace)
Note: [CWE-94] Improper Control of Generation of Code ('Code Injection').

(no-exec)

tests/python/test_installed_adapter_discovery.py

[info] 52-52: use jsonify instead of json.dumps for JSON output
Context: json.dumps(data)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


[error] 127-137: Command coming from incoming request
Context: subprocess.run(
[
"uv",
"build",
"--wheel",
"--out-dir",
str(wheelhouse),
str(ROOT / "adapters" / "claude"),
],
check=True,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)


[error] 142-145: Command coming from incoming request
Context: subprocess.run(
["uv", "pip", "install", "--python", str(python), "--no-deps", str(wheel)],
check=True,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)

🪛 Ruff (0.16.0)
tests/e2e/test_claude.py

[warning] 36-36: Missing return type annotation for private function _use_current_python_for_adapter_discovery

(ANN202)

examples/notebooks/02_variations.ipynb

[warning] 274-274: Abstract raise to an inner function

(TRY301)


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

(TRY003)


[warning] 279-279: Abstract raise to an inner function

(TRY301)


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

(TRY003)


[warning] 283-283: Abstract raise to an inner function

(TRY301)


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

(TRY003)


[warning] 297-297: Do not catch blind exception: Exception

(BLE001)

tests/python/test_installed_adapter_discovery.py

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

(S603)


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

(S607)


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

(S603)


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

(S607)

Comment thread adapters/claude/src/nemo_fabric_adapters/claude/adapter.py Outdated
Comment thread examples/harbor/swebench/adapters/claude/fabric-adapter.json
Comment on lines 273 to +310
"for harness in HARNESSES:\n",
" cfg = for_harness(harness)\n",
" plan = fabric.plan(cfg, base_dir=BASE_DIR)\n",
" rc = plan.config.runtime\n",
" model = plan.config.models[\"default\"][\"model\"]\n",
" print(f\"### {harness['name']}\")\n",
" print(f\" adapter = {plan.adapter.adapter_id}\")\n",
" print(f\" model = {model} input schema = {rc.input_schema}\")\n",
" reason = blocker(harness)\n",
" if reason:\n",
" print(f\" NOT RUN here ({reason}).\")\n",
" print(f\" To run it, provide: {harness['needs']}\")\n",
" else:\n",
" try:\n",
" result = await fabric.run(cfg, base_dir=BASE_DIR, input=PROMPT)\n",
" print(f\" RAN -> {result.status}\")\n",
" print(f\" reply: {oneline(getattr(result.output, 'response', result.output))}\")\n",
" if result.status != \"succeeded\":\n",
" detail = failure_detail(result)\n",
" print(\" error:\", json.dumps(detail, indent=2))\n",
" run_failures.append(f\"{harness['name']}: {json.dumps(detail, sort_keys=True)}\")\n",
" except Exception as error:\n",
" print(f\" run failed ({type(error).__name__}: {oneline(error, 120)}).\")\n",
" print(\" Attempted run failed; continuing with remaining variants.\")\n",
" run_failures.append(f\"{harness['name']}: {type(error).__name__}: {error}\")\n",
" print()"
" previous_adapter_python = os.environ.get(\"ADAPTER_PYTHON\")\n",
" try:\n",
" adapter_python = harness.get(\"python\")\n",
" if adapter_python:\n",
" os.environ[\"ADAPTER_PYTHON\"] = str(adapter_python)\n",
" else:\n",
" os.environ.pop(\"ADAPTER_PYTHON\", None)\n",
" cfg = for_harness(harness)\n",
" plan = fabric.plan(cfg, base_dir=BASE_DIR)\n",
" rc = plan.config.runtime\n",
" model = plan.config.models[\"default\"][\"model\"]\n",
" print(f\"### {harness['name']}\")\n",
" print(f\" adapter = {plan.adapter.adapter_id}\")\n",
" print(f\" model = {model} input schema = {rc.input_schema}\")\n",
" reason = blocker(harness)\n",
" if reason:\n",
" print(f\" NOT RUN here ({reason}).\")\n",
" print(f\" To run it, provide: {harness['needs']}\")\n",
" else:\n",
" try:\n",
" result = await fabric.run(cfg, base_dir=BASE_DIR, input=PROMPT)\n",
" print(f\" RAN -> {result.status}\")\n",
" print(f\" reply: {oneline(getattr(result.output, 'response', result.output))}\")\n",
" if result.status != \"succeeded\":\n",
" detail = failure_detail(result)\n",
" print(\" error:\", json.dumps(detail, indent=2))\n",
" run_failures.append(f\"{harness['name']}: {json.dumps(detail, sort_keys=True)}\")\n",
" except Exception as error:\n",
" print(f\" run failed ({type(error).__name__}: {oneline(error, 120)}).\")\n",
" print(\" Attempted run failed; continuing with remaining variants.\")\n",
" run_failures.append(f\"{harness['name']}: {type(error).__name__}: {error}\")\n",
" print()\n",
" finally:\n",
" if previous_adapter_python is None:\n",
" os.environ.pop(\"ADAPTER_PYTHON\", None)\n",
" else:\n",
" os.environ[\"ADAPTER_PYTHON\"] = previous_adapter_python"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

python3 - <<'PY'
import json, pathlib, re
nb_path = pathlib.Path('examples/notebooks/02_variations.ipynb')
nb = json.loads(nb_path.read_text())
for i, cell in enumerate(nb['cells']):
    src = ''.join(cell.get('source', []))
    if 'for harness in HARNESSES' in src or 'def blocker' in src or 'def for_harness' in src:
        print(f'--- CELL {i} ---')
        print(src)
        print()
PY

Repository: NVIDIA/NeMo-Fabric

Length of output: 5981


🏁 Script executed:

rg -n "def blocker|def for_harness|HARNESSES|adapter_python_available|FabricConfigError|plan\(" examples notebooks . -g '!**/*.ipynb'

Repository: NVIDIA/NeMo-Fabric

Length of output: 27507


🏁 Script executed:

python3 - <<'PY'
import json, pathlib
nb_path = pathlib.Path('examples/notebooks/02_variations.ipynb')
nb = json.loads(nb_path.read_text())
for i, cell in enumerate(nb['cells']):
    src = ''.join(cell.get('source', []))
    if 'for harness in HARNESSES' in src or 'def blocker' in src or 'def for_harness' in src:
        print(f'--- CELL {i} ({cell.get("cell_type")}) ---')
        print(src)
        print()
PY

Repository: NVIDIA/NeMo-Fabric

Length of output: 5995


🏁 Script executed:

python3 - <<'PY'
import json, pathlib
nb = json.loads(pathlib.Path('examples/notebooks/02_variations.ipynb').read_text())
for i, cell in enumerate(nb['cells']):
    src = ''.join(cell.get('source', []))
    if 'def blocker' in src or 'def for_harness' in src:
        print(f'--- CELL {i} ---')
        print(src)
PY

Repository: NVIDIA/NeMo-Fabric

Length of output: 3980


🏁 Script executed:

rg -n "adapter_python_available|ADAPTER_PYTHON|FabricConfigError|unknown adapter|timeout" .

Repository: NVIDIA/NeMo-Fabric

Length of output: 50375


🏁 Script executed:

sed -n '1,170p' python/src/nemo_fabric/client.py
printf '\n---\n'
sed -n '150,340p' tests/python/test_installed_adapter_discovery.py

Repository: NVIDIA/NeMo-Fabric

Length of output: 12224


Move blocker() before fabric.plan()

fabric.plan(cfg, base_dir=BASE_DIR) still runs for every harness before the skip check. If a harness interpreter is unavailable, planning can raise FabricConfigError and abort the loop before the notebook prints “NOT RUN here” or reaches later variants.

🧰 Tools
🪛 Ruff (0.16.0)

[warning] 274-274: Abstract raise to an inner function

(TRY301)


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

(TRY003)


[warning] 279-279: Abstract raise to an inner function

(TRY301)


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

(TRY003)


[warning] 283-283: Abstract raise to an inner function

(TRY301)


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

(TRY003)


[warning] 297-297: Do not catch blind exception: Exception

(BLE001)

🤖 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 `@examples/notebooks/02_variations.ipynb` around lines 273 - 310, Move the
blocker(harness) evaluation and its NOT RUN handling before fabric.plan(cfg,
base_dir=BASE_DIR) in the harness loop. Only build the plan and execute the run
when blocker(harness) returns no reason, while preserving the existing output
and continuing to later variants when a harness is unavailable.

Comment thread tests/python/test_harness_settings_validation.py Outdated
@zhongxuanwang-nv
zhongxuanwang-nv force-pushed the feat/validate-harness-settings branch 2 times, most recently from 3cc4a0e to b890544 Compare July 28, 2026 22:05

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

♻️ Duplicate comments (1)
adapters/claude/src/nemo_fabric_adapters/claude/adapter.py (1)

549-571: 🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift

Hardcoded empty allowed_tools still forecloses an auto-approval path for enabled tools.

allowed_tools=[] was previously flagged as removing the auto-approval list, so a permission_mode="dontAsk" run advertising enabled tools may not be able to execute them headlessly. The updated closed settings_schema (see tests/adapters/test_claude_adapter.py Lines 89-125) confirms allowed_tools is no longer a configurable setting at all, so this gap is now structural. Confirm the intended headless approval story for tools.enabled under non-bypass permission modes, or restore an explicit auto-approval path.

🤖 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/claude/src/nemo_fabric_adapters/claude/adapter.py` around lines 549
- 571, Update the ClaudeAgentOptions construction to provide an explicit
auto-approval path for tools.enabled when using non-bypass permission modes,
rather than always setting allowed_tools to an empty list. Preserve the existing
behavior for bypass modes and ensure headless dontAsk runs can execute the
enabled 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/codex/README.md`:
- Around line 106-121: Update the prose reference to “public Fabric
configuration” in the Codex descriptor documentation to “public NeMo Fabric
configuration,” preserving the surrounding explanation and code identifiers
unchanged.

In `@crates/fabric-core/src/config.rs`:
- Around line 1519-1627: The validate_harness_settings path recompiles
settings_schema on every resolve_run_plan call. Reuse the validator compiled
during validate_adapter_descriptor_shape by storing it alongside the resolved
descriptor and consuming that cached validator during settings validation,
removing the repeated jsonschema::validator_for compilation while preserving
existing validation errors and behavior.

In `@examples/harbor/README.md`:
- Line 86: Update the `fabric_harness_settings` row in the Harbor README to
describe that supplied settings are merged by `build_harbor_config` but rejected
during planning when the selected descriptor lacks `settings_schema`, rather
than implying the input is unmapped.

In `@tests/adapters/test_codex_adapter.py`:
- Line 1009: Expand the Codex preset regression coverage around the existing
plan.config.harness.settings assertion to verify the post-change defaults for
disabled apps, multi-agent behavior, plugins, and web search. Assert the
intended values for each capability so the test validates behavior removed from
presets.rs rather than only confirming an empty settings map.

In `@tests/e2e/test_claude.py`:
- Around line 35-44: Remove the manual previous-value capture and restoration
from _use_current_python_for_adapter_discovery. Set ADAPTER_PYTHON directly to
sys.executable and rely on the shared autouse restore_environ_fixture for
cleanup, preserving the fixture’s autouse behavior.

---

Duplicate comments:
In `@adapters/claude/src/nemo_fabric_adapters/claude/adapter.py`:
- Around line 549-571: Update the ClaudeAgentOptions construction to provide an
explicit auto-approval path for tools.enabled when using non-bypass permission
modes, rather than always setting allowed_tools to an empty list. Preserve the
existing behavior for bypass modes and ensure headless dontAsk runs can execute
the enabled tools.
🪄 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: 9dadf52b-aab8-4407-b9b6-b07fd731c791

📥 Commits

Reviewing files that changed from the base of the PR and between c529942 and 3cc4a0e.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (45)
  • ATTRIBUTIONS-Rust.md
  • Cargo.toml
  • README.md
  • adapters/README.md
  • adapters/claude/README.md
  • adapters/claude/fabric-adapter.json
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • adapters/codex/README.md
  • adapters/deepagents/README.md
  • adapters/hermes/README.md
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/Cargo.toml
  • crates/fabric-core/src/config.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/schema.rs
  • crates/fabric-python/src/lib.rs
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/codex.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/integrations/harness/hermes.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/sdk/python.mdx
  • examples/code_review_agent/config.py
  • examples/harbor/README.md
  • examples/harbor/calculator/README.md
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • examples/notebooks/01_quickstart.ipynb
  • examples/notebooks/02_variations.ipynb
  • python/src/nemo_fabric/integrations/harbor/fabric_agent.py
  • schemas/SCHEMA.md
  • schemas/adapter-descriptor.schema.json
  • schemas/run-plan.schema.json
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • tests/adapters/test_claude_adapter.py
  • tests/adapters/test_codex_adapter.py
  • tests/e2e/test_claude.py
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • tests/integrations/test_harbor_runner.py
  • tests/python/test_harness_settings_validation.py
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.py
💤 Files with no reviewable changes (2)
  • examples/harbor/calculator/README.md
  • python/src/nemo_fabric/integrations/harbor/fabric_agent.py
📜 Review details
🧰 Additional context used
📓 Path-based instructions (57)
**/*.{md,rst}

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

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

Files:

  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/hermes/README.md
  • README.md
  • schemas/SCHEMA.md
  • adapters/deepagents/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • adapters/claude/README.md
  • adapters/README.md
  • adapters/codex/README.md
  • ATTRIBUTIONS-Rust.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:

  • examples/harbor/README.md
  • docs/integrations/harness/hermes.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • README.md
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/sdk/python.mdx
{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:

  • examples/harbor/README.md
  • docs/integrations/harness/hermes.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/sdk/python.mdx
**/*

📄 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:

  • examples/harbor/README.md
  • docs/integrations/harness/hermes.mdx
  • adapters/claude/fabric-adapter.json
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • examples/notebooks/01_quickstart.ipynb
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/schema.rs
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • tests/adapters/test_codex_adapter.py
  • crates/fabric-core/Cargo.toml
  • schemas/adapter-descriptor.schema.json
  • adapters/hermes/README.md
  • README.md
  • schemas/SCHEMA.md
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • crates/fabric-core/src/runtime.rs
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • adapters/deepagents/README.md
  • Cargo.toml
  • schemas/run-plan.schema.json
  • tests/python/test_harness_settings_validation.py
  • crates/fabric-core/src/error.rs
  • docs/integrations/harness/claude.mdx
  • tests/e2e/test_claude.py
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • docs/integrations/harness/deepagents.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • adapters/claude/README.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • tests/integrations/test_harbor_runner.py
  • docs/integrations/harness/codex.mdx
  • docs/sdk/python.mdx
  • adapters/README.md
  • adapters/codex/README.md
  • examples/notebooks/02_variations.ipynb
  • crates/fabric-python/src/lib.rs
  • tests/adapters/test_claude_adapter.py
  • examples/code_review_agent/config.py
  • ATTRIBUTIONS-Rust.md
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.py
**/*.{md,mdx,rst}

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

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

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

Files:

  • examples/harbor/README.md
  • docs/integrations/harness/hermes.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/hermes/README.md
  • README.md
  • schemas/SCHEMA.md
  • adapters/deepagents/README.md
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/deepagents.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • adapters/claude/README.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/sdk/python.mdx
  • adapters/README.md
  • adapters/codex/README.md
  • ATTRIBUTIONS-Rust.md
**/*.{md,rst,txt,adoc}

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

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

Files:

  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/hermes/README.md
  • README.md
  • schemas/SCHEMA.md
  • adapters/deepagents/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • adapters/claude/README.md
  • adapters/README.md
  • adapters/codex/README.md
  • ATTRIBUTIONS-Rust.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/README.md
  • adapters/hermes/README.md
  • README.md
  • adapters/deepagents/README.md
  • adapters/claude/README.md
  • adapters/README.md
  • adapters/codex/README.md
**/*.{md,mdx}

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

**/*.{md,mdx}: Use the full product name NVIDIA NeMo Fabric on its first usage, typically in the title or H1; use NeMo Fabric thereafter.
Use fabric by itself only when referring to the CLI tool, and surround those references with backticks.
Capitalize NVIDIA correctly 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 as here.
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.
Use after instead of once when expressing temporal sequence.
Use can instead of may when 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.

For docs site changes, run just docs to regenerate Python and Rust API references and validate the Fern configuration.

Files:

  • examples/harbor/README.md
  • docs/integrations/harness/hermes.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/hermes/README.md
  • README.md
  • schemas/SCHEMA.md
  • adapters/deepagents/README.md
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/deepagents.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • adapters/claude/README.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/sdk/python.mdx
  • adapters/README.md
  • adapters/codex/README.md
  • ATTRIBUTIONS-Rust.md
**/*.{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:

  • examples/harbor/README.md
  • docs/integrations/harness/hermes.mdx
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/schema.rs
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • tests/adapters/test_codex_adapter.py
  • crates/fabric-core/Cargo.toml
  • adapters/hermes/README.md
  • README.md
  • schemas/SCHEMA.md
  • crates/fabric-core/src/runtime.rs
  • adapters/deepagents/README.md
  • Cargo.toml
  • tests/python/test_harness_settings_validation.py
  • crates/fabric-core/src/error.rs
  • docs/integrations/harness/claude.mdx
  • tests/e2e/test_claude.py
  • docs/integrations/harness/deepagents.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • adapters/claude/README.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • tests/integrations/test_harbor_runner.py
  • docs/integrations/harness/codex.mdx
  • docs/sdk/python.mdx
  • adapters/README.md
  • adapters/codex/README.md
  • crates/fabric-python/src/lib.rs
  • tests/adapters/test_claude_adapter.py
  • examples/code_review_agent/config.py
  • ATTRIBUTIONS-Rust.md
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.py
**/{README.md,*.md,*.mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update relevant documentation when changes affect public behavior, adapters, examples, or workspace structure.

Files:

  • examples/harbor/README.md
  • docs/integrations/harness/hermes.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/hermes/README.md
  • README.md
  • schemas/SCHEMA.md
  • adapters/deepagents/README.md
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/deepagents.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • adapters/claude/README.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/sdk/python.mdx
  • adapters/README.md
  • adapters/codex/README.md
  • ATTRIBUTIONS-Rust.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:

  • examples/harbor/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • adapters/hermes/README.md
  • README.md
  • schemas/SCHEMA.md
  • adapters/deepagents/README.md
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • adapters/claude/README.md
  • adapters/README.md
  • adapters/codex/README.md
  • ATTRIBUTIONS-Rust.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:

  • examples/harbor/README.md
  • adapters/claude/fabric-adapter.json
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • examples/notebooks/01_quickstart.ipynb
  • adapters/hermes/README.md
  • adapters/deepagents/README.md
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • adapters/claude/README.md
  • adapters/README.md
  • adapters/codex/README.md
  • examples/notebooks/02_variations.ipynb
  • examples/code_review_agent/config.py
{*.md,**/*.md,**/*.mdx,**/*.ipynb}

⚙️ CodeRabbit configuration file

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

Files:

  • examples/harbor/README.md
  • docs/integrations/harness/hermes.mdx
  • examples/notebooks/01_quickstart.ipynb
  • skills/integrations/consumer/nemo-fabric-integrate/SKILL.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • adapters/hermes/README.md
  • README.md
  • schemas/SCHEMA.md
  • adapters/deepagents/README.md
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/deepagents.mdx
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
  • adapters/claude/README.md
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/sdk/python.mdx
  • adapters/README.md
  • adapters/codex/README.md
  • examples/notebooks/02_variations.ipynb
  • ATTRIBUTIONS-Rust.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/integrations/harness/hermes.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/sdk/python.mdx
docs/**/*.{md,mdx,yml}

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

Run just docs when the documentation site changes.

Files:

  • docs/integrations/harness/hermes.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/sdk/python.mdx
docs/**/*

📄 CodeRabbit inference engine (AGENTS.md)

Update Fern documentation under docs/ when public behavior, the nemo-fabric package, examples, or supported bindings change.

Files:

  • docs/integrations/harness/hermes.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/sdk/python.mdx
{docs/**,README.md,AGENTS.md}

⚙️ CodeRabbit configuration file

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

Files:

  • docs/integrations/harness/hermes.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • README.md
  • docs/integrations/harness/claude.mdx
  • docs/integrations/harness/deepagents.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
  • docs/integrations/harness/codex.mdx
  • docs/sdk/python.mdx
**/*.{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/claude/fabric-adapter.json
  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/schema.rs
  • tests/adapters/test_codex_adapter.py
  • schemas/adapter-descriptor.schema.json
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • crates/fabric-core/src/runtime.rs
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • schemas/run-plan.schema.json
  • tests/python/test_harness_settings_validation.py
  • crates/fabric-core/src/error.rs
  • tests/e2e/test_claude.py
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
  • tests/integrations/test_harbor_runner.py
  • crates/fabric-python/src/lib.rs
  • tests/adapters/test_claude_adapter.py
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.py
**/*.{json,jsonschema}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Public contract changes must keep checked-in JSON Schema snapshots synchronized.

Files:

  • adapters/claude/fabric-adapter.json
  • schemas/adapter-descriptor.schema.json
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • schemas/run-plan.schema.json
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
**/*.{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/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/schema.rs
  • tests/adapters/test_codex_adapter.py
  • crates/fabric-core/src/runtime.rs
  • tests/python/test_harness_settings_validation.py
  • crates/fabric-core/src/error.rs
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • crates/fabric-python/src/lib.rs
  • tests/adapters/test_claude_adapter.py
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.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/claude/src/nemo_fabric_adapters/claude/adapter.py
  • tests/adapters/test_codex_adapter.py
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • examples/code_review_agent/config.py
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.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/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/schema.rs
  • tests/adapters/test_codex_adapter.py
  • crates/fabric-core/src/runtime.rs
  • tests/python/test_harness_settings_validation.py
  • crates/fabric-core/src/error.rs
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • crates/fabric-python/src/lib.rs
  • tests/adapters/test_claude_adapter.py
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.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/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/schema.rs
  • tests/adapters/test_codex_adapter.py
  • crates/fabric-core/src/runtime.rs
  • tests/python/test_harness_settings_validation.py
  • crates/fabric-core/src/error.rs
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • crates/fabric-python/src/lib.rs
  • tests/adapters/test_claude_adapter.py
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.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/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/schema.rs
  • tests/adapters/test_codex_adapter.py
  • crates/fabric-core/Cargo.toml
  • crates/fabric-core/src/runtime.rs
  • Cargo.toml
  • tests/python/test_harness_settings_validation.py
  • crates/fabric-core/src/error.rs
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • crates/fabric-python/src/lib.rs
  • tests/adapters/test_claude_adapter.py
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.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/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/schema.rs
  • tests/adapters/test_codex_adapter.py
  • crates/fabric-core/Cargo.toml
  • crates/fabric-core/src/runtime.rs
  • Cargo.toml
  • tests/python/test_harness_settings_validation.py
  • crates/fabric-core/src/error.rs
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • crates/fabric-python/src/lib.rs
  • tests/adapters/test_claude_adapter.py
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.py
**/*.py

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Use type annotations for public Python APIs.

Files:

  • adapters/claude/src/nemo_fabric_adapters/claude/adapter.py
  • tests/adapters/test_codex_adapter.py
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • examples/code_review_agent/config.py
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.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/claude/src/nemo_fabric_adapters/claude/adapter.py
  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/schema.rs
  • tests/adapters/test_codex_adapter.py
  • crates/fabric-core/src/runtime.rs
  • tests/python/test_harness_settings_validation.py
  • crates/fabric-core/src/error.rs
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • crates/fabric-python/src/lib.rs
  • tests/adapters/test_claude_adapter.py
  • examples/code_review_agent/config.py
  • crates/fabric-core/src/config.rs
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.py
**/*.rs

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

Implement new runtime or binding behavior in the shared Rust core first.

**/*.rs: Format Rust code with cargo fmt --all; Rust formatting checks must pass with cargo fmt --all -- --check.
Rust workspace changes must pass cargo check --workspace --locked.

Files:

  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • crates/fabric-core/src/config.rs
**/*.{rs,toml}

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

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

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

Files:

  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/Cargo.toml
  • crates/fabric-core/src/runtime.rs
  • Cargo.toml
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • crates/fabric-core/src/config.rs
**/*.{rs,rmeta}

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

If Rust code changes, run cargo fmt --all -- --check and just test-rust.

Files:

  • crates/fabric-cli/src/presets.rs
  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-python/src/lib.rs
  • crates/fabric-core/src/config.rs
crates/fabric-core/**/*.{rs,py}

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

Changes under crates/fabric-core must run both the Rust and Python test suites.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/config.rs
crates/fabric-core/**/*.rs

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

For Rust API reference changes, update Rust documentation comments under crates/fabric-core/ instead of editing generated reference output.

If crates/fabric-core changes in a way exposed through Python, run both the Rust and Python suites.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/config.rs
crates/fabric-core/src/**/*.rs

⚙️ CodeRabbit configuration file

crates/fabric-core/src/**/*.rs: Review the Rust core for runtime lifecycle correctness, handle validation, capability routing accuracy, schema stability, and error semantics.
Public API changes should match committed schemas, tests, and documentation.

Files:

  • crates/fabric-core/src/schema.rs
  • crates/fabric-core/src/runtime.rs
  • crates/fabric-core/src/error.rs
  • crates/fabric-core/src/config.rs
skills/**

📄 CodeRabbit inference engine (AGENTS.md)

skills/**: Keep consumer skills under skills/ 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
  • skills/integrations/consumer/nemo-fabric-integrate/references/config-mapping.md
**/SKILL.md

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

**/SKILL.md: Maintainer skills must begin with YAML frontmatter containing at least name and description.
Maintainer skills may reference repository internals, build and test commands, and contribution workflows, but external usage guidance must remain in the top-level skills/ 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
docs/reference/api/**

📄 CodeRabbit inference engine (AGENTS.md)

Regenerate or update generated API references under docs/reference/api/ when the public API changes.

Treat all files under docs/reference/api/ as generated output and do not modify them directly.

Files:

  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
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_codex_adapter.py
  • tests/adapters/test_claude_adapter.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_codex_adapter.py
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.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_codex_adapter.py
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • tests/python/test_harness_settings_validation.py
  • tests/e2e/test_claude.py
  • tests/integrations/test_harbor_runner.py
  • tests/adapters/test_claude_adapter.py
  • tests/python/test_installed_adapter_discovery.py
  • tests/python/test_notebook_examples.py
**/{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:

  • crates/fabric-core/Cargo.toml
  • Cargo.toml
**/*.{toml,lock}

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

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

Files:

  • crates/fabric-core/Cargo.toml
  • Cargo.toml
**/*.{yml,yaml,toml,lock}

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

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

Files:

  • crates/fabric-core/Cargo.toml
  • Cargo.toml
schemas/**/*

⚙️ CodeRabbit configuration file

schemas/**/*: Schemas are generated public contract snapshots. Check that schema diffs correspond to intentional Rust type changes and are covered by core tests.

Files:

  • schemas/adapter-descriptor.schema.json
  • schemas/SCHEMA.md
  • schemas/run-plan.schema.json
adapters/*/README.md

📄 CodeRabbit inference engine (AGENTS.md)

Update adapter README files when public behavior, examples, or supported bindings change.

Files:

  • adapters/hermes/README.md
  • adapters/deepagents/README.md
  • adapters/claude/README.md
  • adapters/codex/README.md
{README.md,docs/index.yml}

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

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

Files:

  • README.md
README.md

📄 CodeRabbit inference engine (AGENTS.md)

Update the root README.md when public behavior, the nemo-fabric package, examples, or supported bindings change.

Update the top-level README.md when changed behavior affects an entry point users would naturally consult.

Files:

  • README.md
schemas/SCHEMA.md

📄 CodeRabbit inference engine (AGENTS.md)

Keep the JSON Schema notes in schemas/SCHEMA.md current when the public API or Python/Rust binding contract changes.

Files:

  • schemas/SCHEMA.md
{Cargo.toml,python/pyproject.toml,pyproject.toml}

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

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

Files:

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

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

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

Files:

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

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

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

Files:

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

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

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

Files:

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

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

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

Files:

  • Cargo.toml
Cargo.toml

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

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

Files:

  • Cargo.toml
docs/sdk/python.mdx

📄 CodeRabbit inference engine (AGENTS.md)

Keep docs/sdk/python.mdx current when the public Python API changes.

Files:

  • docs/sdk/python.mdx
crates/fabric-python/**/*.{rs,toml}

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

If the PyO3 bridge or package metadata changes, run just build-python and cargo check -p fabric-python --locked.

Files:

  • crates/fabric-python/src/lib.rs
crates/fabric-python/**/*

⚙️ CodeRabbit configuration file

crates/fabric-python/**/*: Treat native binding changes as public API changes. Check JSON/type conversion, error propagation, GIL/thread behavior, and parity with the Python SDK.

Files:

  • crates/fabric-python/src/lib.rs
**/ATTRIBUTIONS-*.md

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

Regenerate and include changed ATTRIBUTIONS-*.md files.

Files:

  • ATTRIBUTIONS-Rust.md
🧠 Learnings (3)
📚 Learning: 2026-06-29T22:34:52.407Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 27
File: adapters/codex-cli/fabric-adapter.json:13-15
Timestamp: 2026-06-29T22:34:52.407Z
Learning: In NeMo-Fabric adapter manifest files (e.g., `*/fabric-adapter.json`), keep `config.accepts` limited to the top-level Fabric capability sections that `resolve_capability_plan` consumes (such as `models`, `tools`, `mcp`, `skills`, `telemetry`). Do not add adapter-owned `harness.settings` keys to `config.accepts`; `harness.settings` should remain adapter-owned and be passed through unchanged.

Applied to files:

  • adapters/claude/fabric-adapter.json
  • crates/fabric-cli/assets/adapters/claude/fabric-adapter.json
  • tests/fixtures/hermes-shim-agent/adapters/hermes-shim/fabric-adapter.json
  • examples/harbor/swebench/adapters/claude/fabric-adapter.json
📚 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/claude/src/nemo_fabric_adapters/claude/adapter.py
📚 Learning: 2026-07-24T16:07:22.255Z
Learnt from: AjayThorve
Repo: NVIDIA/NeMo-Fabric PR: 118
File: docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx:5-5
Timestamp: 2026-07-24T16:07:22.255Z
Learning: In this repo, files generated under `docs/reference/api/**` are NVIDIA NeMo Fabric API reference output. When reviewing changes to these generated pages, do not treat sidebar `position`/ordering updates as direct manual edits—these can be regenerated by running `just docs` after adding public types. Only flag substantive content changes that are not explained by generation.

Applied to files:

  • docs/reference/api/rust-library-reference/nemo-fabric-core/config/struct-adapterdescriptor.mdx
  • docs/reference/api/rust-library-reference/nemo-fabric-core/error/enum-fabricerror.mdx
🪛 ast-grep (0.45.0)
tests/python/test_installed_adapter_discovery.py

[info] 51-51: use jsonify instead of json.dumps for JSON output
Context: json.dumps(data)
Note: [CWE-116] Improper Encoding or Escaping of Output.

(use-jsonify)


[error] 121-131: Command coming from incoming request
Context: subprocess.run(
[
"uv",
"build",
"--wheel",
"--out-dir",
str(wheelhouse),
str(ROOT / "adapters" / "claude"),
],
check=True,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)


[error] 136-139: Command coming from incoming request
Context: subprocess.run(
["uv", "pip", "install", "--python", str(python), "--no-deps", str(wheel)],
check=True,
)
Note: [CWE-78] Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection').

(subprocess-from-request)

tests/python/test_notebook_examples.py

[error] 41-41: The use of exec can be insecure
Context: exec(compile(source, str(QUICKSTART_NOTEBOOK), "exec"), namespace)
Note: [CWE-94] Improper Control of Generation of Code ('Code Injection').

(no-exec)


[warning] 41-41: The use of compile can be insecure
Context: compile(source, str(QUICKSTART_NOTEBOOK), "exec")
Note: [CWE-94] Improper Control of Generation of Code ('Code Injection').

(no-compile)

🪛 Ruff (0.16.0)
tests/e2e/test_claude.py

[warning] 36-36: Missing return type annotation for private function _use_current_python_for_adapter_discovery

(ANN202)

examples/notebooks/02_variations.ipynb

[warning] 273-273: Abstract raise to an inner function

(TRY301)


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

(TRY003)


[warning] 278-278: Abstract raise to an inner function

(TRY301)


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

(TRY003)


[warning] 282-282: Abstract raise to an inner function

(TRY301)


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

(TRY003)


[warning] 296-296: Do not catch blind exception: Exception

(BLE001)

tests/python/test_installed_adapter_discovery.py

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

(S603)


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

(S607)


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

(S603)


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

(S607)

Comment thread adapters/codex/README.md
Comment on lines +1519 to +1627
fn validate_harness_settings(
config: &FabricConfig,
resolved: Option<&ResolvedAdapterDescriptor>,
) -> Result<()> {
let Some(resolved) = resolved else {
return Ok(());
};
let Some(schema) = &resolved.descriptor.settings_schema else {
if config.harness.settings.is_empty() {
return Ok(());
}
let name = config
.harness
.settings
.keys()
.min()
.expect("non-empty settings have a key");
return invalid_harness_settings(
resolved,
format!("harness.settings.{name}"),
"the resolved descriptor does not declare a settings_schema",
);
};

let schema = Value::Object(schema.clone());
let settings = Value::Object(config.harness.settings.clone());
let validator = jsonschema::validator_for(&schema).map_err(|error| {
FabricError::InvalidAdapterDescriptor {
path: resolved.path.clone(),
message: format!("settings_schema could not be compiled: {error}"),
}
})?;
if let Some(error) = validator.iter_errors(&settings).next() {
let settings_path = harness_settings_error_path(&error);
let reason = harness_settings_error_reason(&error);
return invalid_harness_settings(resolved, settings_path, reason);
}
Ok(())
}

fn invalid_harness_settings<T>(
resolved: &ResolvedAdapterDescriptor,
settings_path: String,
reason: impl Into<String>,
) -> Result<T> {
Err(FabricError::InvalidHarnessSettings {
adapter_id: resolved.descriptor.adapter_id.clone(),
descriptor_source: resolved.source,
descriptor_path: resolved.path.clone(),
settings_path,
reason: reason.into(),
})
}

fn harness_settings_error_path(error: &jsonschema::ValidationError<'_>) -> String {
let mut segments = error
.instance_path()
.as_str()
.split('/')
.skip(1)
.map(decode_json_pointer_segment)
.collect::<Vec<_>>();
match error.kind() {
jsonschema::error::ValidationErrorKind::AdditionalProperties { unexpected }
| jsonschema::error::ValidationErrorKind::UnevaluatedProperties { unexpected } => {
if let Some(name) = unexpected.iter().min() {
segments.push(name.clone());
}
}
jsonschema::error::ValidationErrorKind::Required { property } => {
if let Some(name) = property.as_str() {
segments.push(name.to_string());
}
}
_ => {}
}
if segments.is_empty() {
"harness.settings".to_string()
} else {
format!("harness.settings.{}", segments.join("."))
}
}

fn decode_json_pointer_segment(segment: &str) -> String {
segment.replace("~1", "/").replace("~0", "~")
}

fn harness_settings_error_reason(error: &jsonschema::ValidationError<'_>) -> String {
match error.kind() {
jsonschema::error::ValidationErrorKind::AdditionalProperties { .. }
| jsonschema::error::ValidationErrorKind::UnevaluatedProperties { .. } => {
"is not declared by the adapter settings schema".to_string()
}
jsonschema::error::ValidationErrorKind::Required { .. } => {
"is required by the adapter settings schema".to_string()
}
jsonschema::error::ValidationErrorKind::Type { .. } => {
"has a type that is not accepted by the adapter settings schema".to_string()
}
jsonschema::error::ValidationErrorKind::Enum { .. } => {
"is not one of the values accepted by the adapter settings schema".to_string()
}
jsonschema::error::ValidationErrorKind::ExclusiveMinimum { .. } => {
"must be greater than the minimum declared by the adapter settings schema".to_string()
}
_ => format!("does not satisfy the adapter settings schema ({error})"),
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

Recompiles settings_schema on every resolve_run_plan call.

The schema is already meta-validated and compiled once in validate_adapter_descriptor_shape (Lines 1494-1508) during descriptor loading, but validate_harness_settings calls jsonschema::validator_for again on every planning call. Consider caching the compiled validator alongside the resolved descriptor and reusing it here.

🤖 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 `@crates/fabric-core/src/config.rs` around lines 1519 - 1627, The
validate_harness_settings path recompiles settings_schema on every
resolve_run_plan call. Reuse the validator compiled during
validate_adapter_descriptor_shape by storing it alongside the resolved
descriptor and consuming that cached validator during settings validation,
removing the repeated jsonschema::validator_for compilation while preserving
existing validation errors and behavior.

Comment thread examples/harbor/README.md Outdated
assert plan.adapter.harness == "codex"
assert plan.config.runtime.input_schema == "text"
assert plan.config.harness.settings["reasoning_effort"] == "high"
assert plan.config.harness.settings == {}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Cover the Codex capability change, not only the empty map.

This assertion verifies the new settings contract but not the behavior removed from crates/fabric-cli/src/presets.rs, including disabled apps, multi-agent behavior, plugins, and web search. Add regression coverage for the intended post-change defaults so an empty settings map cannot mask a capability regression.
As per path instructions, tests should cover behavior promised by the changed API surface.

🤖 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_codex_adapter.py` at line 1009, Expand the Codex preset
regression coverage around the existing plan.config.harness.settings assertion
to verify the post-change defaults for disabled apps, multi-agent behavior,
plugins, and web search. Assert the intended values for each capability so the
test validates behavior removed from presets.rs rather than only confirming an
empty settings map.

Source: Path instructions

Comment thread tests/e2e/test_claude.py
Signed-off-by: Zhongxuan Wang <daniewang@nvidia.com>
@zhongxuanwang-nv
zhongxuanwang-nv force-pushed the feat/validate-harness-settings branch from b890544 to d202f6c Compare July 28, 2026 22:20
@zhongxuanwang-nv

Copy link
Copy Markdown
Member

Superseded by #149, using the zhongxuanwang-nv-owned fork.

@ZhongxuanWang
ZhongxuanWang deleted the feat/validate-harness-settings branch July 28, 2026 22:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants